[
  {
    "path": ".changeset/README.md",
    "content": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets)\n\nWe have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)\n"
  },
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@2.2.0/schema.json\",\n  \"changelog\": [\n    \"@changesets/changelog-github\",\n    {\n      \"repo\": \"thundersdata-frontend/td-design\"\n    }\n  ],\n  \"commit\": false,\n  \"fixed\": [],\n  \"linked\": [],\n  \"access\": \"public\",\n  \"baseBranch\": \"master\",\n  \"updateInternalDependencies\": \"patch\",\n  \"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH\": {\n    \"updateInternalDependents\": \"always\"\n  }\n}\n"
  },
  {
    "path": ".commitlintrc.js",
    "content": "module.exports = {\n  extends: ['@commitlint/config-conventional'],\n  rules: {},\n};\n"
  },
  {
    "path": ".cz-config.js",
    "content": "'use strict';\n\nmodule.exports = {\n  types: [\n    {\n      value: 'feat',\n      name: '✨  feat:     新功能',\n    },\n    {\n      value: 'fix',\n      name: '🐛  fix:      修复bug',\n    },\n    {\n      value: 'refactor',\n      name: '♻️  refactor: 代码重构（既不是新功能也不是改bug）',\n    },\n    {\n      value: 'chore',\n      name: '🎫  chore:    修改流程配置',\n    },\n    {\n      value: 'docs',\n      name: '📝  docs:     修改了文档',\n    },\n    {\n      value: 'test',\n      name: '✅  test:     更新了测试用例',\n    },\n    {\n      value: 'style',\n      name: '💄  style:    修改了样式文件',\n    },\n    {\n      value: 'perf',\n      name: '⚡️  perf:     新能优化',\n    },\n    {\n      value: 'revert',\n      name: '⏪  revert:   回退提交',\n    },\n  ],\n  scopes: [],\n  allowCustomScopes: true,\n  allowBreakingChanges: ['feat', 'fix'],\n  subjectLimit: 50,\n  messages: {\n    type: '请选择你本次改动的修改类型',\n    customScope: '\\n请明确本次改动的范围（可填）:',\n    subject: '简短描述本次改动:\\n',\n    body: '详细描述本次改动 (可填). 使用 \"|\" 换行:\\n',\n    breaking: '请列出任何 BREAKING CHANGES (可填):\\n',\n    footer: '请列出本次改动关闭的ISSUE (可填). 比如: #31, #34:\\n',\n    confirmCommit: '你确定提交本次改动吗?',\n  },\n};\n"
  },
  {
    "path": ".editorconfig",
    "content": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n"
  },
  {
    "path": ".github/workflows/changeset-version.yml",
    "content": "name: Changesets\n\non:\n  push:\n    branches:\n      - master\n      - v4\n      - v3\n\nconcurrency: ${{ github.workflow }}-${{ github.ref }}\n\njobs:\n  release:\n    name: upgrade-version\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Repo\n        uses: actions/checkout@v3\n        with:\n          # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits\n          fetch-depth: 0\n\n      - name: Install Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 16\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v4\n        with:\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        run: |\n          echo \"::set-output name=pnpm_cache_dir::$(pnpm store path)\"\n\n      - name: Setup pnpm cache\n        uses: actions/cache@v3\n        with:\n          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: Install dependencies\n        run: pnpm i --no-frozen-lockfile\n\n      - name: Create Release Pull Request\n        uses: changesets/action@v1\n        with:\n          publish: pnpm release\n          commit: 'chore: release'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/gh-pages.yml",
    "content": "name: Build Doc Site\n\nenv:\n  NODE_OPTIONS: --max-old-space-size=6144\n\non:\n  push:\n    branches:\n      - master\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 16\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v4\n        with:\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        run: |\n          echo \"::set-output name=pnpm_cache_dir::$(pnpm store path)\"\n\n      - name: Setup pnpm cache\n        uses: actions/cache@v3\n        with:\n          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: Install dependencies\n        run: pnpm i --no-frozen-lockfile\n\n      - name: Build Doc\n        run: pnpm doc:build\n\n      - name: Deploy\n        uses: peaceiris/actions-gh-pages@v3\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          publish_dir: ./docs-dist\n"
  },
  {
    "path": ".github/workflows/issue-close-require.yml",
    "content": "name: Issue Close Require\n\non:\n  schedule:\n    - cron: \"0 0 * * *\"\n\npermissions:\n  contents: read\n\njobs:\n  issue-close-require:\n    permissions:\n      issues: write  # for actions-cool/issues-helper to update issues\n      pull-requests: write  # for actions-cool/issues-helper to update PRs\n    runs-on: ubuntu-latest\n    steps:\n      - name: need reproduce\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'close-issues'\n          labels: 'need reproduce'\n          inactive-day: 3\n          body: |\n            Since the issue was labeled with `need reproduce`, but no response in 3 days. This issue will be closed. If you have any questions, you can comment and reply.\n            由于该 issue 被标记为需要提供复现，却 3 天未收到回应。现关闭 issue，若有任何问题，可评论回复。\n\n      \n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\npackages/**/node_modules\n/npm-debug.log*\n/yarn-error.log\n/yarn.lock\n/package-lock.json\n\n# production\n/dist\n\n# misc\n.DS_Store\n\n# umi\n.umi\n.umi-production\n.env.local\n\n.turbo\npackages/**/lib/**\nbuild/**\ndist/**\n.next/**\n.jest\n\ndocs-dist\n\n.idea\n.gradle"
  },
  {
    "path": ".husky/.gitignore",
    "content": "_\n"
  },
  {
    "path": ".husky/commit-msg",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx commitlint --edit $1\n\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx lint-staged\n"
  },
  {
    "path": ".npmrc",
    "content": "registry=https://registry.npmmirror.com/\nstrict-peer-dependencies=false\n"
  },
  {
    "path": ".prettierignore",
    "content": "**/*.svg\n**/*.ejs\n**/*.html\n**/*.js\n**/*.json\n**/*.jsx\npackage.json\n*.yaml\n.umi\n.umi-production\n\nexample\nlib\n.changeset\ndocs\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"semi\": true,\n  \"trailingComma\": \"es5\",\n  \"singleQuote\": true,\n  \"printWidth\": 120,\n  \"tabWidth\": 2,\n  \"bracketSpacing\": true,\n  \"arrowParens\": \"avoid\",\n  \"proseWrap\": \"never\",\n  \"endOfLine\": \"auto\",\n  \"importOrder\": [\n    \"^react(.*)\",\n    \"<THIRD_PARTY_MODULES>\",\n    \"@/(.*)\",\n    \"^[./]\"\n  ],\n  \"importOrderSeparation\": true,\n  \"importOrderSortSpecifiers\": true,\n  \"importOrderGroupNamespaceSpecifiers\": true,\n  \"importOrderCaseInsensitive\": true,\n  \"overrides\": [\n    {\n      \"files\": \".prettierrc\",\n      \"options\": {\n        \"parser\": \"json\"\n      }\n    }\n  ],\n  \"plugins\": [\n    \"@trivago/prettier-plugin-sort-imports\"\n  ]\n}"
  },
  {
    "path": ".umirc.ts",
    "content": "import { defineConfig } from 'dumi';\n\nexport default defineConfig({\n  title: '雷数前端',\n  favicon: 'https://avatars0.githubusercontent.com/u/56826119',\n  logo: 'https://avatars0.githubusercontent.com/u/56826119',\n  outputPath: 'docs-dist',\n  mode: 'site',\n  hash: true,\n  base: '/td-design',\n  publicPath: '/td-design/',\n  exportStatic: {},\n  dynamicImport: {},\n  webpack5: {},\n  // define: {\n  //   AMAP_DRILL_SERVER_KEY: '23979b50fbe00d2e05c1cf4f6300d028',\n  //   AMAP_DRILL_JS_KEY: 'dfc9eee6a8e7bff31451ce22e3689e09',\n  //   AMAP_DRILL_JS_SECRET: 'ac1294b1351220044a66c1023f7d5226',\n  // },\n  extraBabelPlugins: [\n    [\n      'import',\n      {\n        libraryName: 'antd',\n        libraryDirectory: 'es',\n        style: 'css',\n      },\n    ],\n  ],\n  chainWebpack(config) {\n    config.module\n      .rule('ttf')\n      .test(/.(ttf|otf)$/)\n      .use('file-loader')\n      .loader('file-loader');\n    config.module\n      .rule('media')\n      .test(/\\.(mp4)$/)\n      .use('file-loader')\n      .loader(require.resolve('file-loader'));\n  },\n  navs: [\n    {\n      title: 'RN组件库',\n      path: '/react-native',\n    },\n    {\n      title: '大屏素材库',\n      path: '/screen',\n    },\n    {\n      title: '设计模式',\n      path: '/pattern',\n    },\n    {\n      title: '数据结构',\n      path: '/structure',\n    },\n    {\n      title: '软件开发',\n      path: '/development',\n    },\n    {\n      title: '常见问题',\n      path: '/faq',\n    },\n    {\n      title: '友情链接',\n      path: '/friendlink',\n    },\n    {\n      title: 'GitHub',\n      path: 'https://github.com/thundersdata-frontend/td-design',\n    },\n  ],\n});\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"editor.formatOnSave\": true,\n  \"eslint.validate\": [\n    \"javascript\",\n    \"typescript\",\n    \"json\",\n    \"md\"\n  ],\n  \"cSpell.words\": [\n    \"dayjs\"\n  ]\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# dumi app\n\n## Getting Started\n\nInstall dependencies,\n\n```bash\n$ npm i\n```\n\nStart the dev server,\n\n```bash\n$ npm start\n```\n\nBuild site app,\n\n```bash\n$ npm run build\n```\n"
  },
  {
    "path": "docs/development.md",
    "content": "---\nsidemenu: false\nnav:\n  title: 软件开发\n  path: /development\n---\n\n## 软件开发\n\n收集的一些软件开发相关的术语和概念。\n"
  },
  {
    "path": "docs/friendlink.md",
    "content": "---\nsidemenu: false\nnav:\n  title: 友情链接\n  path: /friendlink\n---\n\n# 友情链接\n\n## react-native 组件库\n\n- [vant-react-native](https://vant-react-native.js.org/vant-react-native/)\n- [ant-design-mobile-rn](https://rn.mobile.ant.design/index-cn)\n- [react-native-element](https://reactnativeelements.com/)\n- [react-native-paper](https://callstack.github.io/react-native-paper/)\n- [nativebase](https://nativebase.io/)\n- [react-native-ui-kitten](https://akveo.github.io/react-native-ui-kitten/)\n\n## react-native 相关网站\n\n- [官网地址](https://reactnative.dev/)\n- [react navigation 导航库](https://reactnavigation.org/)\n- [restyle 样式系统](https://github.com/Shopify/restyle)\n\n## react-native 优秀组件\n\n## react-native 优秀文章\n"
  },
  {
    "path": "docs/index.md",
    "content": "---\ntitle: td-design 雷数科技前端团队\nhero:\n  title: 雷数科技-前端文档\n  desc: 本网站包含雷数科技前端团队开发的所有组件库、脚手架、模板等内容\n  actions:\n    - text: 开始探索\n      link: /react-native\nfeatures:\n  - icon: https://gw.alipayobjects.com/zos/bmw-prod/881dc458-f20b-407b-947a-95104b5ec82b/k79dm8ih_w144_h144.png\n    title: 组件丰富 | 功能全面\n    desc: 提供了54+基础组件，覆盖各类场景，组件特性丰富，满足各种功能需求\n  - icon: https://gw.alipayobjects.com/zos/bmw-prod/d60657df-0822-4631-9d7c-e7a869c2f21c/k79dmz3q_w126_h126.png\n    title: 体积小巧 | 性能出众\n    desc: 在不损失功能的基础上，尽量保证了单个组件的体积最小、性能最优\n  - icon: https://gw.alipayobjects.com/zos/bmw-prod/d1ee0c6f-5aed-4a45-a507-339a4bfe076c/k7bjsocq_w144_h144.png\n    title: 简易定制 | 多种风格\n    desc: 支持灵活的样式定制，简易生成多种风格，满足个性化产品需求\nfooter: Open-source MIT Licensed | Copyright © 2020<br />Powered by [thundersdata](https://github.com/thundersdata)\n---\n"
  },
  {
    "path": "docs/pattern/Strategy.md",
    "content": "---\nnav:\n  title: 策略模式\n  path: /pattern\ngroup:\n  title: 设计模式\n  path: /\n  order: 3\n---\n\n# 策略模式 - Strategy\n\n策略模式是一种行为设计模式， 它能让你定义一系列算法， 并将每种算法分别放入独立的类中， 以使算法的对象能够相互替换。\n\n## 问题\n\n简单的说在一些时候，我们需要根据传入的参数不同来执行不同的代码，比如说当用户认证状态分别为:未认证，已认证，审核中等状态时，我们需要进行不同的处理。或许我们写以下的代码：\n\n```js\nfunction navigation(status) {\n  switch (status) {\n    case '未认证':\n      history.push('未认证');\n      break;\n    case '已认证':\n      history.push('已认证');\n      break;\n    case '审核中':\n      history.push('审核中');\n      break;\n  }\n}\n```\n\n当我们需要增加一个新的状态审核失败时，就需要对 navigation 进行修改增加一个分支，或许一个状态不算什么，但是在未来我们也不确定会增加多少个状态，整个函数的分支就会非常的多，整个方法就会非常的庞大，导致可读性也十分的差，同时它也违反了开放-封闭原则。这一块的代码也无法进行很好的复用，如果还有一个地方需要未认证的逻辑，那我们只能复制粘贴了。\n\n## 解决方案\n\n在对分支进行拆解，将其拆解成多个小的策略，并且有一个中间函数做上下文的链接，而不是直接去使用\n\n```js\n\ninterface Strategy {\n  navigation: () => void;\n}\n\nclass StrategyA implements Strategy {\n  public navigation() {\n    // history.push('未认证');\n    console.log('未认证');\n  }\n}\n\nclass StrategyB implements Strategy {\n  public navigation() {\n    // history.push('已认证');\n    console.log('已认证');\n  }\n}\n\nclass StrategyC implements Strategy {\n  public navigation() {\n    // history.push('审核中');\n    console.log('审核中');\n  }\n}\n\nclass Context {\n  private strategy: Strategy;\n  constructor(strategy: Strategy) {\n    this.strategy = strategy;\n  }\n\n  public setStrategy(strategy: Strategy) {\n    this.strategy = strategy;\n  }\n  public doStrategy() {\n    this.strategy.navigation();\n  }\n}\n\nconst navigation = new Context(new StrategyA());\nnavigation.doStrategy();\nconsole.log('-----');\nnavigation.setStrategy(new StrategyB());\nnavigation.doStrategy();\nconsole.log('-----');\nnavigation.setStrategy(new StrategyC());\nnavigation.doStrategy();\n\n```\n\n策略模式建议找出负责用许多不同方式完成特定任务的类， 然后将其中的算法抽取到一组被称为策略的独立类中。\n\n名为上下文的原始类必须包含一个成员变量来存储对于每种策略的引用。 上下文并不执行任务， 而是将工作委派给已连接的策略对象。\n\n就是将各种互不相关的行为进行独立封装，然后使用中间的上下文进行应用，使调用者本身和方法没有直接的关联，这时候需要增加一个新的状态审核失败只需要新增一种策略就可以解决，符合了开放-封闭原则。不会对原有的代码进行改动。同时也增加了代码的复用性。当然这是面向对象的策略模式，在 js 中可以进行一些省略，方法本身也是一个对象，我们可以直接使用一个对象进行对策略的存放。\n\n```js\nconst Context{\n  \"StrategyA\":()=>{\n    console.log('未认证');\n  },\n  \"StrategyB\":()=>{\n    console.log('已认证');\n  },\n  \"StrategyC\":()=>{\n    console.log('审核中');\n  },\n}\nfunction navigation(name){\n  Context[name]?.()\n}\n```\n\n## 策略模式\n\n1. 将一些独立的逻辑或者业务进行封装\n2. 拥有一个上下文链接封装的逻辑和调用者\n3. 调用者通过对上下文来访问相应的方法\n\n## 优缺点\n\n优点:\n\n1. 提高了代码的复用率\n2. 通过测量将判断分支给剪切了，使得代码中没有那么庞大的 if 或 switch。\n3. 开闭原则。 你无需对上下文进行修改就能够引入新的策略\n\n缺点：\n\n1. 增加了对策略了解的成本\n2. 代码中会存在很多策略方法和上下文\n"
  },
  {
    "path": "docs/pattern/index.md",
    "content": "---\nnav:\n  title: 设计模式\n  path: /pattern\ngroup:\n  title: 设计模式\n  path: /\n  order: 0\n---\n\n# 设计模式介绍\n"
  },
  {
    "path": "docs/pattern/signleton.md",
    "content": "---\nnav:\n  title: 单例模式\n  path: /pattern\ngroup:\n  title: 设计模式\n  path: /\n  order: 1\n---\n\n# 单例模式 - Singleton\n"
  },
  {
    "path": "docs/pattern/visitor.md",
    "content": "---\nnav:\n  title: 访问者模式\n  path: /pattern\ngroup:\n  title: 设计模式\n  path: /\n  order: 2\n---\n\n# 访问者模式 - Visitor\n"
  },
  {
    "path": "docs/react-faq.md",
    "content": "---\nnav:\n  title: React应用开发常见问题\n  path: /faq\ngroup:\n  title: 开发常见问题\n  path: /\n  order: 1\n---\n\n# React 应用开发常见问题\n\n## 单点登录\n\n### 新项目接入单点登录\n\n新项目里直接接入单点登录比较简单，按照我们目前用的 `umi-request` 库，只需要在 `common.ts`中配置 `credentials: include`即可，不需要太多额外的操作\n\n### 老项目改造接入单点登录\n\n1. 首先先找到项目中配置 `request` 的文件，在配置中加入 `credentials: include`，如果老项目中用的是 `axios`库，在配置中加入 `withCredentials: true`\n2. 在请求头中去掉携带 `token`\n3. 找到判断是否登录的地方（一般都是通过是否有 token 判断是否已经登录），直接设置成已经登录的状态\n4. 找到退出登录的地方，把 `logoutUrl`设置为 `域名 + '/logout?redirect_url=' + 域名`\n5. 部署应用的时候，把单点登录域配置上去，具体的 `key` 可以找后端同学\n\n`tips: 一般我们的token都是通过写了一个方法去获取的，所以你可以在上面第二步去掉token的地方，找到那个方法然后进行全局搜索，不出意外的话，可以顺着这个方法找到判断是否登录的方法，以及一些类似于上传文件、上传图片需要token的地方，也设置为 withCredentials=true 即可 `\n"
  },
  {
    "path": "docs/react-native/index.md",
    "content": "---\ntitle: react-native组件库\ntoc: menu\norder: 1\n---\n\n# @td-design/react-native 组件库\n\n## 特性和优势\n\n- 全面兼容 react 和 react-native\n- UI 样式高度可配置，拓展性强，轻松适应各类产品风格\n- 基于 React Native 的 iOS / Android 多平台支持，组件丰富，能全面覆盖各类场景\n- 使用 TypeScript 开发，提供类型定义文件，支持类型及属性智能提示，方便业务开发\n\n## 适用场景\n\n- 适合于中大型产品应用\n- 适合于基于 react-native 的终端应用\n- 适合不同 UI 风格的定制需求的应用\n\n## 版本要求\n\n- `react-native` 0.63.0 版本以上\n\n## 快速上手\n\n_在开始之前，推荐先学习 [React](https://reactjs.org/) 和 [React Native](http://reactnative.dev/)。并确认 Node.js 已经升级到 v14.x 或以上。_\n\n## 新建项目\n\n推荐使用[rn-template](https://github.com/thundersdata-frontend/rn-template)作为模板进行开发。该模板内置了很多常用的功能，可以极大地提高你的项目开发进度，不需要再为搭建环境发愁。\n\n```js | pure\nnpm install -g @td-design/cli\n\ntd-cli init <projectName>\n```\n根据提示，模板选择`app`, 分支目前支持: `main`/`0.66`/`0.67`/`0.68`/`0.69`/`0.70`/`0.71`/`0.72`。\n\n创建成功后，全局搜索`rntemplate`，替换成你的项目名称即可。\n"
  },
  {
    "path": "docs/react-native/restyle.md",
    "content": "---\ntitle: 主题和样式\ntoc: menu\norder: 2\n---\n\n# 主题和样式\n\n先看效果图：\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://user-images.githubusercontent.com/688415/75268245-91084b80-57f7-11ea-905b-2a9046aa5ca3.gif\"\n    />\n    <div>图片来自：<a href=\"https://github.com/Shopify/restyle\">@shopify/restyle</a></div>\n</figure>\n</center>\n\n## 介绍\n\n`@shopify/restyle` 是由 shopify 公司开发的一个用于开发 react-native UI 组件库的工具。主要聚焦在组件库的样式上。它假设我们的组件库是基于一套设计体系，定义了一系列的颜色和间距常量。我们可以通过定义主题的方式来方便地实现对组件样式的定义和自由切换（如暗黑模式）。\n\n## 使用\n\n### 定义主题\n\n任何使用此工具开发的组件库都要有一个全局的样式对象。它明确地定义了一系列的颜色(color)、间距(spacing)、断点(breakpoints)以及其他更多的定义。UI 组件可以直接使用这个样式对象中的 key 值。比如`backgroundColor=\"primaryColor\"`。在`TypeScript`的加持下，我们可以非常放心，它会约束我们可以使用的值。示例如下：\n\n```js\nimport { createTheme } from '@shopify/restyle';\n\nconst palette = {\n  purpleLight: '#8C6FF7',\n  purplePrimary: '#5A31F4',\n  purpleDark: '#3F22AB',\n\n  greenLight: '#56DCBA',\n  greenPrimary: '#0ECD9D',\n  greenDark: '#0A906E',\n\n  black: '#0B0B0B',\n  white: '#F0F2F3',\n};\n\nconst theme = createTheme({\n  colors: {\n    mainBackground: palette.white,\n    cardPrimaryBackground: palette.purplePrimary,\n  },\n  spacing: {\n    s: 8,\n    m: 16,\n    l: 24,\n    xl: 40,\n  },\n  breakpoints: {\n    phone: 0,\n    tablet: 768,\n  },\n});\n\nexport type Theme = typeof theme;\nexport default theme;\n```\n\n有了这个主题样式对象之后，我们应该如何在项目中使用呢？\n\n1. 在项目的`app.tsx`里面，用`ThemeProvider`包裹你的组件：\n\n```tsx | pure\nimport { ThemeProvider } from '@shopify/restyle';\nimport theme from './theme';\n\nconst App = () => <ThemeProvider theme={theme}>{/* Rest of the app */}</ThemeProvider>;\n```\n\n### Colors 颜色\n\n通常设计师会使用一个调色板（palette）来定义组件设计体系中涉及到的各种颜色。通常而言，我们不建议直接在主题里面使用颜色值，而是建议使用调色板中颜色对应的语义化的名字。\n\n```js\n// 定义一个调色板\nconst palette = {\n  purpleLight: '#8C6FF7',\n  purplePrimary: '#5A31F4',\n  purpleDark: '#3F22AB',\n\n  greenLight: '#56DCBA',\n  greenPrimary: '#0ECD9D',\n  greenDark: '#0A906E',\n\n  black: '#0B0B0B',\n  white: '#F0F2F3',\n};\n\n// 在主题中使用调色板里颜色对应的名字\nconst theme = createTheme({\n  colors: {\n    mainBackground: palette.white,\n    mainForeground: palette.black,\n    cardPrimaryBackground: palette.purplePrimary,\n    buttonPrimaryBackground: palette.purplePrimary,\n  },\n});\n```\n\n_为什么选择使用调色板中颜色对应的名字更有好处呢？_\n\n1. 很容易理解整个 APP 中在何处应用了颜色。\n2. 如果调色板中颜色发生了改变，我们只需要把颜色名称对应的值改掉就可以了，不用去整个 APP 里找到颜色值并替换。比如把紫色换成了深黑色。\n\n```js\nconst palette = {\n  // ...\n  // purpleDark: '#3F22AB', // 原值\n  purpleDark: '#0B0B0B', // 改后的值\n};\n```\n\n3. 如上面的主题中，`cardPrimaryBackground`和`buttonPrimaryBackground`虽然都指向的是同一个颜色，但是如果需要把`buttonPrimaryBackground`换成绿色，改动也是非常简单方便的。\n\n```js\nconst theme = createTheme({\n  colors: {\n    // ...\n    // buttonPrimaryBackground: palette.purplePrimary, // 原先值\n    buttonPrimaryBackground: palette.greenPrimary, // 改后的值\n  },\n});\n```\n\n4. 可以在 APP 使用过程中自由地切换主题样式。\n\n### Spacing 间距\n\n间距是按照衣服尺寸定义的一些常量数值。示例如下：\n\n```js\nconst theme = createTheme({\n  spacing: {\n    s: 8,\n    m: 16,\n    l: 24,\n    xl: 40,\n  },\n});\n```\n\n### Breakpoints 断点\n\n断点是我们设置的为应用不同样式的不同目标屏幕尺寸的最小宽度。断点可以定义为单个值(width)，或者一个宽高值对象。示例如下：\n\n```js\nconst theme = createTheme({\n  breakpoints: {\n    phone: 0,\n    longPhone: {\n      width: 0,\n      height: 812,\n    },\n    tablet: 768,\n    largeTablet: 1024,\n  },\n});\n```\n\n具体可以参见下面的[Responsive 响应式](#responsive-响应式)章节。\n\n### 使用主题样式对象\n\n借助`useTheme`，我们可以非常方便地在一个组件内使用主题内定义的内容。示例如下：\n\n```tsx | pure\nconst Component = () => {\n  const theme = useTheme<Theme>();\n  const { cardPrimaryBackground } = theme.colors;\n  // ...\n};\n```\n\n_之所以不直接引入 theme 文件，是为了方便我们实现主题切换效果。_\n\n### 内置的 Box/Text 组件\n\n1. Box 组件：\n\nBox 组件可以定义的属性由这几个大类组成：`backgroundColor`, `opacity`, `visible`, `layout`, `spacing`, `border`, `shadow`, `position`。具体大类里有哪些属性，可以参见下方的[Restyle Function](#restyle-functions)章节。\n\n```tsx | pure\nimport { createBox } from '@shopify/restyle';\nimport { Theme } from './theme';\n\nconst Box = createBox<Theme>();\n\nexport default Box;\n```\n\n2. Text 组件：\n\nText 组件可以定义的属性由这几个大类组成：`color`, `opacity`, `visible`, `typography`, `textShadow`, `spacing`。具体大类里有哪些属性，可以参见下方的[Restyle Function](#restyle-functions)章节。\n\n```tsx | pure\nimport { createText } from '@shopify/restyle';\nimport { Theme } from './theme';\n\nconst Text = createText<Theme>();\n\nexport default Text;\n```\n\n值得注意的是，Text 组件还可以接受一个`variant`属性，它对应的是 theme 对象里`textVariants`下的 key 值。\n\n```tsx | pure\nconst theme = createTheme({\n  ...,\n  textVariants: {\n    header: {\n      fontWeight: 'bold',\n      fontSize: 34,\n      lineHeight: 42.5,\n      color: 'black',\n    },\n    subheader: {\n      fontWeight: '600',\n      fontSize: 28,\n      lineHeight: 36,\n      color: 'black',\n    },\n    body: {\n      fontSize: 16,\n      lineHeight: 24,\n      color: 'black',\n    },\n  },\n});\n\n// In a component\n<Text variant=\"header\">Header</Text>\n```\n\n### 自定义组件\n\n如果我们想要自己创建一个类似`Box`和`Text`这样的组件，但是我们自己决定组件可以接受那些类别的属性，我们可以使用`createRestyleComponent`。示例如下：\n\n```tsx | pure\nimport { createRestyleComponent, createVariant, spacing, SpacingProps, VariantProps } from '@shopify/restyle';\nimport { Theme } from './theme';\n\ntype Props = SpacingProps<Theme> & VariantProps<Theme, 'cardVariants'>;\nconst Card = createRestyleComponent<Props>([spacing, createVariant({ themeKey: 'cardVariants' })]);\n\nexport default Card;\n```\n\n如果觉得这还不够，也可以使用`useRestyle`这个 hooks 来实现更强大的定制功能。示例如下：\n\n```tsx | pure\nimport {\n  backgroundColor,\n  BackgroundColorProps,\n  border,\n  BorderProps,\n  composeRestyleFunctions,\n  spacing,\n  SpacingProps,\n  useRestyle,\n} from '@shopify/restyle';\nimport { TouchableOpacity, View } from 'react-native';\n\nimport Text from './Text';\nimport { Theme } from './theme';\n\nconst restyleFunctions = composeRestyleFunctions([spacing, border, backgroundColor]);\ntype Props = SpacingProps<Theme> &\n  BorderProps<Theme> &\n  BackgroundColorProps<Theme> & {\n    onPress: () => void;\n  };\n\nconst Button = ({ onPress, label, ...rest }: Props) => {\n  const props = useRestyle(restyleFunctions, rest);\n\n  return (\n    <TouchableOpacity onPress={onPress}>\n      <View {...props}>\n        <Text variant=\"buttonLabel\">{label}</Text>\n      </View>\n    </TouchableOpacity>\n  );\n};\n```\n\n### Restyle Functions\n\n**Restyle Functions**把组件允许接受的属性做了一下分类，同时映射到主题对象，我们可以非常方便地使用他们来约束组件的属性以及快速开发基于主题对象的组件。\n\n| 类别 | 属性 | 对应的主体对象 Key 值 |\n| --- | --- | --- |\n| backgroundColor | `backgroundColor` | `colors` |\n| color | `color` | `colors` |\n| opacity | `opacity` |  |\n| visible | `display` |  |\n| spacing | `margin`, `marginTop`, `marginRight`, `marginBottom`, `marginLeft`, `marginStart`, `marginEnd`, `marginHorizontal`, `marginVertical`, `padding`, `paddingTop`, `paddingRight`, `paddingBottom`, `paddingLeft`, `paddingStart`, `paddingEnd`, `paddingHorizontal`, `paddingVertical` | `spacing` |\n| layout | `width`, `height`, `minWidth`, `maxWidth`, `minHeight`, `maxHeight`, `overflow`, `aspectRatio`, `alignContent`, `alignItems`, `alignSelf`, `justifyContent`, `flex`, `flexBasis`, `flexDirection`, `flexGrow`, `flexShrink`, `flexWrap` |  |\n| position | `position`, `top`, `right`, `bottom`, `left`, `start`, `end` |  |\n| position | `zIndex` | `zIndices` |\n| border | `borderBottomWidth`, `borderLeftWidth`, `borderRightWidth`, `borderStartWidth`, `borderEndWidth`, `borderStyle`, `borderTopWidth`, `borderWidth` |  |\n| border | `borderColor`, `borderTopColor`, `borderRightColor`, `borderLeftColor`, `borderStartColor`, `borderEndColor`, `borderBottomColor` | `colors` |\n| border | `borderRadius`, `borderBottomLeftRadius`, `borderBottomRightRadius`, `borderBottomStartRadius`, `borderBottomEndRadius`, `borderTopLeftRadius`, `borderTopRightRadius`, `borderTopStartRadius`, `borderTopEndRadius` | `borderRadii` |\n| shadow | `shadowOpacity`, `shadowOffset`, `shadowRadius`, `elevation` |  |\n| shadow | `shadowColor` | `colors` |\n| textShadow | `textShadowOffset`, `textShadowRadius` |  |\n| textShadow | `textShadowColor` | `colors` |\n| typography | `fontFamily`, `fontSize`, `fontStyle`, `fontWeight`, `letterSpacing`, `lineHeight`, `textAlign`, `textDecorationLine`, `textDecorationStyle`, `textTransform` |  |\n\n### Variants\n\n`variant` 是 `Restyle Function`的一种形式。它可以将一个属性映射到多个其他属性。`variant`需要对应到主题对象中的 key 值。示例如下：\n\n```tsx | pure\n// In theme\nconst theme = createTheme({\n  // ...\n  spacing: {\n    s: 8,\n    m: 16,\n    l: 24,\n  },\n  colors: {\n    cardRegularBackground: '#EEEEEE',\n  },\n  breakpoints: {\n    phone: 0,\n    tablet: 768,\n  },\n  cardVariants: {\n    defaults: {\n      // We can define defaults for the variant here.\n      // This will be applied after the defaults passed to createVariant and before the variant defined below.\n    },\n    regular: {\n      // We can refer to other values in the theme here, and use responsive props\n      padding: {\n        phone: 'x2',\n        tablet: 'x3',\n      },\n    }\n    elevated: {\n      padding: {\n        phone: 'x2',\n        tablet: 'x3',\n      },\n      shadowColor: '#000',\n      shadowOpacity: 0.2,\n      shadowOffset: {width: 0, height: 5},\n      shadowRadius: 15,\n      elevation: 5,\n    }\n  }\n})\n\nimport {createVariant, createRestyleComponent, VariantProps} from '@shopify/restyle'\nconst variant = createVariant<Theme>({themeKey: 'cardVariants', defaults: {\n  margin: {\n    phone: 'x2',\n    tablet: 'x3',\n  },\n  backgroundColor: 'cardRegularBackground',\n}})\n\nconst Card = createRestyleComponent<VariantProps<Theme, 'cardVariants'>>([variant])\n\n// variant的值必须是`cardVariants`对象下的key值。TypeScript会自动给我们提示。\n<Card variant=\"elevated\" />\n```\n\n### Responsive 响应式\n\n我们通过在主题对象中定义 breakpoints（断点），来实现响应式效果。每个 Restyle 支持的属性都可以使用响应式写法来支持不同屏幕尺寸下的不同效果。示例如下：\n\n```tsx | pure\nconst theme = createTheme({\n  // ...\n  breakpoints: {\n    phone: 0,\n    tablet: 768,\n  }\n})\n\n// 用法1：不关心断点\n<Box flexDirection=\"row\" />\n\n// 用法2：不同尺寸不同效果\n<Box flexDirection={{ phone: 'column', tablet: 'row' }} />\n```\n\n另外，如果我们想要把一些属性跟响应式关联，我们可以借助`useResponsiveProp`这个 hooks。示例如下：\n\n```tsx | pure\nconst Button = ({ color = { phone: 'purple', tablet: 'blue' }, ...restProps }) => {\n  // 设备是phone的时候，值为purple；设备是tablet的时候，值为blue\n  const textColorProp = useResponsiveProp(color);\n\n  const bgColor = textColorProp === 'purple' ? 'lightPurple' : 'lightBlue';\n\n  return (\n    <Button backgroundColor={bgColor} {...restProps}>\n      {/* 这里不需要转，因为Text会自动转 */}\n      <Text color={color}>click me</Text>\n      <ActivityIndicator color={theme.colors[textColorProp]} />\n    </Button>\n  );\n};\n```\n\n### 主题切换\n\n基于`Restyle`实现主题切换效果很简单，我们只需要提供两套或者多套不同的主题即可。因为主题中并没有直接使用颜色，而是使用的调色板中的颜色，所以我们可以自由地切换主题。比如我们想要实现暗黑模式，示例如下：\n\n```tsx | pure\n// 定义主题对象\nexport const palette = {\n  purple: '#5A31F4',\n  white: '#FFF',\n  black: '#111',\n  darkGray: '#333',\n  lightGray: '#EEE',\n};\n\nconst theme = createTheme({\n  spacing: {\n    s: 8,\n    m: 16,\n  },\n  colors: {\n    mainBackground: palette.lightGray,\n    mainForeground: palette.black,\n\n    primaryCardBackground: palette.purple,\n    secondaryCardBackground: palette.white,\n    primaryCardText: palette.white,\n    secondaryCardText: palette.black,\n  },\n  breakpoints: {},\n  textVariants: {\n    body: {\n      fontSize: 16,\n      lineHeight: 24,\n      color: 'mainForeground',\n    },\n  },\n  cardVariants: {\n    primary: {\n      backgroundColor: 'primaryCardBackground',\n      shadowOpacity: 0.3,\n    },\n    secondary: {\n      backgroundColor: 'secondaryCardBackground',\n      shadowOpacity: 0.1,\n    },\n  },\n});\n\ntype Theme = typeof theme;\n\n// 定义暗黑主题。区别只是颜色不一样。\nconst darkTheme: Theme = {\n  ...theme,\n  colors: {\n    ...theme.colors,\n    mainBackground: palette.black,\n    mainForeground: palette.white,\n\n    secondaryCardBackground: palette.darkGray,\n    secondaryCardText: palette.white,\n  },\n};\n\n// 组件中使用\nconst App = () => {\n  const [darkMode, setDarkMode] = useState(false);\n  return (\n    <ThemeProvider theme={darkMode ? darkTheme : theme}>\n      <Box padding=\"x3\" backgroundColor=\"mainBackground\" flex={1}>\n        <Box backgroundColor=\"primaryCardBackground\" margin=\"x2\" padding=\"x3\" flexGrow={1}>\n          <Text variant=\"body\" color=\"primaryCardText\">\n            Primary Card\n          </Text>\n        </Box>\n        <Box backgroundColor=\"secondaryCardBackground\" margin=\"x2\" padding=\"x3\" flexGrow={1}>\n          <Text variant=\"body\" color=\"secondaryCardText\">\n            Secondary Card\n          </Text>\n        </Box>\n        <Box marginTop=\"x3\">\n          <Switch value={darkMode} onValueChange={(value: boolean) => setDarkMode(value)} />\n        </Box>\n      </Box>\n    </ThemeProvider>\n  );\n};\n\nexport default App;\n```\n"
  },
  {
    "path": "docs/react-native/theme.md",
    "content": "---\ntoc: menu\norder: 3\n---\n\n# Theme 主题\n\n`@shopify/restyle`库给我们提供了完备的主题定制功能。\n\n## Spacing 间距\n\n| 名称  | 说明  | 值   |\n| ----- | ----- | ---- |\n| `x0`  | 1 倍  | `0`  |\n| `x1`  | 1 倍  | `4`  |\n| `x2`  | 2 倍  | `8`  |\n| `x3`  | 3 倍  | `12` |\n| `x4`  | 4 倍  | `16` |\n| `x5`  | 5 倍  | `20` |\n| `x6`  | 6 倍  | `24` |\n| `x7`  | 7 倍  | `28` |\n| `x8`  | 8 倍  | `32` |\n| `x9`  | 9 倍  | `36` |\n| `x10` | 10 倍 | `40` |\n\n## 圆角\n\n| 名称  | 说明  | 值   |\n| ----- | ----- | ---- |\n| `x0`  | 1 倍  | `0`  |\n| `x1`  | 1 倍  | `4`  |\n| `x2`  | 2 倍  | `8`  |\n| `x3`  | 3 倍  | `12` |\n| `x4`  | 4 倍  | `16` |\n| `x5`  | 5 倍  | `20` |\n| `x6`  | 6 倍  | `24` |\n| `x7`  | 7 倍  | `28` |\n| `x8`  | 8 倍  | `32` |\n| `x9`  | 9 倍  | `36` |\n| `x10` | 10 倍 | `40` |\n\n## 媒体查询断点\n\n| 名称          | 说明   | 值     |\n| ------------- | ------ | ------ |\n| `phone`       | 手机   | `0`    |\n| `tablet`      | 平板   | `768`  |\n| `largeTablet` | 大平板 | `1024` |\n\n## 通用颜色\n\n| 名称          | 说明       | 值            |\n| ------------- | ---------- | ------------- |\n| `transparent` | 透明       | `transparent` |\n| `white`       | 白色       | `#FFFFFF`     |\n| `black`       | 黑色       | `#000000`     |\n| `func50`      | 功能色 0   | `#FBF5F5`     |\n| `func100`     | 功能色 1   | `#FFF7E3`     |\n| `func200`     | 功能色 2   | `#FFD21D`     |\n| `func300`     | 功能色 3   | `#52C41A`     |\n| `func400`     | 功能色 4   | `#1890FF`     |\n| `func500`     | 功能色 5   | `#F86E21`     |\n| `func600`     | 功能色 6   | `#F4333C`     |\n| `func700`     | 保留功能色 | `transparent` |\n| `func800`     | 保留功能色 | `transparent` |\n| `func900`     | 保留功能色 | `transparent` |\n\n**我们设置了`func700`/ `func800`/ `func900`作为保留功能色，方便开发者进行扩展**\n\n## 亮色模式颜色(继承通用颜色)\n\n| 名称          | 说明       | 值                      |\n| ------------- | ---------- | ----------------------- |\n| `primary50`   | 主色       | `#E5F1FF`               |\n| `primary100`  | 主色       | `#3AA3FF`               |\n| `primary200`  | 主色       | `#005DFF`               |\n| `primary300`  | 主色       | `rgba(0, 93, 255, 0.7)` |\n| `primary400`  | 主色       | `rgba(0, 93, 255, 0.4)` |\n| `primary500`  | 保留主色   | `transparent`           |\n| `primary600`  | 保留主色   | `transparent`           |\n| `primary700`  | 保留主色   | `transparent`           |\n| `primary800`  | 保留主色   | `transparent`           |\n| `primary900`  | 保留主色   | `transparent`           |\n| `gray50`      | 中性色     | `#F5F5F5`               |\n| `gray100`     | 中性色     | `#E5E5E5`               |\n| `gray200`     | 中性色     | `#CCCCCC`               |\n| `gray300`     | 中性色     | `#999999`               |\n| `gray400`     | 中性色     | `#666666`               |\n| `gray500`     | 中性色     | `#333333`               |\n| `gray600`     | 中性色     | `rgba(0, 0, 0, 0.4)`    |\n| `gray700`     | 中性色     | `rgba(0, 0, 0, 0.04)`   |\n| `gray800`     | 保留中性色 | `transparent`           |\n| `gray900`     | 保留中性色 | `transparent`           |\n| `background`  | 背景色     | 同`gray50`              |\n| `mask`        | 遮罩       | 同`gray600`             |\n| `border`      | 边框       | 同`gray200`             |\n| `icon`        | 图标       | 同`gray300`             |\n| `disabled`    | 禁用       | 同`gray200`             |\n| `text`        | 文本       | 同`gray500`             |\n| `text_active` | 当前文本   | 同`white`               |\n\n**我们设置了`primary600`/ `primary700`/ `primary800`/ `primary900`作为保留主色， `gray800` / `gray900`作为保留中性色，方便开发者进行扩展**\n\n## 暗色模式颜色(继承通用颜色)\n\n| 名称          | 说明       | 值                          |\n| ------------- | ---------- | --------------------------- |\n| `primary50`   | 主色       | `rgba(0, 93, 255, 0.3)`     |\n| `primary100`  | 主色       | `#3AA3FF`                   |\n| `primary200`  | 主色       | `#005DFF`                   |\n| `primary300`  | 主色       | `rgba(0, 93, 255, 0.7)`     |\n| `primary400`  | 主色       | `rgba(0, 93, 255, 0.4)`     |\n| `primary500`  | 保留主色   | `transparent`               |\n| `primary600`  | 保留主色   | `transparent`               |\n| `primary700`  | 保留主色   | `transparent`               |\n| `primary800`  | 保留主色   | `transparent`               |\n| `primary900`  | 保留主色   | `transparent`               |\n| `gray50`      | 中性色     | `#131C22`                   |\n| `gray100`     | 中性色     | `rgba(255, 255, 255, 0.15)` |\n| `gray200`     | 中性色     | `rgba(255, 255, 255, 0.25)` |\n| `gray300`     | 中性色     | `rgba(255, 255, 255, 0.4)`  |\n| `gray400`     | 中性色     | `rgba(255, 255, 255, 0.6)`  |\n| `gray500`     | 中性色     | `rgba(255, 255, 255, 0.8)`  |\n| `gray600`     | 中性色     | `rgba(0, 0, 0, 0.4)`        |\n| `gray700`     | 中性色     | `rgba(0, 0, 0, 0.04)`       |\n| `gray800`     | 保留中性色 | `transparent`               |\n| `gray900`     | 保留中性色 | `transparent`               |\n| `background`  | 背景色     | 同`gray50`                  |\n| `mask`        | 遮罩       | 同`gray600`                 |\n| `border`      | 边框       | 同`gray400`                 |\n| `icon`        | 图标       | 同`gray300`                 |\n| `disabled`    | 禁用       | 同`gray300`                 |\n| `text`        | 文本       | 同`gray500`                 |\n| `text_active` | 当前文本   | 同`white`                   |\n\n## TextVariant\n\n| 名称 | 字体大小(fontSize) | 字重(fontWeight) | 行高(lineHeight) |\n| ---- | ------------------ | ---------------- | ---------------- |\n| `h0` | 24                 | `bold`           | 39               |\n| `h1` | 18                 | `500`            | 25               |\n| `h2` | 16                 | `500`            | 22               |\n| `h3` | 14                 | `500`            | 19               |\n| `h4` |                    |                  |                  |\n| `h5` |                    |                  |                  |\n| `h6` |                    |                  |                  |\n| `h7` |                    |                  |                  |\n| `h8` |                    |                  |                  |\n| `h9` |                    |                  |                  |\n| `p0` | 16                 |                  | 22               |\n| `p1` | 14                 |                  | 19               |\n| `p2` | 12                 |                  | 16               |\n| `p3` | 10                 |                  | 14               |\n| `p4` |                    |                  |                  |\n| `p5` |                    |                  |                  |\n| `p6` |                    |                  |                  |\n| `p7` |                    |                  |                  |\n| `p8` |                    |                  |                  |\n| `p9` |                    |                  |                  |\n| `d0` | 24                 |                  | 28               |\n| `d1` | 18                 |                  | 21               |\n| `d2` | 12                 |                  | 14               |\n| `d3` |                    |                  |                  |\n| `d4` |                    |                  |                  |\n| `d5` |                    |                  |                  |\n| `d6` |                    |                  |                  |\n| `d7` |                    |                  |                  |\n| `d8` |                    |                  |                  |\n| `d9` |                    |                  |                  |\n\n**我们设置了`h4`/`h5`/`h6`/`h7`/`h8`/`h9`/`p4`/`p5`/`p6`/`p7`/`p8`/`p9`/`d3`/`d4`/`d5`/`d6`/`d7`/`d8`/`d9`作为保留的字体样式，方便开发者进行扩展**\n\n## 如何复写应用主题\n\n想要复写应用主题很简单，只需要如下操作就可以实现：\n\n### 1. 在应用中定义你自己的主题颜色文件：\n\n```ts | pure\nimport { theme, Theme } from '@td-design/react-native';\n\nexport const lightTheme: Theme = {\n  ...theme.lightTheme,\n  colors: {\n    ...theme.lightTheme.colors,\n    // 复写需要覆盖的颜色\n  },\n};\n\nexport const darkTheme: Theme = {\n  ...theme.darkTheme,\n  colors: {\n    ...theme.darkTheme.colors,\n    // 复写需要覆盖的颜色\n  },\n};\n```\n\n### 2. 把自定义主题注入到`app.tsx`里的`ThemeProvider`里:\n\n```jsx | pure\n// 其他import\nimport { ThemeProvider } from '@td-design/react-native';\nimport { lightTheme, darkTheme } from './theme';\n\nexport default () => {\n  // 其他代码\n\n  return <ThemeProvider theme={lightTheme}>{/** 其他Provider */}</ThemeProvider>;\n};\n```\n\n### 3. 实现亮色模式和暗色模式切换\n\n```jsx | pure\n// 其他import\nimport { ThemeProvider } from '@td-design/react-native';\nimport { lightTheme, darkTheme } from './theme';\n\nexport default () => {\n  const [dark, setDark] = useState(false);\n  // 其他代码\n\n  return (\n    <ThemeProvider theme={dark ? darkTheme : lightTheme}>\n      {/** 把setDark方法通过context或者其他全局变量的方式传递到应用里在需要的地方调用即可。 */}\n      {/** 其他Provider */}\n    </ThemeProvider>\n  );\n};\n```\n"
  },
  {
    "path": "docs/react-perf.md",
    "content": "---\nnav:\n  title: React应用开发性能优化手段\n  path: /faq\ngroup:\n  title: 开发常见问题\n  path: /\n  order: 2\n---\n\n# React 应用开发常见性能优化手段\n\n**性能优化应该遵循的基本法则：将变的部分和不变的部分分离。**\n\n- 变的部分：\n  - state\n  - props\n  - context\n\n`props`和`context`都是基于`state`演变过来的。父组件的`state`传给子组件，就成为了子组件的`props`； 父组件的`state`传到了`context`里，就成为一个子孙组件的`context`了。\n\n## 1. state 尽可能地下放到子组件\n\n```jsx | pure\nimport { useState } from 'react';\n\nfunction ExpensiveCpn() {\n  let now = performance.now();\n  while (performance.now() - now < 100) {}\n  console.log('耗时的组件 render');\n  return <p>耗时的组件</p>;\n}\n\nexport default function App() {\n  const [num, updateNum] = useState(0);\n\n  return (\n    <div>\n      <input value={num} onChange={e => updateNum(+e.target.value)} />\n      <p>num is {num}</p>\n      <ExpensiveCpn />\n    </div>\n  );\n}\n```\n\n以上面的代码为例，当`num`发生变化的时候，`ExpensiveCpn`就会被重新渲染。因为`num`是`App`组件的 state，它的改变会让`App`组件重新渲染，`ExpensiveCpn`作为`App`的子组件，自然也就重新渲染了。\n\n所以，我们应该将`num`下放到跟`ExpensiveCpn`不相关的子组件中：\n\n```jsx | pure\nimport { useState } from 'react';\n\nfunction ExpensiveCpn() {\n  let now = performance.now();\n  while (performance.now() - now < 100) {}\n  console.log('耗时的组件 render');\n  return <p>耗时的组件</p>;\n}\n\nfunction Input() {\n  const [num, updateNum] = useState(0);\n  return (\n    <>\n      <input value={num} onChange={e => updateNum(+e.target.value)} />\n      <p>num is {num}</p>\n    </>\n  );\n}\n\nexport default function App() {\n  return (\n    <div>\n      <Input />\n      <ExpensiveCpn />\n    </div>\n  );\n}\n```\n\n如上所示，现在`num`状态位于`Input`组件中，它的改变只会引起`Input`组件自身的重新渲染，而不会引起`ExpensiveCpn`的重新渲染。\n\n假如在`App`里面用到了`num`这个`state`，那我们又能怎么优化代码呢？ 答案是我们可以借助`children`来实现：\n\n优化前的代码：\n\n```jsx | pure\nimport { useState } from 'react';\n\nfunction ExpensiveCpn() {\n  let now = performance.now();\n  while (performance.now() - now < 100) {}\n  console.log('耗时的组件 render');\n  return <p>耗时的组件</p>;\n}\n\nexport default function App() {\n  const [num, updateNum] = useState(0);\n  return (\n    <div title={num + ''}>\n      <input value={num} onChange={e => updateNum(+e.target.value)} />\n      <p>num is {num}</p>\n      <ExpensiveCpn />\n    </div>\n  );\n}\n```\n\n优化后的代码：\n\n```jsx | pure\nimport { ReactNode, useState } from 'react';\n\nfunction ExpensiveCpn() {\n  let now = performance.now();\n  while (performance.now() - now < 100) {}\n  console.log('耗时的组件 render');\n  return <p>耗时的组件</p>;\n}\n\nfunction InputWrapper({ children }: { children: ReactNode }) {\n  const [num, updateNum] = useState(0);\n\n  return (\n    <div title={num + ''}>\n      <input value={num} onChange={e => updateNum(+e.target.value)} />\n      <p>num is {num}</p>\n      {children}\n    </div>\n  );\n}\n\nexport default function App() {\n  return (\n    <InputWrapper>\n      <ExpensiveCpn /> // <- 把`ExpensiveCpn`做为`InputWrapper`的`children`\n    </InputWrapper>\n  );\n}\n```\n\n## 2. 避免不必要的 re-render\n\n以`FlatList.renderItem`的使用为例：\n\n```jsx | pure\nconst renderItem = useCallback(\n  ({ item: { node } }) => {\n    const slug = node.slug;\n\n    const handlePress = () => {\n      push('SignedOutAssetScreen', { assetSlug: slug });\n    };\n\n    return <MarketCell onPress={handlePress} key={node.uuid} asset={node} />;\n  },\n  [push]\n);\n\n// const MarketCell = memo((props) => ...)\n```\n\n上面的代码，即便是`renderItem`方法被`useCallback`包裹了，但`MarketCell`组件还是会重新渲染。因为`useCallback`里面定义的函数每次都会重新创建，导致`MarketCell`组件重新渲染。\n\n所以解决办法也很简单，我们只要把`handlePress`方法用`useCallback`包裹起来，就不会重新创建，这样就不会重新渲染了。同时我们应该把整个`renderItem`里面的函数封装成一个自定义组件：\n\n```jsx | pure\nconst Item = memo(({ asset }: { asset: MarketCellProps['asset'] & { slug: string } }) => {\n  const slug = asset.slug;\n\n  // 将push方法从renderItem的依赖，转移到自定义组件内部\n  const { push } = useStackNavigation();\n\n  // handlePress 不会被重新创建\n  const handlePress = useCallback(() => {\n    push('SignedOutAssetScreen', { assetSlug: slug });\n  }, [slug, push]);\n\n  return <MarketCell onPress={handlePress} asset={asset} />;\n});\n\n// renderItem 返回一个组件\nconst renderItem = useCallback(({ item: { node } }) => {\n  return <Item key={node.uuid} asset={node} />;\n}, []);\n```\n\n## 3. 使用`useMemo`来缓存计算耗时的结果\n\n如果在一个组件里面会调用一个计算特别耗时的函数，那么我们应该使用`useMemo`来缓存计算结果，以避免重复计算。\n\n```jsx | pure\n// 避免这样做\nfunction Component(props) {\n  const calcResult = heavyCalculation(props.item);\n\n  return <AnotherComponent value={calcResult} />;\n}\n\n// 只有 `props.item` 改变时someProp的值才会被重新计算\nfunction Component(props) {\n  const calcResult = useMemo(() => heavyCalculation(props.item), [props.item]);\n\n  return <AnotherComponent value={calcResult} />;\n}\n```\n\n## 4. 避免使用内联对象和内联函数\n\n使用内联对象时，react 会在每次渲染时重新创建对此对象的引用，这会导致接收此对象的组件将其视为不同的对象。因此，该组件对于 prop 的浅层比较始终返回 false，导致组件一直重新渲染。\n\n```jsx | pure\nfunction Component(props) {\n  return <AnotherComponent style={{ margin: 0 }} {...props} />;\n}\n```\n\n- 如果这个对象跟 props 无关，那么我们可以把它抽取出作为一个变量定义在组件外部；\n- 如果这个对象跟 props 有关，那么我们可以用`useMemo`帮我们缓存这个对象，以避免重复创建。\n\n```jsx | pure\n// 跟props无关\nconst style = { margin: 0 };\nfunction Component(props) {\n  return <AnotherComponent style={style} {...props} />;\n}\n\n// 跟props有关\nfunction Component(props) {\n  const style = useMemo(() => ({ margin: props.margin }), [props.margin]);\n\n  return <AnotherComponent style={style} {...props} />;\n}\n```\n\n内联函数也是一样，组件每次渲染时都会创建一个新的引用。这时我们可以用`useCallback`进行包裹，以避免重复创建。\n\n```jsx | pure\n// bad\nfunction Component(props) {\n  return (\n    <AnotherComponent\n      {...props}\n      onPress={() => {\n        // do something...\n      }}\n    />\n  );\n}\n\n// good\nfunction Component(props) {\n  const handlePress = useCallback(() => {\n    // do something...\n  }, []);\n\n  return <AnotherComponent {...props} onPress={handlePress} />;\n}\n```\n\n**推荐使用[ahooks/useMemoizedFn](https://ahooks-next.surge.sh/zh-CN/hooks/use-memoized-fn)，它会自动帮你缓存函数的返回值，并且可以接受一个参数，用于指定缓存的依赖。**\n\n## 5. 遍历生成组件时使用 key\n\n老生常谈的话题，这也是在渲染列表时必须要做的事儿。可以讨论的是到底可不可以用`index`作为 key 呢？首先，官方文档里面推荐的使用列表项里面自带一个能够唯一标识的属性作为 key；但是，官网文档里面并没有说不能用 index 作为 key，[官方文档链接](https://reactjs.org/docs/lists-and-keys.html)。只是提醒说如果列表项会改变的情况下不能用 index 作为 key。\n\n所以，我们如果能够保证列表项不会改变，那么我们就可以用`index`作为 key。\n\n```jsx | pure\nconst todoItems = todos.map(todo => (\n  // 优先使用todo里面能唯一标识这条数据的属性作为key\n  <li key={todo.id}>{todo.text}</li>\n));\n\n// 或者\n\nconst todoItems = todos.map((todo, index) => (\n  // 用index作为key需要保证todos不会改变\n  <li key={index}>{todo.text}</li>\n));\n```\n\n## 6. 延迟加载不是立即需要的组件\n\n常见做法：\n\n- 使用`React.lazy`，在组件加载时才加载组件；\n\n```jsx | pure\nconst Component = React.lazy(() => import('./Component'));\n```\n\n- 基于路由进行代码分割，如`react-router` / `umi`\n\n- 组件按需加载， 配合插件`babel-plugin-import`使用\n\n```jsx | pure\nimport { Button } from 'antd';\n```\n\n## 7. Context 性能优化\n\n跨层级传递数据，通常会使用 React Context 作为媒介，hooks 提出之后，使用 context 前所未有的方便，但同样地，context payload 变更会触发所有用到了这个 Context 的组件重新渲染，即使这个组件用到的那部分数据没有发生变化。\n\n```jsx | pure\nimport React, { useContext, useState } from 'react';\n\nconst ThemeContext = React.createContext();\n\nexport function ChildNonTheme() {\n  console.log('不关心皮肤的子组件渲染了');\n  return <div>我不关心皮肤，皮肤改变的时候别让我重新渲染！</div>;\n}\n\nexport function ChildWithTheme() {\n  const theme = useContext(ThemeContext);\n  return <div>我是有皮肤的哦~ {theme}</div>;\n}\n\nexport default function App() {\n  const [theme, setTheme] = useState('light');\n  const onChangeTheme = () => setTheme(theme === 'light' ? 'dark' : 'light');\n  return (\n    <ThemeContext.Provider value={theme}>\n      <button onClick={onChangeTheme}>改变皮肤</button>\n      <ChildWithTheme />\n      <ChildNonTheme />\n    </ThemeContext.Provider>\n  );\n}\n```\n\n上面的代码中，`theme`发生改变的时候，会让`ChildNonTheme`组件也跟着被重新渲染（虽然它压根儿就不关心 theme，但谁让它在 Context 下呢...）\n\n怎么解这个问题呢？我们可以巧妙地利用`children`来解决。\n\n```jsx | pure\nimport React, { useContext, useState } from 'react';\n\nconst ThemeContext = React.createContext();\n\nfunction ChildNonTheme() {\n  console.log('不关心皮肤的子组件渲染了');\n  return <div>我不关心皮肤，皮肤改变的时候别让我重新渲染！</div>;\n}\n\nfunction ChildWithTheme() {\n  const theme = useContext(ThemeContext);\n  return <div>我是有皮肤的哦~ {theme}</div>;\n}\n\n// 定义一个组件，把`children`传进去\nfunction ThemeApp({ children }) {\n  const [theme, setTheme] = useState('light');\n  const onChangeTheme = () => setTheme(theme === 'light' ? 'dark' : 'light');\n  return (\n    <ThemeContext.Provider value={theme}>\n      <button onClick={onChangeTheme}>改变皮肤</button>\n      {children}\n    </ThemeContext.Provider>\n  );\n}\n\nexport default function App() {\n  return (\n    <ThemeApp>\n      {/* 这两个组件作为ThemeApp组件的chilren传进去 */}\n      <ChildWithTheme />\n      <ChildNonTheme />\n    </ThemeApp>\n  );\n}\n```\n\n对`ThemeApp`组件而言， `ChildWithTheme`和`ChildNonTheme`是作为`children`传进来的，也就意味着`ThemeApp`组件在重新渲染时，是不会对 children 造成影响的。可以直接复用。\n\n## 8. 多用 Fragment\n\nreact 规定返回多个元素必须要有一个父元素，这样一来就会导致应用中多出现了很多无用的父元素，这样会导致性能问题。\n\n```jsx | pure\nfunction Component() {\n  return (\n    <div>\n      <h1>Hello world!</h1>\n      <h1>Hello there!</h1>\n      <h1>Hello there again!</h1>\n    </div>\n  );\n}\n```\n\n我们可以使用`Fragment`或者`<></>`来避免创建不必要的元素\n\n```jsx | pure\nfunction Component() {\n  return (\n    <>\n      <h1>Hello world!</h1>\n      <h1>Hello there!</h1>\n      <h1>Hello there again!</h1>\n    </>\n  );\n}\n```\n\n## 9. 正确认识 props\n\n我们知道，父组件传值给子组件有两种方式，第一种是通过`props`，第二种是通过`context`。\n\n但是，即便一个子组件不接收任何`props`，这并不意味着它的 props 不存在，相反，props 一直存在，这种情况下它是一个`{}`。\n\nReact 中是默认使用全等来判断`props`是否相等的，所以即便是`{}`也不会被认为是相等的。这就导致 react 的性能优化没有被命中，从而子组件还是发生了重新渲染。\n\n```jsx | pure\nimport React, { useState, useContext } from 'react';\n\nconst numCtx = React.createContext < number > 0;\nconst updateNumCtx = React.createContext < React.Dispatch < number >> (() => {});\n\nfunction Button() {\n  const updateNum = useContext(updateNumCtx); // updateNum是一个dispatch，它是不变的。\n  console.log('btn render');\n  return <button onClick={() => updateNum(Math.random())}>产生随机数</button>;\n}\n\nfunction Show() {\n  const num = useContext(numCtx); // 用到了context里面的num，所以num改变时会触发重新渲染。\n  return <p>num is: {num}</p>;\n}\n\nconst Middle = () => {\n  return (\n    <>\n      <Button />\n      <Show />\n    </>\n  );\n};\n\nexport default function App() {\n  const [num, updateNum] = useState(0);\n\n  return (\n    <numCtx.Provider value={num}>\n      <updateNumCtx.Provider value={updateNum}>\n        <Middle />\n      </updateNumCtx.Provider>\n    </numCtx.Provider>\n  );\n}\n```\n\n如上代码所示，虽然 Middle 不接收任何 props，但是实际上 props 是{}, react 在用全等比较的时候，{}和{}不会认为是相等的，所以 APP 组件发生重新渲染的时候，Middle 组件也会跟着重新渲染，从而使它的 Button 子组件也跟着重新渲染。\n\n我们可以使用`memo`或者`useMemo`来解决 Middle 组件的重新渲染问题。\n\n```jsx | pure\n// 使用memo\nconst Middle = React.memo(() => {\n  return (\n    <>\n      <Button />\n      <Show />\n    </>\n  );\n});\n\n// 使用useMemo\nconst Middle = () => {\n  return useMemo(\n    () => (\n      <>\n        <Button />\n        <Show />\n      </>\n    ),\n    []\n  );\n};\n```\n"
  },
  {
    "path": "docs/rn-faq.md",
    "content": "---\nnav:\n  title: RN应用开发常见问题\n  path: /faq\ngroup:\n  title: 开发常见问题\n  path: /\n  order: 0\n---\n\n# RN 应用开发常见问题\n\n## 1. 自定义图标\n\n## 2. 集成极光推送\n\n## 3. 集成热更新\n\n### 安装与注册 CodePush\n\n- 在终端输入`npm install -g code-push-cli`\n- 安装完毕后，输入`code-push -v`查看版本，如看到版本号则代表安装成功\n- 在终端输入 `code-push register`，会在浏览器自动打开注册页面让你选择授权账号，授权通过之后 CodePush 会告诉你 access key，复制此可以到终端即可完成注册\n- 然后输入`code-push login`进行登录，登录成功会提示 successfully logged-in\n- 为了让 CodePush 服务器知道你的 app，我们需要向它注册 app：在终端输入`code-push app add <appName> <os> react-native`，如: `code-push app add animalHusbandryCollectorApp android react-native`。一般`appName`就是项目中`app.json`文件中的`name`。注册完成之后会返回一套 `deploymentKey`，请记录下该 key，会在后面步骤中用到。如果 android 和 iOS 都需要热更新功能，需要分别生成一套 key\n\n```code\ncode-push app add animalHusbandryCollectorApp-android android react-native\ncode-push app add animalHusbandryCollectorApp-ios ios react-native\n```\n\n### 项目中安装依赖\n\n```code\n    yarn add react-native-code-push\n```\n\n### Android 配置\n\n- `android/app/build.gradle。把上面生成的 android 的 deploymentKey 放到下面 buildTypes 中`\n\n```code\napply from: \"../../node_modules/react-native/react.gradle\"\napply from: \"../../node_modules/react-native-code-push/android/codepush.gradle\" // <- 添加这行\n\nandroid {\n   ...\n    signingConfigs {\n        debug {\n            storeFile file('debug.keystore')\n            storePassword 'android'\n            keyAlias 'androiddebugkey'\n            keyPassword 'android'\n        }\n        releaseStaging {\n            storeFile file('staging.keystore')\n            storePassword 'android'\n            keyAlias 'androidstagingkey'\n            keyPassword 'android'\n        }\n        release {\n            if (project.hasProperty('RELEASE_STORE_FILE')) {\n                storeFile file(RELEASE_STORE_FILE)\n                storePassword RELEASE_STORE_PASSWORD\n                keyAlias RELEASE_KEY_ALIAS\n                keyPassword RELEASE_KEY_PASSWORD\n            }\n        }\n    }\n\n    buildTypes {\n        debug {\n            ...\n            // Note: CodePush updates should not be tested in Debug mode as they are overriden by the RN packager. However, because CodePush checks for updates in all modes, we must supply a key.\n            resValue \"string\", \"CodePushDeploymentKey\", '\"\"'\n            ...\n        }\n\n        releaseStaging.initWith(release)\n        releaseStaging {\n            ...\n            signingConfig signingConfigs.releaseStaging\n            resValue \"string\", \"CodePushDeploymentKey\", '\"<INSERT_STAGING_KEY>\"'\n\n            // Note: It is a good idea to provide matchingFallbacks for the new buildType you create to prevent build issues\n            // Add the following line if not already there\n            matchingFallbacks = ['release']\n            ...\n        }\n\n        release {\n            ...\n            resValue \"string\", \"CodePushDeploymentKey\", '\"<INSERT_PRODUCTION_KEY>\"'\n            ...\n        }\n    }\n    ...\n}\n\n```\n\n- `android/settings.gradle`\n\n```code\ninclude ':app', ':react-native-code-push'\nproject(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')\n```\n\n- `MainApplication.java`\n\n```java\nimport com.microsoft.codepush.react.CodePush;\n\nprivate final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {\n  ...\n  @Override\n  protected String getJSBundleFile() {\n    return CodePush.getJSBundleFile();\n  }\n};\n```\n\n### IOS 配置\n\n```code\ncd ios && pod install\n```\n\n- `AppDelegate.m`\n\n```code\n#import <CodePush/CodePush.h>\n\n// 把下面这行代码：\nreturn [[NSBundle mainBundle] URLForResource:@\"main\" withExtension:@\"jsbundle\"];\n// 改成：\nreturn [CodePush bundleURL];\n\n// 最后的sourceURLForBridge方法如下：\n- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge\n{\n  #if DEBUG\n    return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\"index\" fallbackResource:nil];\n  #else\n    return [CodePush bundleURL];\n  #endif\n}\n```\n\n- Info.plist 执行命令：`appcenter codepush deployment list -a <ownerName>/<appName> -k`查看 server 上的 deployment key 在`Info.plist`文件里面新建一个键值对：\n\n```code\n<key>CodePushDeploymentKey</key>\n<string>Your Deployment Key</string>\n```\n\n- 打开 xcode，选中自己的项目，选中**project**下的项目名称，选择`Info`标签页，点击`Configurations`下的加号，选择`Duplicate \"Release\" Configuration` 命名为`Staging`.\n<center>\n<img src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644829195776339205.png\" alt=\"数组插入\" width=\"400\" />\n</center>\n\n- 选择`Build Settings`标签页，点击加号，选择`Add User Defined Setting`用.xcodeproj 打开项目，先把 Debug/Release/Staging 的值配置好： Debug: `$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)` Release: `$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)` Staging: `$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)` 然后把配置名称改成：`CONFIGURATION_BUILD_DIR`，然后再切换回.xcworkspace 打开项目\n<center>\n<img src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644829210496443837.png\" alt=\"数组插入\" width=\"400\" />\n</center>\n\n- 再次选择`Add User Defined Setting`，输入`CODEPUSH_KEY`，通过命令`appcenter codepush deployment list -a <ownerName>/<appName> -k`把`Staging`和`Production`的 deployment key 分别填到`CODEPUSH_KEY`下匹配的属性里。\n\n- 打开`Info.plist`，把之前的`CodePushDeploymentKey`的值改成`$(CODEPUSH_KEY)`\n\n- 重新运行`pod install`\n\n- 运行代码，能够正常启动模拟器，就表示集成成功\n\n### 代码中使用\n\n1. 在项目中增加文件（可以直接拷贝）：`scripts/codePush/index.js`\n\n```code\n'use strict';\n\nconst { makePush } = require('./makePush');\nconst inquirer = require('inquirer');\n\nconst ENV_PARAMS = {\n  message: '请选择您要部署环境',\n  type: 'list',\n  name: 'environment',\n  items: {\n    1: 'Production',\n    2: 'Staging'\n  },\n  choices: ['Staging', 'Production']\n};\n\nconst PLATFORM_PARAMS = {\n  message: '请选择您要部署的平台',\n  type: 'list',\n  name: 'platform',\n  choices: ['both', 'android', 'ios'],\n  default: 'both'\n};\n\nconst VERSION_PARAMS = {\n  name: 'version',\n  type: 'input',\n  message: '请输入要更新的目标版本号'\n};\n\nconst DES_PARAMS = {\n  name: 'description',\n  type: 'editor',\n  message: '请输入本次修改的描述'\n};\n\nconst MANDATORY_PARAMS = {\n  message: '本次更新是否为强制更新',\n  type: 'list',\n  name: 'mandatory',\n  choices: ['true', 'false'],\n  default: 'false',\n};\n\nconst QUESTIONS = [ENV_PARAMS, PLATFORM_PARAMS, DES_PARAMS, VERSION_PARAMS, MANDATORY_PARAMS];\n\nfunction main (){\n  inquirer.prompt(QUESTIONS).then(option => {\n    const { description, environment, platform, version, mandatory } = option;\n    if (!description) {\n      console.error('你没有输入改动描述');\n      process.exit(1);\n    }\n    makePush({\n      environment,\n      platform,\n      version,\n      description,\n      mandatory,\n    });\n  });\n}\n\nmain();\n\n```\n\n2. 在项目中增加文件：`scripts/codePush/makePush.js`\n\n`注意：需要把下面的的包的名字给替换掉 thundersdata/rn-template-android ---> ownerName/在之前步骤注册的对应平台的app的名字，如果android和ios都需要热更新，则都要替换 `\n\n```code\n'use strict';\nconst shell = require('shelljs');\n\nfunction makePush({ environment, platform, description, mandatory, version }) {\n  let androidCmd = `appcenter codepush release-react -a thundersdata/rn-template-android -d ${environment} --description \"${description}\" -m \"${mandatory}\"`;\n  let iosCmd = `appcenter codepush release-react -a thundersdata/rn-template-ios -d ${environment} --description \"${description}\" -m \"${mandatory}\"`;\n  if (version) {\n    androidCmd += ` -t \"${version}\"`;\n    iosCmd += ` -t \"${version}\"`;\n  }\n  let finalCmd = '';\n  if (platform === 'both') {\n    finalCmd = `${androidCmd} && ${iosCmd}`;\n  } else if (platform === 'android') {\n    finalCmd = androidCmd;\n  } else {\n    finalCmd = iosCmd;\n  }\n\n  shell.exec(finalCmd);\n}\n\nmodule.exports = {\n  makePush,\n};\n\n```\n\n3. 在项目中添加文件：`hooks/useCodePush.ts`\n\n```code\nimport codePush, { DownloadProgress } from 'react-native-code-push';\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport { useRef } from 'react';\nimport { Modal, Toast } from '@td-design/react-native';\n\nexport function useCodePush() {\n  const key = useRef(-1);\n\n  const [progress, setProgress] = useSafeState<string>();\n\n  // eslint-disable-next-line complexity\n  const codePushStatusDidChange = async (syncStatus: codePush.SyncStatus) => {\n    switch (syncStatus) {\n      case codePush.SyncStatus.CHECKING_FOR_UPDATE:\n        // 0 - 正在查询CodePush服务器以进行更新。\n        console.info('[CodePush] Checking for update.');\n        break;\n      case codePush.SyncStatus.AWAITING_USER_ACTION:\n        // 1 - 有可用的更新，并且向最终用户显示了一个确认对话框。（仅在updateDialog使用时适用）\n        console.info('[CodePush] Awaiting user action.');\n        break;\n      case codePush.SyncStatus.DOWNLOADING_PACKAGE:\n        // 2 - 正在从CodePush服务器下载可用更新。\n        console.info('[CodePush] Downloading package.');\n        break;\n      case codePush.SyncStatus.INSTALLING_UPDATE:\n        // 3 - 已下载一个可用的更新，并将其安装。\n        console.info('[CodePush] Installing update.');\n        break;\n      case codePush.SyncStatus.UP_TO_DATE:\n        // 4 - 应用程序已配置的部署完全最新。\n        console.info('[CodePush] App is up to date.');\n        break;\n      case codePush.SyncStatus.UPDATE_IGNORED:\n        // 5 该应用程序具有可选更新，最终用户选择忽略该更新。（仅在updateDialog使用时适用）\n        console.info('[CodePush] User cancelled the update.');\n        break;\n      case codePush.SyncStatus.UPDATE_INSTALLED:\n        // 6 - 安装了一个可用的更新，它将根据 SyncOptions 中的 InstallMode指定在 syncStatusChangedCallback 函数返回后立即或在下次应用恢复/重新启动时立即运行。\n        console.info('[CodePush] Installed update.');\n        break;\n      case codePush.SyncStatus.SYNC_IN_PROGRESS:\n        // 7 - 正在执行的 sync 操作\n        console.info('[CodePush] Sync already in progress.');\n        break;\n      case codePush.SyncStatus.UNKNOWN_ERROR:\n        // -1 - 同步操作遇到未知错误。\n        console.info('[CodePush] An unknown error occurred.');\n        break;\n    }\n  };\n\n  const codePushDownloadDidProgress = (progress: DownloadProgress) => {\n    const curPercent = ((progress.receivedBytes / progress.totalBytes) * 100).toFixed(0);\n    console.info('[CodePushUtils] Downloading Progress', `${curPercent}%`);\n    setProgress(`${curPercent}%`);\n  };\n\n  const syncImmediate = async () => {\n    codePush.sync(\n      {\n        updateDialog: {\n          // 是否显示更新描述\n          appendReleaseDescription: true,\n          // 更新描述的前缀。 默认为\"Description\"\n          descriptionPrefix: '\\n\\n更新内容：\\n',\n          // 强制更新按钮文字，默认为continue\n          mandatoryContinueButtonLabel: '立即更新',\n          // 强制更新时的信息. 默认为\"An update is available that must be installed.\"\n          mandatoryUpdateMessage: '必须更新后才能使用',\n          // 非强制更新时，按钮文字,默认为\"ignore\"\n          optionalIgnoreButtonLabel: '稍后',\n          // 非强制更新时，确认按钮文字. 默认为\"Install\"\n          optionalInstallButtonLabel: '后台更新',\n          // 非强制更新时，检查到更新的消息文本\n          optionalUpdateMessage: '有新版本了，是否更新？',\n          // Alert窗口的标题\n          title: '更新',\n        },\n        installMode: codePush.InstallMode.IMMEDIATE,\n      },\n      codePushStatusDidChange,\n      codePushDownloadDidProgress,\n    );\n  };\n\n  /** 个人中心页面用 */\n  const checkForUpdate = async () => {\n    key.current = Toast.submitting({ content: '检查中...' });\n    const update = await codePush.checkForUpdate();\n    Toast.remove(key.current);\n    if (!update) {\n      Modal.alert({\n        title: '提示',\n        content: '当前版本没有发现需要安装的更新',\n      });\n    } else {\n      syncImmediate();\n    }\n  };\n\n  /** app启动时不需要弹窗提示 */\n  const checkForUpdateWithoutMessage = async () => {\n    const update = await codePush.checkForUpdate();\n    if (!update) {\n      // 如果没有在app启动时调用sync，则需要显式调用notifyAppReady，否则插件将认为更新失败并回滚回以前版本\n      codePush.notifyAppReady();\n    } else {\n      syncImmediate();\n    }\n  };\n\n  return {\n    progress,\n    checkForUpdate: useMemoizedFn(checkForUpdate),\n    checkForUpdateWithoutMessage: useMemoizedFn(checkForUpdateWithoutMessage),\n    sync: syncImmediate,\n  };\n}\n\n```\n\n4. `由于热更新时我们只能针对特定的版本进行热更新，所以为了保证后续用户手机上 app 版本的一致性，我们推荐使用强更新和热更新相结合的方式。当有版本更新时，我们推荐使用强更新功能，当需要对某个版本进行 bug 修复时，我们推荐使用热更新功能。`\n\n`注意：热更新要求app版本必须是三段式的，如: 1.1.0。`\n\n添加文件：`hooks/useCheckUpdate.ts`\n\n```code\nimport { useRef } from 'react';\nimport { helpers, Image, Modal, Toast } from '@td-design/react-native';\nimport { ForceUpdateEnum } from 'enums';\nimport RNFetchBlob from 'rn-fetch-blob';\nimport { PERMISSIONS, request } from 'react-native-permissions';\nimport { useCustomRequest } from './useCustomRequest';\nimport { useToast } from './useToast';\nimport { useCodePush } from './useCodePush';\nimport { Linking, Platform } from 'react-native';\n\nconst { px } = helpers;\n\nexport function useCheckUpdate(showMessage = false) {\n  const { toastFail } = useToast();\n  const { checkForUpdate, checkForUpdateWithoutMessage } = useCodePush();\n\n  const key = useRef(-1);\n\n  const appUpdate = async (androidDownloadUrl: string, appStoreUrl: string, version: string) => {\n    if (Platform.OS === 'android') {\n      const result = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);\n      if (result !== 'granted') {\n        toastFail('请授权APP下载文件的权限');\n        return;\n      }\n      key.current = Toast.submitting({ content: '下载中...' });\n      const downloadPath = RNFetchBlob.fs.dirs.DownloadDir + `/animalHusbandryCollectorApp-${version}.apk`;\n      const android = RNFetchBlob.android;\n      RNFetchBlob.config({\n        addAndroidDownloads: {\n          // 调起原生下载管理\n          useDownloadManager: true,\n          // 下载的安装包保存的名字\n          title: `animalHusbandryCollectorApp-${version}.apk`,\n          // 下载时候顶部通知栏的描述\n          description: '下载完成之后将会自动安装',\n          // 下载的文件格式\n          mime: 'application/vnd.android.package-archive',\n          // 下载完成之后扫描下载的文件\n          mediaScannable: true,\n          // 通知栏显示下载情况\n          notification: true,\n          // 下载地址\n          path: downloadPath,\n        },\n      })\n        .fetch('GET', androidDownloadUrl)\n        .then(res => {\n          android.actionViewIntent(res.path(), 'application/vnd.android.package-archive');\n        })\n        .catch(() => {\n          toastFail('下载失败');\n        })\n        .finally(() => {\n          Toast.remove(key.current);\n        });\n    } else {\n      Linking.canOpenURL(appStoreUrl)\n        .then(supported => {\n          if (!supported) {\n            console.warn('找不到对应的应用');\n            return false;\n          }\n          return Linking.openURL(appStoreUrl);\n        })\n        .catch(err => {\n          console.error('跳转到APP_STORE失败，失败原因：', err);\n        });\n    }\n  };\n\n  /**\n   * 根据版本号对比是否需要强制更新，默认版本号为三段 如：1.2.3\n   * 和后端约定：第一段和第二段为强制更新，第三段为非强制更新\n   * 如果是非强制更新的话，走热更新功能\n   */\n  const { run: checkUpdate } = useCustomRequest(API.collector.appVersion.check.fetch, {\n    manual: true,\n    onSuccess: data => {\n      if (data?.forcedUpdate === ForceUpdateEnum.强制) {\n        Modal.alert({\n          icon: (\n            <Image\n              source={require('modules/offline/assets/modal_confirm.webp')}\n              style={{ width: px(55), height: px(55), marginTop: px(36) }}\n            />\n          ),\n          title: '版本更新',\n          content: '检测到有新版本请立即升级',\n          onPress: () => appUpdate(data?.downloadUrl ?? '', data?.appStoreUrl ?? '', data?.version ?? ''),\n        });\n        return;\n      }\n\n      // 热更新，判断是否需要显示检查更新的弹窗\n      if (showMessage) {\n        checkForUpdate();\n      } else {\n        checkForUpdateWithoutMessage();\n      }\n    },\n  });\n  return { checkUpdate };\n}\n\n```\n\n配置文件：`android/app/src/main/AndroidManifest.xml`，否则 android apk 下载失败\n\n```code\n    ...\n    <!-- 文件权限 -->\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.DOWNLOAD_WITHOUT_NOTIFICATION\" />\n    <uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\" />\n    ...\n    <intent-filter>\n      <action android:name=\"android.intent.action.VIEW\" />\n      <action android:name=\"android.intent.action.DOWNLOAD_COMPLETE\"/> ---->添加这行\n      ...\n    </intent-filter>\n```\n\n5. 添加 `npm scripts`\n\n```code\n{\n  \"scripts\": {\n    ...\n    \"codePush\": \"node scripts/codePush/index.js\",\n    \"android:staging\": \"yarn bundle && cd ./android && ./gradlew app:assembleReleaseStaging\",\n    ...\n  },\n}\n```\n\n6. 在 `App.tsx`中使用\n\n```code\nimport { SafeAreaProvider } from 'react-native-safe-area-context';\nimport { NavigationContainer, DefaultTheme } from '@react-navigation/native';\nimport { hide as hideSplash } from 'react-native-bootsplash';\nimport { ThemeProvider } from '@td-design/react-native';\nimport { useMount } from '@td-design/rn-hooks';\nimport { getVersion } from 'react-native-device-info';\n\nimport { Stack } from './stacks';\nimport { authAtom } from 'atoms';\nimport { Fallback } from 'components';\nimport { lightTheme } from 'theme';\nimport { linking } from 'linking';\nimport { isSignedIn } from 'utils/auth';\nimport { useUpdateAtom } from 'jotai/utils';\nimport { useCheckUpdate } from 'hooks/useCheckUpdate';\n\nexport function App() {\n  const updateAuth = useUpdateAtom(authAtom);\n\n  const { checkUpdate } = useCheckUpdate();\n\n  useMount(() => {\n    const init = async () => {\n      // 判断用户是否已经登录\n      const signedIn = await isSignedIn();\n      updateAuth({ signedIn });\n    };\n\n    init().finally(async () => {\n      await hideSplash({ fade: true });\n      checkUpdate({ version: getVersion() });\n    });\n  });\n\n  return (\n    <SafeAreaProvider>\n      <ThemeProvider theme={lightTheme}>\n        <NavigationContainer linking={linking} fallback={<Fallback />} theme={DefaultTheme}>\n          <Stack />\n        </NavigationContainer>\n      </ThemeProvider>\n    </SafeAreaProvider>\n  );\n}\n\n```\n\n7. `发布热更新：在项目下执行命令：yarn codePush 然后按照步骤执行即可`\n\n## 4. 外链唤醒 APP\n"
  },
  {
    "path": "docs/screen.md",
    "content": "---\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 概要\n  order: 1\n---\n\n# 概要\n\n大屏素材库概要，集成一些常见的大屏组件及图表组件，统一样式。\n\n## 安装方式：\n\n```sh\nyarn add @td-design/lego\n```\n\n如果你要使用地图功能，请安装\n\n```sh\nyarn add @td-design/lego-map\n```\n\n如果你要使用视频播放功能，请安装\n\n```sh\nyarn add @td-design/lego-video\n```\n"
  },
  {
    "path": "docs/structure/array.md",
    "content": "---\ntoc: menu\n---\n\n# 数组 - Array\n\n## 什么是数组\n\n数组是一种线性结构，是一个存储相同类型的变量所组成的一个有序集合，数组中每一个变量称为元素，每个元素都有一个对应的索引（索引从 0 开始）。数组还有另一个特点，就是在内存中是顺序存储的。 内存是由一个个连续的内存单元所组成的，每一个内存单元都对应一个地址，在内存单元中，有些被占用了，有些是空闲的。 数组中的每一个元素，都存储在内存单元中，并且这些内存单元之间紧密排列，既不能打乱存储顺序，也不能跳过某个内存单元进行存储。\n\n> 线性表数据结构 从字面意思理解线性表数据结构是数据呈现线性存储的一种方式，有前后两个方向，数据呈一对一的关系，除头尾外，元素都是相连的。线性表数据结构还有链表、栈、队列。\n\n![Array](https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1619014497486978379)\n\n## js 中的数组\n\n基本上所有的语言都内置了数组这个结构，在 js 中也不例外。在 js 中数组是基于 对象来实现的，所有跟传统的数组有一些不同\n\n典型的数组：\n\n- 元素的数据类型相同\n- 使用连续的内存存储\n- 通过数字下标获取元素\n\njs 中的数组\n\n- 元素的数据类型可以不同\n- 内存不一定是连续的（对象是随机存储的）\n- 不能通过数字下标，而是通过字符串下标\n- 数组可以有任何 key。\n\n> 在内存中的存储不一定是连续的，可能根据不同环境的实现有不同的体现。在 V8 引擎中，数组有两种，一种是内存连续的快数组，一种是以堆栈存储的慢数组，快数组存储的是一些简单的数据，可以保证查询时候的性能，但是更耗费存储空间。慢数组牺牲了查询的时间节约了存储空间。引擎会根据数据的情况自动切换快慢数组。\n\n## 数组的优缺点\n\n### 数组的优点\n\n由于数组定义的空间是连续的，数组可以很方便的进行遍历，同时也可以通过数组的下标进行访问例如:\n\n```js\nconst a = [1, 2, 3, 4, 5, 6, 7, 8];\na[1]; // 2\n```\n\n> 同时由于数组连续的特性,遍历的时候有着一定的优势\n\n### 数组的缺点\n\n数组是有序的线性表，为了保证其有序，所以在对数组进行操作的时候会有更多的耗费，基本上对于数组的操作都是 O(n)复杂度的。\n\n- 在数组中插入元素\n\n如果我们希望在一个数组中的某一位置进行插入一个元素，由于数组是连续的，我们需要把插入位置给腾出来，需要把插入位置右侧的所有数据进行相应的后移一位，简单的说就是依次的把数组(i-1)位的值赋值给(i),再把元素赋值到指定索引上。\n\n<center>\n<img src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1619015200254077566.png\" alt=\"数组插入\" width=\"400\" />\n</center>\n\n```js\nArray.prototype.insert = function (index, node) {\n  if (index < 0 || index > this.length) {\n    return undefined;\n  }\n  for (let i = this.length - 1; i >= index; i -= 1) {\n    this[i + 1] = this[i];\n  }\n  this[index] = element;\n  return this;\n};\n```\n\n- 删除数组中元素\n\n删除数组的逻辑跟插入类似\n\n```js\nArray.prototype.delete = function (index) {\n  if (index < 0 || index > this.length) {\n    return undefined;\n  }\n  for (let i = index; i < this.length; i += 1) {\n    this[i] = this[i + 1];\n  }\n  this.pop();\n  return this;\n};\n```\n\n<center>\n<img src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1619015726909083485.png\" alt=\"数组删除\" width=\"400\" />\n</center>\n\n我们把数组里所有的元素都左移了一位，但数组的长度依没有改变，这意味着数组中有额外的一个元素（值是 undefined）。在最后一次循环里，i+1 引用了数组里还未初始化的一个位置。在 Java、C/C+或 C#等一些语言里，这样写可能会抛出异常，因此不得不在 numbers.length-1 处停止循环。最后用 pop 方法将数组最后一位移除，也可以将数组所有不是 undefined 给赋值一个新数组。\n\n## 多维数组\n\n多维数组是数组的元素也为一个数组\n\n```js\n// 一个简单的多维数组\nvar arr = [\n  [1, 2, 3],\n  [4, 5, 6],\n  [7, 8, 9],\n];\n```\n\n多维数组的扁平化\n\n```js\n// ES6 中提供的方法flat\nlet a = [1, [2, 3]];\na.flat(); // [1,2,3]\n\n// 循环\nlet arr1 = [1, 2, [3], [1, 2, 3, [4, [2, 3, 4]]]];\nfunction flatten(arr) {\n  while (arr.some(item => Array.isArray(item))) {\n    arr = [].concat(...arr);\n  }\n  return arr;\n}\nflatten(arr1); //[1, 2, 3, 1, 2, 3, 4, 2, 3, 4]\n```\n\n## 总结\n\njs 原本没有真正的数组，因为 js 的数组可以存放不同类型的数据，不同数据类型存储所需要的空间大小不同，这就导致用来存放数组的内存地址不可能是连续的。所以 js 的数组是按照类似哈希映射的方法存储的，这种方式的数组读写操作相对低效。\n\n数组是编程中极重要的一种数据结构，大部分语言都原生实现了数组数据结构。js 的数组更加灵活，而且原生实现了众多数组的操作方法，这些方法要经常使用务必做到烂熟于心。\n"
  },
  {
    "path": "docs/structure/index.md",
    "content": "---\ntitle: 数据结构介绍\ntoc: menu\nnav:\n  title: Structure\n---\n\n# 数据结构介绍\n\n> Data dominates. If you've chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming. <br/>数据占主导。如果您选择了正确的数据结构并组织得当，那么这些算法几乎总是不言而喻的。数据结构而非算法是编程的核心。\n"
  },
  {
    "path": "docs/structure/linkedList.md",
    "content": "---\ntoc: menu\n---\n\n# 链表 - LinkedList\n\n链表\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  preset: 'ts-jest/presets/js-with-ts',\n  testEnvironment: 'jsdom',\n  clearMocks: true,\n  coverageDirectory: 'coverage',\n  cacheDirectory: '.jest/cache',\n  testPathIgnorePatterns: ['/.history/'],\n  modulePathIgnorePatterns: ['<rootDir>/package.json'],\n  resetMocks: false,\n  setupFiles: ['raf/polyfill', './jest.setup.js'],\n  transform: {\n    '\\\\.ts?$': [\n      'ts-jest',\n      {\n        tsconfig: 'tsconfig.json',\n      },\n    ],\n  },\n  transformIgnorePatterns: ['^.+\\\\.js$'],\n  collectCoverageFrom: [\n    '<rootDir>/**/src/**/*.{js,jsx,ts,tsx}',\n    '!**/demo/**',\n    '!**/example/**',\n    '!**/es/**',\n    '!**/lib/**',\n    '!**/dist/**',\n  ],\n  moduleNameMapper: {\n    '^lodash-es$': 'lodash',\n  },\n  globals: {\n    '__DEV__': true,\n  }\n};\n"
  },
  {
    "path": "jest.setup.js",
    "content": "jest.mock('react-native', () => {\n  return {\n    Platform: {\n      OS: 'ios',\n      Version: 123,\n      isTesting: true,\n      select: objs => objs['ios'],\n    },\n    BackHandler: {\n      addEventListener: jest.fn(),\n      removeEventListener: jest.fn(),\n    },\n    AccessibilityInfo: {\n      addEventListener: jest.fn(),\n      removeEventListener: jest.fn(),\n      isBoldTextEnabled: jest.fn(),\n      isGrayscaleEnabled: jest.fn(),\n      isInvertColorsEnabled: jest.fn(),\n      isReduceMotionEnabled: jest.fn(),\n      isReduceTransparencyEnabled: jest.fn(),\n      isScreenReaderEnabled: jest.fn(),\n    },\n    AppState: {\n      currentState: 'mock-currentState',\n      addEventListener: jest.fn(),\n      removeEventListener: jest.fn(),\n    },\n    Keyboard: {\n      emit: jest.fn(),\n      addListener: jest.fn(),\n    },\n  };\n});\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"license\": \"Apache-2.0\",\n  \"name\": \"thundersdata-frontend\",\n  \"author\": \"陈杰 <chj_0507_dz@sina.com>\",\n  \"homepage\": \"https://github.com/thundersdata-frontend/td-design#readme\",\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\",\n    \"prepare\": \"husky install\",\n    \"build\": \"turbo run build\",\n    \"commit\": \"git-cz\",\n    \"test\": \"jest --passWithNoTests --detectOpenHandles --watch\",\n    \"coverage\": \"jest --coverage\",\n    \"prettier\": \"prettier --write --cache --cache-strategy metadata \\\"**/*.{tsx,ts,md}\\\"\",\n    \"doc:dev\": \"dumi dev\",\n    \"doc:build\": \"dumi build\",\n    \"changeset\": \"changeset\",\n    \"release\": \"pnpm build && changeset publish\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"node_modules/cz-customizable\"\n    }\n  },\n  \"lint-staged\": {\n    \"*.{ts,tsx,md}\": [\n      \"npm run prettier\"\n    ]\n  },\n  \"devDependencies\": {\n    \"@changesets/changelog-github\": \"^0.4.8\",\n    \"@changesets/cli\": \"^2.26.2\",\n    \"@commitlint/cli\": \"^17.6.7\",\n    \"@commitlint/config-conventional\": \"^17.6.7\",\n    \"@testing-library/react-hooks\": \"^8.0.1\",\n    \"@trivago/prettier-plugin-sort-imports\": \"^4.2.0\",\n    \"@types/jest\": \"^29.5.3\",\n    \"@umijs/plugin-esbuild\": \"^1.4.2\",\n    \"antd\": \"^4.23.6\",\n    \"babel-plugin-import\": \"^1.13.6\",\n    \"commitizen\": \"^4.3.0\",\n    \"cz-customizable\": \"^7.0.0\",\n    \"dumi\": \"^1.1.48\",\n    \"file-loader\": \"^6.2.0\",\n    \"husky\": \"^8.0.3\",\n    \"jest\": \"^29.6.1\",\n    \"jest-environment-jsdom\": \"^29.6.1\",\n    \"lint-staged\": \"^13.2.3\",\n    \"prettier\": \"^3.0.0\",\n    \"prettier-plugin-packagejson\": \"^2.4.5\",\n    \"raf\": \"^3.4.1\",\n    \"react\": \"^17.0.0\",\n    \"react-native\": \"^0.72.9\",\n    \"react-test-renderer\": \"^17.0.0\",\n    \"ts-jest\": \"^29.1.1\",\n    \"ts-node\": \"^10.9.1\",\n    \"turbo\": \"^1.10.9\",\n    \"yorkie\": \"^2.0.0\"\n  },\n  \"packageManager\": \"pnpm@7.3.0\",\n  \"engines\": {\n    \"node\": \">=16\",\n    \"pnpm\": \">=7.0.0\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"17.0.43\"\n  }\n}"
  },
  {
    "path": "packages/cli/README.md",
    "content": "# `@td-design/cli`\n\n> TODO: description\n\n## Usage\n\n```\nconst cli = require('@td-design/cli');\n\n// TODO: DEMONSTRATE API\n```\n"
  },
  {
    "path": "packages/cli/bin/index.js",
    "content": "#!/usr/bin/env node\n\nrequire('../lib/index.js');\n"
  },
  {
    "path": "packages/cli/package.json",
    "content": "{\n  \"name\": \"@td-design/cli\",\n  \"version\": \"2.6.2\",\n  \"description\": \"脚手架工具,用于创建项目,创建页面等功能\",\n  \"keywords\": [\n    \"thundersdata\",\n    \"frontend\",\n    \"cli\",\n    \"nodejs\"\n  ],\n  \"author\": \"陈杰 <chenjie@thundersdata.com>\",\n  \"homepage\": \"https://github.com/thundersdata-frontend/td-design#readme\",\n  \"license\": \"Apache-2.0\",\n  \"files\": [\n    \"bin/\",\n    \"lib/\"\n  ],\n  \"main\": \"lib/index.js\",\n  \"bin\": {\n    \"td-cli\": \"bin/index.js\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/thundersdata-frontend/td-design.git\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc -p ./tsconfig.build.json\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/thundersdata-frontend/td-design/issues\"\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\",\n  \"dependencies\": {\n    \"chalk\": \"^5.1.2\",\n    \"commander\": \"^9.4.1\",\n    \"download-git-repo\": \"^3.0.2\",\n    \"handlebars\": \"^4.7.7\",\n    \"inquirer\": \"^9.1.4\",\n    \"log-symbols\": \"^5.1.0\",\n    \"minimist\": \"^1.2.7\",\n    \"ora\": \"^6.1.2\",\n    \"prompt\": \"^1.3.0\",\n    \"semver\": \"^7.3.8\"\n  },\n  \"devDependencies\": {\n    \"@types/inquirer\": \"^9.0.2\",\n    \"typescript\": \"^4.8.4\"\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/index.ts",
    "content": "import chalk from 'chalk';\nimport { program } from 'commander';\nimport fs from 'fs';\nimport inquirer from 'inquirer';\n\nimport setupApp from './setupApp';\nimport setupSpa from './setupSpa';\n\nprogram\n  .version('1.0.0', '-v, --version')\n  .command('init <name>')\n  .action(name => {\n    if (!fs.existsSync(name)) {\n      validateProjectName(name);\n      inquirer\n        .prompt([\n          {\n            name: 'platform',\n            message: '请选择项目类型',\n            type: 'list',\n            choices: ['spa', 'app'],\n          },\n          {\n            name: 'branch',\n            message: '请选择项目分支',\n            type: 'input',\n            default: 'main',\n          },\n        ])\n        .then((answers: { platform: string; branch: string }) => {\n          if (answers.platform === 'spa') {\n            setupSpa.init(name, answers.branch);\n          } else if (answers.platform === 'app') {\n            setupApp.init(name, answers.branch);\n          }\n        });\n    } else {\n      console.log(chalk.red('项目已存在'));\n    }\n  });\nprogram.parse(process.argv);\n\n/**\n * 对项目名进行校验\n * @param {*} name\n */\nfunction validateProjectName(name: string) {\n  if (!String(name).match(/^[$A-Z_][0-9A-Z_$]*$/i)) {\n    console.error(\n      '\"%s\" is not a valid name for a project. Please use a valid identifier ' + 'name (alphanumeric).',\n      name\n    );\n    process.exit(1);\n  }\n\n  if (name === 'React') {\n    console.error('\"%s\" is not a valid name for a project. Please do not use the ' + 'reserved word \"React\".', name);\n    process.exit(1);\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/setupApp.ts",
    "content": "import chalk from 'chalk';\nimport download from 'download-git-repo';\nimport fs from 'fs';\nimport ora from 'ora';\nimport path from 'path';\n\nimport deleteOldDirs from './utils/deleteOldDirs';\nimport replaceProject from './utils/replaceProject';\nimport translateFilePath from './utils/translateFilePath';\nimport walk from './utils/walk';\n\nexport default {\n  init(projectName: string, branch: string) {\n    const repository = `thundersdata-frontend/rn-template#${branch}`;\n    console.log(chalk.green(`模板地址：${repository}`));\n    const spinner = ora('正在下载模板，请稍候...');\n    spinner.start();\n    download(repository, projectName, { clone: true }, (err: string) => {\n      if (err) {\n        spinner.fail();\n        console.log(chalk.red(err));\n      } else {\n        spinner.succeed();\n\n        const rootPath = path.resolve(projectName);\n        // 替换和生成所有重命名之后的文件和文件夹\n        walk(rootPath).forEach(absoluteFilePath => {\n          const relativeFilePath = path.relative(rootPath, absoluteFilePath);\n          const relativeRenamedPath = translateFilePath(relativeFilePath)\n            .replace(/rnTemplate/g, projectName)\n            .replace(/rntemplate/g, projectName.toLowerCase());\n\n          replaceProject(absoluteFilePath, path.resolve(rootPath, relativeRenamedPath), {\n            'Hello App Display Name': projectName,\n            rnTemplate: projectName,\n            rntemplate: projectName.toLowerCase(),\n          });\n        });\n        // 删除以前的旧的文件夹和文件夹下的内容\n        walk(rootPath).forEach(absoluteFilePath => {\n          if (fs.existsSync(absoluteFilePath) && fs.statSync(absoluteFilePath).isDirectory()) {\n            if (absoluteFilePath.includes('rnTemplate') || absoluteFilePath.includes('rntemplate')) {\n              deleteOldDirs(absoluteFilePath);\n            }\n          }\n        });\n        console.log(chalk.green('项目初始化完成'));\n      }\n    });\n  },\n};\n"
  },
  {
    "path": "packages/cli/src/setupSpa.ts",
    "content": "import chalk from 'chalk';\nimport download from 'download-git-repo';\nimport ora from 'ora';\n\nexport default {\n  init: function (name: string, branch: string) {\n    const repository = `thundersdata-frontend/spa-template#${branch}`;\n    console.log(chalk.green(`模板地址：${repository}`));\n    const spinner = ora('正在下载模板，请稍候...');\n    spinner.start();\n    download(repository, name, { clone: true }, (err: string) => {\n      if (err) {\n        spinner.fail();\n        console.log(chalk.red(err));\n      } else {\n        spinner.succeed();\n        console.log(chalk.green('项目初始化完成'));\n      }\n    });\n  },\n};\n"
  },
  {
    "path": "packages/cli/src/utils/deleteOldDirs.ts",
    "content": "import fs from 'fs';\n\nexport default function delDir(path: string) {\n  let files = [];\n  if (fs.existsSync(path)) {\n    files = fs.readdirSync(path);\n    files.forEach(file => {\n      const curPath = path + '/' + file;\n      if (fs.statSync(curPath).isDirectory()) {\n        delDir(curPath); //递归删除文件夹\n      } else {\n        fs.unlinkSync(curPath); //删除文件\n      }\n    });\n    fs.rmdirSync(path);\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/utils/replaceProject.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\n\nconst binaryExtensions = ['.png', '.jar', '.webp', '.ttf', '.svg', '.bat', '.properties', '.keystore'];\n\n/**\n * Copy a file to given destination, replacing parts of its contents.\n * @param srcPath Path to a file to be copied.\n * @param destPath Destination path.\n * @param replacements: e.g. {'TextToBeReplaced': 'Replacement'}\n */\nexport default function replaceProject(srcPath: string, destPath: string, replacements: Record<string, string>) {\n  if (fs.lstatSync(srcPath).isDirectory()) {\n    if (!fs.existsSync(destPath)) {\n      fs.mkdirSync(destPath);\n    }\n    // Not recursive\n    return;\n  }\n\n  const extension = path.extname(srcPath);\n  if (binaryExtensions.indexOf(extension) === -1) {\n    // Text file\n    const srcPermissions = fs.statSync(srcPath).mode;\n    let content = fs.readFileSync(srcPath, 'utf8');\n    Object.keys(replacements).forEach(\n      regex => (content = content.replace(new RegExp(regex, 'g'), replacements[regex]))\n    );\n    fs.writeFileSync(destPath, content, {\n      encoding: 'utf8',\n      mode: srcPermissions,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/utils/translateFilePath.ts",
    "content": "'use strict';\n\n/**\n * There are various files in the templates folder in the RN repo. We want\n * these to be ignored by tools when working with React Native itself.\n * Example: _babelrc file is ignored by Babel, renamed to .babelrc inside\n *          a real app folder.\n * This is especially important for .gitignore because npm has some special\n * behavior of automatically renaming .gitignore to .npmignore.\n */\nexport default function translateFilePath(path: string) {\n  if (!path) {\n    return path;\n  }\n  return path\n    .replace('_BUCK', 'BUCK')\n    .replace('_gitignore', '.gitignore')\n    .replace('_gitattributes', '.gitattributes')\n    .replace('_babel.config.js', 'babel.config.js')\n    .replace('_babelrc', '.babelrc')\n    .replace('_flowconfig', '.flowconfig')\n    .replace('_buckconfig', '.buckconfig')\n    .replace('_watchmanconfig', '.watchmanconfig');\n}\n"
  },
  {
    "path": "packages/cli/src/utils/walk.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\n\n('use strict');\n\nexport default function walk(current: string): string[] {\n  if (!fs.lstatSync(current).isDirectory()) {\n    return [current];\n  }\n\n  const files = fs.readdirSync(current).map(child => {\n    child = path.join(current, child);\n    return walk(child);\n  });\n  return [current].concat(...files);\n}\n"
  },
  {
    "path": "packages/cli/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,\n    \"module\": \"commonjs\" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,\n    \"outDir\": \"./lib\" /* 输出目录 */,\n    \"strict\": true /* 启用所有严格类型检查选项。 */,\n    \"baseUrl\": \"./\" /* 解析非绝对模块名称的基目录。 */,\n    \"esModuleInterop\": true /* 通过为所有导入创建命名空间对象，实现CommonJS和ES模块之间的互操作性。意味着“allowSyntheticDefaultImports”。 */,\n    \"experimentalDecorators\": true /* 启用对ES7装饰器的实验性支持。 */,\n    \"forceConsistentCasingInFileNames\": true /* 不允许对同一文件进行大小写不一致的引用。 */,\n    \"resolveJsonModule\": true /* 允许导入JSON文件 */,\n    \"skipLibCheck\": true\n  }\n  // \"exclude\": [\"node_modules\",]\n}\n"
  },
  {
    "path": "packages/cli/types.d.ts",
    "content": "declare module 'download-git-repo';\n"
  },
  {
    "path": "packages/eslint-plugin-replace-hooks/.eslintrc.js",
    "content": "'use strict';\n\nmodule.exports = {\n  root: true,\n  extends: ['eslint:recommended', 'plugin:eslint-plugin/recommended', 'plugin:node/recommended'],\n  env: {\n    es6: true,\n  },\n  parserOptions: {\n    ecmaVersion: 2020,\n    sourceType: 'module',\n  },\n  overrides: [\n    {\n      files: ['tests/**/*.js'],\n      env: { mocha: true },\n    },\n  ],\n};\n"
  },
  {
    "path": "packages/eslint-plugin-replace-hooks/README.md",
    "content": "# eslint-plugin-replace-hooks\n\nreplace some hooks by other hooks\n\n## Installation\n\nYou'll first need to install [ESLint](https://eslint.org/):\n\n```sh\nnpm i eslint --save-dev\n```\n\nNext, install `eslint-plugin-replace-hooks`:\n\n```sh\nnpm install eslint-plugin-replace-hooks --save-dev\n```\n\n## Usage\n\nAdd `replace-hooks` to the plugins section of your `.eslintrc` configuration file. You can omit the `eslint-plugin-` prefix:\n\n```json\n{\n  \"plugins\": [\n    \"replace-hooks\" // this must be placed before `import`\n  ]\n}\n```\n\nThen configure the rules you want to use under the rules section.\n\n```json\n{\n  \"rules\": {\n    \"replace-hooks/no-forbidden-hooks\": [\n      \"error\",\n      { \"useState\": { \"tip\": \"your custom hooks\", \"dependency\": \"your module\" } }\n    ]\n  }\n}\n```\n\n## Supported Rules\n\n- no-forbidden-hooks\n\n## Caution\n\n- this plugin should work with `eslint-plugin-import`, especially the rules `import/no-duplicates` to help merge import from same modules.\n- the plugin must be placed before `eslint-plugin-import`\n\n  plugins: [ // other plugins, 'replace-hooks', 'import', ]\n"
  },
  {
    "path": "packages/eslint-plugin-replace-hooks/docs/rules/no-forbidden-hooks.md",
    "content": "# no forbidden hooks in project (no-forbidden-hooks)\n\n## Rule Details\n\n可以通过配置，把项目中不允许使用的 hooks 标记出来，同时提示用指定的其他 hooks 替换\n\nExamples of **incorrect** code for this rule:\n\n```js\n// 其他配置\nrules: {\n  // 其他规则\n  'replace-hooks/no-forbidden-hooks': 'error',\n}\n\n```\n\nExamples of **correct** code for this rule:\n\n```js\n// 其他配置\nrules: {\n  // 其他规则\n  'replace-hooks/no-forbidden-hooks': ['error', { useState: 'useSafeState' }],\n}\n\n```\n\n### Options\n\n要提示错误的 hooks，是一个键值对。键是要提示错误的 hooks，值是提示要替换的 hooks。比如：\n\n```js\n{\n  useState: 'useSafeState';\n}\n```\n\n## When Not To Use It\n\n如果你的项目里不需要用一些自定义的 hooks 封装，替换默认的 hooks\n"
  },
  {
    "path": "packages/eslint-plugin-replace-hooks/gulpfile.js",
    "content": "const gulp = require('gulp');\nconst del = require('del');\n\n/**\n * 清理构建目录\n */\nasync function clean() {\n  /** 删除构建目录 */\n  await del('lib');\n}\n\nasync function copy() {\n  await gulp.src('./src/**/*').pipe(gulp.dest('lib/'));\n}\n\nexports.default = gulp.series(clean, copy);\n"
  },
  {
    "path": "packages/eslint-plugin-replace-hooks/package.json",
    "content": "{\n  \"name\": \"eslint-plugin-replace-hooks\",\n  \"version\": \"1.0.3\",\n  \"description\": \"replace some hooks by other hooks\",\n  \"keywords\": [\n    \"eslint\",\n    \"eslintplugin\",\n    \"eslint-plugin\"\n  ],\n  \"author\": \"chjdamon<chj_0507_dz@sina.com>\",\n  \"main\": \"lib/index.js\",\n  \"scripts\": {\n    \"build\": \"gulp\",\n    \"lint\": \"eslint .\",\n    \"test\": \"mocha tests --recursive\"\n  },\n  \"devDependencies\": {\n    \"del\": \"^6.0.0\",\n    \"eslint\": \"^8.25.0\",\n    \"eslint-plugin-es\": \"^4.1.0\",\n    \"eslint-plugin-eslint-plugin\": \"^5.0.6\",\n    \"eslint-plugin-node\": \"^11.1.0\",\n    \"gulp\": \"^4.0.2\",\n    \"mocha\": \"^10.1.0\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"requireindex\": \"^1.2.0\"\n  }\n}\n"
  },
  {
    "path": "packages/eslint-plugin-replace-hooks/src/index.js",
    "content": "/**\n * @fileoverview replace some hooks by other hooks\n * @author chjdamon\n */\n'use strict';\n\n//------------------------------------------------------------------------------\n// Requirements\n//------------------------------------------------------------------------------\n\nconst requireIndex = require('requireindex');\n\n//------------------------------------------------------------------------------\n// Plugin Definition\n//------------------------------------------------------------------------------\n\n// import all rules in lib/rules\nmodule.exports.rules = requireIndex(__dirname + '/rules');\n"
  },
  {
    "path": "packages/eslint-plugin-replace-hooks/src/rules/no-forbidden-hooks.js",
    "content": "/**\n * @fileoverview no forbidden hooks in project\n * @author chjdamon\n */\n'use strict';\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\nmodule.exports = {\n  meta: {\n    type: 'suggestion', // `problem`, `suggestion`, or `layout`\n    docs: {\n      description: 'no forbidden hooks in project',\n      recommended: true,\n      url: 'https://github.com/thundersdata-frontend/td-design/tree/main/packages/eslint-plugin-replace-hooks#readme', // URL to the documentation page for this rule\n    },\n    fixable: 'code', // Or `code` or `whitespace`\n    schema: [\n      {\n        type: 'object',\n      },\n    ], // Add a schema if the rule has options\n    messages: {\n      empty: '',\n      forbidden: '`{{name}}` is forbidden. try to use `{{tip}}` from `{{dependency}}` alternatively',\n    },\n  },\n\n  create(context) {\n    // variables should be defined here\n    if (!context.options || !Array.isArray(context.options) || context.options.length === 0) return {};\n    const pattern = context.options[0]; // {useState: {tip: 'useSafeState', dependency: '@td-design/rn-hooks'}}\n    //----------------------------------------------------------------------\n    // Helpers\n    //----------------------------------------------------------------------\n\n    // any helper functions should go here or else delete this section\n\n    //----------------------------------------------------------------------\n    // Public\n    //----------------------------------------------------------------------\n    if (!pattern) return {};\n    return {\n      // 删除要替换的hooks，插入代替的hooks的import\n      ImportSpecifier: node => {\n        Object.entries(pattern).forEach(([key, value]) => {\n          if (node.imported.name === key) {\n            context.report({\n              node,\n              messageId: 'forbidden',\n              data: {\n                name: key,\n                tip: value.tip,\n                dependency: value.dependency,\n              },\n              fix: fixer => [\n                fixer.remove(node),\n                fixer.insertTextAfterRange(\n                  [node.parent.range[0], node.parent.range[1] + 1],\n                  `import { ${value.tip} } from '${value.dependency}';\\n`\n                ),\n              ],\n            });\n          }\n        });\n      },\n\n      // 删除空的import\n      ImportDeclaration: node => {\n        if (node.specifiers.length === 0) {\n          context.report({\n            node,\n            messageId: 'empty',\n            fix: fixer => fixer.remove(node),\n          });\n        }\n      },\n\n      // 替换文本\n      'VariableDeclaration VariableDeclarator CallExpression Identifier': node => {\n        Object.entries(pattern).forEach(([key, value]) => {\n          if (node.name === key) {\n            context.report({\n              node,\n              messageId: 'forbidden',\n              data: {\n                name: key,\n                tip: value.tip,\n                dependency: value.dependency,\n              },\n              fix: fixer => fixer.replaceText(node, value.tip),\n            });\n          }\n        });\n      },\n    };\n  },\n};\n"
  },
  {
    "path": "packages/hooks/CHANGELOG.md",
    "content": "# @td-design/rn-hooks\n\n## 2.8.1\n\n### Patch Changes\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 优化代码性能\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复useCounter的bug\n\n## 2.8.0\n\n### Minor Changes\n\n- [#831](https://github.com/thundersdata-frontend/td-design/pull/831) [`85fcb2d49`](https://github.com/thundersdata-frontend/td-design/commit/85fcb2d49ad1a15f5db089b769ecfb610988c0d1) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 新增useInfiniteScroll\n\n## 2.7.4\n\n### Patch Changes\n\n- [#812](https://github.com/thundersdata-frontend/td-design/pull/812) [`603414f12`](https://github.com/thundersdata-frontend/td-design/commit/603414f12353bdd2ae1ffa1655fcddf8b799029b) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修改RN里面判断开发环境的方式\n\n## 2.7.3\n\n### Patch Changes\n\n- [#698](https://github.com/thundersdata-frontend/td-design/pull/698) [`52e472893`](https://github.com/thundersdata-frontend/td-design/commit/52e472893db980bbbc0131fe45da2188ec681542) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化 useRequest 组件在开发环境的提示\n\n## 2.7.2\n\n### Patch Changes\n\n- [#694](https://github.com/thundersdata-frontend/td-design/pull/694) [`8edd617ee`](https://github.com/thundersdata-frontend/td-design/commit/8edd617eee2d62d4c6daa6aa1c348464325cd358) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化部分 hooks 的代码\n\n## 2.7.1\n\n### Patch Changes\n\n- [#660](https://github.com/thundersdata-frontend/td-design/pull/660) [`94e1422ba`](https://github.com/thundersdata-frontend/td-design/commit/94e1422babc364a236695e12a80718336a039e70) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 修复 Modal 的几个方法在关闭后 Portal 没有被销毁的问题 2. 优化 ImagePicker 两个方法的写法 3. 修复 ActionSheet 的一些问题\n\n## 2.7.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n## 2.6.1\n\n### Patch Changes\n\n- [#643](https://github.com/thundersdata-frontend/td-design/pull/643) [`694c4666c`](https://github.com/thundersdata-frontend/td-design/commit/694c4666c116869ee9321dd579113136603b8ba3) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 pollingInterval 没有类型定义的问题\n\n## 2.6.0\n\n### Minor Changes\n\n- [#641](https://github.com/thundersdata-frontend/td-design/pull/641) [`68cfd28b1`](https://github.com/thundersdata-frontend/td-design/commit/68cfd28b1f3bc9bebfe8b6eda4979102054fb8df) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化 hooks\n\n## 2.5.1\n\n### Patch Changes\n\n- [`1cffe53a5`](https://github.com/thundersdata-frontend/td-design/commit/1cffe53a553b66a78b09a34ad091afae5cfc56c7) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 loading 在 ready 为 falsy 的时候一直都是 true 的问题\n\n## 2.5.0\n\n### Minor Changes\n\n- [`4d1d4db4c`](https://github.com/thundersdata-frontend/td-design/commit/4d1d4db4c83b1d37810af6c289adfade573364d8) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 移除某些 hooks 对 react-native-background-timer 的依赖\n\n  2. 重写 useSms\n"
  },
  {
    "path": "packages/hooks/package.json",
    "content": "{\n  \"name\": \"@td-design/rn-hooks\",\n  \"version\": \"2.8.1\",\n  \"description\": \"从ahooks里面抽取的一些在rn项目里可以使用的hooks。提高开发效率\",\n  \"keywords\": [\n    \"hooks\",\n    \"ahooks\"\n  ],\n  \"homepage\": \"https://github.com/thundersdata-frontend/td-design/tree/main/packages/hooks#readme\",\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/commonjs/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/thundersdata-frontend/td-design.git\"\n  },\n  \"scripts\": {\n    \"build\": \"rollup -c\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/thundersdata-frontend/td-design/issues\"\n  },\n  \"dependencies\": {\n    \"lodash-es\": \"^4.17.21\"\n  },\n  \"devDependencies\": {\n    \"@types/lodash-es\": \"^4.17.8\",\n    \"@types/node\": \"^20.4.4\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"typescript\": \"^5.1.6\",\n    \"@rollup/plugin-babel\": \"^6.0.3\",\n    \"@rollup/plugin-commonjs\": \"^25.0.3\",\n    \"@rollup/plugin-node-resolve\": \"^15.1.0\",\n    \"rollup\": \"^3.26.3\",\n    \"rollup-plugin-typescript2\": \"^0.35.0\",\n    \"tslib\": \"^2.6.0\"\n  }\n}"
  },
  {
    "path": "packages/hooks/rollup.config.js",
    "content": "const commonjs = require('@rollup/plugin-commonjs');\nconst resolve = require('@rollup/plugin-node-resolve');\nconst typescript = require('rollup-plugin-typescript2')\nconst fs = require(\"fs\")\n\nconst noDeclarationFiles = { compilerOptions: { declaration: false } };\n\nlet pkg = JSON.parse(fs.readFileSync('./package.json')),\n    external = Object.keys(pkg.dependencies || {});\n\n\nmodule.exports = [\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/commonjs',\n      format: 'cjs',\n      name: '[name].js',\n      preserveModules: true, \n      preserveModulesRoot: 'src',\n    },\n    plugins: [\n      resolve(),\n      commonjs(),\n      typescript({tsconfig: \"tsconfig.json\",tsconfigOverride:{ compilerOptions: { declaration: true ,declarationDir:'./lib/typescript'} },useTsconfigDeclarationDir: true}),\n    ],\n    external: ['react','react-native',...external,/node_modules/],\n  },\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/module',\n      format: 'esm',\n      entryFileNames: '[name].js',\n      preserveModules: true, \n      preserveModulesRoot: 'src',\n    },\n    plugins: [\n      resolve(),\n      commonjs({ mainFields: [\"module\", \"main\", \"jsnext:main\", \"browser\"],\n      extensions: [\".js\", \".mjs\", \".json\"],\n      sourceMap: false,\n      browser: true,}),\n      typescript({ tsconfigOverride: noDeclarationFiles}),\n    ],\n    external: ['react','react-native',...external,/node_modules/],\n  }\n]\n\n\n"
  },
  {
    "path": "packages/hooks/src/createUpdateEffect/index.test.ts",
    "content": "import { useEffect, useLayoutEffect } from 'react';\n\nimport { renderHook } from '@testing-library/react-hooks';\n\nimport { createUpdateEffect } from './index';\n\ndescribe('createUpdateEffect', () => {\n  it('should be defined', () => {\n    expect(createUpdateEffect).toBeDefined();\n  });\n\n  it('should work for useEffect', () => {\n    const useUpdateEffect = createUpdateEffect(useEffect);\n\n    let mountedState = 1;\n    const hook = renderHook(() =>\n      useUpdateEffect(() => {\n        mountedState = 2;\n      })\n    );\n    expect(mountedState).toEqual(1);\n    hook.rerender();\n    expect(mountedState).toEqual(2);\n  });\n\n  it('should work for useLayoutEffect', () => {\n    const useUpdateLayoutEffect = createUpdateEffect(useLayoutEffect);\n\n    let mountedState = 1;\n    const hook = renderHook(() =>\n      useUpdateLayoutEffect(() => {\n        mountedState = 2;\n      })\n    );\n    expect(mountedState).toEqual(1);\n    hook.rerender();\n    expect(mountedState).toEqual(2);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/createUpdateEffect/index.ts",
    "content": "import type { useEffect, useLayoutEffect } from 'react';\nimport { useRef } from 'react';\n\ntype effectHookType = typeof useEffect | typeof useLayoutEffect;\n\nexport const createUpdateEffect: (hook: effectHookType) => effectHookType = hook => (effect, deps) => {\n  const isMounted = useRef(false);\n\n  // for react-refresh\n  hook(() => {\n    return () => {\n      isMounted.current = false;\n    };\n  }, []);\n\n  hook(() => {\n    if (!isMounted.current) {\n      isMounted.current = true;\n    } else {\n      return effect();\n    }\n  }, deps);\n};\n"
  },
  {
    "path": "packages/hooks/src/index.ts",
    "content": "import { default as useAccessibilityInfo } from './useAccessibilityInfo';\nimport { default as useAppState } from './useAppState';\nimport { default as useAsyncEffect } from './useAsyncEffect';\nimport { default as useBackHandler } from './useBackHandler';\nimport { default as useBoolean } from './useBoolean';\nimport { default as useControllableValue } from './useControllableValue';\nimport { default as useCountdown } from './useCountdown';\nimport { default as useCounter } from './useCounter';\nimport { default as useCreation } from './useCreation';\nimport { default as useDebounce } from './useDebounce';\nimport { default as useDebounceEffect } from './useDebounceEffect';\nimport { default as useDebounceFn } from './useDebounceFn';\nimport { default as useDeepCompareEffect } from './useDeepCompareEffect';\nimport { default as useDeviceOrientation } from './useDeviceOrientation';\nimport { default as useDimensions } from './useDimensions';\nimport { default as useDynamicList } from './useDynamicList';\nimport { default as useEventEmitter } from './useEventEmitter';\nimport { default as useHistoryTravel } from './useHistoryTravel';\nimport { default as useInfiniteScroll } from './useInfiniteScroll';\nimport { default as useInterval } from './useInterval';\nimport { default as useKeyboard } from './useKeyboard';\nimport { default as useLatest } from './useLatest';\nimport { default as useLayout } from './useLayout';\nimport { default as useLockFn } from './useLockFn';\nimport { default as useMap } from './useMap';\nimport { default as useMemoizedFn } from './useMemoizedFn';\nimport { default as useMount } from './useMount';\nimport { default as usePagination } from './usePagination';\nimport { default as usePrevious } from './usePrevious';\nimport { clearCache, default as useRequest } from './useRequest';\nimport { default as useSafeState } from './useSafeState';\nimport { default as useSet } from './useSet';\nimport { default as useSetState } from './useSetState';\nimport { default as useSms } from './useSms';\nimport { default as useThrottle } from './useThrottle';\nimport { default as useThrottleEffect } from './useThrottleEffect';\nimport { default as useThrottleFn } from './useThrottleFn';\nimport { default as useTimeout } from './useTimeout';\nimport { default as useToggle } from './useToggle';\nimport { default as useTrackedEffect } from './useTrackedEffect';\nimport { default as useUnmount } from './useUnmount';\nimport { default as useUnmountedRef } from './useUnmountedRef';\nimport { default as useUpdate } from './useUpdate';\nimport { default as useUpdateEffect } from './useUpdateEffect';\nimport { default as useUpdateLayoutEffect } from './useUpdateLayoutEffect';\nimport { default as useWhyDidYouUpdate } from './useWhyDidYouUpdate';\n\nexport {\n  useAccessibilityInfo,\n  useAppState,\n  useBackHandler,\n  useDeviceOrientation,\n  useDimensions,\n  useKeyboard,\n  useLayout,\n  useAsyncEffect,\n  useBoolean,\n  useControllableValue,\n  useCounter,\n  useCreation,\n  useDebounce,\n  useDebounceEffect,\n  useDebounceFn,\n  useDeepCompareEffect,\n  useDynamicList,\n  useEventEmitter,\n  useHistoryTravel,\n  useInterval,\n  useLatest,\n  useLockFn,\n  useMap,\n  useMemoizedFn,\n  useMount,\n  usePagination,\n  usePrevious,\n  useRequest,\n  useSafeState,\n  useSet,\n  useSetState,\n  useCountdown,\n  useThrottle,\n  useThrottleEffect,\n  useThrottleFn,\n  useTimeout,\n  useToggle,\n  useTrackedEffect,\n  useUnmount,\n  useUpdate,\n  useUnmountedRef,\n  useUpdateEffect,\n  useUpdateLayoutEffect,\n  useWhyDidYouUpdate,\n  useSms,\n  clearCache,\n  useInfiniteScroll,\n};\n"
  },
  {
    "path": "packages/hooks/src/useAccessibilityInfo/index.test.ts",
    "content": "import { AccessibilityChangeEventName, AccessibilityInfo } from 'react-native';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport useAccessibilityInfo from './index';\n\ndescribe('useAccessibilityInfo', () => {\n  const mockAddEventListener = AccessibilityInfo.addEventListener as jest.Mock;\n\n  const mockIsBoldTextEnabled = AccessibilityInfo.isBoldTextEnabled as jest.Mock;\n  const mockIsGrayscaleEnabled = AccessibilityInfo.isGrayscaleEnabled as jest.Mock;\n  const mockIsInvertColorsEnabled = AccessibilityInfo.isInvertColorsEnabled as jest.Mock;\n  const mockIsReduceMotionEnabled = AccessibilityInfo.isReduceMotionEnabled as jest.Mock;\n  const mockIsReduceTransparencyEnabled = AccessibilityInfo.isReduceTransparencyEnabled as jest.Mock;\n  const mockIsScreenReaderEnabled = AccessibilityInfo.isScreenReaderEnabled as jest.Mock;\n\n  const createEmitChangeEvent = (event: AccessibilityChangeEventName) => {\n    let handler: (value: boolean) => void;\n\n    mockAddEventListener.mockImplementation((eventName, fn) => {\n      if (eventName === event) {\n        handler = fn;\n      }\n    });\n\n    return (value: boolean) => handler(value);\n  };\n\n  beforeAll(() => {\n    mockIsBoldTextEnabled.mockResolvedValue(false);\n    mockIsGrayscaleEnabled.mockResolvedValue(false);\n    mockIsInvertColorsEnabled.mockResolvedValue(false);\n    mockIsReduceMotionEnabled.mockResolvedValue(false);\n    mockIsReduceTransparencyEnabled.mockResolvedValue(false);\n    mockIsScreenReaderEnabled.mockResolvedValue(false);\n  });\n\n  describe('screenReaderEnabled', () => {\n    it('should return undefined until promise will be resolved', async () => {\n      const { result } = renderHook(() => useAccessibilityInfo().screenReaderEnabled);\n\n      expect(result.current).toBeUndefined();\n    });\n\n    it('should return default value', async () => {\n      const defaultValue = true;\n\n      mockIsScreenReaderEnabled.mockResolvedValueOnce(defaultValue);\n\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().screenReaderEnabled);\n\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      expect(result.current).toBe(defaultValue);\n    });\n\n    it('should update value when it change', async () => {\n      const newValue = true;\n      const emit = createEmitChangeEvent('screenReaderChanged');\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().screenReaderEnabled);\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      const { current: initial } = result;\n\n      act(() => emit(newValue));\n\n      const { current: afterUpdate } = result;\n\n      expect({ initial, afterUpdate }).toEqual({\n        initial: false,\n        afterUpdate: newValue,\n      });\n    });\n  });\n\n  describe('grayscaleEnabled', () => {\n    it('should return undefined until promise will be resolved', async () => {\n      const { result } = renderHook(() => useAccessibilityInfo().grayscaleEnabled);\n\n      expect(result.current).toBeUndefined();\n    });\n\n    it('should return default value', async () => {\n      const defaultValue = true;\n\n      mockIsGrayscaleEnabled.mockResolvedValueOnce(defaultValue);\n\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().grayscaleEnabled);\n\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      expect(result.current).toBe(defaultValue);\n    });\n\n    it('should update value when it change', async () => {\n      const newValue = true;\n      const emit = createEmitChangeEvent('grayscaleChanged');\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().grayscaleEnabled);\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      const { current: initial } = result;\n\n      act(() => emit(newValue));\n\n      const { current: afterUpdate } = result;\n\n      expect({ initial, afterUpdate }).toEqual({\n        initial: false,\n        afterUpdate: newValue,\n      });\n    });\n  });\n\n  describe('invertColorsEnabled', () => {\n    it('should return undefined until promise will be resolved', async () => {\n      const { result } = renderHook(() => useAccessibilityInfo().invertColorsEnabled);\n\n      expect(result.current).toBeUndefined();\n    });\n\n    it('should return default value', async () => {\n      const defaultValue = true;\n\n      mockIsInvertColorsEnabled.mockResolvedValueOnce(defaultValue);\n\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().invertColorsEnabled);\n\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      expect(result.current).toBe(defaultValue);\n    });\n\n    it('should update value when it change', async () => {\n      const newValue = true;\n      const emit = createEmitChangeEvent('invertColorsChanged');\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().invertColorsEnabled);\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      const { current: initial } = result;\n\n      act(() => emit(newValue));\n\n      const { current: afterUpdate } = result;\n\n      expect({ initial, afterUpdate }).toEqual({\n        initial: false,\n        afterUpdate: newValue,\n      });\n    });\n  });\n\n  describe('reduceMotionEnabled', () => {\n    it('should return undefined until promise will be resolved', async () => {\n      const { result } = renderHook(() => useAccessibilityInfo().reduceMotionEnabled);\n\n      expect(result.current).toBeUndefined();\n    });\n\n    it('should return default value', async () => {\n      const defaultValue = true;\n\n      mockIsReduceMotionEnabled.mockResolvedValueOnce(defaultValue);\n\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().reduceMotionEnabled);\n\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      expect(result.current).toBe(defaultValue);\n    });\n\n    it('should update value when it change', async () => {\n      const newValue = true;\n      const emit = createEmitChangeEvent('reduceMotionChanged');\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().reduceMotionEnabled);\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      const { current: initial } = result;\n\n      act(() => emit(newValue));\n\n      const { current: afterUpdate } = result;\n\n      expect({ initial, afterUpdate }).toEqual({\n        initial: false,\n        afterUpdate: newValue,\n      });\n    });\n  });\n\n  describe('reduceTransparencyEnabled', () => {\n    it('should return undefined until promise will be resolved', async () => {\n      const { result } = renderHook(() => useAccessibilityInfo().reduceTransparencyEnabled);\n\n      expect(result.current).toBeUndefined();\n    });\n\n    it('should return default value', async () => {\n      const defaultValue = true;\n\n      mockIsReduceTransparencyEnabled.mockResolvedValueOnce(defaultValue);\n\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().reduceTransparencyEnabled);\n\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      expect(result.current).toBe(defaultValue);\n    });\n\n    it('should update value when it change', async () => {\n      const newValue = true;\n      const emit = createEmitChangeEvent('reduceTransparencyChanged');\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().reduceTransparencyEnabled);\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      const { current: initial } = result;\n\n      act(() => emit(newValue));\n\n      const { current: afterUpdate } = result;\n\n      expect({ initial, afterUpdate }).toEqual({\n        initial: false,\n        afterUpdate: newValue,\n      });\n    });\n  });\n\n  describe('boldTextEnabled', () => {\n    it('should return undefined until promise will be resolved', async () => {\n      const { result } = renderHook(() => useAccessibilityInfo().boldTextEnabled);\n\n      expect(result.current).toBeUndefined();\n    });\n\n    it('should return default value', async () => {\n      const defaultValue = true;\n\n      mockIsBoldTextEnabled.mockResolvedValueOnce(defaultValue);\n\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().boldTextEnabled);\n\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      expect(result.current).toBe(defaultValue);\n    });\n\n    it('should update value when it change', async () => {\n      const newValue = true;\n      const emit = createEmitChangeEvent('boldTextChanged');\n      const { result, waitForNextUpdate } = renderHook(() => useAccessibilityInfo().boldTextEnabled);\n      await waitForNextUpdate(); // wait when promise will be resolved\n\n      const { current: initial } = result;\n\n      act(() => emit(newValue));\n\n      const { current: afterUpdate } = result;\n\n      expect({ initial, afterUpdate }).toEqual({\n        initial: false,\n        afterUpdate: newValue,\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useAccessibilityInfo/index.ts",
    "content": "import { useEffect } from 'react';\nimport { AccessibilityChangeEventName, AccessibilityInfo } from 'react-native';\n\nimport useSafeState from '../useSafeState';\n\ntype AccessibilityInfoStaticInitializers =\n  | 'isBoldTextEnabled'\n  | 'isScreenReaderEnabled'\n  | 'isGrayscaleEnabled'\n  | 'isInvertColorsEnabled'\n  | 'isReduceMotionEnabled'\n  | 'isReduceTransparencyEnabled';\n\nfunction useAccessibilityStateListener(\n  eventName: AccessibilityChangeEventName,\n  initializerName: AccessibilityInfoStaticInitializers\n) {\n  const [isEnabled, setIsEnabled] = useSafeState<boolean | undefined>(undefined);\n\n  useEffect(() => {\n    if (!AccessibilityInfo[initializerName]) return;\n\n    AccessibilityInfo[initializerName]().then(setIsEnabled);\n\n    const subscription = AccessibilityInfo.addEventListener(eventName, setIsEnabled);\n\n    return () => {\n      if (typeof subscription?.remove === 'function') {\n        subscription.remove();\n      } else {\n        // @ts-ignore - need update @types/react-native@0.65.x\n        AccessibilityInfo.removeEventListener(eventName, setIsEnabled);\n      }\n    };\n  }, [eventName, initializerName, setIsEnabled]);\n\n  return isEnabled;\n}\n\nexport default function useAccessibilityInfo() {\n  // 字体加粗（IOS）\n  const boldTextEnabled = useAccessibilityStateListener('boldTextChanged', 'isBoldTextEnabled');\n  // 灰色模式（IOS。色盲使用）\n  const grayscaleEnabled = useAccessibilityStateListener('grayscaleChanged', 'isGrayscaleEnabled');\n  // 反转显示屏的颜色（IOS）\n  const invertColorsEnabled = useAccessibilityStateListener('invertColorsChanged', 'isInvertColorsEnabled');\n  // 减弱动态效果\n  const reduceMotionEnabled = useAccessibilityStateListener('reduceMotionChanged', 'isReduceMotionEnabled');\n  // 降低透明度 (IOS)\n  const reduceTransparencyEnabled = useAccessibilityStateListener(\n    'reduceTransparencyChanged',\n    'isReduceTransparencyEnabled'\n  );\n  // 是否启用读屏应用\n  const screenReaderEnabled = useAccessibilityStateListener('screenReaderChanged', 'isScreenReaderEnabled');\n\n  return {\n    screenReaderEnabled,\n    grayscaleEnabled,\n    invertColorsEnabled,\n    reduceMotionEnabled,\n    reduceTransparencyEnabled,\n    boldTextEnabled,\n  };\n}\n"
  },
  {
    "path": "packages/hooks/src/useAppState/index.test.ts",
    "content": "import { AppState, AppStateStatus } from 'react-native';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport useAppState from './index';\n\ndescribe('useAppState', () => {\n  const addEventListenerMock = AppState.addEventListener as jest.Mock;\n  const createEmitAppStateChange = () => {\n    let listener: (newStatus: AppStateStatus) => any;\n\n    addEventListenerMock.mockImplementationOnce((_, fn) => {\n      listener = fn;\n    });\n\n    return (newStatus: AppStateStatus) => listener(newStatus);\n  };\n\n  it('should return current state by default', () => {\n    const { result } = renderHook(() => useAppState());\n\n    expect(result.current).toBe(AppState.currentState);\n  });\n\n  it('should update state when it change', () => {\n    const newStatus = 'background';\n    const emit = createEmitAppStateChange();\n\n    const { result } = renderHook(() => useAppState());\n\n    const { current: initialStatus } = result;\n\n    act(() => {\n      emit(newStatus);\n    });\n\n    const { current: statusAfterUpdate } = result;\n\n    expect({ initialStatus, statusAfterUpdate }).toEqual({\n      initialStatus: AppState.currentState,\n      statusAfterUpdate: newStatus,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useAppState/index.ts",
    "content": "import { useEffect } from 'react';\nimport { AppState } from 'react-native';\n\nimport useSafeState from '../useSafeState';\n\nexport default function useAppState() {\n  const [appState, setAppState] = useSafeState(AppState.currentState);\n\n  useEffect(() => {\n    const subscription = AppState.addEventListener('change', setAppState);\n\n    return () => {\n      if (typeof subscription?.remove === 'function') {\n        subscription.remove();\n      } else {\n        // @ts-ignore - need update @types/react-native@0.65.x\n        AppState.removeEventListener('change', setAppState);\n      }\n    };\n  }, [setAppState]);\n\n  return appState;\n}\n"
  },
  {
    "path": "packages/hooks/src/useAsyncEffect/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useAsyncEffect } from '@td-design/rn-hooks';\n\nfunction mockCheck(): Promise<boolean> {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve(true);\n    }, 3000);\n  });\n}\n\nexport default () => {\n  const [pass, setPass] = useState<boolean>();\n\n  useAsyncEffect(async () => {\n    setPass(await mockCheck());\n  }, []);\n\n  return (\n    <div>\n      <button disabled={!pass}>Submit</button>\n      <p>\n        {pass === null && 'Checking...'}\n        {pass === true && 'Check passed.'}\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useAsyncEffect/index.test.ts",
    "content": "import { useState } from 'react';\n\nimport { renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../utils/testHelpers';\nimport useAsyncEffect from './index';\n\ndescribe('useAsyncEffect', () => {\n  test('useAsyncEffect should be defined', () => {\n    expect(useAsyncEffect).toBeDefined();\n  });\n\n  test('should work without cleanup', async () => {\n    const { result, waitForNextUpdate } = renderHook(() => {\n      const [count, setCount] = useState(0);\n\n      useAsyncEffect(async () => {\n        await sleep(100);\n        setCount(1);\n      }, []);\n      return count;\n    });\n\n    expect(result.current).toBe(0);\n\n    await waitForNextUpdate();\n\n    expect(result.current).toBe(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useAsyncEffect/index.ts",
    "content": "import type { DependencyList } from 'react';\nimport { useEffect } from 'react';\n\nimport { isFunction } from '../utils';\n\nfunction isAsyncGenerator(\n  val: AsyncGenerator<void, void, void> | Promise<void>\n): val is AsyncGenerator<void, void, void> {\n  return isFunction(val[Symbol.asyncIterator]);\n}\n\nfunction useAsyncEffect(effect: () => AsyncGenerator<void, void, void> | Promise<void>, deps?: DependencyList) {\n  useEffect(() => {\n    const e = effect();\n    let cancelled = false;\n    async function execute() {\n      if (isAsyncGenerator(e)) {\n        while (true) {\n          const result = await e.next();\n          if (result.done || cancelled) {\n            break;\n          }\n        }\n      } else {\n        await e;\n      }\n    }\n    execute();\n    return () => {\n      cancelled = true;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, deps);\n}\n\nexport default useAsyncEffect;\n"
  },
  {
    "path": "packages/hooks/src/useBackHandler/index.test.ts",
    "content": "import { BackHandler } from 'react-native';\n\nimport { renderHook } from '@testing-library/react-hooks';\n\nimport useBackHandler from './index';\n\ndescribe('useBackHandler', () => {\n  test('useBackHandler should be defined', () => {\n    expect(useBackHandler).toBeDefined();\n  });\n\n  const addEventListenerMock = BackHandler.addEventListener as jest.Mock;\n  const removeEventListenerMock = BackHandler.removeEventListener as jest.Mock;\n\n  beforeEach(() => {\n    jest.clearAllMocks();\n  });\n\n  it('should add back press listener on mount', () => {\n    const handler = jest.fn();\n\n    renderHook(props => useBackHandler(props.handler), {\n      initialProps: { handler },\n    });\n\n    expect(addEventListenerMock).toBeCalledTimes(1);\n    expect(addEventListenerMock).toBeCalledWith('hardwareBackPress', handler);\n  });\n\n  it('should resubscribe when passed handler will change', () => {\n    const handler = jest.fn();\n    const handler2 = jest.fn();\n\n    const { rerender } = renderHook(props => useBackHandler(props.handler), {\n      initialProps: { handler },\n    });\n\n    expect(addEventListenerMock).toBeCalledWith('hardwareBackPress', handler);\n\n    rerender({ handler: handler2 });\n\n    expect(removeEventListenerMock).toBeCalledWith('hardwareBackPress', handler);\n    expect(addEventListenerMock).toBeCalledWith('hardwareBackPress', handler2);\n  });\n\n  it('should remove back press listener on unmount', () => {\n    const handler = jest.fn();\n\n    const { unmount } = renderHook(props => useBackHandler(props.handler), {\n      initialProps: { handler },\n    });\n\n    expect(removeEventListenerMock).toBeCalledTimes(0);\n\n    unmount();\n\n    expect(removeEventListenerMock).toBeCalledTimes(1);\n    expect(removeEventListenerMock).toBeCalledWith('hardwareBackPress', handler);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useBackHandler/index.ts",
    "content": "import { useEffect } from 'react';\nimport { BackHandler } from 'react-native';\n\nexport default function useBackHandler(handler: () => boolean) {\n  useEffect(() => {\n    const subscription = BackHandler.addEventListener('hardwareBackPress', handler);\n\n    return () => {\n      if (typeof subscription?.remove === 'function') {\n        subscription.remove();\n      } else {\n        // React Native < 0.65\n        BackHandler.removeEventListener('hardwareBackPress', handler);\n      }\n    };\n  }, [handler]);\n}\n"
  },
  {
    "path": "packages/hooks/src/useBoolean/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useBoolean } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [state, { toggle, setTrue, setFalse }] = useBoolean(true);\n\n  return (\n    <div>\n      <p>Effects：{JSON.stringify(state)}</p>\n      <p>\n        <button type=\"button\" onClick={toggle}>\n          Toggle\n        </button>\n        <button type=\"button\" onClick={setFalse} style={{ margin: '0 16px' }}>\n          Set false\n        </button>\n        <button type=\"button\" onClick={setTrue}>\n          Set true\n        </button>\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useBoolean/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useBoolean from './index';\n\ndescribe('useBoolean', () => {\n  it('should be defined', () => {\n    expect(useBoolean).toBeDefined();\n  });\n\n  it('test on methods', async () => {\n    const { result } = renderHook(() => useBoolean());\n    expect(result.current[0]).toBeFalsy();\n    const [, { setTrue, toggle, set }] = result.current;\n\n    act(() => {\n      setTrue();\n    });\n    expect(result.current[0]).toBeTruthy();\n\n    act(() => {\n      toggle();\n    });\n    expect(result.current[0]).toBeFalsy();\n\n    act(() => {\n      toggle();\n    });\n    expect(result.current[0]).toBeTruthy();\n\n    act(() => {\n      set(false);\n    });\n    expect(result.current[0]).toBeFalsy();\n\n    // act(() => {\n    //   result.current[1].set(true);\n    // });\n    // expect(result.current[0]).toBe(true);\n\n    // act(() => {\n    //   // @ts-ignore\n    //   result.current[1].set(0);\n    // });\n    // expect(result.current[0]).toBe(false);\n\n    // act(() => {\n    //   // @ts-ignore\n    //   result.current[1].set('a');\n    // });\n    // expect(result.current[0]).toBe(true);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useBoolean/index.ts",
    "content": "import { useMemo } from 'react';\n\nimport useToggle from '../useToggle';\n\n/**\n * 优雅的管理 boolean 状态的 Hook。\n * @param defaultValue 默认值为false\n * @returns\n */\nexport default function useBoolean(defaultValue = false) {\n  const [state, { toggle, set }] = useToggle(defaultValue);\n\n  const actions = useMemo(() => {\n    const setTrue = () => set(true);\n    const setFalse = () => set(false);\n    return {\n      toggle,\n      set: (v: boolean) => set(!!v),\n      setTrue,\n      setFalse,\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return [state, actions] as const;\n}\n"
  },
  {
    "path": "packages/hooks/src/useControllableValue/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useControllableValue } from '@td-design/rn-hooks';\n\nexport default (props: any) => {\n  const [state, setState] = useControllableValue<string>(props, {\n    defaultValue: '',\n  });\n\n  return (\n    <>\n      <input value={state} onChange={e => setState(e.target.value)} style={{ width: 300 }} />\n      <button type=\"button\" onClick={() => setState('')} style={{ margin: '0 4px' }}>\n        Clear\n      </button>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useControllableValue/demo/demo2.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useControllableValue } from '@td-design/rn-hooks';\n\nconst ControllableComponent = (props: any) => {\n  const [state, setState] = useControllableValue<string>(props);\n\n  return <input value={state} onChange={e => setState(e.target.value)} style={{ width: 300 }} />;\n};\n\nconst Parent = () => {\n  const [state, setState] = useState<string>('');\n  const clear = () => {\n    setState('');\n  };\n\n  return (\n    <>\n      <ControllableComponent value={state} onChange={setState} />\n      <button type=\"button\" onClick={clear} style={{ margin: '0 4px' }}>\n        Clear\n      </button>\n    </>\n  );\n};\nexport default Parent;\n"
  },
  {
    "path": "packages/hooks/src/useControllableValue/demo/demo3.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useControllableValue } from '@td-design/rn-hooks';\n\nconst ControllableComponent = (props: any) => {\n  const [state, setState] = useControllableValue<string>(props);\n\n  return (\n    <input\n      value={state}\n      onChange={e => {\n        setState(e.target.value);\n      }}\n      style={{ width: 300 }}\n    />\n  );\n};\nconst Parent = () => {\n  const [state, setState] = useState<number>(0);\n\n  return (\n    <>\n      <div style={{ marginBottom: 8 }}>state:{state}</div>\n      <ControllableComponent onChange={setState} />\n    </>\n  );\n};\nexport default Parent;\n"
  },
  {
    "path": "packages/hooks/src/useControllableValue/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useControllableValue from './index';\n\ndescribe('useControllableValue', () => {\n  test('useControllableValue should be defined', () => {\n    expect(useControllableValue).toBeDefined();\n  });\n\n  test('defaultValue should work like a charm', () => {\n    const { result } = renderHook(() => useControllableValue({ defaultValue: 1 }));\n    expect(result.current[0]).toEqual(1);\n  });\n\n  test('value should override defaultValue', () => {\n    const { result } = renderHook(() => useControllableValue({ defaultValue: 1, value: 2 }));\n    expect(result.current[0]).toEqual(2);\n  });\n\n  test('value should be undefined if nothing passed', () => {\n    const { result } = renderHook(() => useControllableValue());\n    expect(result.current[0]).toBeUndefined();\n  });\n\n  test('onChange should work like a charm', () => {\n    let extraParam = '';\n    const props = {\n      value: 2,\n      onChange(v: number, extra: any) {\n        this.value = v;\n        extraParam = extra;\n      },\n    };\n    const { result } = renderHook(() => useControllableValue(props));\n    expect(result.current[0]).toEqual(2);\n\n    act(() => {\n      result.current[1](3, 'test');\n    });\n\n    expect(props.value).toEqual(3);\n    expect(extraParam).toEqual('test');\n  });\n\n  test('state should update when rerender', () => {\n    const { result, rerender } = renderHook(props => useControllableValue(props), {\n      initialProps: {\n        value: 2,\n      },\n    });\n\n    rerender({ value: 3 });\n\n    expect(result.current[0]).toEqual(3);\n\n    rerender({ value: 1 });\n\n    expect(result.current[0]).toEqual(1);\n  });\n\n  test('state should update when set was triggered', () => {\n    const { result } = renderHook(() => useControllableValue({ newValue: 1 }));\n    const [, setValue] = result.current;\n\n    act(() => setValue(undefined));\n    expect(result.current[0]).toBeUndefined();\n\n    act(() => setValue(null));\n    expect(result.current[0]).toBeNull();\n\n    act(() => setValue(55));\n    expect(result.current[0]).toBe(55);\n\n    act(() => setValue((prev: number) => prev + 1));\n    expect(result.current[0]).toEqual(56);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useControllableValue/index.ts",
    "content": "import type { SetStateAction } from 'react';\nimport { useMemo, useRef } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useUpdate from '../useUpdate';\nimport { isFunction } from '../utils';\n\ninterface Options<T> {\n  /** 默认值，会被 props.defaultValue 和 props.value 覆盖 */\n  defaultValue?: T;\n  /** 默认值的属性名。默认为 defaultValue */\n  defaultValuePropName?: string;\n  /** 值的属性名。默认为 value */\n  valuePropName?: string;\n  /** 修改值时触发的函数。默认为 onChange */\n  trigger?: string;\n}\n\ninterface StandardProps<T> {\n  value: T;\n  defaultValue?: T;\n  onChange?: (value: T) => void;\n}\nexport type Props = Record<string, any>;\n\nfunction useControllableValue<T = any>(props: StandardProps<T>): [T, (v: SetStateAction<T>) => void];\nfunction useControllableValue<T = any>(\n  props?: Props,\n  options?: Options<T>\n): [T, (v: SetStateAction<T>, ...args: any[]) => void];\nfunction useControllableValue<T = any>(props: Props = {}, options: Options<T> = {}) {\n  const {\n    defaultValue,\n    defaultValuePropName = 'defaultValue',\n    valuePropName = 'value',\n    trigger = 'onChange',\n  } = options;\n\n  const value = props[valuePropName] as T;\n  const isControlled = props.hasOwnProperty(valuePropName);\n\n  const initialValue = useMemo(() => {\n    if (isControlled) {\n      return value;\n    }\n    if (props.hasOwnProperty(defaultValuePropName)) {\n      return props[defaultValuePropName];\n    }\n    return defaultValue;\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const stateRef = useRef(initialValue);\n  if (isControlled) {\n    stateRef.current = value;\n  }\n\n  const update = useUpdate();\n\n  function setState<T>(v: SetStateAction<T>, ...args: any[]) {\n    const r = isFunction(v) ? v(stateRef.current) : v;\n\n    if (!isControlled) {\n      stateRef.current = r;\n      update();\n    }\n    if (props[trigger]) {\n      props[trigger](r, ...args);\n    }\n  }\n\n  return [stateRef.current, useMemoizedFn(setState)] as const;\n}\n\nexport default useControllableValue;\n"
  },
  {
    "path": "packages/hooks/src/useCountdown/index.ts",
    "content": "import { useEffect, useRef, useState } from 'react';\n\nimport useAppState from '../useAppState';\nimport useMemoizedFn from '../useMemoizedFn';\n\nexport default function useCountDown(seconds) {\n  const appState = useAppState();\n  const timer = useRef<ReturnType<typeof setInterval>>();\n  const [target, setTarget] = useState<Date | null>(null);\n  const [count, setCount] = useState(0);\n\n  const start = useMemoizedFn(() => {\n    setTarget(add(new Date(), seconds));\n  });\n\n  const stop = useMemoizedFn(() => {\n    setTarget(null);\n    setCount(0);\n  });\n\n  useEffect(() => {\n    if (target === null || appState !== 'active') return;\n\n    setCount(diff(new Date(), target));\n\n    timer.current = setInterval(() => {\n      setCount(diff(new Date(), target));\n    }, 1000);\n\n    return () => {\n      if (timer.current) {\n        clearInterval(timer.current);\n        timer.current = undefined;\n      }\n    };\n  }, [target]);\n\n  useEffect(() => {\n    if (count === 0) {\n      stop();\n    }\n  }, [count, stop]);\n\n  return {\n    count,\n\n    start,\n    stop,\n  };\n}\n\nfunction add(date: Date, seconds: number) {\n  return new Date(date.getTime() + seconds * 1000);\n}\n\nfunction diff(now: Date, target: Date) {\n  return Math.max(Math.trunc((target.getTime() - now.getTime()) / 1000 + 0.5), 0);\n}\n"
  },
  {
    "path": "packages/hooks/src/useCounter/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useCounter } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [current, { inc, dec, set, reset }] = useCounter(100, { min: 1, max: 10 });\n\n  return (\n    <div>\n      <p>{current} [max: 10; min: 1;]</p>\n      <div>\n        <button\n          type=\"button\"\n          onClick={() => {\n            inc();\n          }}\n          style={{ marginRight: 8 }}\n        >\n          inc()\n        </button>\n        <button\n          type=\"button\"\n          onClick={() => {\n            dec();\n          }}\n          style={{ marginRight: 8 }}\n        >\n          dec()\n        </button>\n        <button\n          type=\"button\"\n          onClick={() => {\n            set(3);\n          }}\n          style={{ marginRight: 8 }}\n        >\n          set(3)\n        </button>\n        <button type=\"button\" onClick={reset} style={{ marginRight: 8 }}>\n          reset()\n        </button>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useCounter/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useCounter from './index';\n\ndescribe('useCounter', () => {\n  test('useCounter should be defined', () => {\n    expect(useCounter).toBeDefined();\n  });\n\n  test('initialValue should work like a charm', () => {\n    const { result } = renderHook(() => useCounter(2));\n\n    expect(result.current[0]).toBe(2);\n  });\n\n  test('state should be empty string if no initialValue passed', () => {\n    const { result } = renderHook(() => useCounter());\n    expect(result.current[0]).toBe(0);\n  });\n\n  test('min value should be 2', () => {\n    const { result } = renderHook(() => useCounter(1, { min: 2 }));\n\n    expect(result.current[0]).toBe(2);\n  });\n\n  test('max value should be 5', () => {\n    const { result } = renderHook(() => useCounter(7, { max: 5 }));\n\n    expect(result.current[0]).toBe(5);\n  });\n\n  test('actions should work like a charm', () => {\n    const { result } = renderHook(() => useCounter(100, { min: 1, max: 10 }));\n    expect(result.current[0]).toEqual(10);\n\n    const [, { inc, dec, reset, set }] = result.current;\n\n    act(() => {\n      inc(1);\n    });\n    expect(result.current[0]).toEqual(10);\n\n    act(() => {\n      dec(100);\n    });\n    expect(result.current[0]).toEqual(1);\n\n    act(() => {\n      inc(2);\n    });\n    expect(result.current[0]).toEqual(3);\n\n    act(() => {\n      reset();\n    });\n    expect(result.current[0]).toEqual(10);\n\n    act(() => {\n      set(6);\n    });\n    expect(result.current[0]).toEqual(6);\n\n    act(() => {\n      set(60);\n    });\n    expect(result.current[0]).toEqual(10);\n\n    act(() => {\n      set(-100);\n    });\n    expect(result.current[0]).toEqual(1);\n\n    act(() => {\n      inc();\n      inc();\n      inc();\n    });\n    expect(result.current[0]).toEqual(4);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useCounter/index.ts",
    "content": "import { useEffect } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useSafeState from '../useSafeState';\n\ntype Options = { min?: number; max?: number };\nexport type ValueParam = number | ((c: number) => number);\n\n/**\n * 步进器效果\n * @param initialValue\n * @param options\n * @returns\n */\nexport default function useCounter(initialValue = 0, options: Options = {}) {\n  const [current, setCurrent] = useSafeState(0);\n\n  useEffect(() => {\n    setCurrent(getTargetValue(initialValue, options));\n  }, [initialValue, options]);\n\n  const setValue = (value: ValueParam) => {\n    setCurrent(c => {\n      const target = typeof value === 'number' ? value : value(c);\n      return getTargetValue(target, options);\n    });\n  };\n\n  const inc = (delta = 1) => {\n    setValue(c => c + delta);\n  };\n\n  const dec = (delta = 1) => {\n    setValue(c => c - delta);\n  };\n\n  const set = (value: ValueParam) => {\n    setValue(value);\n  };\n\n  const reset = () => {\n    setValue(initialValue);\n  };\n\n  const actions = {\n    inc: useMemoizedFn(inc),\n    dec: useMemoizedFn(dec),\n    set: useMemoizedFn(set),\n    reset: useMemoizedFn(reset),\n  };\n\n  return [current, actions] as const;\n}\n\nfunction getTargetValue(val: number, options: Options = {}) {\n  const { min, max } = options;\n  let target = val;\n  if (typeof max === 'number') {\n    target = Math.min(max, target);\n  }\n  if (typeof min === 'number') {\n    target = Math.max(min, target);\n  }\n  return target;\n}\n"
  },
  {
    "path": "packages/hooks/src/useCreation/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useCreation } from '@td-design/rn-hooks';\n\nclass Foo {\n  constructor() {\n    this.data = Math.random();\n  }\n\n  data: number;\n}\n\nexport default function () {\n  const foo = useCreation(() => new Foo(), []);\n  const [, setFlag] = useState({});\n  return (\n    <>\n      <p>{foo.data}</p>\n      <button\n        type=\"button\"\n        onClick={() => {\n          setFlag({});\n        }}\n      >\n        Rerender\n      </button>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/hooks/src/useCreation/index.test.ts",
    "content": "import { useState } from 'react';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport useCreation from './index';\n\ndescribe('useCreation', () => {\n  test('useCreation should be defined', () => {\n    expect(useCreation).toBeDefined();\n  });\n\n  class Foo {\n    data: number;\n\n    constructor() {\n      this.data = Math.random();\n    }\n  }\n\n  const hook = () =>\n    renderHook(() => {\n      const [count, setCount] = useState(0);\n      const [, setFlag] = useState({});\n      const foo = useCreation(() => new Foo(), [count]); // count发生变化之后返回的foo和之前的不是同一个\n      return {\n        foo,\n        count,\n        setCount,\n        setFlag,\n      };\n    });\n\n  test('useCreation should work like a charm', () => {\n    const { result } = hook();\n    const foo = result.current.foo;\n\n    act(() => {\n      result.current.setFlag({});\n    });\n\n    expect(result.current.foo).toBe(foo);\n\n    act(() => {\n      result.current.setCount(1);\n    });\n\n    expect(result.current.foo).not.toBe(foo);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useCreation/index.ts",
    "content": "import { useRef } from 'react';\n\nimport { depsAreSame } from '../utils';\n\n/**\n * `useCreation` 是 `useMemo` 或 `useRef` 的替代品。\n * 因为 `useMemo` 不能保证被 memo 的值一定不会被重计算，而 `useCreation` 可以保证这一点。\n * 相比于 `useRef`，你可以使用 `useCreation` 创建一些常量，这些常量和 `useRef` 创建出来的 ref 有很多使用场景上的相似，但对于复杂常量的创建，`useRef` 却容易出现潜在的性能隐患。\n * const a = useRef(new Subject()) // 每次重渲染，都会执行实例化 Subject 的过程，即便这个实例立刻就被扔掉了\n * const b = useCreation(() => new Subject(), []) // 通过 factory 函数，可以避免性能隐患\n */\nexport default function useCreation<T>(factory: () => T, deps: any[]) {\n  const { current } = useRef({\n    deps,\n    initialized: false,\n    obj: undefined as T | undefined,\n  });\n\n  if (current.initialized === false || !depsAreSame(current.deps, deps)) {\n    current.deps = deps;\n    current.obj = factory();\n    current.initialized = true;\n  }\n  return current.obj as T;\n}\n"
  },
  {
    "path": "packages/hooks/src/useDebounce/DebounceOptions.ts",
    "content": "export interface DebounceOptions {\n  /** 超时时间，单位为毫秒 */\n  wait?: number;\n  /** 是否在延迟开始前调用函数 */\n  leading?: boolean;\n  /** 是否在延迟开始后调用函数 */\n  trailing?: boolean;\n}\n"
  },
  {
    "path": "packages/hooks/src/useDebounce/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useDebounce } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [value, setValue] = useState<string>();\n  const debouncedValue = useDebounce(value, { wait: 500 });\n\n  return (\n    <div>\n      <input value={value} onChange={e => setValue(e.target.value)} placeholder=\"Typed value\" style={{ width: 280 }} />\n      <p style={{ marginTop: 16 }}>DebouncedValue: {debouncedValue}</p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useDebounce/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../utils/testHelpers';\nimport useDebounce from './index';\n\ndescribe('useDebounce', () => {\n  it('should be defined', () => {\n    expect(useDebounce).toBeDefined();\n  });\n\n  it('useDebounce wait:200ms', async () => {\n    let mountedState = 0;\n    const { result, rerender } = renderHook(() => useDebounce(mountedState, { wait: 200 }));\n    expect(result.current).toEqual(0);\n\n    await act(async () => {\n      mountedState = 1;\n      rerender();\n      await sleep(50);\n      expect(result.current).toEqual(0);\n\n      mountedState = 2;\n      rerender();\n      await sleep(100);\n      expect(result.current).toEqual(0);\n\n      mountedState = 3;\n      rerender();\n      await sleep(150);\n      expect(result.current).toEqual(0);\n\n      mountedState = 4;\n      rerender();\n      await sleep(250);\n      expect(result.current).toEqual(4);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useDebounce/index.ts",
    "content": "import { useEffect, useState } from 'react';\n\nimport useDebounceFn from '../useDebounceFn';\nimport type { DebounceOptions } from './DebounceOptions';\n\n/**\n * 用来处理防抖值的 Hook。\n * @param value 需要防抖的值\n * @param options 配置防抖的行为\n * @returns\n */\nexport default function useDebounce<T>(value: T, options?: DebounceOptions) {\n  const [debounced, setDebounced] = useState(value);\n\n  const { run } = useDebounceFn(() => {\n    setDebounced(value);\n  }, options);\n\n  useEffect(() => {\n    run();\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [value]); // 每次value变化的时候，都触发debounce的run方法\n\n  return debounced;\n}\n"
  },
  {
    "path": "packages/hooks/src/useDebounceEffect/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useDebounceEffect } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [value, setValue] = useState('hello');\n  const [records, setRecords] = useState<string[]>([]);\n  useDebounceEffect(\n    () => {\n      setRecords(val => [...val, value]);\n    },\n    [value],\n    {\n      wait: 1000,\n    }\n  );\n  return (\n    <div>\n      <input value={value} onChange={e => setValue(e.target.value)} placeholder=\"Typed value\" style={{ width: 280 }} />\n      <p style={{ marginTop: 16 }}>\n        <ul>\n          {records.map((record, index) => (\n            <li key={index}>{record}</li>\n          ))}\n        </ul>\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useDebounceEffect/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../utils/testHelpers';\nimport useDebounceEffect from './index';\n\ndescribe('useDebounceEffect', () => {\n  test('useDebounceEffect should be defined', () => {\n    expect(useDebounceEffect).toBeDefined();\n  });\n\n  test('useDebounceEffect should work like a charm', async () => {\n    const mockEffect = jest.fn();\n    const mockCleanup = jest.fn();\n\n    const { rerender } = renderHook(props =>\n      useDebounceEffect(\n        () => {\n          mockEffect();\n          return () => mockCleanup();\n        },\n        [props],\n        { wait: 200 }\n      )\n    );\n    expect(mockEffect).not.toBeCalled();\n    expect(mockCleanup).not.toBeCalled();\n\n    await act(async () => {\n      rerender(2);\n      await sleep(50);\n    });\n    expect(mockEffect).not.toBeCalled();\n    expect(mockCleanup).not.toBeCalled();\n\n    await act(async () => {\n      rerender(3);\n      await sleep(400);\n    });\n    expect(mockEffect).toBeCalled();\n    expect(mockCleanup).not.toBeCalled();\n  });\n\n  test('useDebounceEffect should cancel timeout on unmount', async () => {\n    const mockEffect = jest.fn();\n    const mockCleanup = jest.fn();\n\n    const { rerender, unmount } = renderHook(props =>\n      useDebounceEffect(\n        () => {\n          mockEffect();\n\n          return () => mockCleanup();\n        },\n        [props],\n        { wait: 200 }\n      )\n    );\n\n    await act(async () => {\n      rerender(4);\n      await sleep(400);\n      unmount();\n    });\n\n    expect(mockCleanup.mock.calls.length).toEqual(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useDebounceEffect/index.ts",
    "content": "import { DependencyList, EffectCallback, useEffect, useState } from 'react';\n\nimport type { DebounceOptions } from '../useDebounce/DebounceOptions';\nimport useDebounceFn from '../useDebounceFn';\nimport useUpdateEffect from '../useUpdateEffect';\n\n/**\n * 为 `useEffect` 增加防抖的能力。\n * @param effect 执行函数\n * @param deps 依赖数组\n * @param options 配置防抖的行为\n */\nexport default function useDebounceEffect(effect: EffectCallback, deps?: DependencyList, options?: DebounceOptions) {\n  const [flag, setFlag] = useState({});\n\n  const { run } = useDebounceFn(() => {\n    setFlag({});\n  }, options);\n\n  useEffect(() => {\n    return run();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, deps);\n\n  useUpdateEffect(effect, [flag]);\n}\n"
  },
  {
    "path": "packages/hooks/src/useDebounceFn/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useDebounceFn } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [value, setValue] = useState(0);\n  const { run } = useDebounceFn(\n    () => {\n      setValue(value + 1);\n    },\n    {\n      wait: 500,\n    }\n  );\n\n  return (\n    <div>\n      <p style={{ marginTop: 16 }}> Clicked count: {value} </p>\n      <button type=\"button\" onClick={run}>\n        Click fast!\n      </button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useDebounceFn/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../utils/testHelpers';\nimport useDebounceFn from './index';\n\ndescribe('useDebounceFn', () => {\n  test('useDebounceFn should be defined', () => {\n    expect(useDebounceFn).toBeDefined();\n  });\n\n  test('useDebounceFn parameter should be function', () => {\n    const { result } = renderHook(() => useDebounceFn(12 as any, { wait: 200 }));\n    expect(result.error).toBeDefined();\n  });\n\n  test('debounce.run should work like a charm', async () => {\n    let count = 0;\n    function debounceFn(delta: number) {\n      count += delta;\n    }\n    const { result } = renderHook(() => useDebounceFn(debounceFn, { wait: 200 }));\n\n    act(() => {\n      result.current.run(2);\n      result.current.run(2);\n      result.current.run(2);\n      result.current.run(2);\n    });\n    expect(count).toBe(0);\n\n    await sleep(300);\n\n    expect(count).toBe(2);\n\n    act(() => {\n      result.current.run(4);\n    });\n    expect(count).toBe(2);\n    await sleep(300);\n    expect(count).toBe(6);\n  });\n\n  test('debounce.cancel should work like a charm', async () => {\n    let count = 0;\n    function debounceFn(delta: number) {\n      count += delta;\n    }\n    const { result } = renderHook(() => useDebounceFn(debounceFn, { wait: 200 }));\n\n    act(() => {\n      result.current.run(2);\n      result.current.run(2);\n      result.current.run(2);\n      result.current.run(2);\n    });\n    expect(count).toBe(0);\n\n    await sleep(300);\n\n    expect(count).toBe(2);\n\n    act(() => {\n      result.current.run(4);\n    });\n    expect(count).toBe(2);\n\n    act(() => {\n      result.current.cancel(); // result.current.run(4) 被取消，所以 count 还是 2\n    });\n    expect(count).toBe(2);\n    await sleep(300);\n    expect(count).toBe(2);\n  });\n\n  test('debounce.flush should work like a charm', async () => {\n    let count = 0;\n    function debounceFn(delta: number) {\n      count += delta;\n    }\n    const { result } = renderHook(() => useDebounceFn(debounceFn));\n\n    act(() => {\n      result.current.run(2);\n      result.current.run(2);\n      result.current.run(2);\n      result.current.run(2);\n    });\n    expect(count).toBe(0);\n\n    await sleep(1100);\n\n    expect(count).toBe(2);\n\n    act(() => {\n      result.current.run(4);\n    });\n    expect(count).toBe(2);\n\n    act(() => {\n      result.current.flush(); // 立即执行\n    });\n    expect(count).toBe(6);\n    await sleep(300);\n    expect(count).toBe(6);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useDebounceFn/index.ts",
    "content": "import { debounce } from 'lodash-es';\n\nimport useCreation from '../useCreation';\nimport type { DebounceOptions } from '../useDebounce/DebounceOptions';\nimport useMemoizedFn from '../useMemoizedFn';\nimport useUnmount from '../useUnmount';\n\ntype noop = (...args: any) => any;\n\n/**\n * 用来处理防抖函数的 Hook。\n * @param fn 需要防抖的函数\n * @param options 配置防抖的行为\n */\nexport default function useDebounceFn<T extends noop>(fn: T, options?: DebounceOptions) {\n  if (__DEV__) {\n    if (typeof fn !== 'function') {\n      throw new Error(`useDebounceFn expected parameter is a function, got ${typeof fn}`);\n    }\n  }\n\n  const fnRef = useMemoizedFn(fn);\n\n  const wait = options?.wait ?? 1000;\n\n  const debounced = useCreation(\n    () =>\n      debounce(\n        (...args: Parameters<T>): ReturnType<T> => {\n          return fnRef(...args);\n        },\n        wait,\n        options\n      ),\n    []\n  );\n\n  useUnmount(() => {\n    debounced.cancel();\n  });\n\n  return {\n    run: debounced,\n    cancel: debounced.cancel,\n    flush: debounced.flush,\n  };\n}\n"
  },
  {
    "path": "packages/hooks/src/useDeepCompareEffect/demo/demo1.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\n\nimport { useDeepCompareEffect } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n  const effectCountRef = useRef(0);\n  const deepCompareCountRef = useRef(0);\n\n  useEffect(() => {\n    effectCountRef.current += 1;\n  }, [{}]);\n\n  useDeepCompareEffect(() => {\n    deepCompareCountRef.current += 1;\n    return () => {\n      // do something\n    };\n  }, [{}]);\n\n  return (\n    <div>\n      <p>effectCount: {effectCountRef.current}</p>\n      <p>deepCompareCount: {deepCompareCountRef.current}</p>\n      <p>\n        <button type=\"button\" onClick={() => setCount(c => c + 1)}>\n          reRender\n        </button>\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useDeepCompareEffect/index.test.ts",
    "content": "import { useState } from 'react';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport useDeepCompareEffect from './index';\n\ndescribe('useDeepCompareEffect', () => {\n  test('useDeepCompareEffect should be defined', () => {\n    expect(useDeepCompareEffect).toBeDefined();\n  });\n\n  test('useDeepCompareEffect should work like a charm', () => {\n    const { result } = renderHook(() => {\n      const [x, setX] = useState(0);\n      const [y, setY] = useState({});\n\n      useDeepCompareEffect(() => {\n        setX(x => x + 1);\n      }, [y]);\n\n      return { x, setY };\n    });\n\n    expect(result.current.x).toBe(1);\n\n    act(() => {\n      result.current.setY({}); // 对象的深比较会失败，所以 setX 不会执行\n    });\n    expect(result.current.x).toBe(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useDeepCompareEffect/index.ts",
    "content": "/* eslint-disable */\nimport { DependencyList, EffectCallback, useEffect, useRef } from 'react';\n\nimport { isEqual } from 'lodash-es';\n\nexport default function useDeepCompareEffect(effect: EffectCallback, deps: DependencyList) {\n  const depsRef = useRef<DependencyList>();\n  const signalRef = useRef(0);\n\n  if (!isEqual(deps, depsRef.current)) {\n    depsRef.current = deps;\n    signalRef.current += 1;\n  }\n\n  useEffect(effect, [signalRef.current]);\n}\n"
  },
  {
    "path": "packages/hooks/src/useDeviceOrientation/index.ts",
    "content": "import { useEffect } from 'react';\nimport { Dimensions, ScaledSize } from 'react-native';\n\nimport useDimensions from '../useDimensions';\nimport useSafeState from '../useSafeState';\n\nconst isOrientationPortrait = ({ width, height }: ScaledSize) => height >= width;\nconst isOrientationLandscape = ({ width, height }: ScaledSize) => width >= height;\n\nexport default function useDeviceOrientation() {\n  const { screen } = useDimensions();\n\n  const initialState = {\n    portrait: isOrientationPortrait(screen),\n    landscape: isOrientationLandscape(screen),\n  };\n  const [orientation, setOrientation] = useSafeState(initialState);\n\n  useEffect(() => {\n    const onChange = ({ screen }: { screen: ScaledSize }) => {\n      setOrientation({\n        portrait: isOrientationPortrait(screen),\n        landscape: isOrientationLandscape(screen),\n      });\n    };\n\n    const subscription = Dimensions.addEventListener('change', onChange);\n\n    return () => {\n      // @ts-ignore - React Native >= 0.65\n      if (typeof subscription?.remove === 'function') {\n        // @ts-ignore - need update @types/react-native@0.65.x\n        subscription.remove();\n      } else {\n        // @ts-ignore React Native < 0.65\n        Dimensions.removeEventListener('change', onChange);\n      }\n    };\n  }, [setOrientation]);\n\n  return orientation;\n}\n"
  },
  {
    "path": "packages/hooks/src/useDimensions/index.ts",
    "content": "import { useEffect } from 'react';\nimport { Dimensions, ScaledSize } from 'react-native';\n\nimport useSafeState from '../useSafeState';\n\nconst initialValue = {\n  window: Dimensions.get('window'),\n  screen: Dimensions.get('screen'),\n};\n\nexport default function useDimensions() {\n  const [dimensions, setDimensions] = useSafeState(initialValue);\n\n  useEffect(() => {\n    function onChange({ window, screen }: { window: ScaledSize; screen: ScaledSize }) {\n      setDimensions({ window, screen });\n    }\n\n    const subscription = Dimensions.addEventListener('change', onChange);\n\n    return () => {\n      // @ts-ignore - React Native >= 0.65\n      if (typeof subscription?.remove === 'function') {\n        // @ts-ignore - need update @types/react-native@0.65.x\n        subscription.remove();\n      } else {\n        // @ts-ignore React Native < 0.65\n        Dimensions.removeEventListener('change', onChange);\n      }\n    };\n  }, [setDimensions]);\n\n  return dimensions;\n}\n"
  },
  {
    "path": "packages/hooks/src/useDynamicList/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useDynamicList from './index';\n\ndescribe('useDynamicList', () => {\n  const setUp = (props: any): any => renderHook(() => useDynamicList(props));\n\n  it('getKey should work', () => {\n    const hook = setUp([1, 2, 3]);\n    expect(hook.result.current.list[0]).toEqual(1);\n    expect(hook.result.current.getKey(0)).toEqual(0);\n    expect(hook.result.current.getKey(1)).toEqual(1);\n    expect(hook.result.current.getKey(2)).toEqual(2);\n  });\n\n  it('methods should work', () => {\n    const hook = setUp([\n      { name: 'aaa', age: 18 },\n      { name: 'bbb', age: 19 },\n      { name: 'ccc', age: 20 },\n    ]);\n\n    expect(hook.result.current.list[0].age).toEqual(18);\n    expect(hook.result.current.list[1].age).toEqual(19);\n    expect(hook.result.current.list[2].age).toEqual(20);\n\n    expect(hook.result.current.getKey(0)).toEqual(0);\n    expect(hook.result.current.getKey(1)).toEqual(1);\n    expect(hook.result.current.getKey(2)).toEqual(2);\n\n    // unshift\n    act(() => {\n      hook.result.current.unshift({ name: 'ddd', age: 21 });\n    });\n\n    expect(hook.result.current.list[0].name).toEqual('ddd');\n    expect(hook.result.current.getKey(0)).toEqual(3);\n\n    // push\n    act(() => {\n      hook.result.current.push({ name: 'ddd', age: 21 });\n    });\n\n    expect(hook.result.current.list[4].name).toEqual('ddd');\n    expect(hook.result.current.getKey(0)).toEqual(3);\n    expect(hook.result.current.getKey(4)).toEqual(4);\n\n    // insert\n    act(() => {\n      hook.result.current.insert(1, { name: 'eee', age: 22 });\n    });\n    expect(hook.result.current.list[1].name).toEqual('eee');\n    expect(hook.result.current.getKey(1)).toEqual(5);\n\n    // merge\n    act(() => {\n      hook.result.current.merge(0, [1, 2, 3, 4]);\n    });\n    expect(hook.result.current.list[0]).toEqual(1);\n    expect(hook.result.current.getKey(0)).toEqual(6);\n\n    // move\n    act(() => {\n      hook.result.current.move(0, 1);\n    });\n    expect(hook.result.current.list[0]).toEqual(2);\n    expect(hook.result.current.getKey(0)).toEqual(7);\n\n    // move without changes\n    act(() => {\n      hook.result.current.move(2, 2);\n    });\n    expect(hook.result.current.list[0]).toEqual(2);\n    expect(hook.result.current.getKey(0)).toEqual(7);\n\n    // shift\n    act(() => {\n      hook.result.current.shift();\n    });\n    expect(hook.result.current.list[0]).toEqual(1);\n    expect(hook.result.current.getKey(0)).toEqual(6);\n    expect(hook.result.current.list.length).toEqual(9);\n\n    // pop\n    act(() => {\n      hook.result.current.pop();\n    });\n    expect(hook.result.current.list.length).toEqual(8);\n\n    // replace\n    act(() => {\n      hook.result.current.replace(7, { value: 8 });\n    });\n    expect(hook.result.current.list[7].value).toEqual(8);\n\n    // remove\n    act(() => {\n      hook.result.current.remove(7);\n    });\n    expect(hook.result.current.list.length).toEqual(7);\n  });\n\n  it('same items should have different keys', () => {\n    const hook = setUp([1, 1, 1, 1]);\n    expect(hook.result.current.getKey(0)).toEqual(0);\n    expect(hook.result.current.getKey(1)).toEqual(1);\n    expect(hook.result.current.getKey(2)).toEqual(2);\n    expect(hook.result.current.getKey(3)).toEqual(3);\n\n    act(() => {\n      hook.result.current.push(1);\n    });\n\n    expect(hook.result.current.getKey(4)).toEqual(4);\n    const testObj = {};\n\n    act(() => {\n      hook.result.current.push({});\n      hook.result.current.push(testObj);\n      hook.result.current.push(testObj);\n    });\n\n    expect(hook.result.current.getKey(5)).toEqual(5);\n    expect(hook.result.current.getKey(6)).toEqual(6);\n    expect(hook.result.current.getKey(7)).toEqual(7);\n  });\n\n  it('initialValue changes', () => {\n    const hook = renderHook(({ initialValue }) => useDynamicList(initialValue), {\n      initialProps: {\n        initialValue: [1],\n      },\n    });\n    expect(hook.result.current.list[0]).toEqual(1);\n    expect(hook.result.current.getKey(0)).toEqual(0);\n\n    act(() => {\n      hook.result.current.reset([2]);\n    });\n\n    expect(hook.result.current.list[0]).toEqual(2);\n    expect(hook.result.current.getKey(0)).toEqual(1);\n\n    act(() => {\n      hook.result.current.reset([3]);\n    });\n\n    expect(hook.result.current.list[0]).toEqual(3);\n    expect(hook.result.current.getKey(0)).toEqual(2);\n  });\n\n  it('sortList', () => {\n    const hook = setUp([1, 2, 3, 4]);\n    const formData = [\n      {\n        name: 'my bro',\n        age: '23',\n        memo: \"he's my bro\",\n      },\n      {\n        name: 'my sis',\n        age: '21',\n        memo: \"she's my sis\",\n      },\n      null,\n      {\n        name: '新增行',\n        age: '25',\n      },\n    ];\n\n    let sorted = hook.result.current.sort(formData);\n    expect(sorted.length).toEqual(3);\n    expect(sorted[0].name).toEqual('my bro');\n\n    act(() => {\n      hook.result.current.move(3, 0);\n    });\n    sorted = hook.result.current.sort(formData);\n    expect(sorted[0].name).toEqual('新增行');\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useDynamicList/index.ts",
    "content": "import { useCallback, useRef, useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\nexport default function useDynamicList<T>(initialList: T[] = []) {\n  const counterRef = useRef(-1);\n  const keyListRef = useRef<number[]>([]);\n\n  const setKey = useCallback((index: number) => {\n    counterRef.current += 1;\n    keyListRef.current.splice(index, 0, counterRef.current);\n  }, []);\n\n  const [list, setList] = useState(() => {\n    initialList.forEach((_, index) => {\n      setKey(index);\n    });\n    return initialList;\n  });\n\n  /**\n   * 重设List\n   * @param newList\n   */\n  const reset = (newList: T[]) => {\n    keyListRef.current = [];\n    setList(() => {\n      newList.forEach((_, index) => {\n        setKey(index);\n      });\n      return newList;\n    });\n  };\n\n  /**\n   * 在指定位置插入一个新数据\n   * @param index\n   * @param item\n   */\n  const insert = (index: number, item: T) => {\n    setList(l => {\n      const temp = [...l];\n      temp.splice(index, 0, item);\n      setKey(index);\n\n      return temp;\n    });\n  };\n\n  const getKey = (index: number) => {\n    return keyListRef.current[index];\n  };\n\n  const getIndex = (key: number) => {\n    return keyListRef.current.findIndex(item => item === key);\n  };\n\n  /**\n   * 从指定位置开始，合并数据\n   * @param index\n   * @param items\n   */\n  const merge = (index: number, items: T[]) => {\n    setList(l => {\n      const temp = [...l];\n      items.forEach((_, i) => {\n        setKey(index + i);\n      });\n      temp.splice(index, 0, ...items);\n\n      return temp;\n    });\n  };\n\n  /**\n   * 替换指定位置的数据\n   * @param index\n   * @param item\n   */\n  const replace = (index: number, item: T) => {\n    setList(l => {\n      const temp = [...l];\n      temp[index] = item;\n\n      return temp;\n    });\n  };\n\n  /**\n   * 删除指定位置的数据\n   * @param index\n   */\n  const remove = (index: number) => {\n    setList(l => {\n      const temp = [...l];\n      temp.splice(index, 1);\n\n      try {\n        keyListRef.current.splice(index, 1);\n      } catch (e) {\n        console.error(e);\n      }\n\n      return temp;\n    });\n  };\n\n  /**\n   * 移动数据到新位置\n   * @param oldIndex\n   * @param newIndex\n   */\n  const move = (oldIndex: number, newIndex: number) => {\n    if (oldIndex === newIndex) return;\n\n    setList(l => {\n      const newList = [...l];\n      const temp = newList.filter((_, index) => index !== oldIndex);\n      temp.splice(newIndex, 0, newList[oldIndex]);\n\n      try {\n        const keyTemp = keyListRef.current.filter((_, index) => index !== oldIndex);\n        keyTemp.splice(newIndex, 0, keyListRef.current[oldIndex]);\n        keyListRef.current = keyTemp;\n      } catch (error) {\n        console.error(error);\n      }\n\n      return temp;\n    });\n  };\n\n  /**\n   * 在当前数组中插入一个新的数据\n   * @param item\n   */\n  const push = (item: T) => {\n    setList(l => {\n      setKey(l.length);\n\n      return l.concat([item]);\n    });\n  };\n\n  /**\n   * 从数组中删除最后一个数据，返回新数组\n   */\n  const pop = () => {\n    try {\n      keyListRef.current = keyListRef.current.slice(0, keyListRef.current.length - 1);\n    } catch (error) {\n      console.error(error);\n    }\n\n    setList(l => l.slice(0, l.length - 1));\n  };\n\n  /**\n   * 在数组最前面插入一条新数据\n   * @param item\n   */\n  const unshift = (item: T) => {\n    setList(l => {\n      setKey(0);\n\n      return [item].concat(l);\n    });\n  };\n\n  /**\n   * 删除数组的第一条数据，并返回新数组\n   */\n  const shift = () => {\n    try {\n      keyListRef.current = keyListRef.current.slice(1, keyListRef.current.length);\n    } catch (error) {\n      console.error(error);\n    }\n    setList(l => l.slice(1, l.length));\n  };\n\n  const sort = (result: T[]) => {\n    return result\n      .map((item, index) => ({ key: index, item }))\n      .sort((a, b) => getIndex(a.key) - getIndex(b.key))\n      .filter(item => !!item.item)\n      .map(item => item.item);\n  };\n\n  return {\n    list,\n    insert: useMemoizedFn(insert),\n    merge: useMemoizedFn(merge),\n    replace: useMemoizedFn(replace),\n    remove: useMemoizedFn(remove),\n    getKey: useMemoizedFn(getKey),\n    getIndex: useMemoizedFn(getIndex),\n    move: useMemoizedFn(move),\n    push: useMemoizedFn(push),\n    pop: useMemoizedFn(pop),\n    unshift: useMemoizedFn(unshift),\n    shift: useMemoizedFn(shift),\n    sort: useMemoizedFn(sort),\n    reset: useMemoizedFn(reset),\n  };\n}\n"
  },
  {
    "path": "packages/hooks/src/useEventEmitter/index.ts",
    "content": "/* eslint-disable */\nimport { useEffect, useRef } from 'react';\n\ntype Subscription<T> = (val: T) => void;\n\nexport class EventEmitter<T> {\n  private subscriptions = new Set<Subscription<T>>();\n\n  emit(val: T) {\n    for (const subscription of this.subscriptions) {\n      subscription(val);\n    }\n  }\n\n  useSubscription(cb: Subscription<T>) {\n    const callbackRef = useRef<Subscription<T>>();\n    callbackRef.current = cb;\n\n    useEffect(() => {\n      function subscription(val: T) {\n        if (callbackRef.current) {\n          callbackRef.current(val);\n        }\n      }\n\n      this.subscriptions.add(subscription);\n\n      return () => {\n        this.subscriptions.delete(subscription);\n      };\n\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n  }\n}\n\nexport default function useEventEmitter<T = void>() {\n  const ref = useRef<EventEmitter<T>>();\n  if (!ref.current) {\n    ref.current = new EventEmitter();\n  }\n  return ref.current;\n}\n"
  },
  {
    "path": "packages/hooks/src/useGetState/__tests__/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useGetState from '../index';\n\ndescribe('useGetState', () => {\n  const setUp = <T>(initialValue: T) =>\n    renderHook(() => {\n      const [state, setState, getState] = useGetState<T>(initialValue);\n      return {\n        state,\n        setState,\n        getState,\n      } as const;\n    });\n\n  it('should support initialValue', () => {\n    const hook = setUp(() => 0);\n    expect(hook.result.current.state).toEqual(0);\n  });\n\n  it('should support update', () => {\n    const hook = setUp(0);\n    act(() => {\n      hook.result.current.setState(1);\n    });\n    expect(hook.result.current.getState()).toEqual(1);\n  });\n\n  it('should getState frozen', () => {\n    const hook = setUp(0);\n    const prevGetState = hook.result.current.getState;\n    act(() => {\n      hook.result.current.setState(1);\n    });\n    expect(hook.result.current.getState).toEqual(prevGetState);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useGetState/demo/demo1.tsx",
    "content": "/**\n * title: Open console to view logs\n * desc: The counter prints the value every 3 seconds\n *\n * title.zh-CN: 打开控制台查看输出\n * desc.zh-CN: 计数器每 3 秒打印一次值\n */\nimport React, { useEffect } from 'react';\n\nimport { useGetState } from 'ahooks';\n\nexport default () => {\n  const [count, setCount, getCount] = useGetState<number>(0);\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      console.log('interval count', getCount());\n    }, 3000);\n\n    return () => {\n      clearInterval(interval);\n    };\n  }, []);\n\n  return <button onClick={() => setCount(count => count + 1)}>count: {count}</button>;\n};\n"
  },
  {
    "path": "packages/hooks/src/useGetState/index.ts",
    "content": "import type { Dispatch, SetStateAction } from 'react';\nimport { useRef } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useSafeState from '../useSafeState';\n\ntype GetStateAction<S> = () => S;\n\nfunction useGetState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>, GetStateAction<S>];\nfunction useGetState<S = undefined>(): [\n  S | undefined,\n  Dispatch<SetStateAction<S | undefined>>,\n  GetStateAction<S | undefined>,\n];\nfunction useGetState<S>(initialState?: S) {\n  const [state, setState] = useSafeState(initialState);\n  const stateRef = useRef(state);\n  stateRef.current = state;\n\n  const getState = useMemoizedFn(() => stateRef.current);\n\n  return [state, setState, getState];\n}\n\nexport default useGetState;\n"
  },
  {
    "path": "packages/hooks/src/useHistoryTravel/index.ts",
    "content": "import { useRef, useState } from 'react';\n\nimport { isNumber } from 'lodash-es';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\ntype HistoryData<T> = {\n  present?: T;\n  past: T[];\n  future: T[];\n};\n\nexport default function useHistoryTravel<T>(initialValue?: T, maxLength = 0) {\n  const [history, setHistory] = useState<HistoryData<T | undefined>>({\n    present: initialValue,\n    past: [],\n    future: [],\n  });\n\n  const { present, past, future } = history;\n\n  const initialValueRef = useRef(initialValue);\n\n  const reset = (...params: any[]) => {\n    const _initialValue = params.length > 0 ? params[0] : initialValueRef.current;\n    initialValueRef.current = _initialValue;\n\n    setHistory({\n      present: _initialValue,\n      past: [],\n      future: [],\n    });\n  };\n\n  const updateValue = (val: T) => {\n    const _past = [...past, present];\n    const maxLengthNum = isNumber(maxLength) ? maxLength : Number(maxLength);\n    // maximum number of records exceeded\n    if (maxLengthNum > 0 && _past.length > maxLengthNum) {\n      //delete first\n      _past.splice(0, 1);\n    }\n\n    setHistory({\n      present: val,\n      future: [],\n      past: _past,\n    });\n  };\n\n  // 内部方法，不对外暴露\n  const _forward = (step = 1) => {\n    if (future.length === 0) return;\n\n    const { _before, _current, _after } = split(step, future);\n    setHistory({\n      past: [...past, present, ..._before],\n      present: _current,\n      future: _after,\n    });\n  };\n\n  // 内部方法，不对外暴露\n  const _backward = (step = -1) => {\n    if (past.length === 0) return;\n\n    const { _before, _current, _after } = split(step, past);\n    setHistory({\n      past: _before,\n      present: _current,\n      future: [..._after, present, ...future],\n    });\n  };\n\n  const go = (step: number) => {\n    const stepNum = isNumber(step) ? step : Number(step);\n    if (stepNum === 0) {\n      return;\n    }\n    if (stepNum > 0) {\n      return _forward(stepNum);\n    }\n    _backward(stepNum);\n  };\n\n  return {\n    value: present,\n    backLength: past.length,\n    forwardLength: future.length,\n    setValue: useMemoizedFn(updateValue),\n    go: useMemoizedFn(go),\n    back: useMemoizedFn(() => {\n      go(-1);\n    }),\n    forward: useMemoizedFn(() => {\n      go(1);\n    }),\n    reset: useMemoizedFn(reset),\n  };\n}\n\nfunction split<T>(step: number, targetArr: T[]) {\n  const index = dumpIndex(step, targetArr);\n  return {\n    _current: targetArr[index],\n    _before: targetArr.slice(0, index),\n    _after: targetArr.slice(index + 1),\n  };\n}\n\nfunction dumpIndex<T>(step: number, arr: T[]) {\n  let index = step > 0 ? step - 1 : arr.length + step;\n\n  if (index >= arr.length - 1) {\n    index = arr.length - 1;\n  }\n  if (index < 0) {\n    index = 0;\n  }\n  return index;\n}\n"
  },
  {
    "path": "packages/hooks/src/useInfiniteScroll/__tests__/index.test.ts",
    "content": "import { useState } from 'react';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../../utils/testHelpers';\nimport useInfiniteScroll from '../index';\n\nasync function mockRequest({ page, pageSize }: { page: number; pageSize: number }) {\n  await sleep(1000);\n  return {\n    page,\n    pageSize,\n    total: 30,\n    list: Array(10)\n      .fill('')\n      .map((_, index) => ({ id: (page - 1) * pageSize + index, name: `Cell${(page - 1) * pageSize + index}` })),\n  };\n}\n\nconst setup = (service, options?: any) => renderHook(() => useInfiniteScroll(service, options));\n\ndescribe('useInfiniteScroll', () => {\n  beforeAll(() => {\n    jest.useFakeTimers();\n  });\n\n  afterAll(() => {\n    jest.useRealTimers();\n  });\n\n  it('should auto load', async () => {\n    const { result } = setup(mockRequest);\n    expect(result.current.loading).toBeTruthy();\n    await act(async () => {\n      jest.advanceTimersByTime(1000);\n    });\n    expect(result.current.loading).toBeFalsy();\n  });\n\n  it('loadMore should work', async () => {\n    const { result } = setup(mockRequest);\n    expect(result.current.loading).toBeTruthy();\n\n    act(() => {\n      result.current.loadMore();\n    });\n\n    expect(result.current.loadingMore).toBeTruthy();\n    await act(async () => {\n      jest.advanceTimersByTime(1000);\n    });\n    expect(result.current.loadingMore).toBeFalsy();\n  });\n\n  it('refresh should work', async () => {\n    const fn = jest.fn(() => Promise.resolve({ list: [] }));\n    const { result } = setup(fn);\n    const { refresh } = result.current;\n    expect(fn).toBeCalledTimes(1);\n    await act(async () => {\n      refresh();\n    });\n    expect(fn).toBeCalledTimes(2);\n  });\n\n  it('refresh should be triggered when refreshDeps change', async () => {\n    const fn = jest.fn(() => Promise.resolve({ list: [], page: 1, pageSize: 10, total: 30 }));\n    const { result } = renderHook(() => {\n      const [value, setValue] = useState('');\n      const res = useInfiniteScroll(fn, {\n        refreshDeps: [value],\n      });\n      return {\n        ...res,\n        setValue,\n      };\n    });\n    expect(fn).toBeCalledTimes(1);\n    act(() => {\n      result.current.setValue('ahooks');\n    });\n    expect(fn).toBeCalledTimes(2);\n  });\n\n  it('cancel should be work', () => {\n    const onSuccess = jest.fn();\n    const { result } = setup(mockRequest, {\n      onSuccess,\n    });\n    const { cancel } = result.current;\n    expect(result.current.loading).toBe(true);\n    act(() => cancel());\n    expect(result.current.loading).toBe(false);\n    expect(onSuccess).not.toBeCalled();\n  });\n\n  it('onBefore/onSuccess/onFinally should be called', async () => {\n    const onBefore = jest.fn();\n    const onSuccess = jest.fn();\n    const onFinally = jest.fn();\n    const { result } = setup(mockRequest, {\n      onBefore,\n      onSuccess,\n      onFinally,\n    });\n    await act(async () => {\n      jest.advanceTimersByTime(1000);\n    });\n    expect(onBefore).toBeCalled();\n    expect(onSuccess).toBeCalled();\n    expect(onFinally).toBeCalled();\n  });\n\n  it('onError should be called when throw error', async () => {\n    const onError = jest.fn();\n    const mockRequestError = () => {\n      return Promise.reject('error');\n    };\n    setup(mockRequestError, {\n      onError,\n    });\n    await act(async () => {\n      Promise.resolve();\n    });\n    expect(onError).toBeCalled();\n  });\n\n  it('loading should be true when refresh after loadMore', async () => {\n    const { result } = setup(mockRequest);\n    expect(result.current.loading).toBeTruthy();\n    const { refresh, loadMore } = result.current;\n    await act(async () => {\n      jest.advanceTimersByTime(1000);\n    });\n\n    expect(result.current.loading).toBeFalsy();\n\n    act(() => {\n      loadMore();\n      refresh();\n    });\n    expect(result.current.loading).toBeTruthy();\n\n    await act(async () => {\n      jest.advanceTimersByTime(1000);\n    });\n\n    expect(result.current.loading).toBeFalsy();\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useInfiniteScroll/index.ts",
    "content": "import { DependencyList } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useRequest from '../useRequest';\nimport useSafeState from '../useSafeState';\nimport useUpdateEffect from '../useUpdateEffect';\n\ninterface PageParams {\n  page: number;\n  pageSize: number;\n}\n\ninterface Page<T> extends PageParams {\n  list: T[];\n  total: number;\n  totalPage?: number;\n}\n\ninterface InfiniteScrollOptions<TData> {\n  manual?: boolean;\n  refreshDeps?: DependencyList;\n\n  onBefore?: () => void;\n  onSuccess?: (data: TData) => void;\n  onError?: (error: Error) => void;\n  onFinally?: (data?: TData, error?: Error) => void;\n}\n\nconst INITIAL_PAGE = 1;\nconst INITIAL_PAGE_SIZE = 10;\n\nfunction useInfiniteScroll<T>(\n  service: (data: PageParams) => Promise<Page<T>>,\n  options?: InfiniteScrollOptions<Page<T>>\n) {\n  const { manual = false, refreshDeps = [], onBefore, onSuccess, onError, onFinally } = options || {};\n\n  const [data, setData] = useSafeState<Page<T>>();\n  const [loadingMore, setLoadingMore] = useSafeState(false);\n  const [noMoreData, setNoMoreData] = useSafeState(false);\n\n  const { loading, error, run, runAsync, cancel } = useRequest(\n    async (lastData: Page<T>) => {\n      const currentData = await service(\n        lastData\n          ? {\n              page: lastData.page + 1,\n              pageSize: lastData.pageSize,\n            }\n          : {\n              page: INITIAL_PAGE,\n              pageSize: INITIAL_PAGE_SIZE,\n            }\n      );\n\n      if (!currentData) {\n        setNoMoreData(true);\n        return currentData;\n      }\n\n      setNoMoreData(currentData.page * currentData.pageSize >= currentData.total);\n\n      if (!lastData) {\n        setData({\n          ...currentData,\n          list: [...(currentData.list || [])],\n        });\n      } else {\n        setData({\n          ...currentData,\n          list: [...(lastData.list || []), ...(currentData.list || [])],\n        });\n      }\n\n      return currentData;\n    },\n    {\n      manual,\n      onBefore,\n      onSuccess,\n      onError,\n      onFinally(_, d, e) {\n        setLoadingMore(false);\n        onFinally?.(d, e);\n      },\n    }\n  );\n\n  const loadMore = useMemoizedFn(() => {\n    if (noMoreData) return;\n\n    setLoadingMore(true);\n    return run(data);\n  });\n\n  const refresh = useMemoizedFn(() => {\n    setLoadingMore(false);\n    return runAsync();\n  });\n\n  useUpdateEffect(() => {\n    run();\n  }, [...refreshDeps]);\n\n  return {\n    data: data?.list || [],\n    loading,\n    loadingMore,\n    noMoreData,\n    error,\n\n    loadMore,\n    refresh,\n    cancel,\n    mutate: setData,\n  };\n}\n\nexport default useInfiniteScroll;\n"
  },
  {
    "path": "packages/hooks/src/useInterval/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useInterval } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n\n  useInterval(() => {\n    setCount(count + 1);\n  }, 1000);\n\n  return <div>count: {count}</div>;\n};\n"
  },
  {
    "path": "packages/hooks/src/useInterval/demo/demo2.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useInterval } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n  const [interval, setInterval] = useState(1000);\n\n  useInterval(\n    () => {\n      setCount(count + 1);\n    },\n    interval,\n    { immediate: true }\n  );\n\n  return (\n    <div>\n      <p> count: {count} </p>\n      <p style={{ marginTop: 16 }}> interval: {interval} </p>\n      <button onClick={() => setInterval(interval + 1000)} style={{ marginRight: 8 }}>\n        interval + 1000\n      </button>\n      <button\n        style={{ marginRight: 8 }}\n        onClick={() => {\n          setInterval(1000);\n        }}\n      >\n        reset interval\n      </button>\n      <button\n        onClick={() => {\n          setInterval(null);\n        }}\n      >\n        clear\n      </button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useInterval/demo/demo3.tsx",
    "content": "import React, { Dispatch, SetStateAction, useState } from 'react';\n\nimport { useInterval } from '@td-design/rn-hooks';\n\nconst useManualInterval = (\n  fn: any,\n  interval: number | null | undefined,\n  options?: { immediate?: boolean }\n): [boolean, Dispatch<SetStateAction<boolean>>] => {\n  const [enable, setEnable] = useState<boolean>(true);\n  useInterval(fn, enable ? interval : null, options);\n  return [enable, setEnable];\n};\n\nexport default () => {\n  const [count, setCount] = useState<number>(0);\n  const [interval, setInterval] = useState<number>(500);\n\n  const [status, setStatus] = useManualInterval(\n    () => {\n      setCount(count + 1);\n    },\n    interval,\n    { immediate: true }\n  );\n\n  return (\n    <>\n      <p style={{ marginTop: 16 }}> count: {count} </p>\n      <p style={{ marginTop: 16 }}> interval: {interval} </p>\n      <p style={{ marginTop: 16 }}> status: {status ? 'alive' : 'stopped'} </p>\n      <button onClick={() => setInterval(interval + 500)} style={{ marginRight: 12 }}>\n        interval + 500\n      </button>\n      <button\n        style={{ marginRight: 12 }}\n        onClick={() => {\n          setInterval(500);\n        }}\n      >\n        reset interval\n      </button>\n      <button\n        onClick={() => {\n          setStatus(!status);\n        }}\n      >\n        {status ? 'stop' : 'start'} interval\n      </button>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useInterval/index.test.ts",
    "content": "import { renderHook } from '@testing-library/react-hooks';\n\nimport useInterval from './index';\n\ndescribe('useInterval', () => {\n  beforeEach(() => {\n    jest.useFakeTimers();\n  });\n\n  test('useInterval should be defined', () => {\n    expect(useInterval).toBeDefined();\n  });\n\n  test('useInterval should work like a charm', () => {\n    const callback = jest.fn();\n\n    renderHook(() => useInterval(callback, 20));\n    expect(callback).not.toBeCalled();\n\n    jest.advanceTimersByTime(200);\n    expect(callback).toHaveBeenCalledTimes(10);\n  });\n\n  test('userInterval should not work when delay is undefined', () => {\n    const callback = jest.fn();\n    renderHook(() => useInterval(callback));\n\n    expect(callback).not.toBeCalled();\n\n    jest.advanceTimersByTime(200);\n\n    expect(callback).not.toBeCalled();\n  });\n\n  test('immediate in options should work', () => {\n    const callback = jest.fn();\n    renderHook(() => useInterval(callback, 20, { immediate: true }));\n\n    expect(callback).toBeCalled();\n    expect(callback).toHaveBeenCalledTimes(1);\n\n    jest.advanceTimersByTime(50);\n\n    expect(callback).toHaveBeenCalledTimes(3);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useInterval/index.ts",
    "content": "import { useEffect, useRef } from 'react';\n\nimport { isNumber } from 'lodash-es';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\ntype Func = (...args: any[]) => any;\n\nexport default function useInterval(fn: Func, delay?: number, options?: { immediate: boolean }) {\n  const immediate = options?.immediate ?? false;\n\n  const timerCallback = useMemoizedFn(fn);\n  const timer = useRef<ReturnType<typeof setInterval>>();\n\n  useEffect(() => {\n    if (!isNumber(delay) || delay < 0) return;\n    if (immediate) {\n      timerCallback();\n    }\n    timer.current = setInterval(timerCallback, delay);\n\n    return clear;\n  }, [delay, immediate]);\n\n  const clear = useMemoizedFn(() => {\n    if (timer.current) {\n      clearInterval(timer.current);\n    }\n  });\n\n  return clear;\n}\n"
  },
  {
    "path": "packages/hooks/src/useKeyboard/index.test.ts",
    "content": "import useKeyboard from './index';\n\ndescribe('useKeyboard', () => {\n  test('useKeyboard should be defined', () => {\n    expect(useKeyboard).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useKeyboard/index.ts",
    "content": "import { useEffect } from 'react';\nimport { Keyboard, KeyboardMetrics } from 'react-native';\n\nimport useBoolean from '../useBoolean';\nimport useSafeState from '../useSafeState';\n\nconst emptyCoord = Object.freeze({\n  screenX: 0,\n  screenY: 0,\n  width: 0,\n  height: 0,\n});\n\nconst initialValue = {\n  start: emptyCoord,\n  end: emptyCoord,\n};\n\nexport default function useKeyboard() {\n  const [shown, { setTrue, setFalse }] = useBoolean(false);\n  const [coords, setCoords] = useSafeState<{ start?: KeyboardMetrics; end?: KeyboardMetrics }>(initialValue);\n  const [keyboardHeight, setKeyboardHeight] = useSafeState(0);\n\n  useEffect(() => {\n    const subscriptions = [\n      Keyboard.addListener('keyboardWillShow', e => {\n        setCoords({ start: e.startCoordinates, end: e.endCoordinates });\n      }),\n      Keyboard.addListener('keyboardDidShow', e => {\n        setTrue();\n        setCoords({ start: e.startCoordinates, end: e.endCoordinates });\n        setKeyboardHeight(e.endCoordinates.height);\n      }),\n      Keyboard.addListener('keyboardWillHide', e => {\n        setCoords({ start: e.startCoordinates, end: e.endCoordinates });\n      }),\n      Keyboard.addListener('keyboardDidHide', e => {\n        setFalse();\n        if (e) {\n          setCoords({ start: e.startCoordinates, end: e.endCoordinates });\n        } else {\n          setCoords(initialValue);\n          setKeyboardHeight(0);\n        }\n      }),\n    ];\n\n    return () => {\n      subscriptions.forEach(subscription => subscription.remove());\n    };\n  }, [setCoords, setFalse, setKeyboardHeight, setTrue]);\n\n  return {\n    keyboardShown: shown,\n    keyboardHeight,\n    coords,\n  };\n}\n"
  },
  {
    "path": "packages/hooks/src/useLatest/demo/demo1.tsx",
    "content": "import React, { useEffect, useState } from 'react';\n\nimport { useLatest } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n\n  const latestCountRef = useLatest(count);\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setCount(latestCountRef.current + 1);\n    }, 1000);\n    return () => clearInterval(interval);\n  }, []);\n\n  return (\n    <>\n      <p>count: {count}</p>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useLatest/index.test.ts",
    "content": "import { renderHook } from '@testing-library/react-hooks';\n\nimport useLatest from './index';\n\ndescribe('useLatest', () => {\n  test('useLatest should be defined', () => {\n    expect(useLatest).toBeDefined();\n  });\n\n  test('useLatest with basic variable should work like a charm', () => {\n    const { result, rerender } = renderHook(state => useLatest(state), { initialProps: 0 });\n\n    rerender(1);\n    expect(result.current.current).toBe(1);\n\n    rerender(2);\n    expect(result.current.current).toBe(2);\n  });\n\n  test('useLatest with reference variable should work like a charm', () => {\n    const { result, rerender } = renderHook(state => useLatest(state), { initialProps: {} });\n\n    expect(result.current.current).toEqual({});\n\n    rerender([]);\n    expect(result.current.current).toEqual([]);\n  });\n\n  test('useLatest with function should work like a charm', () => {\n    const fn = jest.fn();\n    const { result, rerender } = renderHook(state => useLatest(state), { initialProps: fn });\n\n    expect(result.current.current).toEqual(fn);\n\n    rerender();\n    expect(result.current.current).toEqual(fn);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useLatest/index.ts",
    "content": "import { useRef } from 'react';\n\n/**\n * 返回当前最新值的 Hook，可以避免闭包问题。\n * @param value 要持久化的值\n * @returns\n */\nexport default function useLatest<T>(value: T) {\n  const ref = useRef<T>(value);\n  ref.current = value;\n\n  return ref;\n}\n"
  },
  {
    "path": "packages/hooks/src/useLayout/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useLayout from './index';\n\ndescribe('useLayout', () => {\n  it('should return default state', () => {\n    const { result } = renderHook(() => useLayout());\n\n    expect(result.current.x).toBe(0);\n    expect(result.current.y).toBe(0);\n    expect(result.current.width).toBe(0);\n    expect(result.current.height).toBe(0);\n  });\n\n  it('should update state when layout change', () => {\n    const { result } = renderHook(() => useLayout());\n\n    act(() => {\n      const layout = { x: 1, y: 2, width: 3, height: 4 };\n\n      result.current.onLayout({ nativeEvent: { layout } });\n    });\n\n    expect(result.current.x).toBe(1);\n    expect(result.current.y).toBe(2);\n    expect(result.current.width).toBe(3);\n    expect(result.current.height).toBe(4);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useLayout/index.ts",
    "content": "import useMemoizedFn from '../useMemoizedFn';\nimport useSafeState from '../useSafeState';\n\nexport default function useLayout() {\n  const [layout, setLayout] = useSafeState({\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n  });\n  const onLayout = useMemoizedFn(e => setLayout(e.nativeEvent.layout));\n\n  return {\n    onLayout,\n    ...layout,\n  };\n}\n"
  },
  {
    "path": "packages/hooks/src/useLockFn/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useLockFn } from '@td-design/rn-hooks';\nimport { message } from 'antd';\n\nfunction mockApiRequest() {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve(true);\n    }, 2000);\n  });\n}\n\nexport default () => {\n  const [count, setCount] = useState(0);\n\n  const submit = useLockFn(async () => {\n    message.info('Start to submit');\n    await mockApiRequest();\n    setCount(val => val + 1);\n    message.success('Submit finished');\n  });\n\n  return (\n    <>\n      <p>Submit count: {count}</p>\n      <button onClick={submit}>Submit</button>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useLockFn/index.test.ts",
    "content": "import { useCallback, useRef, useState } from 'react';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../utils/testHelpers';\nimport useLockFn from './index';\n\ndescribe('useLockFn', () => {\n  test('useLockFn should be defined', () => {\n    expect(useLockFn).toBeDefined();\n  });\n\n  const setup = () =>\n    renderHook(() => {\n      const [tag, setTag] = useState(false);\n      const countRef = useRef(0);\n\n      const persistFn = useCallback(\n        async (step: number) => {\n          countRef.current += step;\n          await sleep(50);\n        },\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n        [tag] // 为了模拟tag变化引起persistFn发生变化\n      );\n      const lockedFn = useLockFn(persistFn);\n\n      return {\n        lockedFn,\n        countRef,\n        updateTag: () => setTag(true),\n      };\n    });\n\n  test('useLockFn should work like a charm', async () => {\n    const { result } = setup();\n    const { lockedFn, countRef } = result.current;\n\n    lockedFn(1);\n    expect(countRef.current).toBe(1);\n\n    lockedFn(2);\n    expect(countRef.current).toBe(1);\n\n    await sleep(30);\n    lockedFn(3);\n    expect(countRef.current).toBe(1);\n\n    await sleep(50);\n    lockedFn(4);\n    expect(countRef.current).toBe(5);\n\n    lockedFn(5);\n    expect(countRef.current).toBe(5);\n  });\n\n  test('lockedFn should be the same', () => {\n    const { result, rerender } = setup();\n    const prevLockedFn = result.current.lockedFn;\n\n    rerender();\n    expect(result.current.lockedFn).toEqual(prevLockedFn);\n\n    act(() => {\n      result.current.updateTag(); // 更新之后tag发生变化，导致persistFn发生变化，从而lockedFn发生变化\n    });\n    expect(result.current.lockedFn).not.toEqual(prevLockedFn);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useLockFn/index.ts",
    "content": "import { useCallback, useRef } from 'react';\n\n/**\n * 用于给一个异步函数增加竞态锁，防止并发执行。\n * 可以用在诸如表单提交的场景下，保证即便多次点击提交，在前一次结果未完成之前，后续操作会被忽略\n */\nexport default function useLockFn<P extends any[] = any[], U = any>(fn: (...args: P) => Promise<U>) {\n  const lockRef = useRef(false);\n\n  return useCallback(\n    async (...args: P) => {\n      if (lockRef.current) return;\n      lockRef.current = true;\n\n      try {\n        const result = await fn(...args);\n        lockRef.current = false;\n        return result;\n      } catch (error) {\n        lockRef.current = false;\n        throw error;\n      }\n    },\n    [fn]\n  );\n}\n"
  },
  {
    "path": "packages/hooks/src/useMap/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useMap } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [map, { set, setAll, remove, reset, get }] = useMap<string | number, string>([\n    ['msg', 'hello world'],\n    [123, 'number type'],\n  ]);\n\n  return (\n    <div>\n      <button type=\"button\" onClick={() => set(String(Date.now()), new Date().toJSON())}>\n        Add\n      </button>\n      <button type=\"button\" onClick={() => setAll([['text', 'this is a new Map']])} style={{ margin: '0 8px' }}>\n        Set new Map\n      </button>\n      <button type=\"button\" onClick={() => remove('msg')} disabled={!get('msg')}>\n        Remove 'msg'\n      </button>\n      <button type=\"button\" onClick={() => reset()} style={{ margin: '0 8px' }}>\n        Reset\n      </button>\n      <div style={{ marginTop: 16 }}>\n        <pre>{JSON.stringify(Array.from(map), null, 2)}</pre>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useMap/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useMap from './index';\n\nconst setUp = (initialMap?: Iterable<[any, any]>) => renderHook(() => useMap(initialMap));\n\ndescribe('useMap', () => {\n  it('should be defined', () => {\n    expect(useMap).toBeDefined();\n  });\n\n  it('should init map and utils', () => {\n    const { result } = setUp([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n    const [map, utils] = result.current;\n\n    expect(Array.from(map)).toEqual([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n    expect(utils).toStrictEqual({\n      get: expect.any(Function),\n      set: expect.any(Function),\n      setAll: expect.any(Function),\n      remove: expect.any(Function),\n      reset: expect.any(Function),\n    });\n  });\n\n  it('should init empty map if not initial object provided', () => {\n    const { result } = setUp();\n\n    expect([...result.current[0]]).toEqual([]);\n  });\n\n  it('should get corresponding value for initial provided key', () => {\n    const { result } = setUp([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n    const [, utils] = result.current;\n\n    let value;\n    act(() => {\n      value = utils.get('a');\n    });\n\n    expect(value).toBe(1);\n  });\n\n  it('should get corresponding value for existing provided key', () => {\n    const { result } = setUp([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n\n    act(() => {\n      result.current[1].set('a', 99);\n    });\n\n    let value;\n    act(() => {\n      value = result.current[1].get('a');\n    });\n\n    expect(value).toBe(99);\n  });\n\n  it('should get undefined for non-existing provided key', () => {\n    const { result } = setUp([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n    const [, utils] = result.current;\n\n    let value;\n    act(() => {\n      value = utils.get('nonExisting');\n    });\n\n    expect(value).toBeUndefined();\n  });\n\n  it('should set new key-value pair', () => {\n    const { result } = setUp([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.set('newKey', 99);\n    });\n\n    expect([...result.current[0]]).toEqual([\n      ['foo', 'bar'],\n      ['a', 1],\n      ['newKey', 99],\n    ]);\n  });\n\n  it('should override current value if setting existing key', () => {\n    const { result } = setUp([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.set('foo', 'qux');\n    });\n\n    expect([...result.current[0]]).toEqual([\n      ['foo', 'qux'],\n      ['a', 1],\n    ]);\n  });\n\n  it('should set new map', () => {\n    const { result } = setUp([\n      ['foo', 'bar'],\n      ['a', 1],\n    ]);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.setAll([\n        ['foo', 'foo'],\n        ['a', 2],\n      ]);\n    });\n\n    expect([...result.current[0]]).toEqual([\n      ['foo', 'foo'],\n      ['a', 2],\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useMap/index.ts",
    "content": "import { useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\n/**\n * 一个可以管理 Map 类型状态的 Hook。\n * @param initialValue 初始值\n * @returns\n */\nexport default function useMap<K = any, T = any>(initialValue?: Iterable<readonly [K, T]>) {\n  const getInitValue = () => new Map(initialValue);\n\n  const [map, setMap] = useState<Map<K, T>>(getInitValue);\n\n  const set = (key: K, entry: T) => {\n    setMap(prev => {\n      const temp = new Map(prev);\n      temp.set(key, entry);\n      return temp;\n    });\n  };\n\n  const setAll = (newMap: Iterable<readonly [K, T]>) => {\n    setMap(new Map(newMap));\n  };\n\n  const remove = (key: K) => {\n    setMap(prev => {\n      const temp = new Map(prev);\n      temp.delete(key);\n      return temp;\n    });\n  };\n\n  const reset = () => setMap(getInitValue());\n\n  const get = (key: K) => map.get(key);\n\n  const actions = {\n    set: useMemoizedFn(set),\n    setAll: useMemoizedFn(setAll),\n    remove: useMemoizedFn(remove),\n    reset: useMemoizedFn(reset),\n    get: useMemoizedFn(get),\n  };\n\n  return [map, actions] as const;\n}\n"
  },
  {
    "path": "packages/hooks/src/useMemoizedFn/index.test.ts",
    "content": "import { useState } from 'react';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport useMemoizedFn from './index';\n\nconst useCount = () => {\n  const [count, setCount] = useState(0);\n\n  const addCount = () => {\n    setCount(c => c + 1);\n  };\n\n  const memoizedFn = useMemoizedFn(() => count);\n\n  return {\n    addCount,\n    memoizedFn,\n  };\n};\n\ndescribe('useMemoizedFn', () => {\n  test('useMemoizedFn should be defined', () => {\n    expect(useMemoizedFn).toBeDefined();\n  });\n\n  test('useMemoizedFn should work like a charm', () => {\n    const { result } = renderHook(() => useCount());\n    // 在useCount重新渲染之前先存下来，用于后面比较引用地址是否一致\n    const prevMemoizedFn = result.current.memoizedFn;\n\n    // 修改state的操作要放在act中执行\n    act(() => {\n      result.current.addCount();\n    });\n\n    // 比较 rerender 前后 memoizedFn 的地址是否发生变化\n    expect(prevMemoizedFn).toEqual(result.current.memoizedFn);\n    expect(result.current.memoizedFn()).toEqual(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useMemoizedFn/index.ts",
    "content": "import { useMemo, useRef } from 'react';\n\nimport { isFunction } from '../utils';\n\ntype noop = (this: any, ...args: any[]) => any;\n\ntype PickFunction<T extends noop> = (this: ThisParameterType<T>, ...args: Parameters<T>) => ReturnType<T>;\n\nfunction useMemoizedFn<T extends noop>(fn: T) {\n  if (__DEV__) {\n    if (!isFunction(fn)) {\n      throw new Error(`useMemoizedFn expected parameter is a function, got ${typeof fn}`);\n    }\n  }\n\n  const fnRef = useRef<T>(fn);\n\n  // why not write `fnRef.current = fn`?\n  // https://github.com/alibaba/hooks/issues/728\n  fnRef.current = useMemo(() => fn, [fn]);\n\n  const memoizedFn = useRef<PickFunction<T>>();\n  if (!memoizedFn.current) {\n    memoizedFn.current = function (this, ...args) {\n      return fnRef.current.apply(this, args);\n    };\n  }\n\n  return memoizedFn.current as T;\n}\n\nexport default useMemoizedFn;\n"
  },
  {
    "path": "packages/hooks/src/useMount/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useMount, useToggle } from '@td-design/rn-hooks';\nimport { message } from 'antd';\n\nconst MyComponent = () => {\n  useMount(() => {\n    message.info('mount');\n  });\n\n  return <div>Hello World</div>;\n};\n\nexport default () => {\n  const [state, { toggle }] = useToggle(false);\n\n  return (\n    <>\n      <button type=\"button\" onClick={toggle}>\n        {state ? 'unmount' : 'mount'}\n      </button>\n      {state && <MyComponent />}\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useMount/index.test.ts",
    "content": "import { renderHook } from '@testing-library/react-hooks';\n\nimport useMount from './index';\n\ndescribe('useMount', () => {\n  test('useMount should be defined', () => {\n    expect(useMount).toBeDefined();\n  });\n\n  test('useMount parameter should be function', () => {\n    const { result } = renderHook(() => useMount(1 as any));\n    expect(result.error).toBeDefined();\n  });\n\n  test('useMount should work like a charm', () => {\n    const fn = jest.fn();\n    const { rerender, unmount } = renderHook(() => useMount(fn));\n\n    expect(fn).toBeCalledTimes(1);\n\n    rerender();\n    expect(fn).toBeCalledTimes(1);\n\n    unmount();\n    expect(fn).toBeCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useMount/index.ts",
    "content": "import { useEffect } from 'react';\n\nimport { isFunction } from '../utils';\n\ntype Func = (...args: any[]) => any;\n\n/**\n * 只在组件 mount 时执行的 Hook。也就是说 fn 函数只会执行一次\n * @param fn mount 时执行的函数\n */\nexport default function useMount(fn: Func) {\n  if (__DEV__) {\n    if (!isFunction(fn)) {\n      throw new Error(`useMount expected parameter is a function, got ${typeof fn}`);\n    }\n  }\n\n  useEffect(() => {\n    fn();\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n}\n"
  },
  {
    "path": "packages/hooks/src/usePagination/index.test.ts",
    "content": "import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks';\n\nimport usePagination from './index';\nimport { request } from './testingHelper';\n\ntype PaginationParams = { current: number; pageSize: number };\n\ndescribe('usePagination', () => {\n  test('usePagination should be defined', () => {\n    expect(usePagination).toBeDefined();\n  });\n\n  beforeEach(() => {\n    jest.useFakeTimers();\n  });\n\n  const setUp = (service: any, options: any) => renderHook(o => usePagination(service, o || options));\n  let hook: RenderHookResult<any, any>;\n\n  test('usePagination should run automatically', async () => {\n    hook = setUp(request, {});\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data.list).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n    expect(hook.result.current.pagination.total).toEqual(12);\n    expect(hook.result.current.pagination.current).toEqual(1);\n    expect(hook.result.current.pagination.pageSize).toEqual(10);\n    expect(hook.result.current.pagination.totalPage).toEqual(2);\n    expect(hook.result.current.params).toEqual([{ current: 1, pageSize: 10 }]);\n    hook.unmount();\n\n    // 测试自动执行失败的场景\n    hook = setUp(({ current, pageSize }: PaginationParams, fail = true) => request({ current, pageSize, fail }), {});\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.error).toEqual(new Error('fail'));\n    expect(hook.result.current.data).toBeUndefined();\n  });\n\n  test('usePagination should be triggered manually', async () => {\n    hook = setUp(request, { manual: true });\n    expect(hook.result.current.loading).toBeFalsy();\n\n    act(() => {\n      hook.result.current.run({ current: 1, pageSize: 10 });\n    });\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data.list).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n    expect(hook.result.current.pagination.total).toEqual(12);\n    expect(hook.result.current.pagination.current).toEqual(1);\n    expect(hook.result.current.pagination.pageSize).toEqual(10);\n    expect(hook.result.current.pagination.totalPage).toEqual(2);\n    hook.unmount();\n\n    // 测试失败的场景\n    hook = setUp(request, { manual: true });\n    expect(hook.result.current.loading).toBeFalsy();\n\n    act(() => {\n      hook.result.current.run({ fail: true, current: 1, pageSize: 10 });\n    });\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.error).toEqual(new Error('fail'));\n    expect(hook.result.current.data).toBeUndefined();\n  });\n\n  test('usePagination changeCurrent should work', async () => {\n    hook = setUp(request, {});\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data.list).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n\n    act(() => {\n      hook.result.current.pagination.changeCurrent(2);\n    });\n\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data.list).toEqual([11, 12]);\n    expect(hook.result.current.pagination.total).toEqual(12);\n    expect(hook.result.current.pagination.totalPage).toEqual(2);\n  });\n\n  test('usePagination changePageSize should work', async () => {\n    hook = setUp(request, {});\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data.list).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n\n    act(() => {\n      hook.result.current.pagination.changePageSize(2);\n    });\n\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data.list).toEqual([1, 2]);\n    expect(hook.result.current.pagination.total).toEqual(12);\n    expect(hook.result.current.pagination.totalPage).toEqual(6);\n\n    act(() => {\n      hook.result.current.pagination.changeCurrent(2);\n    });\n\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data.list).toEqual([3, 4]);\n    expect(hook.result.current.pagination.total).toEqual(12);\n    expect(hook.result.current.pagination.totalPage).toEqual(6);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/usePagination/index.ts",
    "content": "import { useMemo } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useRequest from '../useRequest';\nimport type { Data, PaginationOptions, PaginationResult, Params, Service } from './types';\n\nconst usePagination = <TData extends Data, TParams extends Params>(\n  service: Service<TData, TParams>,\n  options: PaginationOptions<TData, TParams> = {}\n) => {\n  const { defaultPageSize = 10, defaultCurrent = 1, ...rest } = options;\n\n  const result = useRequest(service, {\n    defaultParams: [{ current: defaultCurrent, pageSize: defaultPageSize }] as any as TParams,\n    refreshDepsAction: () => {\n      // eslint-disable-next-line @typescript-eslint/no-use-before-define\n      changeCurrent(1);\n    },\n    ...rest,\n  });\n\n  const { current = 1, pageSize = defaultPageSize } = result.params[0] ?? {};\n\n  const total = result.data?.total ?? 0;\n  const totalPage = useMemo(() => Math.ceil(total / pageSize), [pageSize, total]);\n\n  const onChange = (current: number, pageSize: number) => {\n    let toPage = current <= 0 ? 1 : current;\n    const toPageSize = pageSize <= 0 ? 1 : pageSize;\n    const tempTotalPage = Math.ceil(total / toPageSize);\n\n    if (toPage > tempTotalPage) {\n      toPage = Math.max(1, tempTotalPage);\n    }\n\n    const [oldParams = {}, ...restParams] = result.params ?? [];\n\n    result.run(\n      {\n        ...oldParams,\n        current: toPage,\n        pageSize: toPageSize,\n      },\n      ...restParams\n    );\n  };\n\n  const changeCurrent = (current: number) => {\n    onChange(current, pageSize);\n  };\n\n  const changePageSize = (pageSize: number) => {\n    onChange(current, pageSize);\n  };\n\n  return {\n    ...result,\n    pagination: {\n      current,\n      pageSize,\n      total,\n      totalPage,\n      onChange: useMemoizedFn(onChange),\n      changeCurrent: useMemoizedFn(changeCurrent),\n      changePageSize: useMemoizedFn(changePageSize),\n    },\n  } as PaginationResult<TData, TParams>;\n};\n\nexport default usePagination;\n"
  },
  {
    "path": "packages/hooks/src/usePagination/testingHelper.ts",
    "content": "import type { Data, Params, Service } from './types';\n\nexport const request: Service<Data, Params> = ({\n  current = 1,\n  pageSize = 10,\n  fail = false,\n}: {\n  current: number;\n  pageSize: number;\n  fail?: boolean;\n}) => {\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      if (fail) {\n        reject(new Error('fail'));\n      } else {\n        const originalData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\n        const total = originalData.length;\n        const list = originalData.slice((current - 1) * pageSize, current * pageSize);\n\n        resolve({\n          total,\n          list,\n        });\n      }\n    }, 1000);\n  });\n};\n"
  },
  {
    "path": "packages/hooks/src/usePagination/types.ts",
    "content": "import type { Options, Result } from '../useRequest/types';\n\nexport type Data = { total: number; list: any[] };\n\nexport type Params = [{ current: number; pageSize: number; [key: string]: any }, ...any[]];\n\nexport type Service<TData extends Data, TParams extends Params> = (...args: TParams) => Promise<TData>;\n\nexport interface PaginationResult<TData extends Data, TParams extends Params> extends Result<TData, TParams> {\n  pagination: {\n    current: number;\n    pageSize: number;\n    total: number;\n    totalPage: number;\n    onChange: (current: number, pageSize: number) => void;\n    changeCurrent: (current: number) => void;\n    changePageSize: (pageSize: number) => void;\n  };\n}\n\nexport interface PaginationOptions<TData extends Data, TParams extends Params> extends Options<TData, TParams> {\n  defaultPageSize?: number;\n  defaultCurrent?: number;\n}\n"
  },
  {
    "path": "packages/hooks/src/usePrevious/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { usePrevious } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n  const previous = usePrevious(count);\n  return (\n    <>\n      <div>counter current value: {count}</div>\n      <div style={{ marginBottom: 8 }}>counter previous value: {previous}</div>\n      <button type=\"button\" onClick={() => setCount(c => c + 1)}>\n        increase\n      </button>\n      <button type=\"button\" style={{ marginLeft: 8 }} onClick={() => setCount(c => c - 1)}>\n        decrease\n      </button>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/usePrevious/demo/demo2.tsx",
    "content": "/**\n * 只有 shouldUpdate function 返回 true 时，才会记录值的变化。\n */\nimport React, { useState } from 'react';\n\nimport { usePrevious } from '@td-design/rn-hooks';\n\ninterface Person {\n  name: string;\n  job: string;\n}\n\nconst nameCompareFunction = (prev: Person | undefined, next: Person) => {\n  if (!prev) {\n    return true;\n  }\n  if (prev.name !== next.name) {\n    return true;\n  }\n  return false;\n};\n\nconst jobCompareFunction = (prev: Person | undefined, next: Person) => {\n  if (!prev) {\n    return true;\n  }\n  if (prev.job !== next.job) {\n    return true;\n  }\n  return false;\n};\n\nexport default () => {\n  const [state, setState] = useState({ name: 'Jack', job: 'student' });\n  const [nameInput, setNameInput] = useState('');\n  const [jobInput, setJobInput] = useState('');\n  const previousName = usePrevious(state, nameCompareFunction);\n  const previousJob = usePrevious(state, jobCompareFunction);\n\n  return (\n    <>\n      <div style={{ margin: '8px 0', border: '1px solid #e8e8e8', padding: 8 }}>\n        <div>current name: {state.name}</div>\n        <div>current job: {state.job}</div>\n      </div>\n      <div>previous name: {(previousName || {}).name}</div>\n      <div style={{ marginBottom: 8 }}>previous job: {(previousJob || {}).job}</div>\n      <div style={{ marginTop: 8 }}>\n        <input\n          style={{ width: 220 }}\n          value={nameInput}\n          onChange={e => setNameInput(e.target.value)}\n          placeholder=\"new name\"\n        />\n        <button\n          type=\"button\"\n          onClick={() => {\n            setState(s => ({ ...s, name: nameInput }));\n          }}\n          style={{ marginLeft: 8 }}\n        >\n          update\n        </button>\n      </div>\n      <div style={{ marginTop: 8 }}>\n        <input\n          style={{ width: 220 }}\n          value={jobInput}\n          onChange={e => setJobInput(e.target.value)}\n          placeholder=\"new job\"\n        />\n        <button\n          type=\"button\"\n          onClick={() => {\n            setState(s => ({ ...s, job: jobInput }));\n          }}\n          style={{ marginLeft: 8 }}\n        >\n          update\n        </button>\n      </div>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/usePrevious/index.test.ts",
    "content": "import { renderHook } from '@testing-library/react-hooks';\n\nimport usePrevious, { ShouldUpdateFunc } from './index';\n\ndescribe('usePrevious', () => {\n  test('usePrevious should be defined', () => {\n    expect(usePrevious).toBeDefined();\n  });\n\n  function setup<T>(initialValue?: T, compareFunction?: ShouldUpdateFunc<T>) {\n    return renderHook(({ val, cmpFunc }) => usePrevious<T>(val as T, cmpFunc), {\n      initialProps: {\n        val: initialValue || 0,\n        cmpFunc: compareFunction,\n      } as { val?: T; cmpFunc?: ShouldUpdateFunc<T> },\n    });\n  }\n\n  test('usePrevious should be undefined if no initialValue', () => {\n    const { result } = setup();\n    expect(result.current).toBeUndefined();\n  });\n\n  test('usePrevious should be undefined even if initialValue passed', () => {\n    const { result } = setup(2);\n    expect(result.current).toBeUndefined();\n  });\n\n  test('usePrevious should update previous value only after render with different value', () => {\n    const { result, rerender } = setup(0);\n    expect(result.current).toBeUndefined();\n\n    rerender({ val: 1 });\n    expect(result.current).toBe(0);\n\n    rerender({ val: 2 });\n    expect(result.current).toBe(1);\n\n    rerender({ val: 3 });\n    expect(result.current).toBe(2);\n  });\n\n  test('usePrevious should work fine with undefined values', () => {\n    const { result, rerender } = setup(0);\n    expect(result.current).toBeUndefined();\n\n    rerender({ val: 1 });\n    expect(result.current).toBe(0);\n\n    rerender({ val: undefined });\n    expect(result.current).toBe(1);\n\n    rerender({ val: 3 });\n    expect(result.current).toBeUndefined();\n  });\n\n  test('usePrevious compareFunction should work like a charm', () => {\n    const obj1 = { label: 'John', value: 'john' };\n    const obj2 = { label: 'Jonny', value: 'john' };\n    const obj3 = { label: 'Kate', value: 'kate' };\n    type Obj = { label: string; value: string };\n    const compareFunction = (a?: Obj, b?: Obj) => (a && b ? a.value !== b.value : true);\n\n    const { result, rerender } = setup(obj1, compareFunction);\n\n    expect(result.current).toBeUndefined();\n\n    rerender({ val: obj2, cmpFunc: compareFunction });\n    expect(result.current).toBeUndefined();\n\n    rerender({ val: obj3, cmpFunc: compareFunction });\n    expect(result.current).toBe(obj1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/usePrevious/index.ts",
    "content": "import { useRef } from 'react';\n\nexport type ShouldUpdateFunc<T> = (prev: T | undefined, next: T) => boolean;\n\nconst defaultShouldUpdate = <T>(a?: T, b?: T) => !Object.is(a, b);\n\n/**\n * 保存上一次状态的 Hook。\n * @param state 初始state\n * @param shouldUpdate 判断是否更新的函数\n */\nexport default function usePrevious<T>(\n  state: T,\n  shouldUpdate: ShouldUpdateFunc<T> = defaultShouldUpdate\n): T | undefined {\n  const prevRef = useRef<T>();\n  const currentRef = useRef<T>();\n\n  if (shouldUpdate(currentRef.current, state)) {\n    prevRef.current = currentRef.current;\n    currentRef.current = state;\n  }\n\n  return prevRef.current;\n}\n"
  },
  {
    "path": "packages/hooks/src/useRafInterval/demo/demo1.tsx",
    "content": "/**\n * title: 基础组件 usage\n * desc: Execute once per 1000ms.\n *\n * title.zh-CN: 基础用法\n * desc.zh-CN: 每1000ms，执行一次\n */\nimport React, { useState } from 'react';\n\nimport { useRafInterval } from 'ahooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n\n  useRafInterval(() => {\n    setCount(count + 1);\n  }, 1000);\n\n  return <div>count: {count}</div>;\n};\n"
  },
  {
    "path": "packages/hooks/src/useRafInterval/demo/demo2.tsx",
    "content": "/**\n * title: Advanced usage\n * desc: Modify the delay to realize the timer interval change and pause.\n *\n * title.zh-CN: 进阶使用\n * desc.zh-CN: 动态修改 delay 以实现定时器间隔变化与暂停。\n */\nimport React, { useState } from 'react';\n\nimport { useRafInterval } from 'ahooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n  const [interval, setInterval] = useState(1000);\n\n  useRafInterval(() => {\n    setCount(count + 1);\n  }, interval);\n\n  return (\n    <div>\n      <p> count: {count} </p>\n      <p style={{ marginTop: 16 }}> interval: {interval} </p>\n      <button onClick={() => setInterval(t => (!!t ? t + 1000 : 1000))} style={{ marginRight: 8 }}>\n        interval + 1000\n      </button>\n      <button\n        style={{ marginRight: 8 }}\n        onClick={() => {\n          setInterval(1000);\n        }}\n      >\n        reset interval\n      </button>\n      <button\n        onClick={() => {\n          setInterval(undefined);\n        }}\n      >\n        clear\n      </button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useRafInterval/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useRafInterval from './index';\n\nconst FRAME_TIME = 16.7;\ndescribe('useRafInterval', () => {\n  beforeEach(() => {\n    jest.useFakeTimers();\n  });\n\n  test('useRafInterval should be defined', () => {\n    expect(useRafInterval).toBeDefined();\n  });\n\n  test('useRafInterval should work like a charm', () => {\n    const callback = jest.fn();\n\n    renderHook(() => useRafInterval(callback, FRAME_TIME));\n    expect(callback).not.toBeCalled();\n\n    act(() => {\n      requestAnimationFrame(() => {\n        expect(callback).toBeCalledTimes(1);\n      });\n      requestAnimationFrame(() => {\n        expect(callback).toBeCalledTimes(2);\n      });\n    });\n  });\n\n  test('userInterval should not work when delay is undefined', () => {\n    const callback = jest.fn();\n    renderHook(() => useRafInterval(callback));\n\n    expect(callback).not.toBeCalled();\n\n    act(() => {\n      requestAnimationFrame(() => {\n        expect(callback).not.toBeCalled();\n      });\n    });\n  });\n\n  test('immediate in options should work', () => {\n    const callback = jest.fn();\n    renderHook(() => useRafInterval(callback, FRAME_TIME, { immediate: true }));\n\n    expect(callback).toBeCalled();\n\n    act(() => {\n      requestAnimationFrame(() => {\n        expect(callback).toBeCalledTimes(2);\n      });\n      requestAnimationFrame(() => {\n        expect(callback).toBeCalledTimes(3);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useRafInterval/index.ts",
    "content": "import { useEffect, useRef } from 'react';\n\nimport { isNumber } from 'lodash-es';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\ninterface Handle {\n  id: ReturnType<typeof setInterval> | number;\n}\n\nconst setRafInterval = function (callback: () => void, delay = 0): Handle {\n  if (typeof requestAnimationFrame === typeof undefined) {\n    return {\n      id: setInterval(callback, delay),\n    };\n  }\n  const handle: Handle = {\n    id: 0,\n  };\n\n  let start = new Date().getTime();\n  const loop = () => {\n    const current = new Date().getTime();\n    if (current - start >= delay) {\n      callback();\n      start = new Date().getTime();\n    }\n    handle.id = requestAnimationFrame(loop);\n  };\n  handle.id = requestAnimationFrame(loop);\n  return handle;\n};\n\nfunction cancelAnimationFrameIsNotDefined(t: any): t is NodeJS.Timer {\n  return typeof cancelAnimationFrame === typeof undefined;\n}\n\nconst clearRafInterval = function (handle: Handle) {\n  if (cancelAnimationFrameIsNotDefined(handle.id)) {\n    return clearInterval(handle.id);\n  }\n  cancelAnimationFrame(handle.id);\n};\n\nfunction useRafInterval(\n  fn: () => void,\n  delay?: number,\n  options?: {\n    immediate?: boolean;\n  }\n) {\n  const immediate = options?.immediate ?? false;\n\n  const timerCallback = useMemoizedFn(fn);\n  const timerRef = useRef<Handle>();\n\n  useEffect(() => {\n    if (!isNumber(delay) || delay < 0) return;\n    if (immediate) {\n      timerCallback();\n    }\n    timerRef.current = setRafInterval(() => {\n      timerCallback();\n    }, delay);\n\n    return clear;\n  }, [delay, immediate]);\n\n  const clear = useMemoizedFn(() => {\n    if (timerRef.current) {\n      clearRafInterval(timerRef.current);\n    }\n  });\n\n  return clear;\n}\n\nexport default useRafInterval;\n"
  },
  {
    "path": "packages/hooks/src/useRafState/demo/demo1.tsx",
    "content": "/**\n * title: Default usage\n *\n * title.zh-CN: 基础用法\n */\nimport React, { useEffect } from 'react';\n\nimport { useRafState } from 'ahooks';\n\nexport default () => {\n  const [state, setState] = useRafState({\n    width: 0,\n    height: 0,\n  });\n\n  useEffect(() => {\n    const onResize = () => {\n      setState({\n        width: document.documentElement.clientWidth,\n        height: document.documentElement.clientHeight,\n      });\n    };\n    onResize();\n\n    window.addEventListener('resize', onResize);\n\n    return () => {\n      window.removeEventListener('resize', onResize);\n    };\n  }, []);\n\n  return (\n    <div>\n      <p>Try to resize the window </p>\n      current: {JSON.stringify(state)}\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useRafState/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useRafState from './index';\n\ndescribe('useRafState', () => {\n  beforeEach(() => {\n    jest.useFakeTimers();\n  });\n\n  test('should be defined', () => {\n    expect(useRafState).toBeDefined();\n  });\n\n  test('useRafState should work like a charm', () => {\n    const { result } = renderHook(() => useRafState(0));\n    const [rafState, setRafState] = result.current;\n    expect(rafState).toBe(0);\n\n    act(() => {\n      setRafState(1);\n      requestAnimationFrame(() => {\n        expect(rafState).toBe(1);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useRafState/index.ts",
    "content": "import type { Dispatch, SetStateAction } from 'react';\nimport { useRef, useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useUnmount from '../useUnmount';\n\nfunction useRafState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];\nfunction useRafState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];\n\nfunction useRafState<S>(initialState?: S | (() => S)) {\n  const ref = useRef(0);\n  const [state, setState] = useState(initialState);\n\n  const setRafState = useMemoizedFn((value: S | ((prevState: S | undefined) => S)) => {\n    cancelAnimationFrame(ref.current);\n\n    ref.current = requestAnimationFrame(() => {\n      setState(value);\n    });\n  });\n\n  useUnmount(() => {\n    cancelAnimationFrame(ref.current);\n  });\n\n  return [state, setRafState] as const;\n}\n\nexport default useRafState;\n"
  },
  {
    "path": "packages/hooks/src/useRafTimeout/demo/demo1.tsx",
    "content": "/**\n * title: 基础组件 usage\n * desc: Execute after 2000ms.\n *\n * title.zh-CN: 基础用法\n * desc.zh-CN: 在 2000ms 后执行。\n */\nimport React, { useState } from 'react';\n\nimport { useRafTimeout } from 'ahooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n\n  useRafTimeout(() => {\n    setCount(count + 1);\n  }, 2000);\n\n  return <div>count: {count}</div>;\n};\n"
  },
  {
    "path": "packages/hooks/src/useRafTimeout/demo/demo2.tsx",
    "content": "/**\n * title: Advanced usage\n * desc: Modify the delay to realize the timer timeout change and pause.\n *\n * title.zh-CN: 进阶使用\n * desc.zh-CN: 动态修改 delay 以实现定时器间隔变化与暂停。\n */\nimport React, { useState } from 'react';\n\nimport { useRafTimeout } from 'ahooks';\n\nexport default () => {\n  const [count, setCount] = useState(0);\n  const [delay, setDelay] = useState<number | undefined>(1000);\n\n  useRafTimeout(() => {\n    setCount(count + 1);\n  }, delay);\n\n  return (\n    <div>\n      <p> count: {count} </p>\n      <p style={{ marginTop: 16 }}> Delay: {delay} </p>\n      <button onClick={() => setDelay(t => (!!t ? t + 1000 : 1000))} style={{ marginRight: 8 }}>\n        Delay + 1000\n      </button>\n      <button\n        style={{ marginRight: 8 }}\n        onClick={() => {\n          setDelay(1000);\n        }}\n      >\n        reset Delay\n      </button>\n      <button\n        onClick={() => {\n          setDelay(undefined);\n        }}\n      >\n        clear\n      </button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useRafTimeout/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useRafTimeout from './index';\n\ninterface ParamsObj {\n  fn: (...arg: any) => any;\n  delay: number | undefined;\n}\n\nconst setUp = ({ fn, delay }: ParamsObj) => renderHook(() => useRafTimeout(fn, delay));\n\nconst FRAME_TIME = 16.7;\ndescribe('useRafTimeout', () => {\n  beforeEach(() => {\n    jest.useFakeTimers();\n  });\n\n  it('useRafTimeout should be defined', () => {\n    expect(useRafTimeout).toBeDefined();\n  });\n\n  it('useRafTimeout should work like a charm', () => {\n    const callback = jest.fn();\n    setUp({ fn: callback, delay: FRAME_TIME });\n    expect(callback).not.toBeCalled();\n\n    act(() => {\n      requestAnimationFrame(() => {\n        expect(callback).not.toBeCalled();\n      });\n      requestAnimationFrame(() => {\n        expect(callback).toBeCalledTimes(1);\n      });\n    });\n  });\n\n  it('timeout should stop when delay is undefined', () => {\n    const delay: number | undefined = undefined;\n    const callback = jest.fn();\n    setUp({ fn: callback, delay });\n    expect(callback).not.toBeCalled();\n\n    act(() => {\n      requestAnimationFrame(() => {\n        expect(callback).not.toBeCalled();\n      });\n      requestAnimationFrame(() => {\n        expect(callback).not.toBeCalled();\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useRafTimeout/index.ts",
    "content": "import { useEffect, useRef } from 'react';\n\nimport { isNumber } from 'lodash-es';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\ninterface Handle {\n  id: number | ReturnType<typeof setTimeout>;\n}\n\nconst setRafTimeout = function (callback: () => void, delay = 0): Handle {\n  if (typeof requestAnimationFrame === typeof undefined) {\n    return {\n      id: setTimeout(callback, delay),\n    };\n  }\n  const handle: Handle = {\n    id: 0,\n  };\n\n  const startTime = new Date().getTime();\n  const loop = () => {\n    const current = new Date().getTime();\n    if (current - startTime >= delay) {\n      callback();\n    } else {\n      handle.id = requestAnimationFrame(loop);\n    }\n  };\n  handle.id = requestAnimationFrame(loop);\n  return handle;\n};\n\nfunction cancelAnimationFrameIsNotDefined(t: any): t is NodeJS.Timer {\n  return typeof cancelAnimationFrame === typeof undefined;\n}\n\nconst clearRafTimeout = function (handle: Handle) {\n  if (cancelAnimationFrameIsNotDefined(handle.id)) {\n    return clearTimeout(handle.id);\n  }\n  cancelAnimationFrame(handle.id as number);\n};\n\nfunction useRafTimeout(fn: () => void, delay?: number) {\n  const timerCallback = useMemoizedFn(fn);\n  const timerRef = useRef<Handle>();\n\n  useEffect(() => {\n    if (!isNumber(delay) || delay < 0) return;\n\n    timerRef.current = setRafTimeout(() => {\n      timerCallback();\n    }, delay);\n\n    return clear;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [delay]);\n\n  const clear = useMemoizedFn(() => {\n    if (timerRef.current) {\n      clearRafTimeout(timerRef.current);\n    }\n  });\n\n  return clear;\n}\n\nexport default useRafTimeout;\n"
  },
  {
    "path": "packages/hooks/src/useRequest/Fetch.ts",
    "content": "import { MutableRefObject } from 'react';\n\nimport { isFunction } from '../utils';\nimport type { FetchState, Options, PluginReturn, Service, Subscribe } from './types';\n\nexport default class Fetch<TData, TParams extends any[]> {\n  pluginImpls: PluginReturn<TData, TParams>[] = [];\n\n  count = 0;\n\n  state: FetchState<TData, TParams> = {\n    loading: false,\n    params: undefined,\n    data: undefined,\n    error: undefined,\n  };\n\n  constructor(\n    public service: MutableRefObject<Service<TData, TParams>>,\n    public options: Options<TData, TParams>,\n    public subscribe: Subscribe,\n    public initState: Partial<FetchState<TData, TParams>> = {}\n  ) {\n    this.state = {\n      ...this.state,\n      loading: !options.manual,\n      ...initState,\n    };\n  }\n\n  setState(s: Partial<FetchState<TData, TParams>> = {}) {\n    this.state = {\n      ...this.state,\n      ...s,\n    };\n    this.subscribe();\n  }\n\n  runPluginHandler(event: keyof PluginReturn<TData, TParams>, ...rest: any[]) {\n    // @ts-ignore\n    const result = this.pluginImpls.map(impl => impl[event]?.(...rest)).filter(Boolean);\n    return Object.assign({}, ...result);\n  }\n\n  async runAsync(...params: any[]): Promise<TData> {\n    this.count += 1;\n    const currentCount = this.count;\n\n    const { stopNow = false, returnNow = false, ...state } = this.runPluginHandler('onBefore', params);\n\n    if (stopNow) {\n      return new Promise(() => {});\n    }\n\n    this.setState({\n      loading: true,\n      params,\n      ...state,\n    });\n\n    if (returnNow) {\n      return Promise.resolve(state.data);\n    }\n\n    this.options.onBefore?.(params as TParams);\n\n    try {\n      let { servicePromise } = this.runPluginHandler('onRequest', this.service.current, params);\n      if (!servicePromise) {\n        servicePromise = this.service.current(...(params as TParams));\n      }\n\n      const result = await servicePromise;\n\n      if (currentCount !== this.count) {\n        return new Promise(() => {});\n      }\n\n      this.setState({\n        loading: false,\n        data: result,\n        error: undefined,\n      });\n\n      this.options.onSuccess?.(result, params as TParams);\n      this.runPluginHandler('onSuccess', result, params);\n\n      this.options.onFinally?.(params as TParams, result, undefined);\n\n      if (currentCount === this.count) {\n        this.runPluginHandler('onFinally', params, result, undefined);\n      }\n\n      return result;\n    } catch (e) {\n      if (currentCount !== this.count) {\n        return new Promise(() => {});\n      }\n\n      const error = e as Error;\n      this.setState({\n        loading: false,\n        error,\n      });\n\n      this.options.onError?.(error, params as TParams);\n      this.runPluginHandler('onError', error, params);\n\n      this.options.onFinally?.(params as TParams, undefined, error);\n\n      if (currentCount === this.count) {\n        this.runPluginHandler('onFinally', params, undefined, error);\n      }\n\n      throw error;\n    }\n  }\n\n  run(...params: any[]) {\n    this.runAsync(...params).catch(error => {\n      if (!this.options.onError) {\n        console.error(error);\n      }\n    });\n  }\n\n  cancel() {\n    this.count += 1;\n    this.setState({\n      loading: false,\n    });\n\n    this.runPluginHandler('onCancel');\n  }\n\n  refresh() {\n    this.run(...(this.state.params || []));\n  }\n\n  refreshAsync() {\n    return this.runAsync(...(this.state.params || []));\n  }\n\n  mutate(data?: TData | ((oldData?: TData) => TData | undefined)) {\n    const targetData = isFunction(data) ? data(this.state.data) : data;\n    this.runPluginHandler('onMutate', targetData);\n    this.setState({\n      data: targetData,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/hooks/src/useRequest/index.test.ts",
    "content": "import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks';\n\nimport useRequest from './index';\nimport { request } from './utils/testingHelper';\n\ndescribe('useRequest', () => {\n  beforeEach(() => {\n    jest.useFakeTimers();\n  });\n\n  const setUp = (service: any, options: any) => renderHook(o => useRequest(service, o || options));\n  let hook: RenderHookResult<any, any>;\n\n  test('useRequest should be defined', () => {\n    expect(useRequest).toBeDefined();\n  });\n\n  test('useRequest should run automatically', async () => {\n    let value, success;\n\n    const successCb = (text: string) => (success = text);\n    const errorCb = jest.fn();\n    const beforeCb = () => (value = 'before');\n    const finallyCb = () => (value = 'finally');\n\n    // 测试成功的场景\n    hook = setUp(request, {\n      onBefore: beforeCb,\n      onSuccess: successCb,\n      onError: errorCb,\n      onFinally: finallyCb,\n    });\n\n    expect(hook.result.current.loading).toBeTruthy();\n    expect(value).toEqual('before');\n    expect(success).toEqual(undefined);\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(success).toEqual('success');\n    expect(hook.result.current.data).toEqual('success');\n    expect(value).toEqual('finally');\n    expect(errorCb).toHaveBeenCalledTimes(0);\n    hook.unmount();\n\n    // 测试失败的场景\n    hook = setUp(() => request(0), {\n      onSuccess: successCb,\n      onError: errorCb,\n    });\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.error).toEqual(new Error('fail'));\n    expect(errorCb).toHaveBeenCalledTimes(1);\n    hook.unmount();\n  });\n\n  test('useRequest should be triggered manually', async () => {\n    hook = setUp(request, {\n      manual: true,\n    });\n\n    expect(hook.result.current.loading).toBeFalsy();\n\n    act(() => {\n      hook.result.current.run(1);\n    });\n\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.data).toEqual('success');\n\n    // 测试失败的场景\n    act(() => {\n      hook.result.current.run(0);\n    });\n    expect(hook.result.current.loading).toBeTruthy();\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.error).toEqual(new Error('fail'));\n    hook.unmount();\n  });\n\n  test('useRequest runAsync should work', async () => {\n    let success = '',\n      error;\n\n    hook = setUp(request, {\n      manual: true,\n    });\n\n    act(() => {\n      hook.result.current\n        .runAsync(0)\n        .then((res: string) => {\n          success = res;\n        })\n        .catch((e: Error) => {\n          error = e;\n        });\n    });\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(success).toEqual('');\n    expect(error).toEqual(new Error('fail'));\n\n    success = '';\n    error = undefined;\n    act(() => {\n      hook.result.current\n        .runAsync(1)\n        .then((res: string) => {\n          success = res;\n        })\n        .catch((e: Error) => {\n          error = e;\n        });\n    });\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(success).toEqual('success');\n    expect(error).toBeUndefined();\n    hook.unmount();\n  });\n\n  test('useRequest mutate should work', async () => {\n    hook = setUp(request, {});\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.data).toEqual('success');\n\n    act(() => {\n      hook.result.current.mutate('hello');\n    });\n    expect(hook.result.current.data).toEqual('hello');\n    hook.unmount();\n  });\n\n  test('useRequest defaultParams should work', async () => {\n    hook = setUp(request, {\n      defaultParams: [1, 2, 3],\n    });\n    expect(hook.result.current.loading).toBeTruthy();\n\n    act(() => {\n      jest.runAllTimers();\n    });\n    await hook.waitForNextUpdate();\n\n    expect(hook.result.current.loading).toBeFalsy();\n    expect(hook.result.current.params).toEqual([1, 2, 3]);\n    expect(hook.result.current.data).toEqual('success');\n    hook.unmount();\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useRequest/index.ts",
    "content": "import { useAutoRunPlugin } from './plugins/useAutoRunPlugin';\nimport { useCachePlugin } from './plugins/useCachePlugin';\nimport { useDebouncePlugin } from './plugins/useDebouncePlugin';\nimport { useLoadingDelayPlugin } from './plugins/useLoadingDelayPlugin';\nimport { usePollingPlugin } from './plugins/usePollingPlugin';\nimport { useRetryPlugin } from './plugins/useRetryPlugin';\nimport { useThrottlePlugin } from './plugins/useThrottlePlugin';\nimport type { Options, Plugin, Service } from './types';\nimport useRequestImpl from './useRequestImpl';\nimport { clearCache } from './utils/cache';\n\nexport { clearCache };\n\nexport default function useRequest<TData, TParams extends any[]>(\n  service: Service<TData, TParams>,\n  options?: Options<TData, TParams>,\n  plugins?: Plugin<TData, TParams>[]\n) {\n  return useRequestImpl<TData, TParams>(service, options, [\n    ...(plugins || []),\n    useDebouncePlugin,\n    useLoadingDelayPlugin,\n    usePollingPlugin,\n    useThrottlePlugin,\n    useCachePlugin,\n    useRetryPlugin,\n    useAutoRunPlugin,\n  ] as Plugin<TData, TParams>[]);\n}\n"
  },
  {
    "path": "packages/hooks/src/useRequest/plugins/useAutoRunPlugin.ts",
    "content": "import { useRef } from 'react';\n\nimport useUpdateEffect from '../../useUpdateEffect';\nimport type { Plugin } from '../types';\n\nexport const useAutoRunPlugin: Plugin<any, any[]> = (\n  fetchInstance,\n  { manual, ready = true, defaultParams = [], refreshDeps = [], refreshDepsAction }\n) => {\n  const hasAutoRun = useRef(false);\n  hasAutoRun.current = false;\n\n  useUpdateEffect(() => {\n    if (!manual && ready) {\n      hasAutoRun.current = true;\n      fetchInstance.run(...defaultParams);\n    }\n  }, [ready]);\n\n  useUpdateEffect(() => {\n    if (hasAutoRun.current) return;\n\n    if (!manual) {\n      hasAutoRun.current = true;\n      if (refreshDepsAction) {\n        refreshDepsAction();\n      } else {\n        fetchInstance.refresh();\n      }\n    }\n  }, [...refreshDeps]);\n\n  return {\n    onBefore: () => {\n      if (!ready) {\n        return {\n          stopNow: true,\n        };\n      }\n      return {};\n    },\n  };\n};\n\nuseAutoRunPlugin.onInit = ({ ready = true, manual = true }) => {\n  return {\n    loading: !manual && ready,\n  };\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/plugins/useCachePlugin.ts",
    "content": "import { useRef } from 'react';\n\nimport * as cache from '../utils/cache';\nimport * as cachePromise from '../utils/cachePromise';\nimport * as cacheSubscribe from '../utils/cacheSubscribe';\nimport useCreation from '../../useCreation';\nimport useUnmount from '../../useUnmount';\nimport type { Plugin } from '../types';\nimport type { CachedData } from '../utils/cache';\n\nexport const useCachePlugin: Plugin<any, any[]> = (\n  fetchInstance,\n  { cacheKey, cacheTime = 5 * 60 * 1000, staleTime = 0, setCache: customSetCache, getCache: customGetCache }\n) => {\n  const unSubscribeRef = useRef<() => void>();\n\n  const currentPromiseRef = useRef<Promise<any>>();\n\n  const _setCache = (key: string, cachedData: CachedData) => {\n    if (customSetCache) {\n      customSetCache(cachedData);\n    } else {\n      cache.setCache(key, cacheTime, cachedData);\n    }\n    cacheSubscribe.trigger(key, cachedData.data);\n  };\n\n  const _getCache = (key: string, params: any[] = []) => {\n    if (customGetCache) {\n      return customGetCache(params);\n    }\n    return cache.getCache(key);\n  };\n\n  useCreation(() => {\n    if (!cacheKey) return;\n\n    // get data from cache when init\n    const cacheData = _getCache(cacheKey);\n    if (cacheData && Object.hasOwnProperty.call(cacheData, 'data')) {\n      fetchInstance.state.data = cacheData.data;\n      fetchInstance.state.params = cacheData.params;\n      if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) {\n        fetchInstance.state.loading = false;\n      }\n    }\n\n    // subscribe same cachekey update, trigger update\n    unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, data => {\n      fetchInstance.setState({ data });\n    });\n  }, []);\n\n  useUnmount(() => {\n    unSubscribeRef.current?.();\n  });\n\n  if (!cacheKey) return {};\n\n  return {\n    onBefore: params => {\n      const cacheData = _getCache(cacheKey, params);\n\n      if (!cacheData || !Object.hasOwnProperty.call(cacheData, 'data')) return {};\n\n      // If the data is fresh, stop request\n      if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) {\n        return {\n          loading: false,\n          data: cacheData?.data,\n          error: undefined,\n          returnNow: true,\n        };\n      }\n      // If the data is stale, return data, and request continue\n      return {\n        data: cacheData?.data,\n        error: undefined,\n      };\n    },\n    onRequest: (service, args) => {\n      let servicePromise = cachePromise.getCachePromise(cacheKey);\n\n      // If has servicePromise, and is not trigger by self, then use it\n      if (servicePromise && servicePromise !== currentPromiseRef.current) return { servicePromise };\n\n      servicePromise = service(...args);\n      currentPromiseRef.current = servicePromise;\n      cachePromise.setCachePromise(cacheKey, servicePromise);\n      return { servicePromise };\n    },\n    onSuccess: (data, params) => {\n      if (cacheKey) {\n        // cancel subscribe, avoid trgger self\n        unSubscribeRef.current?.();\n        _setCache(cacheKey, {\n          data,\n          params,\n          time: new Date().getTime(),\n        });\n        // resubscribe\n        unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, d => {\n          fetchInstance.setState({ data: d });\n        });\n      }\n    },\n    onMutate: data => {\n      if (cacheKey) {\n        // cancel subscribe, avoid trgger self\n        unSubscribeRef.current?.();\n        _setCache(cacheKey, {\n          data,\n          params: fetchInstance.state.params,\n          time: new Date().getTime(),\n        });\n        // resubscribe\n        unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, d => {\n          fetchInstance.setState({ data: d });\n        });\n      }\n    },\n  };\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/plugins/useDebouncePlugin.ts",
    "content": "import { useEffect, useMemo, useRef } from 'react';\n\nimport { debounce, DebouncedFunc, DebounceSettings } from 'lodash-es';\n\nimport type { Plugin } from '../types';\n\nexport const useDebouncePlugin: Plugin<any, any[]> = (\n  fetchInstance,\n  { debounceWait, debounceLeading, debounceTrailing, debounceMaxWait }\n) => {\n  const debounceRef = useRef<DebouncedFunc<any>>();\n\n  const options = useMemo(() => {\n    const settings: DebounceSettings = {};\n\n    if (debounceLeading !== undefined) {\n      settings.leading = debounceLeading;\n    }\n    if (debounceTrailing !== undefined) {\n      settings.trailing = debounceTrailing;\n    }\n    if (debounceMaxWait !== undefined) {\n      settings.maxWait = debounceMaxWait;\n    }\n    return settings;\n  }, [debounceLeading, debounceTrailing, debounceMaxWait]);\n\n  useEffect(() => {\n    if (debounceWait) {\n      const originRunAsync = fetchInstance.runAsync.bind(fetchInstance);\n      debounceRef.current = debounce(\n        (cb: any) => {\n          cb();\n        },\n        debounceWait,\n        options\n      );\n\n      fetchInstance.runAsync = (...args) =>\n        new Promise((resolve, reject) => {\n          debounceRef.current?.(() => {\n            originRunAsync(...args)\n              .then(resolve)\n              .catch(reject);\n          });\n        });\n\n      return () => {\n        debounceRef.current?.cancel();\n        fetchInstance.runAsync = originRunAsync;\n      };\n    }\n    return () => {};\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [debounceWait, options]);\n\n  if (!debounceWait) return {};\n\n  return {\n    onCancel: () => {\n      debounceRef.current?.cancel();\n    },\n  };\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/plugins/useLoadingDelayPlugin.ts",
    "content": "import { useRef } from 'react';\n\nimport type { Plugin } from '../types';\n\nexport const useLoadingDelayPlugin: Plugin<any, any[]> = (fetchInstance, { loadingDelay, ready }) => {\n  const timerRef = useRef<any>();\n\n  if (!loadingDelay) return {};\n\n  const cancelTimeout = () => {\n    if (timerRef.current) {\n      clearTimeout(timerRef.current);\n    }\n  };\n\n  return {\n    onBefore: () => {\n      cancelTimeout();\n\n      // Two cases:\n      // 1. ready === undefined\n      // 2. ready === true\n      if (ready !== false) {\n        timerRef.current = setTimeout(() => {\n          fetchInstance.setState({\n            loading: true,\n          });\n        }, loadingDelay);\n      }\n\n      return {\n        loading: false,\n      };\n    },\n    onCancel: () => {\n      cancelTimeout();\n    },\n    onFinally: () => {\n      cancelTimeout();\n    },\n  };\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/plugins/usePollingPlugin.ts",
    "content": "import { useRef } from 'react';\n\nimport useUpdateEffect from '../../useUpdateEffect';\nimport type { Plugin } from '../types';\n\nexport const usePollingPlugin: Plugin<any, any[]> = (\n  fetchInstance,\n  { pollingInterval, pollingErrorRetryCount = -1 }\n) => {\n  const timerRef = useRef<ReturnType<typeof setTimeout>>();\n  const countRef = useRef<number>(0);\n\n  const stopPolling = () => {\n    if (timerRef.current) {\n      clearTimeout(timerRef.current);\n    }\n  };\n\n  useUpdateEffect(() => {\n    if (!pollingInterval) {\n      stopPolling();\n    }\n  }, [pollingInterval]);\n\n  if (!pollingInterval) return {};\n\n  return {\n    onBefore: () => {\n      stopPolling();\n    },\n    onError: () => {\n      countRef.current += 1;\n    },\n    onSuccess: () => {\n      countRef.current = 0;\n    },\n    onFinally: () => {\n      if (\n        pollingErrorRetryCount === -1 ||\n        // When an error occurs, the request is not repeated after pollingErrorRetryCount retries\n        (pollingErrorRetryCount !== -1 && countRef.current <= pollingErrorRetryCount)\n      ) {\n        // 之所以用setTimeout, 是因为fetchInstance.refresh()最后都会走到onFinally，然后这里又会再次调用refresh，从而实现跟interval一样的效果\n        timerRef.current = setTimeout(() => {\n          fetchInstance.refresh();\n        }, pollingInterval);\n      } else {\n        countRef.current = 0;\n      }\n    },\n    onCancel: () => {\n      stopPolling();\n    },\n  };\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/plugins/useRetryPlugin.ts",
    "content": "import { useRef } from 'react';\n\nimport type { Plugin } from '../types';\n\nexport const useRetryPlugin: Plugin<any, any[]> = (fetchInstance, { retryInterval, retryCount }) => {\n  const timerRef = useRef<any>();\n  const countRef = useRef(0);\n\n  const triggerByRetry = useRef(false);\n\n  if (!retryCount) return {};\n\n  return {\n    onBefore: () => {\n      if (!triggerByRetry.current) {\n        countRef.current = 0;\n      }\n      triggerByRetry.current = false;\n\n      if (timerRef.current) {\n        clearTimeout(timerRef.current);\n      }\n    },\n    onSuccess: () => {\n      countRef.current = 0;\n    },\n    onError: () => {\n      countRef.current += 1;\n      if (retryCount === -1 || countRef.current <= retryCount) {\n        const timeout = retryInterval ?? Math.min(1000 * 2 ** countRef.current, 30000);\n        timerRef.current = setTimeout(() => {\n          triggerByRetry.current = true;\n          fetchInstance.refresh();\n        }, timeout);\n      } else {\n        countRef.current = 0;\n      }\n    },\n    onCancel: () => {\n      countRef.current = 0;\n      if (timerRef.current) {\n        clearTimeout(timerRef.current);\n      }\n    },\n  };\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/plugins/useThrottlePlugin.ts",
    "content": "import { useEffect, useMemo, useRef } from 'react';\n\nimport { DebouncedFunc, throttle, ThrottleSettings } from 'lodash-es';\n\nimport type { Plugin } from '../types';\n\nexport const useThrottlePlugin: Plugin<any, any[]> = (\n  fetchInstance,\n  { throttleWait, throttleLeading, throttleTrailing }\n) => {\n  const throttleRef = useRef<DebouncedFunc<any>>();\n\n  const options = useMemo(() => {\n    const settings: ThrottleSettings = {};\n\n    if (throttleLeading !== undefined) {\n      settings.leading = throttleLeading;\n    }\n    if (throttleTrailing !== undefined) {\n      settings.trailing = throttleTrailing;\n    }\n    return settings;\n  }, [throttleLeading, throttleTrailing]);\n\n  useEffect(() => {\n    if (throttleWait) {\n      const originRunAsync = fetchInstance.runAsync.bind(fetchInstance);\n\n      throttleRef.current = throttle(\n        (cb: any) => {\n          cb();\n        },\n        throttleWait,\n        options\n      );\n\n      fetchInstance.runAsync = (...args) =>\n        new Promise((resolve, reject) => {\n          throttleRef.current?.(() => {\n            originRunAsync(...args)\n              .then(resolve)\n              .catch(reject);\n          });\n        });\n\n      return () => {\n        fetchInstance.runAsync = originRunAsync;\n        throttleRef.current?.cancel();\n      };\n    }\n  }, [throttleWait, throttleLeading, throttleTrailing]);\n\n  if (!throttleWait) return {};\n\n  return {\n    onCancel: () => {\n      throttleRef.current?.cancel();\n    },\n  };\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/types.ts",
    "content": "import type { DependencyList } from 'react';\n\nimport type Fetch from './Fetch';\nimport { CachedData } from './utils/cache';\n\nexport type Subscribe = () => void;\nexport type Service<TData, TParams extends any[]> = (...args: TParams) => Promise<TData>;\nexport type Options<TData, TParams extends any[]> = Record<string, any> & {\n  manual?: boolean;\n\n  onBefore?: (params: TParams) => void;\n  onSuccess?: (data: TData, params: TParams) => void;\n  onError?: (e: Error, params: TParams) => void;\n  onFinally?: (params: TParams, data?: TData, e?: Error) => void;\n\n  defaultParams?: TParams;\n  ready?: boolean;\n\n  // refreshDeps\n  refreshDeps?: DependencyList;\n  refreshDepsAction?: () => void;\n\n  loadingDelay?: number;\n\n  pollingInterval?: number;\n\n  // debounce\n  debounceWait?: number;\n  debounceLeading?: boolean;\n  debounceTrailing?: boolean;\n  debounceMaxWait?: number;\n\n  // throttle\n  throttleWait?: number;\n  throttleLeading?: boolean;\n  throttleTrailing?: boolean;\n\n  // cache\n  cacheKey?: string;\n  cacheTime?: number;\n  staleTime?: number;\n  setCache?: (data: CachedData<TData, TParams>) => void;\n  getCache?: (params: TParams) => CachedData<TData, TParams> | undefined;\n\n  // retry\n  retryCount?: number;\n  retryInterval?: number;\n};\n\nexport type Plugin<TData, TParams extends any[]> = {\n  (fetchInstance: Fetch<TData, TParams>, options: Options<TData, TParams>): PluginReturn<TData, TParams>;\n  onInit?: (options: Options<TData, TParams>) => Partial<FetchState<TData, TParams>>;\n};\n\nexport type PluginReturn<TData, TParams extends any[]> = {\n  onBefore?: (params: TParams) =>\n    | ({\n        stopNow?: boolean;\n        returnNow?: boolean;\n      } & Partial<FetchState<TData, TParams>>)\n    | void;\n\n  onRequest?: (\n    service: Service<TData, TParams>,\n    params: TParams\n  ) => {\n    servicePromise?: Promise<TData>;\n  };\n\n  onSuccess?: (data: TData, params: TParams) => void;\n\n  onError?: (e: Error, params: TParams) => void;\n\n  onFinally?: (params: TParams, data?: TData, e?: Error) => void;\n\n  onCancel?: () => void;\n\n  onMutate?: (data: TData) => void;\n};\n\nexport type FetchState<TData, TParams extends any[]> = {\n  loading: boolean;\n  params?: TParams;\n  data?: TData;\n  error?: Error;\n};\n\nexport type Result<TData, TParams extends any[]> = {\n  loading: boolean;\n\n  data?: TData;\n\n  error?: Error;\n\n  params: TParams | [];\n\n  cancel: Fetch<TData, TParams>['cancel'];\n\n  refresh: Fetch<TData, TParams>['refresh'];\n\n  refreshAsync: Fetch<TData, TParams>['refreshAsync'];\n\n  run: Fetch<TData, TParams>['run'];\n\n  runAsync: Fetch<TData, TParams>['runAsync'];\n\n  mutate: Fetch<TData, TParams>['mutate'];\n};\n"
  },
  {
    "path": "packages/hooks/src/useRequest/useRequestImpl.ts",
    "content": "import useCreation from '../useCreation';\nimport useLatest from '../useLatest';\nimport useMemoizedFn from '../useMemoizedFn';\nimport useMount from '../useMount';\nimport useUnmount from '../useUnmount';\nimport useUpdate from '../useUpdate';\nimport Fetch from './Fetch';\nimport type { Options, Plugin, Result, Service } from './types';\n\nexport default function useRequestImpl<TData, TParams extends any[]>(\n  service: Service<TData, TParams>,\n  options: Options<TData, TParams> = {},\n  plugins: Plugin<TData, TParams>[] = []\n) {\n  const { manual = false, ...rest } = options;\n\n  if (__DEV__) {\n    if (options.defaultParams && !Array.isArray(options.defaultParams)) {\n      console.warn(`expected defaultParams is array, got ${typeof options.defaultParams}`);\n    }\n  }\n\n  const fetchOptions = {\n    manual,\n    ...rest,\n  };\n\n  const serviceRef = useLatest(service);\n  const forceUpdate = useUpdate();\n\n  const fetchInstance = useCreation(() => {\n    const initState = plugins.map(p => p?.onInit?.(fetchOptions)).filter(Boolean);\n\n    return new Fetch<TData, TParams>(serviceRef, fetchOptions, forceUpdate, Object.assign({}, ...initState));\n  }, []);\n\n  fetchInstance.options = fetchOptions;\n  fetchInstance.pluginImpls = plugins.map(plugin => plugin(fetchInstance, fetchOptions));\n\n  useMount(() => {\n    if (!manual) {\n      // useCachePlugin can set fetchInstance.state.params from cache when init\n      const params = fetchInstance.state.params || options.defaultParams || [];\n      // @ts-ignore\n      fetchInstance.run(...params);\n    }\n  });\n\n  useUnmount(() => {\n    fetchInstance.cancel();\n  });\n\n  return {\n    loading: fetchInstance.state.loading,\n    data: fetchInstance.state.data,\n    error: fetchInstance.state.error,\n    params: fetchInstance.state.params || [],\n    cancel: useMemoizedFn(fetchInstance.cancel.bind(fetchInstance)),\n    refresh: useMemoizedFn(fetchInstance.refresh.bind(fetchInstance)),\n    refreshAsync: useMemoizedFn(fetchInstance.refreshAsync.bind(fetchInstance)),\n    run: useMemoizedFn(fetchInstance.run.bind(fetchInstance)),\n    runAsync: useMemoizedFn(fetchInstance.runAsync.bind(fetchInstance)),\n    mutate: useMemoizedFn(fetchInstance.mutate.bind(fetchInstance)),\n  } as Result<TData, TParams>;\n}\n"
  },
  {
    "path": "packages/hooks/src/useRequest/utils/cache.ts",
    "content": "type Timer = ReturnType<typeof setTimeout>;\ntype CachedKey = string | number;\n\nexport interface CachedData<TData = any, TParams = any> {\n  data: TData;\n  params: TParams;\n  time: number;\n}\ninterface RecordData extends CachedData {\n  timer: Timer | undefined;\n}\n\nconst cache = new Map<CachedKey, RecordData>();\n\nconst setCache = (key: CachedKey, cacheTime: number, cachedData: CachedData) => {\n  const currentCache = cache.get(key);\n  if (currentCache?.timer) {\n    clearTimeout(currentCache.timer);\n  }\n\n  let timer: Timer | undefined = undefined;\n\n  if (cacheTime > -1) {\n    // if cache out, clear it\n    timer = setTimeout(() => {\n      cache.delete(key);\n    }, cacheTime);\n  }\n\n  cache.set(key, {\n    ...cachedData,\n    timer,\n  });\n};\n\nconst getCache = (key: CachedKey) => {\n  return cache.get(key);\n};\n\nconst clearCache = (key?: string | string[]) => {\n  if (key) {\n    const cacheKeys = Array.isArray(key) ? key : [key];\n    cacheKeys.forEach(cacheKey => cache.delete(cacheKey));\n  } else {\n    cache.clear();\n  }\n};\n\nexport { getCache, setCache, clearCache };\n"
  },
  {
    "path": "packages/hooks/src/useRequest/utils/cachePromise.ts",
    "content": "type CachedKey = string | number;\nconst cachePromise = new Map<CachedKey, Promise<any>>();\n\nconst getCachePromise = (cacheKey: CachedKey) => {\n  return cachePromise.get(cacheKey);\n};\n\nconst setCachePromise = (cacheKey: CachedKey, promise: Promise<any>) => {\n  // Should cache the same promise, cannot be promise.finally\n  // Because the promise.finally will change the reference of the promise\n  cachePromise.set(cacheKey, promise);\n\n  // no use promise.finally for compatibility\n  promise\n    .then(res => {\n      cachePromise.delete(cacheKey);\n      return res;\n    })\n    .catch(() => {\n      cachePromise.delete(cacheKey);\n    });\n};\n\nexport { getCachePromise, setCachePromise };\n"
  },
  {
    "path": "packages/hooks/src/useRequest/utils/cacheSubscribe.ts",
    "content": "type Listener = (data: any) => void;\nconst listeners: Record<string, Listener[]> = {};\n\nconst trigger = (key: string, data: any) => {\n  if (listeners[key]) {\n    listeners[key].forEach(item => item(data));\n  }\n};\n\nconst subscribe = (key: string, listener: Listener) => {\n  if (!listeners[key]) {\n    listeners[key] = [];\n  }\n  listeners[key].push(listener);\n\n  return function unsubscribe() {\n    const index = listeners[key].indexOf(listener);\n    listeners[key].splice(index, 1);\n  };\n};\n\nexport { trigger, subscribe };\n"
  },
  {
    "path": "packages/hooks/src/useRequest/utils/testingHelper.ts",
    "content": "import type { Service } from '../types';\n\nexport const request: Service<any, any[]> = (req?: number) => {\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      if (req === 0) {\n        reject(new Error('fail'));\n      } else {\n        resolve('success');\n      }\n    }, 1000);\n  });\n};\n"
  },
  {
    "path": "packages/hooks/src/useResetState/__tests__/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useResetState from '../index';\n\ndescribe('useResetState', () => {\n  const setUp = <S>(initialState: S) =>\n    renderHook(() => {\n      const [state, setState, resetState] = useResetState<S>(initialState);\n\n      return {\n        state,\n        setState,\n        resetState,\n      } as const;\n    });\n\n  it('should support initialValue', () => {\n    const hook = setUp({\n      hello: 'world',\n    });\n    expect(hook.result.current.state).toEqual({ hello: 'world' });\n  });\n\n  it('should reset state', () => {\n    const hook = setUp({\n      hello: '',\n      count: 0,\n    });\n\n    act(() => {\n      hook.result.current.setState({\n        hello: 'world',\n        count: 1,\n      });\n    });\n\n    act(() => {\n      hook.result.current.resetState();\n    });\n\n    expect(hook.result.current.state).toEqual({ hello: '', count: 0 });\n  });\n\n  it('should support function update', () => {\n    const hook = setUp({\n      count: 0,\n    });\n    act(() => {\n      hook.result.current.setState(prev => ({ count: prev.count + 1 }));\n    });\n    expect(hook.result.current.state).toEqual({ count: 1 });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useResetState/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useResetState } from 'ahooks';\n\ninterface State {\n  hello: string;\n  count: number;\n}\n\nexport default () => {\n  const [state, setState, resetState] = useResetState<State>({\n    hello: '',\n    count: 0,\n  });\n\n  return (\n    <div>\n      <pre>{JSON.stringify(state, null, 2)}</pre>\n      <p>\n        <button type=\"button\" style={{ marginRight: '8px' }} onClick={() => setState({ hello: 'world', count: 1 })}>\n          set hello and count\n        </button>\n\n        <button type=\"button\" onClick={resetState}>\n          resetState\n        </button>\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useResetState/index.ts",
    "content": "import type { Dispatch, SetStateAction } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useSafeState from '../useSafeState';\n\ntype ResetState = () => void;\n\nconst useResetState = <S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>, ResetState] => {\n  const [state, setState] = useSafeState(initialState);\n\n  const resetState = useMemoizedFn(() => {\n    setState(initialState);\n  });\n\n  return [state, setState, resetState];\n};\n\nexport default useResetState;\n"
  },
  {
    "path": "packages/hooks/src/useSafeState/demo/demo1.tsx",
    "content": "import React, { useEffect, useState } from 'react';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nconst Child = () => {\n  const [value, setValue] = useSafeState<string>();\n\n  useEffect(() => {\n    setTimeout(() => {\n      setValue('从服务端获取的数据');\n    }, 5000);\n  }, []);\n\n  const text = value || '正在获取数据。。。';\n\n  return <div>{text}</div>;\n};\n\nexport default () => {\n  const [visible, setVisible] = useState(true);\n\n  return (\n    <div>\n      <button onClick={() => setVisible(false)}>卸载</button>\n      {visible && <Child />}\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useSafeState/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useSafeState from './index';\n\ndescribe('useSafeState', () => {\n  test('useSafeState should be defined', () => {\n    expect(useSafeState).toBeDefined();\n  });\n\n  test('useSafeState should support initialState', () => {\n    const { result } = renderHook(() => useSafeState(2));\n\n    expect(result.current[0]).toBe(2);\n  });\n\n  test('useSafeState should update', () => {\n    const { result } = renderHook(() => useSafeState(() => ({ hello: 'world' })));\n    const [, setState] = result.current;\n    act(() => {\n      setState({ hello: 'react' });\n    });\n\n    expect(result.current[0]).toEqual({ hello: 'react' });\n  });\n\n  test('useSafeState should not update when unmounted', () => {\n    const { result, unmount } = renderHook(() => useSafeState(2));\n\n    expect(result.current[0]).toBe(2);\n\n    act(() => {\n      result.current[1](3);\n    });\n    expect(result.current[0]).toBe(3);\n\n    unmount();\n    act(() => {\n      result.current[1](4);\n    });\n    expect(result.current[0]).toBe(3);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useSafeState/index.ts",
    "content": "import { Dispatch, SetStateAction, useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useUnmountedRef from '../useUnmountedRef';\n\nfunction useSafeState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];\nfunction useSafeState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];\n\n/**\n * 用法与 useState 完全一样，但是在组件卸载后 setState 不再执行，避免因组件卸载后更新状态而导致的内存泄漏。\n * @param initialState 初始值\n */\nfunction useSafeState<S>(initialState?: S | (() => S)) {\n  const unmountedRef = useUnmountedRef();\n  const [state, setState] = useState(initialState);\n\n  const setCurrentState = (currentState?: S | (() => S)) => {\n    // 如果组件已经卸载了，则不要再做 setState 的操作\n    if (unmountedRef.current) return;\n    setState(currentState);\n  };\n\n  return [state, useMemoizedFn(setCurrentState)] as const;\n}\n\nexport default useSafeState;\n"
  },
  {
    "path": "packages/hooks/src/useSet/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useSet } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [set, { add, remove, reset }] = useSet(['Hello']);\n\n  return (\n    <div>\n      <button type=\"button\" onClick={() => add(String(Date.now()))}>\n        Add Timestamp\n      </button>\n      <button type=\"button\" onClick={() => remove('Hello')} disabled={!set.has('Hello')} style={{ margin: '0 8px' }}>\n        Remove Hello\n      </button>\n      <button type=\"button\" onClick={() => reset()}>\n        Reset\n      </button>\n      <div style={{ marginTop: 16 }}>\n        <pre>{JSON.stringify(Array.from(set), null, 2)}</pre>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useSet/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useSet from './index';\n\nconst setUp = <K>(initialSet?: Iterable<K>) => renderHook(() => useSet(initialSet));\n\ndescribe('useSet', () => {\n  it('should be defined', () => {\n    expect(useSet).toBeDefined();\n  });\n\n  it('should init set and utils', () => {\n    const { result } = setUp([1, 2]);\n    const [set, utils] = result.current;\n\n    expect(set).toEqual(new Set([1, 2]));\n    expect(utils).toStrictEqual({\n      add: expect.any(Function),\n      remove: expect.any(Function),\n      reset: expect.any(Function),\n    });\n  });\n\n  it('should init empty set if no initial set provided', () => {\n    const { result } = setUp();\n\n    expect(result.current[0]).toEqual(new Set());\n  });\n\n  it('should have an initially provided key', () => {\n    const { result } = setUp(['a']);\n    const [set] = result.current;\n\n    let value;\n    act(() => {\n      value = set.has('a');\n    });\n\n    expect(value).toBe(true);\n  });\n\n  it('should have an added key', () => {\n    const { result } = setUp();\n\n    act(() => {\n      result.current[1].add('newKey');\n    });\n\n    let value;\n    act(() => {\n      value = result.current[0].has('newKey');\n    });\n\n    expect(value).toBe(true);\n  });\n\n  it('should get false for non-existing key', () => {\n    const { result } = setUp(['a']);\n    const [set] = result.current;\n\n    let value;\n    act(() => {\n      value = set.has('nonExisting');\n    });\n\n    expect(value).toBe(false);\n  });\n\n  it('should add a new key', () => {\n    const { result } = setUp(['oldKey']);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.add('newKey');\n    });\n\n    expect(result.current[0]).toEqual(new Set(['oldKey', 'newKey']));\n  });\n\n  it('should work if setting existing key', () => {\n    const { result } = setUp(['oldKey']);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.add('oldKey');\n    });\n\n    expect(result.current[0]).toEqual(new Set(['oldKey']));\n  });\n\n  it('should remove existing key', () => {\n    const { result } = setUp([1, 2]);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.remove(2);\n    });\n\n    expect(result.current[0]).toEqual(new Set([1]));\n  });\n\n  it('should do nothing if removing non-existing key', () => {\n    const { result } = setUp(['a', 'b']);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.remove('nonExisting');\n    });\n\n    expect(result.current[0]).toEqual(new Set(['a', 'b']));\n  });\n\n  it('should reset to initial set provided', () => {\n    const { result } = setUp([1]);\n    const [, utils] = result.current;\n\n    act(() => {\n      utils.add(2);\n    });\n\n    expect(result.current[0]).toEqual(new Set([1, 2]));\n\n    act(() => {\n      utils.reset();\n    });\n\n    expect(result.current[0]).toEqual(new Set([1]));\n  });\n\n  it('should memoized its utils methods', () => {\n    const { result } = setUp(['a', 'b']);\n    const [, utils] = result.current;\n    const { add, remove, reset } = utils;\n\n    act(() => {\n      add('foo');\n    });\n\n    expect(result.current[1].add).toBe(add);\n    expect(result.current[1].remove).toBe(remove);\n    expect(result.current[1].reset).toBe(reset);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useSet/index.ts",
    "content": "import { useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\n/**\n * 一个可以管理 Set 类型状态的 Hook。\n * @param initialValue 初始值\n * @returns\n */\nexport default function useSet<K>(initialValue?: Iterable<K>) {\n  const getInitValue = () => new Set(initialValue);\n\n  const [set, setSet] = useState<Set<K>>(getInitValue);\n\n  const add = (key: K) => {\n    if (set.has(key)) {\n      return;\n    }\n    setSet(prevSet => {\n      const temp = new Set(prevSet);\n      temp.add(key);\n      return temp;\n    });\n  };\n\n  const remove = (key: K) => {\n    if (!set.has(key)) {\n      return;\n    }\n    setSet(prevSet => {\n      const temp = new Set(prevSet);\n      temp.delete(key);\n      return temp;\n    });\n  };\n\n  const reset = () => setSet(getInitValue());\n\n  const actions = {\n    add: useMemoizedFn(add),\n    remove: useMemoizedFn(remove),\n    reset: useMemoizedFn(reset),\n  };\n\n  return [set, actions] as const;\n}\n"
  },
  {
    "path": "packages/hooks/src/useSetState/index.ts",
    "content": "import { useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport { isFunction } from '../utils';\n\nexport type SetState<S extends Record<string, unknown>> = <K extends keyof S>(\n  state: Pick<S, K> | null | ((prevState: Readonly<S>) => Pick<S, K> | S | null)\n) => void;\n\nconst useSetState = <S extends Record<string, unknown>>(initialState: S | (() => S)): [S, SetState<S>] => {\n  const [state, setState] = useState<S>(initialState);\n\n  const setMergeState = useMemoizedFn(patch => {\n    setState(prevState => {\n      const newState = isFunction(patch) ? patch(prevState) : patch;\n      return newState ? { ...prevState, ...newState } : prevState;\n    });\n  });\n\n  return [state, setMergeState];\n};\n\nexport default useSetState;\n"
  },
  {
    "path": "packages/hooks/src/useSms/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useSms from './index';\n\ndescribe('useSms', () => {\n  beforeEach(() => {\n    jest.useFakeTimers();\n    jest.clearAllTimers();\n  });\n\n  test('useSms should be defined', () => {\n    expect(useSms).toBeDefined();\n  });\n\n  test('useSms sendSms method should work like a charm', async () => {\n    const onSend = jest.fn();\n    const onAfter = jest.fn();\n    const { result } = renderHook(() =>\n      useSms({\n        onSend,\n        onAfter,\n      })\n    );\n    await act(async () => {\n      expect(result.current.text).toEqual('发送验证码');\n      expect(result.current.disabled).toBeFalsy();\n\n      await result.current.sendSms();\n      expect(onAfter).toBeCalledTimes(0);\n\n      jest.advanceTimersByTime(1100); // 1100\n      expect(result.current.text).toEqual('重新发送(59s)');\n\n      jest.advanceTimersByTime(1100); // 2200\n      expect(result.current.text).toEqual('重新发送(58s)');\n\n      jest.advanceTimersByTime(1100); // 3300\n      expect(result.current.text).toEqual('重新发送(57s)');\n\n      jest.advanceTimersByTime(60100); // 60秒\n      expect(result.current.text).toEqual('重新发送');\n\n      expect(onAfter).toBeCalledTimes(1);\n    });\n  });\n\n  test('useSms onBefore method should fire before sendSms fired', async () => {\n    const onBefore = jest.fn();\n    const onSend = jest.fn();\n    const { result } = renderHook(() =>\n      useSms({\n        onSend,\n        onBefore,\n      })\n    );\n\n    await act(async () => {\n      await result.current.sendSms();\n\n      expect(onBefore).toBeCalledTimes(1);\n    });\n  });\n\n  test('useSms sendSms method will not fire when onBefore returns false', async () => {\n    const onBefore = jest.fn(() => Promise.resolve(false));\n    const onSend = jest.fn();\n    const { result } = renderHook(() =>\n      useSms({\n        onSend,\n        onBefore,\n      })\n    );\n\n    await act(async () => {\n      await result.current.sendSms();\n\n      expect(onBefore).toBeCalledTimes(1);\n      expect(onSend).not.toBeCalled();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useSms/index.ts",
    "content": "import { ForwardedRef, MutableRefObject, useEffect, useRef, useState } from 'react';\nimport { TextInput } from 'react-native';\n\nimport useCountdown from '../useCountdown';\nimport useMemoizedFn from '../useMemoizedFn';\n\ninterface Props {\n  /** 倒计时时长，默认为 60s */\n  count?: number;\n  /** 倒计时文字，默认为：获取验证码 */\n  defaultLabel?: string;\n  /** 重新发送文字，默认为：重新发送 */\n  resendLabel?: string;\n  /** 发送之前执行的函数，结果将决定验证码是否允许发送。通常用在验证码发送之前的手机号校验的场景 */\n  onBefore?: () => Promise<boolean>;\n  /** 发送验证码 */\n  onSend: (...args: any[]) => void;\n  /** 倒计时结束之后执行的函数 */\n  onAfter?: () => void;\n  ref?: ForwardedRef<TextInput>;\n}\n\n/**\n * 用于发送手机验证码的 hook。\n * @param props 参数\n */\nexport default function useSms({\n  defaultLabel = '发送验证码',\n  resendLabel = '重新发送',\n  count = 60,\n  onBefore,\n  onSend,\n  onAfter,\n  ref,\n}: Props) {\n  const { count: currentCount, start } = useCountdown(count);\n\n  const [text, setText] = useState('');\n  const [started, setStarted] = useState(false);\n\n  useEffect(() => {\n    if (currentCount === 0) {\n      onAfter?.();\n      setStarted(false);\n    }\n  }, [currentCount]);\n\n  useEffect(() => {\n    if (!started) {\n      setText(defaultLabel);\n    } else if (currentCount !== 0) {\n      setText(`${resendLabel}(${currentCount}s)`);\n    } else {\n      setText(resendLabel);\n    }\n  }, [currentCount, defaultLabel, resendLabel]);\n\n  /**\n   * 发送验证码\n   */\n  const sendSms = async (...args: any[]) => {\n    let validateResult = true;\n    if (onBefore) {\n      validateResult = await onBefore();\n    }\n    if (validateResult) {\n      if (ref) {\n        (ref as MutableRefObject<TextInput>).current.focus();\n      }\n      onSend(...args);\n      // 开始倒计时\n      start();\n      setStarted(true);\n    }\n  };\n\n  return {\n    text,\n    disabled: started,\n    sendSms: useMemoizedFn(sendSms),\n  };\n}\n"
  },
  {
    "path": "packages/hooks/src/useThrottle/ThrottleOptions.ts",
    "content": "export interface ThrottleOptions {\n  /** 超时时间，单位为毫秒 */\n  wait?: number;\n  /** 是否在延迟开始前调用函数 */\n  leading?: boolean;\n  /** 是否在延迟开始后调用函数 */\n  trailing?: boolean;\n}\n"
  },
  {
    "path": "packages/hooks/src/useThrottle/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useThrottle } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [value, setValue] = useState<string>();\n  const throttledValue = useThrottle(value, { wait: 500 });\n\n  return (\n    <div>\n      <input value={value} onChange={e => setValue(e.target.value)} placeholder=\"Typed value\" style={{ width: 280 }} />\n      <p style={{ marginTop: 16 }}>throttledValue: {throttledValue}</p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useThrottle/index.ts",
    "content": "import { useEffect, useState } from 'react';\n\nimport useThrottleFn from '../useThrottleFn';\nimport type { ThrottleOptions } from './ThrottleOptions';\n\n/**\n * 用来处理节流值的 Hook。\n * @param value 需要节流的值\n * @param options 配置节流的行为\n * @returns\n */\nexport default function useThrottle<T>(value: T, options?: ThrottleOptions) {\n  const [throttled, setThrottled] = useState(value);\n\n  const { run } = useThrottleFn(() => {\n    setThrottled(value);\n  }, options);\n\n  useEffect(() => {\n    run();\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [value]);\n\n  return throttled;\n}\n"
  },
  {
    "path": "packages/hooks/src/useThrottleEffect/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useThrottleEffect } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [value, setValue] = useState('hello');\n  const [records, setRecords] = useState<string[]>([]);\n  useThrottleEffect(\n    () => {\n      setRecords(val => [...val, value]);\n    },\n    [value],\n    {\n      wait: 1000,\n    }\n  );\n  return (\n    <div>\n      <input value={value} onChange={e => setValue(e.target.value)} placeholder=\"Typed value\" style={{ width: 280 }} />\n      <p style={{ marginTop: 16 }}>\n        <ul>\n          {records.map((record, index) => (\n            <li key={index}>{record}</li>\n          ))}\n        </ul>\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useThrottleEffect/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../utils/testHelpers';\nimport useThrottleEffect from './index';\n\ndescribe('useThrottleEffect', () => {\n  test('useThrottleEffect should be defined', () => {\n    expect(useThrottleEffect).toBeDefined();\n  });\n\n  test('useThrottleEffect should work like a charm', async () => {\n    const mockEffect = jest.fn();\n    const mockCleanup = jest.fn();\n\n    const { rerender } = renderHook(props =>\n      useThrottleEffect(\n        () => {\n          mockEffect();\n\n          return () => mockCleanup();\n        },\n        [props],\n        { wait: 200 }\n      )\n    );\n\n    expect(mockEffect).toBeCalled();\n    expect(mockCleanup).not.toBeCalled();\n\n    await act(async () => {\n      rerender(2);\n      await sleep(300);\n\n      expect(mockEffect).toBeCalled();\n      expect(mockCleanup).toBeCalled();\n      expect(mockEffect.mock.calls.length).toBe(2);\n      expect(mockCleanup.mock.calls.length).toBe(1);\n\n      rerender(3);\n      expect(mockEffect.mock.calls.length).toBe(2);\n      expect(mockCleanup.mock.calls.length).toBe(1);\n\n      await sleep(300);\n      expect(mockEffect.mock.calls.length).toBe(3);\n      expect(mockCleanup.mock.calls.length).toBe(2);\n    });\n  });\n\n  test('useThrottleEffect should cancel timeout on unmount', async () => {\n    const mockEffect = jest.fn();\n    const mockCleanup = jest.fn();\n\n    const { rerender, unmount } = renderHook(props =>\n      useThrottleEffect(\n        () => {\n          mockEffect();\n\n          return () => mockCleanup();\n        },\n        [props],\n        { wait: 200 }\n      )\n    );\n    expect(mockEffect).toBeCalled();\n    expect(mockCleanup).not.toBeCalled();\n\n    rerender(1);\n    await sleep(100);\n    unmount();\n\n    expect(mockEffect.mock.calls.length).toBe(1);\n    expect(mockCleanup.mock.calls.length).toBe(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useThrottleEffect/index.ts",
    "content": "import { DependencyList, EffectCallback, useEffect, useState } from 'react';\n\nimport type { ThrottleOptions } from '../useThrottle/ThrottleOptions';\nimport useThrottleFn from '../useThrottleFn';\nimport useUpdateEffect from '../useUpdateEffect';\n\n/**\n * 为 `useEffect` 增加节流的能力。\n */\nexport default function useThrottleEffect(effect: EffectCallback, deps?: DependencyList, options?: ThrottleOptions) {\n  const [flag, setFlag] = useState({});\n\n  const { run } = useThrottleFn(() => {\n    setFlag({});\n  }, options);\n\n  useEffect(() => {\n    return run();\n  }, deps);\n\n  useUpdateEffect(effect, [flag]);\n}\n"
  },
  {
    "path": "packages/hooks/src/useThrottleFn/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useThrottleFn } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [value, setValue] = useState(0);\n  const { run } = useThrottleFn(\n    () => {\n      setValue(value + 1);\n    },\n    { wait: 500 }\n  );\n\n  return (\n    <div>\n      <p style={{ marginTop: 16 }}> Clicked count: {value} </p>\n      <button type=\"button\" onClick={run}>\n        Click fast!\n      </button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useThrottleFn/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport { sleep } from '../utils/testHelpers';\nimport useThrottleFn from './index';\n\ndescribe('useThrottleFn', () => {\n  test('useThrottleFn should be defined', () => {\n    expect(useThrottleFn).toBeDefined();\n  });\n\n  test('useThrottleFn parameter should be function', () => {\n    const { result } = renderHook(() => useThrottleFn(12 as any, { wait: 200 }));\n    expect(result.error).toBeDefined();\n  });\n\n  test('useThrottleFn.run should work like a charm', async () => {\n    let count = 0;\n    const throttleFn = (delta = 1) => {\n      count += delta;\n    };\n    const { result } = renderHook(() => useThrottleFn(throttleFn, { wait: 300 }));\n\n    await act(async () => {\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      result.current.run(1);\n      result.current.run(1);\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      await sleep(100); // t = 100\n      expect(count).toBe(1);\n\n      await sleep(150); // t = 250\n      expect(count).toBe(1);\n\n      await sleep(100); // t = 350\n      expect(count).toBe(2);\n\n      result.current.run(2);\n      result.current.run(2);\n      result.current.run(2);\n      await sleep(200); // t = 550\n      expect(count).toBe(4);\n    });\n  });\n\n  test('useThrottleFn.cancel should work like a charm', async () => {\n    let count = 0;\n    const throttleFn = (delta = 1) => {\n      count += delta;\n    };\n    const { result } = renderHook(() => useThrottleFn(throttleFn, { wait: 300 }));\n\n    await act(async () => {\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      result.current.run(1);\n      result.current.run(1);\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      await sleep(100); // t = 100\n      expect(count).toBe(1);\n\n      await sleep(150); // t = 250\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      await sleep(100); // t = 350\n      result.current.run(1);\n      expect(count).toBe(2);\n\n      await sleep(100); // t = 450\n      result.current.run(2);\n      result.current.cancel();\n      expect(count).toBe(2);\n    });\n  });\n\n  test('useThrottleFn.flush should work like a charm', async () => {\n    let count = 0;\n    const throttleFn = (delta = 1) => {\n      count += delta;\n    };\n    const { result } = renderHook(() => useThrottleFn(throttleFn, { wait: 300 }));\n\n    await act(async () => {\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      result.current.run(1);\n      result.current.run(1);\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      await sleep(100); // t = 100\n      expect(count).toBe(1);\n\n      await sleep(150); // t = 250\n      result.current.run(1);\n      expect(count).toBe(1);\n\n      await sleep(100); // t = 350\n      result.current.run(1);\n      expect(count).toBe(2);\n\n      await sleep(100); // t = 450\n      result.current.run(2);\n      result.current.flush();\n      expect(count).toBe(4);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useThrottleFn/index.ts",
    "content": "import { throttle } from 'lodash-es';\n\nimport useCreation from '../useCreation';\nimport useMemoizedFn from '../useMemoizedFn';\nimport type { ThrottleOptions } from '../useThrottle/ThrottleOptions';\nimport useUnmount from '../useUnmount';\n\ntype noop = (...args: any) => any;\n\n/**\n * 用来处理节流函数的 Hook。\n * @param fn 需要节流的函数\n * @param options 配置节流的行为\n */\nexport default function useThrottleFn<T extends noop>(fn: T, options?: ThrottleOptions) {\n  if (__DEV__) {\n    if (typeof fn !== 'function') {\n      throw new Error(`useThrottleFn expected parameter is a function, got ${typeof fn}`);\n    }\n  }\n\n  const fnRef = useMemoizedFn(fn);\n\n  const wait = options?.wait ?? 1000;\n\n  const throttled = useCreation(\n    () =>\n      throttle(\n        (...args: Parameters<T>): ReturnType<T> => {\n          return fnRef(...args);\n        },\n        wait,\n        options\n      ),\n    []\n  );\n\n  useUnmount(() => {\n    throttled.cancel();\n  });\n\n  return {\n    run: throttled,\n    cancel: throttled.cancel,\n    flush: throttled.flush,\n  };\n}\n"
  },
  {
    "path": "packages/hooks/src/useTimeout/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useTimeout } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [state, setState] = useState(1);\n  useTimeout(() => {\n    setState(state + 1);\n  }, 3000);\n\n  return <div>{state}</div>;\n};\n"
  },
  {
    "path": "packages/hooks/src/useTimeout/index.test.ts",
    "content": "import { renderHook } from '@testing-library/react-hooks';\n\nimport useTimeout from './index';\n\ndescribe('useTimeout', () => {\n  beforeEach(() => {\n    jest.useFakeTimers();\n  });\n\n  test('useTimeout should be defined', () => {\n    expect(useTimeout).toBeDefined();\n  });\n\n  test('useTimeout should work like a charm', () => {\n    const callback = jest.fn();\n\n    renderHook(() => useTimeout(callback, 200));\n\n    expect(callback).not.toBeCalled();\n\n    jest.advanceTimersByTime(300);\n\n    expect(callback).toHaveBeenCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useTimeout/index.ts",
    "content": "import { useEffect, useRef } from 'react';\n\nimport { isNumber } from 'lodash-es';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\ntype Func = (...args: any[]) => any;\n\nexport default function useTimeout(fn: Func, delay?: number) {\n  const timerCallback = useMemoizedFn(fn);\n  const timer = useRef<ReturnType<typeof setTimeout>>();\n\n  useEffect(() => {\n    if (!isNumber(delay) || delay < 0) return;\n\n    timer.current = setTimeout(() => {\n      timerCallback();\n    }, delay);\n\n    return clear;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [delay]);\n\n  const clear = useMemoizedFn(() => {\n    if (timer.current) {\n      clearInterval(timer.current);\n    }\n  });\n\n  return clear;\n}\n"
  },
  {
    "path": "packages/hooks/src/useToggle/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useToggle } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [state, { toggle, setLeft, setRight }] = useToggle();\n\n  return (\n    <div>\n      <p>Effects：{`${state}`}</p>\n      <p>\n        <button type=\"button\" onClick={toggle}>\n          Toggle\n        </button>\n        <button type=\"button\" onClick={setLeft} style={{ margin: '0 8px' }}>\n          Toggle False\n        </button>\n        <button type=\"button\" onClick={setRight}>\n          Toggle True\n        </button>\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useToggle/demo/demo2.tsx",
    "content": "import React from 'react';\n\nimport { useToggle } from '@td-design/rn-hooks';\n\nexport default () => {\n  const [state, { toggle, set, setLeft, setRight }] = useToggle('Hello', 'World');\n\n  return (\n    <div>\n      <p>Effects：{state}</p>\n      <p>\n        <button type=\"button\" onClick={toggle}>\n          Toggle\n        </button>\n        <button type=\"button\" onClick={() => set('Hello')} style={{ margin: '0 8px' }}>\n          Set Hello\n        </button>\n        <button type=\"button\" onClick={() => set('World')}>\n          Set World\n        </button>\n        <button type=\"button\" onClick={setLeft} style={{ margin: '0 8px' }}>\n          Set Left\n        </button>\n        <button type=\"button\" onClick={setRight}>\n          Set Right\n        </button>\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useToggle/index.test.ts",
    "content": "import { act, renderHook } from '@testing-library/react-hooks';\n\nimport useToggle from './index';\n\ndescribe('useToggle', () => {\n  test('should be defined', () => {\n    expect(useToggle).toBeDefined();\n  });\n\n  test('initialValue should be false', () => {\n    const { result } = renderHook(() => useToggle());\n    expect(result.current[0]).toBeFalsy();\n  });\n\n  test('initialValue should be hello', () => {\n    const { result } = renderHook(() => useToggle('hello'));\n    expect(result.current[0]).toEqual('hello');\n  });\n\n  test('value should be true after toggle was triggered', () => {\n    const { result } = renderHook(() => useToggle());\n\n    act(() => {\n      result.current[1].toggle();\n    });\n\n    expect(result.current[0]).toBeTruthy();\n  });\n\n  test('value should be world after setRight was triggered', () => {\n    const { result } = renderHook(() => useToggle('hello', 'world'));\n\n    act(() => {\n      result.current[1].setRight();\n    });\n\n    expect(result.current[0]).toEqual('world');\n  });\n\n  test('value should be hello after setRight and setLeft were triggered sequentially', () => {\n    const { result } = renderHook(() => useToggle('hello', 'world'));\n\n    act(() => {\n      result.current[1].setRight();\n    });\n\n    act(() => {\n      result.current[1].setLeft();\n    });\n\n    expect(result.current[0]).toEqual('hello');\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useToggle/index.ts",
    "content": "import { useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\ninterface Actions<T> {\n  setLeft: () => void;\n  setRight: () => void;\n  set: (value: T) => void;\n  toggle: () => void;\n}\n\nfunction useToggle<T = boolean>(): [boolean, Actions<T>];\nfunction useToggle<T>(defaultValue: T): [T, Actions<T>];\nfunction useToggle<T, U>(defaultValue: T, reverseValue: U): [T | U, Actions<T | U>];\n\n/**\n * 用于在两个状态值间切换的 Hook。\n * @param defaultValue 默认值，默认为false\n * @param reverseValue 切换值，可以不传，不传的时候值是对默认值取非\n * @returns\n */\nfunction useToggle<D, R>(defaultValue = false as unknown as D, reverseValue?: R) {\n  const [state, setState] = useState<D | R>(defaultValue);\n\n  const reverseValueOrigin = (reverseValue === undefined ? !defaultValue : reverseValue) as D | R;\n\n  const toggle = () => setState(s => (s === defaultValue ? reverseValueOrigin : defaultValue));\n  const set = (value: D | R) => setState(value);\n  const setLeft = () => setState(defaultValue);\n  const setRight = () => setState(reverseValueOrigin);\n\n  const actions = {\n    toggle: useMemoizedFn(toggle),\n    set: useMemoizedFn(set),\n    setLeft: useMemoizedFn(setLeft),\n    setRight: useMemoizedFn(setRight),\n  };\n\n  return [state, actions];\n}\n\nexport default useToggle;\n"
  },
  {
    "path": "packages/hooks/src/useTrackedEffect/index.ts",
    "content": "import { DependencyList, useEffect, useRef } from 'react';\n\ntype Effect<T extends DependencyList> = (changes?: number[], previousDeps?: T, currentDeps?: T) => void | (() => void);\n\nexport default function useTrackedEffect<T extends DependencyList>(effect: Effect<T>, deps?: [...T]) {\n  const previousDepsRef = useRef<T>();\n\n  useEffect(() => {\n    const changes = diffTwoDeps(previousDepsRef.current, deps);\n    const previousDeps = previousDepsRef.current;\n    previousDepsRef.current = deps;\n\n    return effect(changes, previousDeps, deps);\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, deps);\n}\n\nfunction diffTwoDeps(deps1?: DependencyList, deps2?: DependencyList) {\n  //Let's do a reference equality check on 2 dependency list.\n  //If deps1 is defined, we iterate over deps1 and do comparison on each element with equivalent element from deps2\n  //As this func is used only in this hook, we assume 2 deps always have same length.\n  return deps1\n    ? deps1.map((_ele, idx) => (deps1[idx] !== deps2?.[idx] ? idx : -1)).filter(ele => ele >= 0)\n    : deps2\n    ? deps2.map((_ele, idx) => idx)\n    : [];\n}\n"
  },
  {
    "path": "packages/hooks/src/useUnmount/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useBoolean, useUnmount } from '@td-design/rn-hooks';\nimport { message } from 'antd';\n\nconst MyComponent = () => {\n  useUnmount(() => {\n    message.info('unmount');\n  });\n\n  return <p>Hello World!</p>;\n};\n\nexport default () => {\n  const [state, { toggle }] = useBoolean(true);\n\n  return (\n    <>\n      <button type=\"button\" onClick={toggle}>\n        {state ? 'unmount' : 'mount'}\n      </button>\n      {state && <MyComponent />}\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useUnmount/index.test.ts",
    "content": "import { renderHook } from '@testing-library/react-hooks';\n\nimport useUnmount from './index';\n\ndescribe('useUnmount', () => {\n  test('useUnmount should be defined', () => {\n    expect(useUnmount).toBeDefined();\n  });\n\n  test('useUnmount parameter should be function', () => {\n    const { result } = renderHook(() => useUnmount(1 as any));\n    expect(result.error).toBeDefined();\n  });\n\n  test('useUnmount should work like a charm', () => {\n    const fn = jest.fn();\n    const { rerender, unmount } = renderHook(() => useUnmount(fn));\n    expect(fn).toBeCalledTimes(0);\n\n    rerender();\n    expect(fn).toBeCalledTimes(0);\n\n    unmount();\n    expect(fn).toBeCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useUnmount/index.ts",
    "content": "import { useEffect } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\ntype Func = (...args: any[]) => any;\n\nexport default function useUnmount(fn: Func) {\n  if (__DEV__) {\n    if (typeof fn !== 'function') {\n      throw new Error(`useUnmount expected parameter is a function, got ${typeof fn}`);\n    }\n  }\n\n  const fnRef = useMemoizedFn(fn);\n\n  useEffect(\n    () => fnRef,\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    []\n  );\n}\n"
  },
  {
    "path": "packages/hooks/src/useUnmountedRef/demo/demo1.tsx",
    "content": "import React, { useEffect } from 'react';\n\nimport { useBoolean, useUnmountedRef } from '@td-design/rn-hooks';\nimport { message } from 'antd';\n\nconst MyComponent = () => {\n  const unmountedRef = useUnmountedRef();\n  useEffect(() => {\n    setTimeout(() => {\n      if (!unmountedRef.current) {\n        message.info('component is alive');\n      }\n    }, 3000);\n  }, []);\n\n  return <p>Hello World!</p>;\n};\n\nexport default () => {\n  const [state, { toggle }] = useBoolean(true);\n\n  return (\n    <>\n      <button type=\"button\" onClick={toggle}>\n        {state ? 'unmount' : 'mount'}\n      </button>\n      {state && <MyComponent />}\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useUnmountedRef/index.test.ts",
    "content": "import { renderHook } from '@testing-library/react-hooks';\n\nimport useUnmountedRef from './index';\n\ndescribe('useUnmountedRef', () => {\n  test('useUnmountedRef should be defined', () => {\n    expect(useUnmountedRef).toBeDefined();\n  });\n\n  test('useUnmountedRef should work like a charm', () => {\n    const { result, rerender, unmount } = renderHook(() => useUnmountedRef());\n\n    expect(result.current.current).toBeFalsy();\n\n    rerender();\n    expect(result.current.current).toBeFalsy();\n\n    unmount();\n    expect(result.current.current).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useUnmountedRef/index.ts",
    "content": "import { useEffect, useRef } from 'react';\n\n/**\n * 获取当前组件卸载状态的 Hook。\n * @returns\n */\nexport default function useUnmountedRef() {\n  const unmountedRef = useRef(false);\n\n  useEffect(() => {\n    unmountedRef.current = false;\n\n    return () => {\n      unmountedRef.current = true;\n    };\n  }, []);\n\n  return unmountedRef;\n}\n"
  },
  {
    "path": "packages/hooks/src/useUpdate/demo/demo1.tsx",
    "content": "import React from 'react';\n\nimport { useUpdate } from '@td-design/rn-hooks';\n\nexport default () => {\n  const update = useUpdate();\n\n  return (\n    <>\n      <div>Time: {Date.now()}</div>\n      <button type=\"button\" onClick={update} style={{ marginTop: 8 }}>\n        update\n      </button>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useUpdate/index.test.ts",
    "content": "import { useRef } from 'react';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport useMemoizedFn from '../useMemoizedFn';\nimport useUpdate from './index';\n\ndescribe('useUpdate', () => {\n  test('useUpdate should be defined', () => {\n    expect(useUpdate).toBeDefined();\n  });\n\n  test('useUpdate should update', () => {\n    const { result } = renderHook(() => {\n      const ref = useRef(0);\n      const update = useUpdate();\n      return {\n        update,\n        count: ref.current,\n        onChange: useMemoizedFn(() => {\n          ref.current = ref.current + 1;\n          update();\n        }),\n      };\n    });\n    expect(result.current.count).toEqual(0);\n\n    act(result.current.onChange);\n\n    expect(result.current.count).toEqual(1);\n  });\n\n  test('should return same update function', () => {\n    const { result, rerender } = renderHook(() => useUpdate());\n    const preUpdate = result.current;\n    rerender();\n    expect(result.current).toEqual(preUpdate);\n  });\n});\n"
  },
  {
    "path": "packages/hooks/src/useUpdate/index.ts",
    "content": "import { useState } from 'react';\n\nimport useMemoizedFn from '../useMemoizedFn';\n\n/**\n * 强制组件重新渲染的 Hook。\n * @returns\n */\nexport default function useUpdate() {\n  const [, setState] = useState({});\n\n  return useMemoizedFn(() => setState({}));\n}\n"
  },
  {
    "path": "packages/hooks/src/useUpdateEffect/index.ts",
    "content": "import { useEffect } from 'react';\n\nimport { createUpdateEffect } from '../createUpdateEffect';\n\nexport default createUpdateEffect(useEffect);\n"
  },
  {
    "path": "packages/hooks/src/useUpdateLayoutEffect/index.ts",
    "content": "import { useLayoutEffect } from 'react';\n\nimport { createUpdateEffect } from '../createUpdateEffect';\n\nexport default createUpdateEffect(useLayoutEffect);\n"
  },
  {
    "path": "packages/hooks/src/useWhyDidYouUpdate/demo/demo1.tsx",
    "content": "import React, { useState } from 'react';\n\nimport { useWhyDidYouUpdate } from '@td-design/rn-hooks';\n\nconst Demo: React.FC<{ count: number }> = props => {\n  const [randomNum, setRandomNum] = useState(Math.random());\n\n  useWhyDidYouUpdate('useWhyDidYouUpdateComponent', { ...props, randomNum });\n\n  return (\n    <div>\n      <div>\n        <span>number: {props.count}</span>\n      </div>\n      <div>\n        randomNum: {randomNum}\n        <button onClick={() => setRandomNum(Math.random)} style={{ marginLeft: 8 }}>\n          🎲\n        </button>\n      </div>\n    </div>\n  );\n};\n\nexport default () => {\n  const [count, setCount] = useState(0);\n\n  return (\n    <div>\n      <Demo count={count} />\n      <div>\n        <button onClick={() => setCount(prevCount => prevCount - 1)}>count -</button>\n        <button onClick={() => setCount(prevCount => prevCount + 1)} style={{ marginLeft: 8 }}>\n          count +\n        </button>\n      </div>\n      <p style={{ marginTop: 8 }}>Please open the browser console to view the output!</p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/hooks/src/useWhyDidYouUpdate/index.test.ts",
    "content": "import { useState } from 'react';\n\nimport { act, renderHook } from '@testing-library/react-hooks';\n\nimport useWhyDidYouUpdate from './index';\n\ndescribe('useWhyDidYouUpdate', () => {\n  test('should be defined', () => {\n    expect(useWhyDidYouUpdate).toBeDefined();\n  });\n\n  test('useWhyDidYouUpdate should work like a charm', () => {\n    console.log = jest.fn();\n    const setup = () =>\n      renderHook(() => {\n        const [count, setCount] = useState(100);\n        useWhyDidYouUpdate('UseWhyDidYouUpdateComponent', { count });\n        return {\n          setCount,\n        };\n      });\n\n    const hook = setup();\n\n    act(() => {\n      hook.result.current.setCount(1);\n    });\n    expect(console.log).toHaveBeenCalledWith('[why-did-you-update]', 'UseWhyDidYouUpdateComponent', {\n      count: {\n        from: 100,\n        to: 1,\n      },\n    });\n  });\n\n  it('should support component props', () => {});\n});\n"
  },
  {
    "path": "packages/hooks/src/useWhyDidYouUpdate/index.ts",
    "content": "import { useEffect, useRef } from 'react';\n\ntype Props = Record<string, any>;\n\n/**\n * 帮助开发者排查是那个属性改变导致了组件的 rerender。\n */\nexport default function useWhyDidYouUpdate(componentName: string, props: Props) {\n  const prevProps = useRef<Props>({});\n\n  useEffect(() => {\n    if (prevProps.current) {\n      const allKeys = Object.keys({ ...prevProps.current, ...props });\n      const changedProps: Props = {};\n\n      allKeys.forEach(key => {\n        if (prevProps.current[key] !== props[key]) {\n          changedProps[key] = {\n            from: prevProps.current[key],\n            to: props[key],\n          };\n        }\n      });\n\n      if (Object.keys(changedProps).length) {\n        console.log('[why-did-you-update]', componentName, changedProps);\n      }\n    }\n\n    prevProps.current = props;\n  });\n}\n"
  },
  {
    "path": "packages/hooks/src/utils/index.ts",
    "content": "export function depsAreSame(oldDeps: any[], deps: any[]): boolean {\n  if (oldDeps === deps) return true;\n  for (let i = 0; i < oldDeps.length; i++) {\n    if (oldDeps[i] !== deps[i]) return false;\n  }\n  return true;\n}\n\nexport const isObject = (value: unknown): value is Record<any, any> => value !== null && typeof value === 'object';\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = (value: unknown): value is Function => typeof value === 'function';\n\nexport const isString = (value: unknown): value is string => typeof value === 'string';\n\nexport const isBoolean = (value: unknown): value is boolean => typeof value === 'boolean';\n\nexport const isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const isUndef = (value: unknown): value is undefined => typeof value === 'undefined';\n"
  },
  {
    "path": "packages/hooks/src/utils/platform.ts",
    "content": "import { Platform } from 'react-native';\n\nexport function isIOS() {\n  return Platform.OS === 'ios';\n}\n"
  },
  {
    "path": "packages/hooks/src/utils/testHelpers.ts",
    "content": "/**\n * 模拟异步操作\n * @param time\n * @returns\n */\nexport function sleep(time: number) {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve(true);\n    }, time);\n  });\n}\n"
  },
  {
    "path": "packages/hooks/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"lib\": [\"ESNext\"],\n    \"moduleResolution\": \"node\",\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"downlevelIteration\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": false,\n    \"strictNullChecks\": true,\n    \"baseUrl\": \".\"\n  },\n  \"exclude\": [\"node_modules\", \"lib\", \"es\", \"dist\", \"**/index.test.ts\", \"**/demo\", \"coverage\", \"**/*.js\"]\n}\n"
  },
  {
    "path": "packages/lego/CHANGELOG.md",
    "content": "# @td-design/lego\n\n## 4.1.12\n\n### Patch Changes\n\n- [#938](https://github.com/thundersdata-frontend/td-design/pull/938) [`a32b740a2`](https://github.com/thundersdata-frontend/td-design/commit/a32b740a2a66866e4f2edb01590f8035b95bf837) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Table组件字段折行的问题\n\n## 4.1.11\n\n### Patch Changes\n\n- [#884](https://github.com/thundersdata-frontend/td-design/pull/884) [`b3db6b924`](https://github.com/thundersdata-frontend/td-design/commit/b3db6b924c3bb9049c5e4c5b64eaf8ac1bd10cef) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 优化进度条图\n\n## 4.1.10\n\n### Patch Changes\n\n- [#880](https://github.com/thundersdata-frontend/td-design/pull/880) [`91b431ab7`](https://github.com/thundersdata-frontend/td-design/commit/91b431ab7f0532877ddffe7a47c26ad50029ba1b) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 进度条组件支持非百分比模式\n\n## 4.1.9\n\n### Patch Changes\n\n- [#767](https://github.com/thundersdata-frontend/td-design/pull/767) [`05d836a19`](https://github.com/thundersdata-frontend/td-design/commit/05d836a1926104a2442475281b4f035d683d038b) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复3d饼图卡顿问题\n\n## 4.1.8\n\n### Patch Changes\n\n- [#765](https://github.com/thundersdata-frontend/td-design/pull/765) [`62355ae75`](https://github.com/thundersdata-frontend/td-design/commit/62355ae759b9d31bc837f0eb3dd99e77bfa0a580) Thanks [@qqack](https://github.com/qqack)! - feat: lego的table组件的优化\n\n## 4.1.7\n\n### Patch Changes\n\n- [#763](https://github.com/thundersdata-frontend/td-design/pull/763) [`d0d5db234`](https://github.com/thundersdata-frontend/td-design/commit/d0d5db234eee0f405e3a59907002958d28ef02e1) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复条形图和条形对比图的显示 bug\n\n## 4.1.6\n\n### Patch Changes\n\n- [#761](https://github.com/thundersdata-frontend/td-design/pull/761) [`a9315c23b`](https://github.com/thundersdata-frontend/td-design/commit/a9315c23b7816f37513f401d43b06ae7523b0ebb) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复无法自定义样式的问题\n\n## 4.1.5\n\n### Patch Changes\n\n- [#759](https://github.com/thundersdata-frontend/td-design/pull/759) [`66f777c42`](https://github.com/thundersdata-frontend/td-design/commit/66f777c42028549437cbb35308135daea8fb258c) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 3d饼图支持中心标题\n\n## 4.1.4\n\n### Patch Changes\n\n- [#757](https://github.com/thundersdata-frontend/td-design/pull/757) [`2017a1dea`](https://github.com/thundersdata-frontend/td-design/commit/2017a1dea0e6c843e84a1b7cd66372392ec67be6) Thanks [@qqack](https://github.com/qqack)! - fix: lego组件解决文字滚动组件不能无缝连接问题\n\n## 4.1.3\n\n### Patch Changes\n\n- [#755](https://github.com/thundersdata-frontend/td-design/pull/755) [`5d70073db`](https://github.com/thundersdata-frontend/td-design/commit/5d70073db0a5365f363854ce4e10e3d7cfa696aa) Thanks [@qqack](https://github.com/qqack)! - perf: lego组件库更新写法,去掉warning\n\n## 4.1.2\n\n### Patch Changes\n\n- [#753](https://github.com/thundersdata-frontend/td-design/pull/753) [`069382d8f`](https://github.com/thundersdata-frontend/td-design/commit/069382d8f6b012fcce75d2bd5769083eaa6bfa4e) Thanks [@qqack](https://github.com/qqack)! - fix: lego组件的一些优化\n\n## 4.1.1\n\n### Patch Changes\n\n- [#745](https://github.com/thundersdata-frontend/td-design/pull/745) [`bbc7deb64`](https://github.com/thundersdata-frontend/td-design/commit/bbc7deb64da6805a33ff20e2b5dbdd0a2e714df0) Thanks [@qqack](https://github.com/qqack)! - style: 优化data-show-simple组件\n\n## 4.1.0\n\n### Minor Changes\n\n- [#742](https://github.com/thundersdata-frontend/td-design/pull/742) [`60960d99a`](https://github.com/thundersdata-frontend/td-design/commit/60960d99ace962e135ef957ae06367aba8955d7f) Thanks [@qqack](https://github.com/qqack)! - feat: 用css动画替代动态背景图\n\n## 4.0.3\n\n### Patch Changes\n\n- [#733](https://github.com/thundersdata-frontend/td-design/pull/733) [`aeada2c4f`](https://github.com/thundersdata-frontend/td-design/commit/aeada2c4f464dc84ad2cfab315c956236bfe70b1) Thanks [@qqack](https://github.com/qqack)! - fix: 修复lego的一些组件的bug\n\n## 4.0.2\n\n### Patch Changes\n\n- [#730](https://github.com/thundersdata-frontend/td-design/pull/730) [`d6df8177a`](https://github.com/thundersdata-frontend/td-design/commit/d6df8177a9b8a43ee15a3ecae1d92f87db508780) Thanks [@qqack](https://github.com/qqack)! - lego 中 table 组件的优化\n\n## 4.0.1\n\n### Patch Changes\n\n- [#726](https://github.com/thundersdata-frontend/td-design/pull/726) [`7e04b363f`](https://github.com/thundersdata-frontend/td-design/commit/7e04b363fc35419219bc9afce20c197d50ca6209) Thanks [@qqack](https://github.com/qqack)! - 修改 table 的 lineHeight 报错以及更新 modal 的写法\n\n## 4.0.0\n\n### Major Changes\n\n- [#687](https://github.com/thundersdata-frontend/td-design/pull/687) [`1c6182348`](https://github.com/thundersdata-frontend/td-design/commit/1c6182348dbb3e97ae014b20b432cccc8452e701) Thanks [@chen929104](https://github.com/chen929104)! - 修改 sideEffects 配置 支持使用 Tree-shaking\n\n## 3.1.1\n\n### Patch Changes\n\n- [#647](https://github.com/thundersdata-frontend/td-design/pull/647) [`5bb50834a`](https://github.com/thundersdata-frontend/td-design/commit/5bb50834acd3cc4c4951275e1ee49512805e9335) Thanks [@chj-damon](https://github.com/chj-damon)! - 让柱状图宽度自适应\n\n## 3.1.0\n\n### Minor Changes\n\n- [#645](https://github.com/thundersdata-frontend/td-design/pull/645) [`10117acf9`](https://github.com/thundersdata-frontend/td-design/commit/10117acf92f6e4fe6d7600fc439686e7f916d966) Thanks [@chj-damon](https://github.com/chj-damon)! - 为图表增加 svg 渲染器的配置项\n\n## 3.0.1\n\n### Patch Changes\n\n- [#638](https://github.com/thundersdata-frontend/td-design/pull/638) [`40bbbdb0d`](https://github.com/thundersdata-frontend/td-design/commit/40bbbdb0d1e4d11a9245fa782d84529312694ed7) Thanks [@chj-damon](https://github.com/chj-damon)! - 删除一些无用的图片资源, 优化 useEchartsRef 里的 useCallback 依赖\n\n## 3.0.0\n\n### Major Changes\n\n- [#629](https://github.com/thundersdata-frontend/td-design/pull/629) [`931cebafb`](https://github.com/thundersdata-frontend/td-design/commit/931cebafb99ab21e18dd8957fff394b07cf573b1) Thanks [@chen929104](https://github.com/chen929104)! - 修复打包的时候 background-image 图片没有打包\n\n## 2.3.7\n\n### Patch Changes\n\n- [#554](https://github.com/thundersdata-frontend/td-design/pull/554) [`f12fb3a44`](https://github.com/thundersdata-frontend/td-design/commit/f12fb3a4429e9e80878b55b38185308f82b45da8) Thanks [@qqack](https://github.com/qqack)! - fix: 解决饼图渲染 null 的 bug\n\n## 2.3.6\n\n### Patch Changes\n\n- [#552](https://github.com/thundersdata-frontend/td-design/pull/552) [`db26633df`](https://github.com/thundersdata-frontend/td-design/commit/db26633df44d2d796fdc69c62020f28e9b09190a) Thanks [@chen929104](https://github.com/chen929104)! - 1 修改打包配置\n\n## 2.3.5\n\n### Patch Changes\n\n- [`9c480ef78`](https://github.com/thundersdata-frontend/td-design/commit/9c480ef7847c86e551097a8d1ef6ff98c192f79d) - 1 修改打包文件路径问题\n\n## 2.3.4\n\n### Patch Changes\n\n- [#544](https://github.com/thundersdata-frontend/td-design/pull/544) [`eaae913d4`](https://github.com/thundersdata-frontend/td-design/commit/eaae913d4edd24533f5119272f8d48cb0b4a5ef9) Thanks [@ziqiya](https://github.com/ziqiya)! - 修复 CircularSolidPie 饼图只有 1 个选项时会出现 NaN%\n\n## 2.3.3\n\n### Patch Changes\n\n- [#536](https://github.com/thundersdata-frontend/td-design/pull/536) [`aa9f59b48`](https://github.com/thundersdata-frontend/td-design/commit/aa9f59b4865666b03c805151087b4485072b949a) Thanks [@qqack](https://github.com/qqack)! - feat: 饼图等大屏组件的自适应改造\n\n## 2.3.2\n\n### Patch Changes\n\n- [`079fc9e44`](https://github.com/thundersdata-frontend/td-design/commit/079fc9e4482b3be0d29524b0c7d826dcebf8b6b8) - X 轴不强制显示所有标签\n\n## 2.3.1\n\n### Patch Changes\n\n- [`e749c01a6`](https://github.com/thundersdata-frontend/td-design/commit/e749c01a6daa53c1171104b30b720dc3625ce1f9) - 去除一些使用 useMemo 的过度优化场景\n\n## 2.3.0\n\n### Minor Changes\n\n- [#516](https://github.com/thundersdata-frontend/td-design/pull/516) [`61ead348b`](https://github.com/thundersdata-frontend/td-design/commit/61ead348bd4e96cef1f6dd2e992c004876cbb15a) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 新增 modal 弹窗\n\n## 2.2.18\n\n### Patch Changes\n\n- [`585e7801e`](https://github.com/thundersdata-frontend/td-design/commit/585e7801e246a25f2dfa647a4dd9e6a5800b5f3c) - 优化 children 的定义\n\n## 2.2.17\n\n### Patch Changes\n\n- [`578e9b90d`](https://github.com/thundersdata-frontend/td-design/commit/578e9b90d67c39163f544b4190e09e97ec2fb016) - feat: 3D 饼图和立体环形图增加弹窗配置\n\n## 2.2.16\n\n### Patch Changes\n\n- feat: 3D 饼图和立体环形图增加弹窗配置\n"
  },
  {
    "path": "packages/lego/example/AccumulatedDataDemo/demo1.tsx",
    "content": "import { AccumulatedData } from '@td-design/lego';\n\nexport default function () {\n  return (\n    <AccumulatedData\n      data={[\n        { name: '承运车辆数', value: 36.8, unit: '万辆' },\n        { name: '累计订单', value: 168.5, unit: '万单' },\n        { name: '运费', value: 41.5, unit: '万' },\n        { name: '光伏发电量', value: 3346.8, unit: '万度' },\n        { name: '换电站数量', value: 4, unit: '个' },\n      ]}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/lego/example/AccumulatedDataDemo/demo2.tsx",
    "content": "import { AccumulatedData } from '@td-design/lego';\n\nexport default function () {\n  return (\n    <AccumulatedData\n      data={[\n        { name: '承运车辆数', value: 36.8, unit: '万辆' },\n        { name: '累计订单', value: 168.5, unit: '万单' },\n        { name: '运费', value: 41.5, unit: '万' },\n      ]}\n      numberScroll\n    />\n  );\n}\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月']}\n    yAxis={[{ name: '万元' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11] }}\n    barData={{ name: '运费', data: [500, 584] }}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo10.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月']}\n    yAxis={[{ name: '万元' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11] }}\n    barData={{ name: '运费', data: [500, 584] }}\n    style={{ width: 486, height: 254 }}\n    shadow\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo11.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月', '05月', '06月', '07月', '08月']}\n    yAxis={[{ name: '万元' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11, 19, 23, 32, 45] }}\n    barData={{ name: '运费', data: [98, 112, 234, 500, 584, 666] }}\n    style={{ width: 486, height: 254 }}\n    smooth\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo12.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月', '05月', '06月', '07月', '08月']}\n    yAxis={[{ name: '万元' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11, 19, 23, 32, 45] }}\n    barData={{ name: '运费', data: [98, 112, 234, 500, 584, 666] }}\n    style={{ width: 486, height: 254 }}\n    smooth\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月', '05月', '06月', '07月', '08月']}\n    yAxis={[{ name: '万元' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11, 19, 23, 32, 45] }}\n    style={{ width: 486, height: 254 }}\n    barType=\"cylinderBar\"\n    barData={[\n      { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n      { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月', '05月', '06月', '07月', '08月']}\n    yAxis={[{ name: '万辆' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11, 19, 23, 32, 45] }}\n    style={{ width: 486, height: 254 }}\n    barType=\"cylinderShadowBar\"\n    max={4000}\n    barData={{\n      name: '月高速车辆总数',\n      data: [2012, 2555, 1234, 1899, 1986, 2100],\n    }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo4.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月', '05月', '06月', '07月', '08月']}\n    yAxis={[{ name: '万元' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11, 19, 23, 32, 45] }}\n    style={{ width: 486, height: 254 }}\n    barType=\"sliceBar\"\n    max={4000}\n    barData={{ name: '产值', data: [2012, 2555, 1234, 1899, 1986, 2100] }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo5.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月', '05月', '06月', '07月', '08月']}\n    yAxis={[{ name: '万辆' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11, 19, 23, 32, 45] }}\n    style={{ width: 486, height: 254 }}\n    barType=\"stackBar\"\n    barData={[\n      { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n      { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo6.tsx",
    "content": "import React from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => (\n  <BarLine\n    xAxisData={['03月', '04月']}\n    yAxis={[{ name: '万元' }, { name: '%' }]}\n    lineData={{ name: '同比增长率', data: [12, 11] }}\n    barData={{ name: '运费', data: [500, 584] }}\n    autoLoop\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo7.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <BarLine\n      xAxisData={['03月', '04月']}\n      yAxis={[{ name: '万元' }, { name: '%' }]}\n      lineData={{ name: '同比增长率', data: [12, 11] }}\n      barData={{ name: '运费', data: [500, 584] }}\n      autoLoop={autoLoop}\n      style={{ width: 486, height: 254 }}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo8.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { BarLine } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <BarLine\n          inModal\n          xAxisData={['03月', '04月']}\n          yAxis={[{ name: '万元' }, { name: '%' }]}\n          lineData={{ name: '同比增长率', data: [12, 11] }}\n          barData={{ name: '运费', data: [500, 584] }}\n          style={{ height: 500, width: '100%' }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/BarLineDemo/demo9.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { BarLine, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['03月', '04月', '05月', '06月', '07月', '08月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex < xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <BarLine\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        yAxis={[{ name: '万元' }, { name: '%' }]}\n        lineData={{ name: '同比增长率', data: [12, 11, 19, 23, 32, 45] }}\n        barData={{ name: '运费', data: [98, 112, 234, 500, 584, 666] }}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/BasePieDemo/demo1.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { BasePie } from '@td-design/lego';\n\nconst result = {\n  code: 20000,\n  data: {\n    title: '货物比例',\n    data: {\n      series: [\n        {\n          name: '货物比例',\n          type: 'pie',\n          data: [\n            { name: '木材', value: '47043' },\n            { name: '机械、设备', value: '38603' },\n            { name: '钢铁', value: '31316' },\n            { name: '煤炭及制品', value: '29037' },\n            { name: '矿建材料', value: '27474' },\n            { name: '其他', value: '73437' },\n          ],\n        },\n      ],\n    },\n  },\n  success: true,\n};\n\n/** 饼图 demo */\nconst BasePieDemo = () => {\n  return (\n    <div style={{ width: 475, height: 255 }}>\n      <BasePie\n          autoLoop={true}\n          unit=\"吨\"\n          data={result.data.data.series[0].data}\n        />\n    </div>\n\n  );\n};\n\nexport default BasePieDemo;\n"
  },
  {
    "path": "packages/lego/example/BasePieDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { BasePie } from '@td-design/lego';\n\nconst result = {\n  code: 20000,\n  data: {\n    title: '货物比例',\n    data: {\n      series: [\n        {\n          name: '货物比例',\n          type: 'pie',\n          data: [\n            { name: '木材', value: '47043' },\n            { name: '其他', value: '73437' },\n          ],\n        },\n      ],\n    },\n  },\n  success: true,\n};\n\n/** 饼图 demo */\nconst BasePieDemo = () => (\n  <BasePie\n    data={result.data.data.series[0].data}\n    style={{ width: 486, height: 254 }}\n  />\n);\n\nexport default BasePieDemo;\n"
  },
  {
    "path": "packages/lego/example/BasePieDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { BasePie } from '@td-design/lego';\n\nconst result = {\n  code: 20000,\n  data: {\n    title: '货物比例',\n    data: {\n      series: [\n        {\n          name: '货物比例',\n          type: 'pie',\n          data: [\n            { name: '木材', value: '47043' },\n            { name: '机械、设备', value: '38603' },\n            { name: '钢铁', value: '31316' },\n            { name: '煤炭及制品', value: '29037' },\n            { name: '矿建材料', value: '27474' },\n          ],\n        },\n      ],\n    },\n  },\n  success: true,\n};\n\n/** 饼图 demo */\nconst BasePieDemo = () => (\n  <BasePie\n    data={result.data.data.series[0].data}\n    style={{ width: 486, height: 254 }}\n  />\n);\n\nexport default BasePieDemo;\n"
  },
  {
    "path": "packages/lego/example/BasePieDemo/demo4.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { BasePie, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const seriesData = [\n    { name: '木材', value: '47043' },\n    { name: '机械、设备', value: '38603' },\n    { name: '钢铁', value: '31316' },\n    { name: '煤炭及制品', value: '29037' },\n    { name: '矿建材料', value: '27474' },\n    { name: '其他', value: '73437' },\n  ];\n  const currentName = seriesData[currentIndex]?.name;\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex < seriesData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <BasePie\n        ref={echartsRef}\n        data={seriesData}\n        style={{ width: 700, height: 404 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/BasePieDemo/demo5.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { BasePie } from '@td-design/lego';\n\nconst result = {\n  code: 20000,\n  data: {\n    title: '货物比例',\n    data: {\n      series: [\n        {\n          name: '货物比例',\n          type: 'pie',\n          data: [\n            { name: '木材', value: '47043' },\n            { name: '机械、设备', value: '38603' },\n            { name: '钢铁', value: '31316' },\n            { name: '煤炭及制品', value: '29037' },\n            { name: '矿建材料', value: '27474' },\n            { name: '其他', value: '73437' },\n          ],\n        },\n      ],\n    },\n  },\n  success: true,\n};\n\n/** 饼图 demo */\nconst BasePieDemo = () => {\n  return (\n    <BasePie\n      autoLoop={true}\n      data={result.data.data.series[0].data}\n      legendPosition=\"bottom\"\n      style={{ width: 260, height: 500 }}\n    />\n  );\n};\n\nexport default BasePieDemo;\n"
  },
  {
    "path": "packages/lego/example/BasePieDemo/demo6.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { BasePie } from '@td-design/lego';\n\nconst result = {\n  code: 20000,\n  data: {\n    title: '货物比例',\n    data: {\n      series: [\n        {\n          name: '货物比例',\n          type: 'pie',\n          data: [\n            { name: '木材', value: '47043' },\n            { name: '机械、设备', value: '38603' },\n            { name: '钢铁', value: '31316' },\n            { name: '煤炭及制品', value: '29037' },\n            { name: '矿建材料', value: '27474' },\n            { name: '其他', value: '73437' },\n          ],\n        },\n      ],\n    },\n  },\n  success: true,\n};\n\n/** 饼图 demo */\nconst BasePieDemo = () => {\n  return (\n    <BasePie\n      autoLoop={true}\n      data={result.data.data.series[0].data}\n      legendPosition=\"bottom\"\n      onlyPercentage={true}\n      style={{ width: 260, height: 500 }}\n    />\n  );\n};\n\nexport default BasePieDemo;\n"
  },
  {
    "path": "packages/lego/example/BasePieDemo/demo7.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { BasePie } from '@td-design/lego';\n\nconst result = {\n  code: 20000,\n  data: {\n    title: '货物比例',\n    data: {\n      series: [\n        {\n          name: '货物比例',\n          type: 'pie',\n          data: [\n            { name: '木材', value: '47043' },\n            { name: '机械、设备', value: '38603' },\n            { name: '钢铁', value: '31316' },\n            { name: '煤炭及制品', value: '29037' },\n            { name: '矿建材料', value: '27474' },\n            { name: '其他', value: '73437' },\n          ],\n        },\n      ],\n    },\n  },\n  success: true,\n};\n\n/** 饼图 demo */\nconst BasePieDemo = () => {\n  return (\n    <div style={{ width: 475, height: 255 }}>\n      <BasePie\n        autoLoop={true}\n        unit=\"吨\"\n        data={result.data.data.series[0].data}\n        renderer='svg'\n      />\n    </div>\n\n  );\n};\n\nexport default BasePieDemo;\n"
  },
  {
    "path": "packages/lego/example/CircularSolidPieDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { CircularSolidPie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '47043' },\n    { name: '机械', value: '38603' },\n    { name: '钢铁', value: '31316' },\n    { name: '煤烟', value: '31316' },\n    { name: '木材1', value: '47043' },\n    { name: '机械2', value: '38603' },\n    { name: '钢铁3', value: '31316' },\n    { name: '煤烟4', value: '31316' },\n    { name: '木材5', value: '47043' },\n    { name: '机械6', value: '38603' },\n    { name: '钢铁7', value: '31316' },\n    { name: '煤烟8', value: '31316' },\n  ];\n\n  return (\n    <CircularSolidPie\n      data={data}\n      style={{ width: 500, height: 500 }}\n      autoLoop\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CircularSolidPieDemo/demo2.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { CircularSolidPie, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const seriesData = [\n    { name: '木材', value: '47043' },\n    { name: '机械', value: '38603' },\n    { name: '钢铁', value: '31316' },\n    { name: '煤烟', value: '31316' },\n  ];\n  const currentName = seriesData[currentIndex]?.name;\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex < seriesData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <CircularSolidPie\n        ref={echartsRef}\n        data={seriesData}\n        style={{ width: 470, height: 300 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CircularSolidPieDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { CircularSolidPie } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n\n  const data = [\n    { name: '木材', value: '47043' },\n    { name: '机械', value: '38603' },\n    { name: '钢铁', value: '31316' },\n    { name: '煤烟', value: '31316' },\n  ];\n\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <CircularSolidPie\n          data={data}\n          autoLoop\n          inModal\n          style={{ width: 600, height: 380 }}\n          imgStyle={{ width: 470, height: 365 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CircularSolidPieDemo/demo4.tsx",
    "content": "import React from 'react';\nimport { CircularSolidPie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '47043' },\n    { name: '机械', value: '38603' },\n    { name: '钢铁', value: '31316' },\n    { name: '煤烟', value: '31316' },\n    { name: '木材1', value: '47043' },\n    { name: '机械2', value: '38603' },\n    { name: '钢铁3', value: '31316' },\n    { name: '煤烟4', value: '31316' },\n    { name: '木材5', value: '47043' },\n    { name: '机械6', value: '38603' },\n    { name: '钢铁7', value: '31316' },\n    { name: '煤烟8', value: '31316' },\n  ];\n\n  return (\n    <CircularSolidPie\n      data={data}\n      style={{ width: 500, height: 500 }}\n      autoLoop\n      renderer='svg'\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { CuboidBar } from '@td-design/lego';\n\nexport default () => (\n  <CuboidBar\n    xAxisData={['01月', '02月', '03月']}\n    unit=\"万\"\n    name=\"产值\"\n    data={[2012, 1230, 3790]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { CuboidBar } from '@td-design/lego';\n\nexport default () => (\n  <CuboidBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    unit=\"万\"\n    name=\"产值\"\n    data={[2012, 1230, 3790, 2349, 1654, 1230]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { CuboidBar } from '@td-design/lego';\n\nexport default () => (\n  <CuboidBar\n    xAxisData={[\n      '01月',\n      '02月',\n      '03月',\n      '04月',\n      '05月',\n      '06月',\n      '07月',\n      '08月',\n      '09月',\n      '10月',\n      '11月',\n      '12月',\n    ]}\n    unit=\"万\"\n    name=\"产值\"\n    data={[\n      2012, 1230, 3790, 2349, 1654, 1230, 3790, 2349, 1654, 3790, 2349, 1654,\n    ]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo4.tsx",
    "content": "import React, { useState } from 'react';\nimport { CuboidBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <CuboidBar\n      xAxisData={['01月', '02月', '03月']}\n      unit=\"万\"\n      name=\"产值\"\n      data={[2012, 1230, 3790]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo5.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { CuboidBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <CuboidBar\n      xAxisData={['01月', '02月', '03月']}\n      unit=\"万\"\n      name=\"产值\"\n      data={[2012, 1230, 3790]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo6.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { CuboidBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <CuboidBar\n          inModal\n          xAxisData={['01月', '02月', '03月']}\n          unit=\"万\"\n          name=\"产值\"\n          data={[2012, 1230, 3790]}\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo7.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { CuboidBar, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['01月', '02月', '03月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <CuboidBar\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        unit=\"万\"\n        name=\"产值\"\n        data={[2012, 1230, 3790]}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CuboidBarDemo/demo8.tsx",
    "content": "import React from 'react';\nimport { CuboidBar } from '@td-design/lego';\n\nexport default () => (\n  <CuboidBar\n    xAxisData={['01月', '02月', '03月']}\n    unit=\"万\"\n    name=\"产值\"\n    data={[2012, 1230, 3790]}\n    style={{ width: 486, height: 254 }}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CylinderBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { CylinderBar } from '@td-design/lego';\nimport { useState } from 'react';\nimport { Button } from 'antd';\n\nexport default () => {\n  const [unit, setUnit] = useState('');\n  return (\n    <div>\n      <Button onClick={() => setUnit('辆')}>辆</Button>\n      <Button onClick={() => setUnit('万辆')}>万辆</Button>\n      <CylinderBar\n        xAxisData={['01月', '02月']}\n        seriesData={[\n          { name: '月高速车辆总数', data: [2012, 555], unit: '万辆' },\n          { name: '月空车数量', data: [1222, 1333], unit: '万辆' },\n        ]}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { CylinderBar } from '@td-design/lego';\n\nexport default () => (\n  <CylinderBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    seriesData={[\n      {\n        name: '月高速车辆总数',\n        data: [2012, 2555, 1234, 1899, 1986, 2100],\n        unit: '万辆',\n      },\n      {\n        name: '月空车数量',\n        data: [1222, 1333, 899, 1234, 1500, 900],\n        unit: '辆',\n      },\n    ]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CylinderBarDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { CylinderBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <CylinderBar\n      xAxisData={['01月', '02月']}\n      seriesData={[\n        { name: '月高速车辆总数', data: [2012, 555], unit: '万辆' },\n        { name: '月空车数量', data: [1222, 1333], unit: '万辆' },\n      ]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderBarDemo/demo4.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { CylinderBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <CylinderBar\n      xAxisData={['01月', '02月']}\n      seriesData={[\n        { name: '月高速车辆总数', data: [2012, 555], unit: '万辆' },\n        { name: '月空车数量', data: [1222, 1333], unit: '万辆' },\n      ]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderBarDemo/demo5.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { CylinderBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <CylinderBar\n          inModal\n          xAxisData={['01月', '02月']}\n          seriesData={[\n            { name: '月高速车辆总数', data: [2012, 555], unit: '万辆' },\n            { name: '月空车数量', data: [1222, 1333], unit: '万辆' },\n          ]}\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderBarDemo/demo6.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { CylinderBar, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['01月', '02月', '03月', '04月', '05月', '06月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <CylinderBar\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        seriesData={[\n          {\n            name: '月高速车辆总数',\n            data: [2012, 2555, 1234, 1899, 1986, 2100],\n          },\n          { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n        ]}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderBarDemo/demo7.tsx",
    "content": "import React from 'react';\nimport { CylinderBar } from '@td-design/lego';\nimport { useState } from 'react';\nimport { Button } from 'antd';\n\nexport default () => {\n  const [unit, setUnit] = useState('');\n  return (\n    <div>\n      <Button onClick={() => setUnit('辆')}>辆</Button>\n      <Button onClick={() => setUnit('万辆')}>万辆</Button>\n      <CylinderBar\n        xAxisData={['01月', '02月']}\n        seriesData={[\n          { name: '月高速车辆总数', data: [2012, 555], unit: '万辆' },\n          { name: '月空车数量', data: [1222, 1333], unit },\n        ]}\n        style={{ width: 486, height: 254 }}\n        renderer='svg'\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { CylinderShadowBar } from '@td-design/lego';\n\nexport default () => (\n  <CylinderShadowBar\n    xAxisData={['01月', '02月']}\n    unit=\"万\"\n    name=\"月高速车辆总数\"\n    max={2500}\n    data={[2012, 555]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { CylinderShadowBar } from '@td-design/lego';\n\nexport default () => (\n  <CylinderShadowBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    unit=\"万\"\n    name=\"月高速车辆总数\"\n    max={4000}\n    data={[2012, 555, 2300, 899, 1589, 2500]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { CylinderShadowBar } from '@td-design/lego';\n\nexport default () => (\n  <CylinderShadowBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    unit=\"万\"\n    name=\"月高速车辆总数\"\n    max={4000}\n    data={[2012, 555, 2300, 899, 1589, 2500]}\n    style={{ width: 486, height: 254 }}\n    img={require('../assets/line_bottom.png')}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo4.tsx",
    "content": "import React, { useState } from 'react';\nimport { CylinderShadowBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <CylinderShadowBar\n      xAxisData={['01月', '02月']}\n      unit=\"万\"\n      name=\"月高速车辆总数\"\n      max={2500}\n      data={[2012, 555]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo5.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { CylinderShadowBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <CylinderShadowBar\n      xAxisData={['01月', '02月']}\n      unit=\"万\"\n      name=\"月高速车辆总数\"\n      max={2500}\n      data={[2012, 555]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo6.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { CylinderShadowBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <CylinderShadowBar\n          inModal\n          xAxisData={['01月', '02月']}\n          unit=\"万\"\n          name=\"月高速车辆总数\"\n          max={2500}\n          data={[2012, 555]}\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo7.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { CylinderShadowBar, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['01月', '02月', '03月', '04月', '05月', '06月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n\n      <CylinderShadowBar\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        unit=\"万\"\n        name=\"月高速车辆总数\"\n        max={4000}\n        data={[2012, 555, 2300, 899, 1589, 2500]}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/CylinderShadowBarDemo/demo8.tsx",
    "content": "import React from 'react';\nimport { CylinderShadowBar } from '@td-design/lego';\n\nexport default () => (\n  <CylinderShadowBar\n    xAxisData={['01月', '02月']}\n    unit=\"万\"\n    name=\"月高速车辆总数\"\n    max={2500}\n    data={[2012, 555]}\n    style={{ width: 486, height: 254 }}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/DataShowDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { DataShow } from '@td-design/lego';\n\nexport default () => <DataShow title=\"数据展示1\" data=\"134/999\" />;\n"
  },
  {
    "path": "packages/lego/example/DataShowSimpleDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { DataShowSimple } from '@td-design/lego';\n\nexport default () => (\n  <DataShowSimple\n    title=\"数据展示1\"\n    data=\"134/999\"\n    style={{ width: 450, height: 450 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/FlipNumberDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { FlipNumber } from '@td-design/lego';\n\nexport default () => <FlipNumber start={0} end={100} />;\n"
  },
  {
    "path": "packages/lego/example/FlipNumberDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { FlipNumber } from '@td-design/lego';\n\nexport default () => <FlipNumber start={0} end={10000000} separator=\",\" />;\n"
  },
  {
    "path": "packages/lego/example/FlipNumberDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { FlipNumber } from '@td-design/lego';\n\nexport default () => (\n  <FlipNumber\n    start={0}\n    end={10000000}\n    separator=\",\"\n    style={{\n      color: '#8dceff',\n      fontWeight: 'bold',\n      fontSize: '28px',\n    }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/FlipNumberDemo/demo4.tsx",
    "content": "import React, { useRef } from 'react';\nimport { FlipNumber } from '@td-design/lego';\n\nexport default () => {\n  const ref = useRef(null);\n\n  return (\n    <div>\n      <div>\n        <button\n          onClick={() => {\n            ref?.current?.start();\n          }}\n        >\n          开始\n        </button>\n        <button\n          onClick={() => {\n            ref?.current?.reset();\n          }}\n        >\n          重置\n        </button>\n        <button\n          onClick={() => {\n            ref?.current?.pause();\n          }}\n        >\n          暂停/重新开始\n        </button>\n        <button\n          onClick={() => {\n            ref?.current?.update(10000000 + Math.random() * 10000000);\n          }}\n        >\n          更新\n        </button>\n      </div>\n      <FlipNumber ref={ref} start={0} end={10000000} />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/FloatBallDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { FloatBall } from '@td-design/lego';\n\nconst dataSource = [\n  {\n    label: '服务站(个)',\n    value: 242,\n  },\n  {\n    label: '服务员(人)',\n    value: 1430,\n  },\n  {\n    label: '服务车(辆)',\n    value: 935,\n  },\n];\n\nexport default () => <FloatBall dataSource={dataSource} />;\n"
  },
  {
    "path": "packages/lego/example/FloatBallDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { FloatBall } from '@td-design/lego';\n\nconst dataSource = [\n  {\n    label: '服务站(个)',\n    value: 242,\n  },\n  {\n    label: '服务员(人)',\n    value: 1430,\n  },\n  {\n    label: '服务车(辆)',\n    value: 935,\n  },\n  {\n    label: '流程线(条)',\n    value: 100,\n  },\n];\n\nexport default () => <FloatBall dataSource={dataSource} />;\n"
  },
  {
    "path": "packages/lego/example/FloatBallDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { FloatBall } from '@td-design/lego';\n\nconst dataSource = [\n  {\n    label: '服务站(个)',\n    value: 242,\n  },\n  {\n    label: '服务员(人)',\n    value: 1430,\n  },\n  {\n    label: '服务车(辆)',\n    value: 935,\n  },\n  {\n    label: '流程线(条)',\n    value: 100,\n  },\n];\n\nexport default () => <FloatBall dataSource={dataSource} maxCount={3} />;\n"
  },
  {
    "path": "packages/lego/example/FloatBallDemo/demo4.tsx",
    "content": "import React from 'react';\nimport { FloatBall } from '@td-design/lego';\n\nconst dataSource = [\n  {\n    element: (\n      <>\n        <div className=\"td-lego-float-ball-value\">242</div>\n        <div className=\"td-lego-float-ball-label\">服务站(个)</div>\n      </>\n    ),\n  },\n  {\n    element: (\n      <>\n        <div className=\"td-lego-float-ball-label\">自定义</div>\n      </>\n    ),\n  },\n  {\n    label: '服务车(辆)',\n    value: 935,\n  },\n  {\n    label: '流程线(条)',\n    value: 100,\n  },\n];\n\nexport default () => <FloatBall dataSource={dataSource} maxCount={3} />;\n"
  },
  {
    "path": "packages/lego/example/GaugeDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { Gauge } from '@td-design/lego';\n\nexport default () => (\n  <Gauge style={{ width: 407, height: 351 }} max={100} value={80} />\n);\n"
  },
  {
    "path": "packages/lego/example/HorizontalBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { HorizontalBar } from '@td-design/lego';\n\nexport default () => (\n  <HorizontalBar\n    unit=\"万元\"\n    max={1000}\n    seriesData={{\n      name: '',\n      data: [\n        {\n          name: '太原',\n          value: 960,\n        },\n        {\n          name: '西安',\n          value: 548.7,\n        },\n        {\n          name: '北京',\n          value: 300.2,\n        },\n        {\n          name: '上海',\n          value: 300,\n        },\n      ],\n    }}\n    style={{ width: 486, height: 224 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/HorizontalBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { HorizontalBar } from '@td-design/lego';\n\nexport default () => (\n  <HorizontalBar\n    unit=\"万元\"\n    max={1000}\n    seriesData={{\n      name: '产值',\n      data: [\n        {\n          name: '吉尔吉斯斯坦',\n          value: 960,\n        },\n        {\n          name: '哈萨克斯坦',\n          value: 548.7,\n        },\n        {\n          name: '阿富汗斯坦',\n          value: 300.2,\n        },\n        {\n          name: '伊拉克斯坦',\n          value: 300,\n        },\n      ],\n    }}\n    style={{ width: 486, height: 254 }}\n    config={{\n      grid: {\n        left: '20%',\n        right: '10%',\n      },\n    }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/HorizontalBarDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { HorizontalBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <HorizontalBar\n      unit=\"万元\"\n      max={1000}\n      seriesData={{\n        name: '产值',\n        data: [\n          {\n            name: '太原',\n            value: 960,\n          },\n          {\n            name: '西安',\n            value: 548.7,\n          },\n          {\n            name: '北京',\n            value: 300.2,\n          },\n          {\n            name: '上海',\n            value: 300,\n          },\n        ],\n      }}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/HorizontalBarDemo/demo4.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { HorizontalBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <HorizontalBar\n      unit=\"万元\"\n      max={1000}\n      seriesData={{\n        name: '产值',\n        data: [\n          {\n            name: '太原',\n            value: 960,\n          },\n          {\n            name: '西安',\n            value: 548.7,\n          },\n          {\n            name: '北京',\n            value: 300.2,\n          },\n          {\n            name: '上海',\n            value: 300,\n          },\n        ],\n      }}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/HorizontalBarDemo/demo5.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { HorizontalBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <HorizontalBar\n          unit=\"万元\"\n          max={1000}\n          seriesData={{\n            name: '产值',\n            data: [\n              {\n                name: '太原',\n                value: 960,\n              },\n              {\n                name: '西安',\n                value: 548.7,\n              },\n              {\n                name: '北京',\n                value: 300.2,\n              },\n              {\n                name: '上海',\n                value: 300,\n              },\n            ],\n          }}\n          inModal\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/HorizontalBarDemo/demo6.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { HorizontalBar, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const seriesData = [\n    {\n      name: '太原',\n      value: 960,\n    },\n    {\n      name: '西安',\n      value: 548.7,\n    },\n    {\n      name: '北京',\n      value: 300.2,\n    },\n    {\n      name: '上海',\n      value: 300,\n    },\n  ];\n  const currentName = seriesData[currentIndex]?.name;\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex < seriesData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <HorizontalBar\n        ref={echartsRef}\n        unit=\"万元\"\n        max={1000}\n        seriesData={{\n          name: '产值',\n          data: seriesData,\n        }}\n        style={{ width: 486, height: 254 }}\n        config={{\n          grid: {\n            left: '20%',\n            right: '10%',\n          },\n        }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/HorizontalBarDemo/demo7.tsx",
    "content": "import React from 'react';\nimport { HorizontalBar } from '@td-design/lego';\n\nexport default () => (\n  <HorizontalBar\n    unit=\"万元\"\n    max={1000}\n    seriesData={{\n      name: '',\n      data: [\n        {\n          name: '太原',\n          value: 960,\n        },\n        {\n          name: '西安',\n          value: 548.7,\n        },\n        {\n          name: '北京',\n          value: 300.2,\n        },\n        {\n          name: '上海',\n          value: 300,\n        },\n      ],\n    }}\n    style={{ width: 486, height: 224 }}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/ImgLineDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { ImgLine } from '@td-design/lego';\n\nexport default () => (\n  <ImgLine\n    img={require('../assets/line_bottom.png')}\n    style={{ width: 486, height: 254 }}\n    xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n    yAxis={[{ name: '万kWh' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [174, 187, 719, 18, 784, 392],\n      },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/ImgLineDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { ImgLine } from '@td-design/lego';\n\nexport default () => (\n  <ImgLine\n    img={require('../assets/line_bottom.png')}\n    style={{ width: 486, height: 254 }}\n    xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n    yAxis={[{ name: '万kWh' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [174, 187, 719, 18, 784, 392],\n      },\n    ]}\n    autoLoop\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/ImgLineDemo/demo3.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { ImgLine } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <ImgLine\n      img={require('../assets/line_bottom.png')}\n      style={{ width: 486, height: 254 }}\n      xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n      yAxis={[{ name: '万kWh' }]}\n      seriesData={[\n        {\n          name: '充电电量',\n          yAxisIndex: 0,\n          data: [174, 187, 719, 18, 784, 392],\n        },\n      ]}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ImgLineDemo/demo4.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { ImgLine } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <ImgLine\n          inModal\n          img={require('../assets/line_bottom.png')}\n          style={{ height: 500 }}\n          xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n          yAxis={[{ name: '万kWh' }]}\n          seriesData={[\n            {\n              name: '充电电量',\n              yAxisIndex: 0,\n              data: [174, 187, 719, 18, 784, 392],\n            },\n          ]}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ImgLineDemo/demo5.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { ImgLine, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['1月', '2月', '3月', '4月', '5月', '6月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n\n      <ImgLine\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        img={require('../assets/line_bottom.png')}\n        style={{ width: 486, height: 254 }}\n        yAxis={[{ name: '万kWh' }]}\n        seriesData={[\n          {\n            name: '充电电量',\n            yAxisIndex: 0,\n            data: [174, 187, 719, 18, 784, 392],\n          },\n        ]}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ImgLineDemo/demo6.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { ImgLine, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['1月', '2月', '3月', '4月', '5月', '6月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n\n      <ImgLine\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        img={require('../assets/line_bottom.png')}\n        style={{ width: 486, height: 254 }}\n        yAxis={[{ name: '万kWh' }]}\n        seriesData={[\n          {\n            name: '充电电量',\n            yAxisIndex: 0,\n            data: [174, 187, 719, 18, 784, 392],\n          },\n        ]}\n        renderer='svg'\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ImgPieDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { ImgPie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '47043' },\n    { name: '机械、设备', value: '38603' },\n    { name: '钢铁', value: '31316' },\n  ];\n\n  return <div style={{ width: 300, height: 250 }}><ImgPie data={data} /></div>;\n};\n"
  },
  {
    "path": "packages/lego/example/ImgPieDemo/demo2.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { ImgPie, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const seriesData = [\n    { name: '木材', value: '47043' },\n    { name: '机械、设备', value: '38603' },\n    { name: '钢铁', value: '31316' },\n  ];\n  const currentName = seriesData[currentIndex]?.name;\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex < seriesData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <ImgPie\n        ref={echartsRef}\n        data={seriesData}\n        style={{ width: 407, height: 351 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ImgPieDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { ImgPie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '47043' },\n    { name: '机械、设备', value: '38603' },\n    { name: '钢铁', value: '31316' },\n  ];\n\n  return <div style={{ width: 300, height: 250 }}><ImgPie data={data} renderer='svg' /></div>;\n};\n"
  },
  {
    "path": "packages/lego/example/ImgRosePieDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { ImgRosePie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '6' },\n    { name: '机械', value: '4' },\n    { name: '钢铁', value: '3' },\n    { name: '煤炭', value: '2' },\n    { name: '矿建', value: '1' },\n  ];\n\n  return (\n    <div style={{ width: 460, height: 350 }}>\n    <ImgRosePie\n      seriesData={data}\n      autoLoop={true}\n    />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ImgRosePieDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { ImgRosePie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '6' },\n    { name: '机械', value: '4' },\n    { name: '钢铁', value: '3' },\n    { name: '煤炭', value: '2' },\n    { name: '矿建', value: '1' },\n  ];\n\n  return (\n    <div style={{ width: 460, height: 350 }}>\n    <ImgRosePie\n      seriesData={data}\n      autoLoop={true}\n      renderer='svg'\n    />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ModalDemo/demo1.tsx",
    "content": "import React, {useState} from 'react';\nimport { Modal } from '@td-design/lego';\nimport { Button } from 'antd';\n\nexport default () => {\n\n  const [visible, setVisible] = useState<boolean>(false);\n\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>显示弹窗</Button>\n      <Modal visible={visible} onClose={() => setVisible(false)} />\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/MultiHorizontalBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { MultiHorizontalBar } from '@td-design/lego';\n\nexport default () => (\n  <MultiHorizontalBar\n    unit={['万元', '万元']}\n    max={[1000, 1000]}\n    leftData={{\n      name: '充电',\n      data: [\n        {\n          name: '尖',\n          value: 960,\n        },\n        {\n          name: '峰',\n          value: 548.7,\n        },\n        {\n          name: '平',\n          value: 300.2,\n        },\n        {\n          name: '谷',\n          value: 300,\n        },\n      ],\n    }}\n    rightData={{\n      name: '放电',\n      data: [\n        {\n          name: '尖',\n          value: 960,\n        },\n        {\n          name: '峰',\n          value: 548.7,\n        },\n        {\n          name: '平',\n          value: 300.2,\n        },\n        {\n          name: '谷',\n          value: 300,\n        },\n      ],\n    }}\n    style={{ width: 686, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiHorizontalBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { MultiHorizontalBar } from '@td-design/lego';\n\nexport default () => (\n  <MultiHorizontalBar\n    max={1000}\n    leftData={{\n      name: '充电',\n      data: [\n        {\n          name: '哈萨克斯坦',\n          value: 960,\n        },\n        {\n          name: '吉尔吉斯斯坦',\n          value: 548.7,\n        },\n        {\n          name: '阿富汗斯坦',\n          value: 300.2,\n        },\n        {\n          name: '伊拉克斯坦',\n          value: 300,\n        },\n      ],\n    }}\n    rightData={{\n      name: '放电',\n      data: [\n        {\n          name: '哈萨克斯坦',\n          value: 960,\n        },\n        {\n          name: '吉尔吉斯斯坦',\n          value: 548.7,\n        },\n        {\n          name: '阿富汗斯坦',\n          value: 300.2,\n        },\n        {\n          name: '伊拉克斯坦',\n          value: 300,\n        },\n      ],\n    }}\n    style={{ width: 486, height: 254 }}\n    config={{\n      grid: [\n        {\n          show: false,\n          left: '7%',\n          top: '5%',\n          bottom: '10%',\n          width: '31%',\n        },\n        {\n          show: false,\n          left: '45%',\n          top: '5%',\n          bottom: '10%',\n          width: '0%',\n        },\n        {\n          show: false,\n          right: '7%',\n          top: '5%',\n          bottom: '10%',\n          width: '31%',\n        },\n      ],\n    }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiHorizontalBarDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { MultiHorizontalBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <MultiHorizontalBar\n          unit={['万元', '万元']}\n          max={[1000, 1000]}\n          leftData={{\n            name: '充电',\n            data: [\n              {\n                name: '尖',\n                value: 960,\n              },\n              {\n                name: '峰',\n                value: 548.7,\n              },\n              {\n                name: '平',\n                value: 300.2,\n              },\n              {\n                name: '谷',\n                value: 300,\n              },\n            ],\n          }}\n          rightData={{\n            name: '放电',\n            data: [\n              {\n                name: '尖',\n                value: 960,\n              },\n              {\n                name: '峰',\n                value: 548.7,\n              },\n              {\n                name: '平',\n                value: 300.2,\n              },\n              {\n                name: '谷',\n                value: 300,\n              },\n            ],\n          }}\n          inModal\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/MultiHorizontalBarDemo/demo4.tsx",
    "content": "import React from 'react';\nimport { MultiHorizontalBar } from '@td-design/lego';\n\nexport default () => (\n  <MultiHorizontalBar\n    renderer='svg'\n    unit={['万元', '万元']}\n    max={[1000, 1000]}\n    leftData={{\n      name: '充电',\n      data: [\n        {\n          name: '尖',\n          value: 960,\n        },\n        {\n          name: '峰',\n          value: 548.7,\n        },\n        {\n          name: '平',\n          value: 300.2,\n        },\n        {\n          name: '谷',\n          value: 300,\n        },\n      ],\n    }}\n    rightData={{\n      name: '放电',\n      data: [\n        {\n          name: '尖',\n          value: 960,\n        },\n        {\n          name: '峰',\n          value: 548.7,\n        },\n        {\n          name: '平',\n          value: 300.2,\n        },\n        {\n          name: '谷',\n          value: 300,\n        },\n      ],\n    }}\n    style={{ width: 686, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => (\n  <MultiLine\n    style={{ width: 486, height: 254 }}\n    xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n    yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '174' },\n          { name: '2月', value: '187' },\n          { name: '3月', value: '719' },\n          { name: '4月', value: '18' },\n          { name: '5月', value: '784' },\n          { name: '6月', value: '392' },\n        ],\n      },\n      {\n        name: '充电次数',\n        yAxisIndex: 1,\n        data: [\n          { name: '1月', value: '713' },\n          { name: '2月', value: '192' },\n          { name: '3月', value: '184' },\n          { name: '4月', value: '892' },\n          { name: '5月', value: '138' },\n          { name: '6月', value: '1182' },\n        ],\n      },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo10.tsx",
    "content": "import React from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => (\n  <MultiLine\n    style={{ width: 486, height: 254 }}\n    xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n    yAxis={[{ name: '万kWh' }]}\n    showYAxisLine={false}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '174' },\n          { name: '2月', value: '187' },\n          { name: '3月', value: '719' },\n          { name: '4月', value: '18' },\n          { name: '5月', value: '784' },\n          { name: '6月', value: '392' },\n        ],\n      },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo11.tsx",
    "content": "import React from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => (\n  <MultiLine\n    style={{ width: 486, height: 254 }}\n    xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n    yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '174' },\n          { name: '2月', value: '187' },\n          { name: '3月', value: '719' },\n          { name: '4月', value: '18' },\n          { name: '5月', value: '784' },\n          { name: '6月', value: '392' },\n        ],\n      },\n      {\n        name: '充电次数',\n        yAxisIndex: 1,\n        data: [\n          { name: '1月', value: '713' },\n          { name: '2月', value: '192' },\n          { name: '3月', value: '184' },\n          { name: '4月', value: '892' },\n          { name: '5月', value: '138' },\n          { name: '6月', value: '1182' },\n        ],\n      },\n    ]}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => (\n  <MultiLine\n    style={{ width: 486, height: 254 }}\n    xAxisData={['1月', '2月', '3月']}\n    yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '174' },\n          { name: '2月', value: '187' },\n          { name: '3月', value: '719' },\n        ],\n      },\n      {\n        name: '充电次数',\n        yAxisIndex: 1,\n        data: [\n          { name: '1月', value: '713' },\n          { name: '2月', value: '112' },\n          { name: '3月', value: '184' },\n        ],\n      },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => (\n  <MultiLine\n    style={{ width: 486, height: 254 }}\n    xAxisData={[\n      '1月',\n      '2月',\n      '3月',\n      '4月',\n      '5月',\n      '6月',\n      '7月',\n      '8月',\n      '9月',\n      '10月',\n      '11月',\n      '12月',\n    ]}\n    yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '174' },\n          { name: '2月', value: '187' },\n          { name: '3月', value: '719' },\n          { name: '4月', value: '18' },\n          { name: '5月', value: '784' },\n          { name: '6月', value: '392' },\n          { name: '7月', value: '713' },\n          { name: '8月', value: '192' },\n          { name: '9月', value: '184' },\n          { name: '10月', value: '892' },\n          { name: '11月', value: '138' },\n          { name: '12月', value: '1182' },\n        ],\n      },\n      {\n        name: '充电次数',\n        yAxisIndex: 1,\n        data: [\n          { name: '1月', value: '713' },\n          { name: '2月', value: '192' },\n          { name: '3月', value: '184' },\n          { name: '4月', value: '892' },\n          { name: '5月', value: '138' },\n          { name: '6月', value: '1182' },\n          { name: '7月', value: '174' },\n          { name: '8月', value: '187' },\n          { name: '9月', value: '719' },\n          { name: '10月', value: '18' },\n          { name: '11月', value: '784' },\n          { name: '12月', value: '392' },\n        ],\n      },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo4.tsx",
    "content": "import React from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => (\n  <MultiLine\n    style={{ width: 486, height: 254 }}\n    xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n    yAxis={[{ name: '万kWh' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '174' },\n          { name: '2月', value: '187' },\n          { name: '3月', value: '719' },\n          { name: '4月', value: '18' },\n          { name: '5月', value: '784' },\n          { name: '6月', value: '392' },\n        ],\n      },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo5.tsx",
    "content": "import React from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => (\n  <MultiLine\n    style={{ width: 686, height: 254 }}\n    xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n    yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n    seriesData={[\n      {\n        name: '充电电量',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '174' },\n          { name: '2月', value: '187' },\n          { name: '3月', value: '719' },\n          { name: '4月', value: '18' },\n          { name: '5月', value: '784' },\n          { name: '6月', value: '392' },\n        ],\n      },\n      {\n        name: '充电次数',\n        yAxisIndex: 1,\n        data: [\n          { name: '1月', value: '713' },\n          { name: '2月', value: '192' },\n          { name: '3月', value: '184' },\n          { name: '4月', value: '892' },\n          { name: '5月', value: '138' },\n          { name: '6月', value: '202' },\n        ],\n      },\n      {\n        name: '充电电量1',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '1713' },\n          { name: '2月', value: '1192' },\n          { name: '3月', value: '1184' },\n          { name: '4月', value: '1892' },\n          { name: '5月', value: '1138' },\n          { name: '6月', value: '482' },\n        ],\n      },\n      {\n        name: '充电电量2',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '173' },\n          { name: '2月', value: '119' },\n          { name: '3月', value: '114' },\n          { name: '4月', value: '892' },\n          { name: '5月', value: '1238' },\n          { name: '6月', value: '182' },\n        ],\n      },\n      {\n        name: '充电电量3',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '1213' },\n          { name: '2月', value: '1122' },\n          { name: '3月', value: '1184' },\n          { name: '4月', value: '192' },\n          { name: '5月', value: '1138' },\n          { name: '6月', value: '382' },\n        ],\n      },\n      {\n        name: '充电电量4',\n        yAxisIndex: 0,\n        data: [\n          { name: '1月', value: '713' },\n          { name: '2月', value: '1192' },\n          { name: '3月', value: '584' },\n          { name: '4月', value: '1892' },\n          { name: '5月', value: '938' },\n          { name: '6月', value: '82' },\n        ],\n      },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo6.tsx",
    "content": "import React, { useState } from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <MultiLine\n      style={{ width: 486, height: 254 }}\n      xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n      yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n      seriesData={[\n        {\n          name: '充电电量',\n          yAxisIndex: 0,\n          data: [\n            { name: '1月', value: '174' },\n            { name: '2月', value: '187' },\n            { name: '3月', value: '719' },\n            { name: '4月', value: '18' },\n            { name: '5月', value: '784' },\n            { name: '6月', value: '392' },\n          ],\n        },\n        {\n          name: '充电次数',\n          yAxisIndex: 1,\n          data: [\n            { name: '1月', value: '713' },\n            { name: '2月', value: '192' },\n            { name: '3月', value: '184' },\n            { name: '4月', value: '892' },\n            { name: '5月', value: '138' },\n            { name: '6月', value: '1182' },\n          ],\n        },\n      ]}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo7.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  });\n\n  return (\n    <MultiLine\n      style={{ width: 486, height: 254 }}\n      xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n      yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n      seriesData={[\n        {\n          name: '充电电量',\n          yAxisIndex: 0,\n          data: [\n            { name: '1月', value: '174' },\n            { name: '2月', value: '187' },\n            { name: '3月', value: '719' },\n            { name: '4月', value: '18' },\n            { name: '5月', value: '784' },\n            { name: '6月', value: '392' },\n          ],\n        },\n        {\n          name: '充电次数',\n          yAxisIndex: 1,\n          data: [\n            { name: '1月', value: '713' },\n            { name: '2月', value: '192' },\n            { name: '3月', value: '184' },\n            { name: '4月', value: '892' },\n            { name: '5月', value: '138' },\n            { name: '6月', value: '1182' },\n          ],\n        },\n      ]}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo8.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { MultiLine } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <MultiLine\n          inModal\n          style={{ height: 500 }}\n          xAxisData={['1月', '2月', '3月', '4月', '5月', '6月']}\n          yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n          seriesData={[\n            {\n              name: '充电电量',\n              yAxisIndex: 0,\n              data: [\n                { name: '1月', value: '174' },\n                { name: '2月', value: '187' },\n                { name: '3月', value: '719' },\n                { name: '4月', value: '18' },\n                { name: '5月', value: '784' },\n                { name: '6月', value: '392' },\n              ],\n            },\n            {\n              name: '充电次数',\n              yAxisIndex: 1,\n              data: [\n                { name: '1月', value: '713' },\n                { name: '2月', value: '192' },\n                { name: '3月', value: '184' },\n                { name: '4月', value: '892' },\n                { name: '5月', value: '138' },\n                { name: '6月', value: '1182' },\n              ],\n            },\n          ]}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/MultiLineDemo/demo9.tsx",
    "content": "/*\n * @文件描述:\n * @公司: thundersdata\n * @作者: 阮旭松\n * @Date: 2021-10-11 16:36:21\n * @LastEditors: 阮旭松\n * @LastEditTime: 2021-10-11 16:40:08\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { MultiLine, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['1月', '2月', '3月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n\n      <MultiLine\n        ref={echartsRef}\n        style={{ width: 486, height: 254 }}\n        xAxisData={xAxisData}\n        yAxis={[{ name: '万kWh' }, { name: '万次' }]}\n        seriesData={[\n          {\n            name: '充电电量',\n            yAxisIndex: 0,\n            data: [\n              { name: '1月', value: '174' },\n              { name: '2月', value: '187' },\n              { name: '3月', value: '719' },\n            ],\n          },\n          {\n            name: '充电次数',\n            yAxisIndex: 1,\n            data: [\n              { name: '1月', value: '713' },\n              { name: '2月', value: '112' },\n              { name: '3月', value: '184' },\n            ],\n          },\n        ]}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { PictorialBar } from '@td-design/lego';\n\nexport default () => (\n  <PictorialBar\n    xAxisData={['2019年', '2020年', '2021年']}\n    unit=\"万\"\n    name=\"产值\"\n    data={[2012, 3620, 3790]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { PictorialBar } from '@td-design/lego';\n\nexport default () => (\n  <PictorialBar\n    xAxisData={['2009年', '2010年', '2011年', '2012年', '2013年', '2014年']}\n    unit=\"万\"\n    name=\"产值\"\n    data={[\n      { name: '2009年', value: 2012, unit: '万' },\n      { name: '2010年', value: 3620, unit: '万' },\n      { name: '2011年', value: 3790, unit: '万' },\n      { name: '2012年', value: 1900, unit: '万' },\n      { name: '2013年', value: 4560, unit: '万' },\n      { name: '2014年', value: 7300, unit: '万' },\n    ]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { PictorialBar } from '@td-design/lego';\n\nexport default () => (\n  <PictorialBar\n    xAxisData={[\n      '2009年',\n      '2010年',\n      '2011年',\n      '2012年',\n      '2013年',\n      '2014年',\n      '2015年',\n      '2016年',\n      '2017年',\n      '2018年',\n      '2019年',\n      '2020年',\n    ]}\n    unit=\"万\"\n    name=\"产值\"\n    data={[\n      { name: '2009年', value: 2012, unit: '万' },\n      { name: '2010年', value: 3620, unit: '万' },\n      { name: '2011年', value: 3790, unit: '万' },\n      { name: '2012年', value: 1900, unit: '万' },\n      { name: '2013年', value: 4560, unit: '万' },\n      { name: '2014年', value: 7300, unit: '万' },\n      { name: '2015年', value: 5678, unit: '万' },\n      { name: '2016年', value: 8976, unit: '万' },\n      { name: '2017年', value: 3790, unit: '万' },\n      { name: '2018年', value: 4536, unit: '万' },\n      { name: '2019年', value: 9076, unit: '万' },\n      { name: '2020年', value: 1289, unit: '万' },\n    ]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo4.tsx",
    "content": "import React, { useState } from 'react';\nimport { PictorialBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <PictorialBar\n      xAxisData={['2019年', '2020年', '2021年']}\n      unit=\"万\"\n      name=\"产值\"\n      data={[2012, 3620, 3790]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo5.tsx",
    "content": "import React, { useState, useEffect } from 'react';\nimport { PictorialBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <PictorialBar\n      xAxisData={['2019年', '2020年', '2021年']}\n      unit=\"万\"\n      name=\"产值\"\n      data={[2012, 3620, 3790]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo6.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { PictorialBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <PictorialBar\n          xAxisData={['2019年', '2020年', '2021年']}\n          unit=\"万\"\n          name=\"产值\"\n          data={[2012, 3620, 3790]}\n          inModal\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo7.tsx",
    "content": "/*\n * @文件描述:\n * @公司: thundersdata\n * @作者: 阮旭松\n * @Date: 2021-10-11 16:36:21\n * @LastEditors: 阮旭松\n * @LastEditTime: 2021-10-11 16:40:05\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { PictorialBar, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['2019年', '2020年', '2021年'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n\n      <PictorialBar\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        unit=\"万\"\n        name=\"产值\"\n        data={[2012, 3620, 3790]}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/PictorialBarDemo/demo8.tsx",
    "content": "import React from 'react';\nimport { PictorialBar } from '@td-design/lego';\n\nexport default () => (\n  <PictorialBar\n    xAxisData={['2019年', '2020年', '2021年']}\n    unit=\"万\"\n    name=\"产值\"\n    data={[2012, 3620, 3790]}\n    style={{ width: 486, height: 254 }}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/ProgressDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { Progress } from '@td-design/lego';\n\nexport default () => (\n  <Progress\n    name=\"进度\"\n    data={[\n      { name: '北京', value: 64 },\n      { name: '上海', value: 78 },\n      { name: '成都', value: 38 },\n    ]}\n    style={{ width: 374, height: 214 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/ProgressDemo/demo2.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { Progress } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <Progress\n          name=\"进度\"\n          data={[\n            { name: '北京', value: 64 },\n            { name: '上海', value: 78 },\n            { name: '成都', value: 38 },\n          ]}\n          mode=\"normal\"\n          inModal\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ProgressDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { Progress } from '@td-design/lego';\n\nexport default () => (\n  <Progress\n    name=\"进度\"\n    data={[\n      { name: '北京', value: 64 },\n      { name: '上海', value: 78 },\n      { name: '成都', value: 38 },\n    ]}\n    style={{ width: 374, height: 214 }}\n    renderer=\"svg\"\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/RadarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { Radar } from '@td-design/lego';\n\nexport default () => {\n  const seriesData = [\n    {\n      name: '平均情况',\n      data: [51, 19, 25, 280, 47],\n    },\n    {\n      name: '当前园区情况',\n      data: [74, 28, 45, 340, 56],\n    },\n  ];\n\n  const indicatorData = [\n    { name: '占地面积', max: 100, unit: '亩' },\n    { name: '高标库面积', max: 100, unit: '万平方米' },\n    { name: '充电桩数量', max: 100, unit: '个' },\n    { name: '车辆进出数量', max: 500, unit: '辆' },\n    { name: '平均停留时长', max: 100, unit: '分钟' },\n  ];\n\n  return (\n    <Radar\n      style={{ width: 486, height: 354 }}\n      seriesData={seriesData}\n      indicatorData={indicatorData}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/RadarDemo/demo2.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { Radar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n\n  const seriesData = [\n    {\n      name: '平均情况',\n      data: [51, 19, 25, 280, 47],\n    },\n    {\n      name: '当前园区情况',\n      data: [74, 28, 45, 340, 56],\n    },\n  ];\n\n  const indicatorData = [\n    { name: '占地面积', max: '100', unit: '亩' },\n    { name: '高标库面积', max: '100', unit: '万平方米' },\n    { name: '充电桩数量', max: '100', unit: '个' },\n    { name: '车辆进出数量', max: '500', unit: '辆' },\n    { name: '平均停留时长', max: '100', unit: '分钟' },\n  ];\n\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <Radar\n          inModal\n          seriesData={seriesData}\n          indicatorData={indicatorData}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/RadarDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { Radar } from '@td-design/lego';\n\nexport default () => {\n  const seriesData = [\n    {\n      name: '平均情况',\n      data: [51, 19, 25, 280, 47],\n    },\n    {\n      name: '当前园区情况',\n      data: [74, 28, 45, 340, 56],\n    },\n  ];\n\n  const indicatorData = [\n    { name: '占地面积', max: 100, unit: '亩' },\n    { name: '高标库面积', max: 100, unit: '万平方米' },\n    { name: '充电桩数量', max: 100, unit: '个' },\n    { name: '车辆进出数量', max: 500, unit: '辆' },\n    { name: '平均停留时长', max: 100, unit: '分钟' },\n  ];\n\n  return (\n    <Radar\n      style={{ width: 486, height: 354 }}\n      seriesData={seriesData}\n      indicatorData={indicatorData}\n      renderer=\"svg\"\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ScatterDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { Scatter } from '@td-design/lego';\n\nexport default () => (\n  <Scatter\n    unit=\"AQI指数\"\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    seriesData={[\n      {\n        name: '北京',\n        data: [55, 25, 56, 33, 42, 82],\n      },\n      {\n        name: '上海',\n        data: [27, 71, 74, 36, 46, 69],\n      },\n      {\n        name: '重庆',\n        data: [91, 65, 83, 109, 106, 109],\n      },\n    ]}\n    style={{ width: 374, height: 214 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/ScatterDemo/demo2.tsx",
    "content": "import React, { useState } from 'react';\nimport { Scatter } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <Scatter\n      unit=\"AQI指数\"\n      xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n      seriesData={[\n        {\n          name: '北京',\n          data: [55, 25, 56, 33, 42, 82],\n        },\n        {\n          name: '上海',\n          data: [27, 71, 74, 36, 46, 69],\n        },\n        {\n          name: '重庆',\n          data: [91, 65, 83, 109, 106, 109],\n        },\n      ]}\n      style={{ width: 374, height: 214 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ScatterDemo/demo3.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { Scatter } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <Scatter\n      unit=\"AQI指数\"\n      xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n      seriesData={[\n        {\n          name: '北京',\n          data: [55, 25, 56, 33, 42, 82],\n        },\n        {\n          name: '上海',\n          data: [27, 71, 74, 36, 46, 69],\n        },\n        {\n          name: '重庆',\n          data: [91, 65, 83, 109, 106, 109],\n        },\n      ]}\n      style={{ width: 374, height: 214 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ScatterDemo/demo4.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { Scatter } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <Scatter\n          unit=\"AQI指数\"\n          xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n          seriesData={[\n            {\n              name: '北京',\n              data: [55, 25, 56, 33, 42, 82],\n            },\n            {\n              name: '上海',\n              data: [27, 71, 74, 36, 46, 69],\n            },\n            {\n              name: '重庆',\n              data: [91, 65, 83, 109, 106, 109],\n            },\n          ]}\n          inModal\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ScatterDemo/demo5.tsx",
    "content": "/*\n * @文件描述:\n * @公司: thundersdata\n * @作者: 阮旭松\n * @Date: 2021-10-11 16:36:21\n * @LastEditors: 阮旭松\n * @LastEditTime: 2021-10-11 16:47:35\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { Scatter, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['01月', '02月', '03月', '04月', '05月', '06月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n\n      <Scatter\n        unit=\"AQI指数\"\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        seriesData={[\n          {\n            name: '北京',\n            data: [55, 25, 56, 33, 42, 82],\n          },\n          {\n            name: '上海',\n            data: [27, 71, 74, 36, 46, 69],\n          },\n          {\n            name: '重庆',\n            data: [91, 65, 83, 109, 106, 109],\n          },\n        ]}\n        style={{ width: 374, height: 214 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ScatterDemo/demo6.tsx",
    "content": "import React from 'react';\nimport { Scatter } from '@td-design/lego';\n\nexport default () => (\n  <Scatter\n    unit=\"AQI指数\"\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    seriesData={[\n      {\n        name: '北京',\n        data: [55, 25, 56, 33, 42, 82],\n      },\n      {\n        name: '上海',\n        data: [27, 71, 74, 36, 46, 69],\n      },\n      {\n        name: '重庆',\n        data: [91, 65, 83, 109, 106, 109],\n      },\n    ]}\n    style={{ width: 374, height: 214 }}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/ScrollNumberDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { ScrollNumber } from '@td-design/lego';\n\nexport default () => <ScrollNumber value={244} />;\n"
  },
  {
    "path": "packages/lego/example/ScrollNumberDemo/demo2.tsx",
    "content": "import React, { useState } from 'react';\nimport { ScrollNumber } from '@td-design/lego';\nimport { Button } from 'antd';\n\nexport default () => {\n  const [value, setValue] = useState(200);\n\n  const handleChange = () => {\n    setValue(Math.ceil(Math.random() * 1000));\n  };\n\n  return (\n    <div>\n      <ScrollNumber value={value} />\n      <Button onClick={handleChange}>改变数值</Button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ScrollNumberDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { ScrollNumber } from '@td-design/lego';\n\nexport default () => (\n  <ScrollNumber\n    value=\"11.08吨\"\n    containerStyle={{}}\n    itemStyle={{ fontSize: 28, width: 50 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/SliceBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { SliceBar } from '@td-design/lego';\n\nexport default () => (\n  <SliceBar\n    max={1000}\n    unit=\"万元\"\n    xAxisData={['太原', '西安', '北京', '上海']}\n    name=\"产值\"\n    data={[960, 548, 300, 300]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/SliceBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { SliceBar } from '@td-design/lego';\n\nexport default () => (\n  <SliceBar\n    max={1000}\n    unit=\"万元\"\n    xAxisData={[\n      '太原',\n      '西安',\n      '北京',\n      '上海',\n      '成都',\n      '重庆',\n      '南京',\n      '广州',\n      '厦门',\n      '哈尔滨',\n      '济南',\n      '南昌',\n    ]}\n    name=\"产值\"\n    data={[\n      {\n        name: '太原',\n        value: 960,\n      },\n      {\n        name: '西安',\n        value: 548.7,\n      },\n      {\n        name: '北京',\n        value: 300.2,\n      },\n      {\n        name: '上海',\n        value: 300,\n      },\n      {\n        name: '成都',\n        value: 300,\n      },\n      {\n        name: '重庆',\n        value: 300,\n      },\n      {\n        name: '南京',\n        value: 300,\n      },\n      {\n        name: '广州',\n        value: 300,\n      },\n      {\n        name: '厦门',\n        value: 300,\n      },\n      {\n        name: '哈尔滨',\n        value: 300,\n      },\n      {\n        name: '济南',\n        value: 300,\n      },\n      {\n        name: '南昌',\n        value: 300,\n      },\n    ]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/SliceBarDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { SliceBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <SliceBar\n      max={1000}\n      unit=\"万元\"\n      xAxisData={['太原', '西安', '北京', '上海']}\n      name=\"产值\"\n      data={[960, 548, 300, 300]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/SliceBarDemo/demo4.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { SliceBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <SliceBar\n      max={1000}\n      unit=\"万元\"\n      xAxisData={['太原', '西安', '北京', '上海']}\n      name=\"产值\"\n      data={[960, 548, 300, 300]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/SliceBarDemo/demo5.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { SliceBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <SliceBar\n          max={1000}\n          unit=\"万元\"\n          xAxisData={['太原', '西安', '北京', '上海']}\n          name=\"产值\"\n          data={[960, 548, 300, 300]}\n          inModal\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/SliceBarDemo/demo6.tsx",
    "content": "/*\n * @文件描述:\n * @公司: thundersdata\n * @作者: 阮旭松\n * @Date: 2021-10-11 16:36:21\n * @LastEditors: 阮旭松\n * @LastEditTime: 2021-10-11 16:49:01\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { SliceBar, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['太原', '西安', '北京', '上海'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n\n      <SliceBar\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        max={1000}\n        unit=\"万元\"\n        name=\"产值\"\n        data={[960, 548, 300, 300]}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/SliceBarDemo/demo7.tsx",
    "content": "import React from 'react';\nimport { SliceBar } from '@td-design/lego';\n\nexport default () => (\n  <SliceBar\n    max={1000}\n    unit=\"万元\"\n    xAxisData={['太原', '西安', '北京', '上海']}\n    name=\"产值\"\n    data={[960, 548, 300, 300]}\n    style={{ width: 486, height: 254 }}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { StackBar } from '@td-design/lego';\n\nexport default () => (\n  <StackBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    unit=\"万\"\n    seriesData={[\n      { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n      { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n    ]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { StackBar } from '@td-design/lego';\n\nexport default () => (\n  <StackBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    unit=\"万\"\n    seriesData={[\n      { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n      { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n    ]}\n    seriesColor={[\n      ['#46E081', '#0DFFB7'],\n      ['#3FA4FF', '#60F5FF'],\n    ]}\n    style={{ width: 486, height: 254 }}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { StackBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n  return (\n    <StackBar\n      xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n      unit=\"万\"\n      seriesData={[\n        { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n        { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n      ]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo4.tsx",
    "content": "import React, { useEffect, useState } from 'react';\nimport { StackBar } from '@td-design/lego';\n\nexport default () => {\n  const [autoLoop, setAutoLoop] = useState(true);\n\n  useEffect(() => {\n    setTimeout(() => {\n      setAutoLoop(false);\n    }, 5000);\n  }, []);\n\n  return (\n    <StackBar\n      xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n      unit=\"万\"\n      seriesData={[\n        { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n        { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n      ]}\n      style={{ width: 486, height: 254 }}\n      autoLoop={autoLoop}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo5.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { StackBar } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <StackBar\n          inModal\n          xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n          unit=\"万\"\n          seriesData={[\n            {\n              name: '月高速车辆总数',\n              data: [2012, 2555, 1234, 1899, 1986, 2100],\n            },\n            { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n          ]}\n          style={{ height: 500 }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo6.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from 'antd';\nimport { StackBar, ReactEcharts } from '@td-design/lego';\n\nexport default () => {\n  const echartsRef = useRef<ReactEcharts>(null);\n  const instance = echartsRef.current?.getEchartsInstance();\n\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  const xAxisData = ['01月', '02月', '03月', '04月', '05月', '06月'];\n  const currentName = xAxisData[currentIndex];\n\n  const highlightPrev = () => {\n    if (currentIndex >= 0) {\n      setCurrentIndex((idx) => idx - 1);\n    }\n  };\n\n  const highlightNext = () => {\n    if (currentIndex <= xAxisData.length) {\n      setCurrentIndex((idx) => idx + 1);\n    }\n  };\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    // 取消高亮效果\n    instance?.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance?.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance?.dispatchAction({\n        type: 'showTip',\n        seriesIndex: 0,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, instance]);\n\n  return (\n    <div>\n      <div>\n        <Button onClick={highlightPrev}>高亮上一个</Button>\n        <Button onClick={highlightNext}>高亮下一个</Button>\n      </div>\n      <StackBar\n        ref={echartsRef}\n        xAxisData={xAxisData}\n        unit=\"万\"\n        seriesData={[\n          {\n            name: '月高速车辆总数',\n            data: [2012, 2555, 1234, 1899, 1986, 2100],\n          },\n          { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n        ]}\n        style={{ width: 486, height: 254 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo7.tsx",
    "content": "import React from 'react';\nimport { StackBar } from '@td-design/lego';\n\nexport default () => (\n  <StackBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    unit=\"万\"\n    seriesData={[\n      { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n      { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n    ]}\n    style={{ width: 486, height: 254 }}\n    img={require('../assets/line_bottom.png')}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/StackBarDemo/demo8.tsx",
    "content": "import React from 'react';\nimport { StackBar } from '@td-design/lego';\n\nexport default () => (\n  <StackBar\n    xAxisData={['01月', '02月', '03月', '04月', '05月', '06月']}\n    unit=\"万\"\n    seriesData={[\n      { name: '月高速车辆总数', data: [2012, 2555, 1234, 1899, 1986, 2100] },\n      { name: '月空车数量', data: [1222, 1333, 899, 1234, 1500, 900] },\n    ]}\n    style={{ width: 486, height: 254 }}\n    renderer=\"svg\"\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/SwiperDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { Swiper } from '@td-design/lego';\n\nexport default () => {\n  return (\n    <Swiper\n      autoplay={{ delay: 2000 }}\n      imgs={[\n        'https://fast-fregiht.oss-cn-hangzhou.aliyuncs.com/screen/shanxiluqiao_photo1.jpg',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/industry/1626231634429684221.jpg',\n        'https://uploadfile.bizhizu.cn/up/40/bc/53/40bc5393651da4083978f06f9ffac600.jpg.220.146.jpg',\n        'https://uploadfile.bizhizu.cn/up/f8/de/73/f8de73289ff7286896f8200e8dc45867.jpg.220.146.jpg',\n        'https://uploadfile.bizhizu.cn/up/0f/d2/26/0fd2267541f18505917a38c563498c6f.jpg.220.146.jpg',\n      ]}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/SwiperDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { Swiper } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    '今天是个好日子好日子好日子好日子好日子哦',\n    '明天是个好日子好日子好日子好日子好日子哦',\n    '后天是个好日子好日子好日子好日子好日子哦',\n  ];\n  const list = data.map((str, index) => (\n    <div key={index} style={{ textAlign: 'center', color: 'red' }}>\n      {str}\n    </div>\n  ));\n\n  return <Swiper autoplay={{ delay: 2000 }} list={list} />;\n};\n"
  },
  {
    "path": "packages/lego/example/SwiperDemo/demo3.tsx",
    "content": "import React, { useEffect, useRef } from 'react';\nimport { Swiper } from '@td-design/lego';\n\nexport default () => {\n  const swiperRef = useRef<any>();\n  useEffect(() => {\n    setInterval(() => {\n      swiperRef?.current?.swiper?.slideNext();\n    }, 1000);\n  }, []);\n\n  return (\n    <Swiper\n      ref={swiperRef}\n      pagination={false}\n      imgs={[\n        'https://fast-fregiht.oss-cn-hangzhou.aliyuncs.com/screen/shanxiluqiao_photo1.jpg',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/industry/1626231634429684221.jpg',\n        'https://uploadfile.bizhizu.cn/up/40/bc/53/40bc5393651da4083978f06f9ffac600.jpg.220.146.jpg',\n        'https://uploadfile.bizhizu.cn/up/f8/de/73/f8de73289ff7286896f8200e8dc45867.jpg.220.146.jpg',\n        'https://uploadfile.bizhizu.cn/up/0f/d2/26/0fd2267541f18505917a38c563498c6f.jpg.220.146.jpg',\n      ]}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TableDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { Table } from '@td-design/lego';\n\nconst data = [\n  {\n    id: 1,\n    brand: '维特根1',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n  },\n  {\n    id: 2,\n    brand: '徐工1',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n  },\n  {\n    id: 3,\n    brand: '维特根2',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n  },\n  {\n    id: 4,\n    brand: '维特根3',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n  },\n  {\n    id: 5,\n    brand: '维特根5',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n  },\n  {\n    id: 6,\n    brand: '徐工6',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n  },\n  {\n    id: 7,\n    brand: '维特根7',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n  },\n  {\n    id: 8,\n    brand: '维特根8',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n  },\n];\n\nconst columns = [\n  {\n    id: 1,\n    title: '品牌',\n    dataIndex: 'brand',\n  },\n  {\n    id: 2,\n    title: '名称',\n    dataIndex: 'name',\n  },\n  {\n    id: 3,\n    title: '型号',\n    dataIndex: 'model',\n  },\n  {\n    id: 4,\n    title: '月租金',\n    dataIndex: 'money',\n  },\n];\n\nexport default () => {\n  return (\n    <div style={{ width: '100%', height: 200 }}>\n      <Table\n        data={data}\n        columns={columns}\n        pageSize={4}\n        autoplay={true}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TableDemo/demo2.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { Table } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n\n  const data = [\n    {\n      id: 1,\n      brand: '维特根1',\n      name: '沥青摊铺机',\n      model: '200',\n      money: '12988元',\n    },\n    {\n      id: 2,\n      brand: '徐工1',\n      name: '履带式挖掘机',\n      model: 'XE80CA',\n      money: '862.2元',\n    },\n    {\n      id: 3,\n      brand: '维特根2',\n      name: '沥青摊铺机',\n      model: '200',\n      money: '200元',\n    },\n    {\n      id: 4,\n      brand: '维特根3',\n      name: '沥青摊铺机',\n      model: '200',\n      money: '200元',\n    },\n  ];\n\n  const columns = [\n    {\n      id: 1,\n      title: '品牌',\n      dataIndex: 'brand',\n    },\n    {\n      id: 2,\n      title: '名称',\n      dataIndex: 'name',\n    },\n    {\n      id: 3,\n      title: '型号',\n      dataIndex: 'model',\n    },\n    {\n      id: 4,\n      title: '月租金',\n      dataIndex: 'money',\n    },\n  ];\n\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n      >\n        <Table\n          inModal\n          data={data}\n          columns={columns}\n          height={200}\n          pageSize={4}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TableDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { Table } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    {\n      id: 1,\n      brand: '维特根1',\n      name: '沥青摊铺机',\n      model: '200',\n      money: '12988元',\n    },\n    {\n      id: 2,\n      brand: '徐工',\n      name: '履带式挖掘机',\n      model: 'XE80CA',\n      money: '862.2元',\n    },\n    {\n      id: 3,\n      brand: '维特根2',\n      name: '沥青摊铺机',\n      model: '200',\n      money: '200元',\n    },\n    {\n      id: 4,\n      brand: '维特根3',\n      name: '沥青摊铺机',\n      model: '200',\n      money: '200元',\n    },\n  ];\n\n  const columns = [\n    {\n      id: 1,\n      title: '品牌',\n      dataIndex: 'brand',\n    },\n    {\n      id: 2,\n      title: '名称',\n      dataIndex: 'name',\n    },\n    {\n      id: 3,\n      title: '型号',\n      dataIndex: 'model',\n    },\n    {\n      id: 4,\n      title: '月租金',\n      dataIndex: 'money',\n    },\n  ];\n\n  return (\n    <>\n      <Table\n        data={data}\n        columns={columns}\n        colors={['red', 'blue', 'green']}\n        height={200}\n        pageSize={4}\n      />\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TableDemo/demo4.tsx",
    "content": "import React from 'react';\nimport { Table } from '@td-design/lego';\n\nenum ColorEnum {\n  红 = 1,\n  绿 = 2,\n  蓝 = 3,\n}\n\nconst data = [\n  {\n    id: 1,\n    brand: '维特根1',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n    color: 1,\n  },\n  {\n    id: 2,\n    brand: '徐工',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n    color: 2,\n  },\n  {\n    id: 3,\n    brand: '维特根2',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 3,\n  },\n  {\n    id: 4,\n    brand: '维特根3',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 1,\n  },\n  {\n    id: 5,\n    brand: '维特根5',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n    color: 1,\n  },\n  {\n    id: 6,\n    brand: '徐工6',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n    color: 2,\n  },\n  {\n    id: 7,\n    brand: '维特根7',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 3,\n  },\n  {\n    id: 8,\n    brand: '维特根8',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 1,\n  },\n];\n\nconst columns = [\n  {\n    id: 1,\n    title: '品牌',\n    dataIndex: 'brand',\n  },\n  {\n    id: 2,\n    title: '名称',\n    dataIndex: 'name',\n  },\n  {\n    id: 3,\n    title: '型号',\n    dataIndex: 'model',\n  },\n  {\n    id: 4,\n    title: '月租金',\n    dataIndex: 'money',\n  },\n  {\n    id: 5,\n    title: '颜色',\n    dataIndex: 'color',\n    render: (data) => <span>{ColorEnum[data.color]}</span>,\n  },\n];\n\nexport default () => {\n  return <Table data={data} columns={columns} height={210} pageSize={7} />;\n};\n"
  },
  {
    "path": "packages/lego/example/TableDemo/demo5.tsx",
    "content": "import React from 'react';\nimport { Table } from '@td-design/lego';\n\nconst data = [\n  {\n    id: 1,\n    brand: '维特根1',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n    color: 1,\n  },\n  {\n    id: 2,\n    brand: '徐工',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n    color: 2,\n  },\n  {\n    id: 3,\n    brand: '维特根2',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 3,\n  },\n  {\n    id: 4,\n    brand: '维特根3',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 1,\n  },\n  {\n    id: 5,\n    brand: '维特根5',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n    color: 1,\n  },\n  {\n    id: 6,\n    brand: '徐工6',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n    color: 2,\n  },\n  {\n    id: 7,\n    brand: '维特根7',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 3,\n  },\n  {\n    id: 8,\n    brand: '维特根8',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 1,\n  },\n];\n\nconst columns = [\n  {\n    id: 1,\n    title: '品牌',\n    dataIndex: 'brand',\n  },\n  {\n    id: 2,\n    title: '名称',\n    dataIndex: 'name',\n  },\n  {\n    id: 3,\n    title: '型号',\n    dataIndex: 'model',\n  },\n  {\n    id: 4,\n    title: '月租金',\n    dataIndex: 'money',\n  },\n];\n\nexport default () => {\n  return (\n    <Table\n      data={data}\n      columns={columns}\n      autoplay={false}\n      height={200}\n      pageSize={4}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TableDemo/demo6.tsx",
    "content": "import React from 'react';\nimport { Table } from '@td-design/lego';\nimport './index.less';\nimport { Column } from '../../lib/typescript/other/Table';\n\nconst data = [\n  {\n    id: 1,\n    brand: '维特根1',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n    color: 1,\n  },\n  {\n    id: 2,\n    brand: '徐工',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n    color: 2,\n  },\n  {\n    id: 3,\n    brand: '维特根2',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 3,\n  },\n  {\n    id: 4,\n    brand: '维特根3',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 1,\n  },\n  {\n    id: 5,\n    brand: '维特根5',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '12988元',\n    color: 1,\n  },\n  {\n    id: 6,\n    brand: '徐工6',\n    name: '履带式挖掘机',\n    model: 'XE80CA',\n    money: '862.2元',\n    color: 2,\n  },\n  {\n    id: 7,\n    brand: '维特根7',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 3,\n  },\n  {\n    id: 8,\n    brand: '维特根8',\n    name: '沥青摊铺机',\n    model: '200',\n    money: '200元',\n    color: 1,\n  },\n];\n\nconst columns: Column[] = [\n  {\n    id: 1,\n    title: '品牌',\n    dataIndex: 'brand',\n    flex: 1,\n    textAlign: 'left',\n  },\n  {\n    id: 2,\n    title: '名称',\n    dataIndex: 'name',\n    flex: 1,\n    textAlign: 'left',\n  },\n  {\n    id: 3,\n    title: '型号',\n    dataIndex: 'model',\n    flex: 1,\n    textAlign: 'left',\n  },\n  {\n    id: 4,\n    title: '月租金',\n    dataIndex: 'money',\n    flex: 3,\n    textAlign: 'left',\n  },\n];\n\nexport default () => {\n  return (\n    <Table\n      data={data}\n      columns={columns}\n      height={200}\n      pageSize={4}\n      autoplay={false}\n      headerClass=\"header\"\n      contentClass=\"content\"\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TableDemo/index.less",
    "content": ".header {\n  padding: 0 40px;\n}\n.content {\n  padding: 0 40px;\n}\n"
  },
  {
    "path": "packages/lego/example/TextScrollDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { TextScroll } from '@td-design/lego';\n\nexport default () => {\n  return (\n    <div\n      style={{\n        width: 429,\n        height: 187,\n        backgroundImage: `url(${require('../assets/border_bg.png')})`,\n        padding: 20,\n        backgroundSize: '100% 100%',\n      }}\n    >\n      <TextScroll\n        contentStyle={{ height: 147 }}\n        texts={[\n          '雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。',\n          '今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦',\n          '明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦',\n        ]}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TextScrollDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { TextScroll } from '@td-design/lego';\n\nexport default () => {\n  return (\n    <div\n      style={{\n        width: 429,\n        height: 187,\n        backgroundImage: `url(${require('../assets/border_bg.png')})`,\n        padding: 20,\n        backgroundSize: '100% 100%',\n      }}\n    >\n      <TextScroll\n        contentStyle={{ height: 147 }}\n        scrollSpeed={10}\n        delay={0}\n        texts={[\n          '雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。经过十几年变迁与发展，销售累计突破百亿。',\n          '今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦',\n          '明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦',\n        ]}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/TextScrollDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { TextScroll } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={650}\n        bodyStyle={{ backgroundColor: '#040727' }}\n      >\n        <TextScroll\n          inModal\n          contentStyle={{ height: 147 }}\n          texts={[\n            '雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。雷数科技竭力为客户提供贯穿整个设备生命周期的全方位服务，经过十几年变迁与发展，销售累计突破百亿。',\n            '今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦今天是个好日子哦',\n            '明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦明天是个好日子哦',\n          ]}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ThreeDimensionalPieDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { ThreeDimensionalPie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '47043' },\n    { name: '机械', value: '38603' },\n    { name: '钢铁', value: '31316' },\n  ];\n\n  return (\n    <ThreeDimensionalPie\n      seriesData={data}\n      autoLoop\n      style={{ width: 560, height: 218 }}\n      barConfig={{ legend: { top: 50 } }}\n      pieConfig={{}}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ThreeDimensionalPieDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { ThreeDimensionalPie } from '@td-design/lego';\n\nexport default () => {\n  const data = [\n    { name: '木材', value: '600' },\n    { name: '机械', value: '500' },\n    { name: '钢铁', value: '400' },\n    { name: '铝', value: '300' },\n    { name: '塑料', value: '200' },\n    { name: '金', value: '100' },\n  ];\n\n  return (\n    <ThreeDimensionalPie\n      seriesData={data}\n      style={{ width: 560, height: 218 }}\n      barConfig={{ legend: { top: 50 } }}\n      pieConfig={{}}\n      isFlat={false}\n      coefficient={2}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/ThreeDimensionalPieDemo/demo3.tsx",
    "content": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport { ThreeDimensionalPie } from '@td-design/lego';\n\nexport default () => {\n  const [visible, setVisible] = useState(false);\n\n  const data = [\n    { name: '木材', value: '47043' },\n    { name: '机械', value: '38603' },\n    { name: '钢铁', value: '31316' },\n  ];\n\n  return (\n    <>\n      <Button onClick={() => setVisible(true)}>弹窗</Button>\n      <Modal\n        open={visible}\n        onCancel={() => setVisible(false)}\n        footer={null}\n        width={750}\n        bodyStyle={{ backgroundColor: '#040727' }}\n        getContainer={false} // <- 这个属性如果不加，那第一次打开的时候，里面的echarts图表不能正常渲染\n      >\n        <ThreeDimensionalPie\n          seriesData={data}\n          autoLoop\n          inModal\n          style={{ width: 720, height: 308 }}\n          barConfig={{ legend: { top: 50 } }}\n        />\n      </Modal>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/lego/example/WordCloudDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { WordCloud } from '@td-design/lego';\n\nexport default () => (\n  <WordCloud\n    data={[\n      { name: '雨伞', value: 30 },\n      { name: '晴天', value: 28 },\n      { name: '电话', value: 24 },\n      { name: '手机', value: 23 },\n      { name: '下雨', value: 22 },\n      { name: '暴雨', value: 21 },\n      { name: '多云', value: 20 },\n      { name: '雨衣', value: 29 },\n      { name: '屋檐', value: 28 },\n      { name: '大风', value: 27 },\n      { name: '台风', value: 26 },\n      { name: '下雪', value: 25 },\n      { name: '打雷', value: 24 },\n      { name: '小雨', value: 30 },\n      { name: '中雨', value: 18 },\n      { name: '大雨', value: 14 },\n      { name: '雷阵雨', value: 13 },\n      { name: '下雪', value: 12 },\n      { name: '小雪', value: 11 },\n      { name: '中雪', value: 10 },\n      { name: '大雪', value: 9 },\n      { name: '暴雪', value: 8 },\n      { name: '东风', value: 7 },\n      { name: '南风', value: 6 },\n      { name: '西北风', value: 5 },\n      { name: '北风', value: 4 },\n      { name: '闪电', value: 3 },\n    ]}\n  />\n);\n"
  },
  {
    "path": "packages/lego/example/WordCloudDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { WordCloud } from '@td-design/lego';\n\nexport default () => (\n  <WordCloud\n    data={[\n      { name: '雨伞', value: 30 },\n      { name: '晴天', value: 28 },\n      { name: '电话', value: 24 },\n      { name: '手机', value: 23 },\n      { name: '下雨', value: 22 },\n      { name: '暴雨', value: 21 },\n      { name: '多云', value: 20 },\n      { name: '雨衣', value: 29 },\n      { name: '屋檐', value: 28 },\n      { name: '大风', value: 27 },\n      { name: '台风', value: 26 },\n      { name: '下雪', value: 25 },\n      { name: '打雷', value: 24 },\n      { name: '小雨', value: 30 },\n      { name: '中雨', value: 18 },\n      { name: '大雨', value: 14 },\n      { name: '雷阵雨', value: 13 },\n      { name: '下雪', value: 12 },\n      { name: '小雪', value: 11 },\n      { name: '中雪', value: 10 },\n      { name: '大雪', value: 9 },\n      { name: '暴雪', value: 8 },\n      { name: '东风', value: 7 },\n      { name: '南风', value: 6 },\n      { name: '西北风', value: 5 },\n      { name: '北风', value: 4 },\n      { name: '闪电', value: 3 },\n    ]}\n    renderer='svg'\n  />\n);\n"
  },
  {
    "path": "packages/lego/package.json",
    "content": "{\n  \"name\": \"@td-design/lego\",\n  \"version\": \"4.1.12\",\n  \"description\": \"雷数大屏素材库\",\n  \"keywords\": [\n    \"thundersdata\",\n    \"frontend\",\n    \"lego\"\n  ],\n  \"homepage\": \"https://github.com/thundersdata-frontend/td-design#readme\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/commonjs/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/thundersdata-frontend/td-design.git\"\n  },\n  \"scripts\": {\n    \"build\": \"rollup -c\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/thundersdata-frontend/td-design/issues\"\n  },\n  \"sideEffects\": [\n    \"*.less.js\",\n    \"*.less\",\n    \".css\"\n  ],\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\",\n  \"dependencies\": {\n    \"@react-spring/web\": \"^9.7.3\",\n    \"classnames\": \"^2.3.2\",\n    \"color\": \"^4.2.3\",\n    \"echarts\": \"^5.4.3\",\n    \"echarts-for-react\": \"^3.0.2\",\n    \"echarts-gl\": \"^2.0.9\",\n    \"echarts-wordcloud\": \"^2.1.0\",\n    \"lodash-es\": \"^4.17.21\",\n    \"react-countup\": \"^6.4.2\",\n    \"style-inject\": \"^0.3.0\",\n    \"swiper\": \"^9.2.3\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-babel\": \"^6.0.3\",\n    \"@rollup/plugin-commonjs\": \"^25.0.3\",\n    \"@rollup/plugin-image\": \"^3.0.2\",\n    \"@rollup/plugin-node-resolve\": \"^15.1.0\",\n    \"@types/color\": \"^3.0.3\",\n    \"@types/lodash-es\": \"^4.17.8\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-dom\": \"^18.2.7\",\n    \"less\": \"^4.1.3\",\n    \"postcss\": \"^8.4.31\",\n    \"postcss-url\": \"^10.1.3\",\n    \"rollup\": \"^3.26.3\",\n    \"rollup-plugin-font\": \"^1.1.2\",\n    \"rollup-plugin-postcss\": \"^4.0.2\",\n    \"rollup-plugin-typescript2\": \"^0.35.0\",\n    \"tslib\": \"^2.6.0\",\n    \"typescript\": \"^5.1.6\"\n  }\n}\n"
  },
  {
    "path": "packages/lego/rollup.config.js",
    "content": "const commonjs = require('@rollup/plugin-commonjs');\nconst image = require('@rollup/plugin-image');\nconst resolve = require('@rollup/plugin-node-resolve');\nconst postcss = require('rollup-plugin-postcss');\nconst less = require('less');\nconst typescript = require('rollup-plugin-typescript2');\nconst postcssurl = require('postcss-url')\nconst fs = require(\"fs\")\n\nconst isProductionEnv = process.env.NODE_ENV === 'production';\n\nconst noDeclarationFiles = { compilerOptions: { declaration: false } };\n\nlet pkg = JSON.parse(fs.readFileSync('./package.json')),\n    external = Object.keys(pkg.dependencies || {});\n\nconst processLess = function (context, payload) {\n  return new Promise((resolve, reject) => {\n    less.render(\n      {\n        file: context,\n      },\n      function (err, result) {\n        if (!err) {\n          resolve(result);\n        } else {\n          reject(err);\n        }\n      }\n    );\n\n    less.render(context, {}).then(\n      function (output) {\n        if (output && output.css) {\n          resolve(output.css);\n        } else {\n          reject({});\n        }\n      },\n      function (err) {\n        reject(err);\n      }\n    );\n  });\n};\n\n\n\nmodule.exports = [\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/commonjs',\n      format: 'cjs',\n      name: '[name].js',\n      preserveModules: true,\n      preserveModulesRoot: 'src',\n      // entryFileNames: entryFileNames\n    },\n    plugins: [\n      resolve(),\n      commonjs(),\n      typescript({\n        tsconfig: 'tsconfig.json',\n        tsconfigOverride: { compilerOptions: { declaration: true, declarationDir: './lib/typescript' } },\n        useTsconfigDeclarationDir: true,\n      }),\n      image(),\n      postcss({\n        minimize: isProductionEnv,\n        process: processLess,\n        plugins:[\n          postcssurl({\n            url: 'inline',\n          }),\n        ]\n      }),\n      {\n        name: 'Custom Rollup Plugin`',\n\n        generateBundle: (options, bundle) => {\n          Object.entries(bundle).forEach(entry => {\n\n            // early return if the file we're currently looking at doesn't need to be acted upon by this plugin\n            if (!entry[0].match(/.*(.less.js)$/)) {\n              return;\n            }\n\n            // this line only runs for .scss.js files, which were generated by the postcss plugin.\n            // depending on the use-case, the relative path to style-inject might need to change\n            bundle[entry[0]].code = entry[1].code.replace(\n              '/home/runner/work/td-design/td-design/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js',\n              'style-inject',\n            );\n          });\n        },\n      }\n    ],\n    external:  (id) => {\n      if (/node_modules/.test(id)) return true;\n      return false;\n    },\n  },\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/module',\n      format: 'esm',\n      entryFileNames: '[name].js',\n      preserveModules: true,\n      preserveModulesRoot: 'src',\n    },\n    plugins: [\n      resolve(),\n      commonjs({\n        mainFields: ['module', 'main', 'jsnext:main', 'browser'],\n        extensions: ['.js', '.mjs', '.json'],\n        sourceMap: false,\n        browser: true,\n      }),\n      typescript({ tsconfigOverride: noDeclarationFiles }),\n      image(),\n      postcss({\n        minimize: isProductionEnv,\n        process: processLess,\n        plugins:[\n          postcssurl({\n            url: 'inline',\n          }),\n        ]\n      }),\n      {\n        name: 'Custom Rollup Plugin`',\n\n        generateBundle: (options, bundle) => {\n          Object.entries(bundle).forEach(entry => {\n\n            // early return if the file we're currently looking at doesn't need to be acted upon by this plugin\n            if (!entry[0].match(/.*(.less.js)$/)) {\n              return;\n            }\n\n            // this line only runs for .scss.js files, which were generated by the postcss plugin.\n            // depending on the use-case, the relative path to style-inject might need to change\n            bundle[entry[0]].code = entry[1].code.replace(\n              '/home/runner/work/td-design/td-design/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js',\n              'style-inject',\n            );\n          });\n        },\n      }\n    ],\n    external:  (id) => {\n      if (/node_modules/.test(id)) return true;\n      return false;\n    },\n  },\n];\n"
  },
  {
    "path": "packages/lego/src/accumulated-data/index.less",
    "content": "@import '../style/index.less';\n\n@prefix: .td-lego-accumulated-data;\n\n@{prefix}-container {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n\n  @{prefix}-item {\n    position: relative;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex: 1;\n\n    @{prefix}-border {\n      position: absolute;\n      top: 0;\n      right: 0;\n      width: 1px;\n      height: 80px;\n      background: linear-gradient(\n        180deg,\n        rgba(54, 161, 255, 0) 0%,\n        rgba(25, 104, 255, 1) 52%,\n        rgba(54, 161, 255, 0) 100%\n      );\n    }\n\n    @{prefix}-block {\n      display: flex;\n      flex-direction: column;\n      align-items: baseline;\n      justify-content: center;\n\n      @{prefix}-value {\n        margin-right: 4px;\n        color: #8dceff;\n        font-weight: bold;\n        font-size: 28px;\n        line-height: 42px;\n      }\n    }\n\n    @{prefix}-valueContent {\n      display: flex;\n      flex-direction: row;\n      align-items: center;\n      justify-content: center;\n      width: 100%;\n      margin-top: 6px;\n    }\n\n    @{prefix}-unit {\n      color: #999999;\n      font-weight: 400;\n      font-size: 16px;\n    }\n\n    @{prefix}-name {\n      width: 100%;\n      color: #cccccc;\n      text-align: center;\n      font-weight: 400;\n      font-size: 16px;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/accumulated-data/index.md",
    "content": "---\ntitle: 累计数据\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 基本的数据展示\n\n## API\n\n| 属性         | 必填    | 说明         | 类型                                                         | 默认值  |\n| ------------ | ------- | ------------ | ------------------------------------------------------------ | ------- |\n| data         | `true`  | 数据         | `{ name: string; value: string \\| number; unit?: string }[]` |         |\n| numberScroll | `false` | 数字是否滚动 | `boolean`                                                    | `false` |\n\n## 效果图 1\n\n<code src=\"../../example/AccumulatedDataDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2(数字滚动)\n\n<code src=\"../../example/AccumulatedDataDemo/demo2.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/accumulated-data/index.tsx",
    "content": "import React from 'react';\n\nimport ScrollNumber from '../scroll-number';\nimport './index.less';\n\nconst prefixName = 'td-lego-accumulated-data';\n\nexport default function ({\n  data,\n  numberScroll = false,\n}: {\n  data: { name: string; value: string | number; unit?: string }[];\n  numberScroll?: boolean;\n}) {\n  return (\n    <div className={`${prefixName}-container`}>\n      {data.map(({ name, unit, value }, index) => (\n        <div className={`${prefixName}-item`} key={index}>\n          <div className={`${prefixName}-block`}>\n            <div className={`${prefixName}-name`}>{name}</div>\n            <div className={`${prefixName}-valueContent`}>\n              <div className={`${prefixName}-value`}>{numberScroll ? <ScrollNumber value={value} /> : value}</div>\n              <div className={`${prefixName}-unit`}>{unit}</div>\n            </div>\n          </div>\n          {index !== data.length - 1 && <div className={`${prefixName}-border`}></div>}\n        </div>\n      ))}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/lego/src/bar-line/index.md",
    "content": "---\ntitle: 柱线混合图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 折线图\n  order: 2\n---\n\n# 柱线混合图\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| xAxisData | `true` | x 轴数据 | `any[]` |  |\n| yAxis | `true` | y 轴配置 | `YAXisOption[]` |  |\n| lineData | `true` | 线图数据 | `{ name: string; data: number[] }` |  |\n| lineUnit | `false` | 线图单位 | `string` |  |\n| barType | `false` | 柱图形状 | `string` | `cuboidBar` |\n| barData | `true` | 柱图数据 | `BarSeriesData \\| BarSeriesData[]` |  |\n| barUnit | `false` | 柱图单位 | `string` |  |\n| max | `false` | 柱图最大值（仅在 barType 为 cylinderShadowBar ｜ sliceBar 时需要） | `number` |  |\n| style | `false` | 自定义样式 | `CSSProperties` |  |\n| autoLoop | `false` | 控制是否自动轮播 | `boolean` |  |\n| duration | `false` | 自动轮播的时长 | `number` | `2000` |\n| config | `false` | 自定义 Echarts 配置 | `ECOption` |  |\n| inModal | `false` | 是否在弹窗内显示 | `boolean` | `false` |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean` | `true` |\n| shadow | `false` | 是否显示 areaStyle | `boolean` | `false` |\n| smooth | `false` | 折线是否平滑 | `boolean` | `false` |\n| onEvents | `false` | 图表交互事件 | `Record<string, (params?: any) => void>` |  |\n| renderer | `false` | 图表渲染器 | `canvas \\| svg` | `canvas` |\n\n## 效果图 1 (长方体柱状图)\n\n<code src=\"../../example/BarLineDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2（分组圆柱图）\n\n<code src=\"../../example/BarLineDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (带阴影圆柱图)\n\n<code src=\"../../example/BarLineDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4（叠片柱状图）\n\n<code src=\"../../example/BarLineDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (堆叠圆柱图)\n\n<code src=\"../../example/BarLineDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 自动轮播效果\n\n<code src=\"../../example/BarLineDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (轮播两次后停止)\n\n<code src=\"../../example/BarLineDemo/demo7.tsx\" background=\"#040727\">\n\n## 效果图 8 (弹窗)\n\n<code src=\"../../example/BarLineDemo/demo8.tsx\" background=\"#040727\">\n\n## 效果图 9 (手动控制图表轮播)\n\n<code src=\"../../example/BarLineDemo/demo9.tsx\" background=\"#040727\">\n\n## 效果图 10 (显示阴影效果)\n\n<code src=\"../../example/BarLineDemo/demo10.tsx\" background=\"#040727\">\n\n## 效果图 11 (折线平滑)\n\n<code src=\"../../example/BarLineDemo/demo11.tsx\" background=\"#040727\">\n\n## 效果图 12 (SVG 渲染器)\n\n<code src=\"../../example/BarLineDemo/demo12.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/bar-line/index.tsx",
    "content": "import React, { CSSProperties, ForwardedRef, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport Color from 'color';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  CustomChart, // 系列类型的定义后缀都为 SeriesOption\n  CustomSeriesOption,\n  LineChart,\n  LineSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseBarConfig from '../hooks/useBaseBarConfig';\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useBaseLineConfig from '../hooks/useBaseLineConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\nimport createCuboidSeries from '../utils/createCuboidSeries';\nimport createCylinderBarSeries from '../utils/createCylinderSeries';\nimport createCylinderShadowSeries from '../utils/createCylinderShadowSeries';\nimport createLinearGradient from '../utils/createLinearGradient';\nimport createSliceSeries from '../utils/createSliceSeries';\nimport createStackSeries from '../utils/createStackSeries';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<\n  LineSeriesOption | CustomSeriesOption | TooltipComponentOption | GridComponentOption\n>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, LineChart, CustomChart, CanvasRenderer, SVGRenderer]);\n\ntype CuboidBarParams = {\n  barType: 'cuboidBar';\n  barData: BarSeriesData;\n};\n\ntype CylinderBarParams = {\n  barType: 'cylinderBar';\n  barData: BarSeriesData[];\n};\n\ntype CylinderShadowBarParams = {\n  barType: 'cylinderShadowBar';\n  barData: BarSeriesData;\n};\n\ntype StackBarParams = {\n  barType: 'stackBar';\n  barData: BarSeriesData[];\n};\n\ntype SliceBarParams = {\n  barType: 'sliceBar';\n  barData: BarSeriesData;\n};\n\ntype Params = CuboidBarParams | CylinderBarParams | CylinderShadowBarParams | StackBarParams | SliceBarParams;\n\ntype GetValueType<TType extends Params['barType']> = Extract<Params, { barType: TType }>['barData'];\n\nexport interface BarLineProps<TType extends Params['barType']> {\n  xAxisData: any[];\n  yAxis: YAXisOption[];\n  lineData: { name: string; data: (number | string | null)[] };\n  lineUnit?: string;\n  barUnit?: string;\n  style?: CSSProperties;\n  // 柱状图类型\n  barType?: TType;\n  // barType = cylinderShadowBar | sliceBar 时需要\n  max?: number;\n  barData: GetValueType<TType>;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 是否显示areaStyle */\n  shadow?: boolean;\n  /** 折线是否平滑 */\n  smooth?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 长方体柱状图，对应figma柱状图4\n */\nfunction BarLine<TType extends Params['barType']>(\n  {\n    xAxisData,\n    yAxis,\n    barType,\n    barData,\n    max,\n    barUnit = yAxis[0]?.name,\n    lineData,\n    lineUnit = yAxis[1]?.name,\n    style,\n    autoLoop,\n    duration = 2000,\n    config,\n    inModal = false,\n    shadow = false,\n    smooth = false,\n    showYAxisLine = true,\n    onEvents,\n    renderer = 'canvas',\n  }: BarLineProps<TType>,\n  ref: ForwardedRef<ReactEcharts>\n) {\n  const theme = useTheme();\n  const baseBarConfig = useBaseBarConfig(inModal);\n  const baseChartConfig = useBaseChartConfig(inModal);\n  const baseLineConfig = useBaseLineConfig();\n  const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration, 1);\n\n  const baseLineSeries = {\n    name: lineData.name,\n    yAxisIndex: 1,\n    data: lineData.data.map(item => ({ value: item, unit: lineUnit })),\n    ...baseLineConfig,\n    smooth,\n    itemStyle: {\n      color: createLinearGradient(theme.colors.primary200),\n    },\n    emphasis: {\n      lineStyle: {\n        shadowBlur: 11,\n        shadowColor: theme.colors.assist600,\n      },\n    },\n  };\n  const lineSeries = shadow\n    ? {\n        ...baseLineSeries,\n        areaStyle: {\n          color: getAreaColorsByIndex(theme.colors.primary200),\n          shadowColor: Color(theme.colors.primary200).alpha(0.85).string(),\n        },\n      }\n    : baseLineSeries;\n\n  const createOption = () => {\n    switch (barType) {\n      // 长方体柱状图\n      case 'cuboidBar':\n      default:\n        return {\n          color: [createLinearGradient(theme.colors.primary300)],\n          series: [createCuboidSeries(theme, barData as BarSeriesData, barUnit), lineSeries],\n        };\n\n      // 分组圆柱图\n      case 'cylinderBar':\n        const cylinderBarColors = [\n          createLinearGradient(theme.colors.primary50),\n          createLinearGradient(theme.colors.primary300),\n        ];\n        const cylinderBarData = (barData as BarSeriesData[]).map(item => ({\n          ...item,\n          unit: barUnit,\n        }));\n        return {\n          color: cylinderBarColors,\n          series: [...createCylinderBarSeries(cylinderBarData, cylinderBarColors, 1), lineSeries],\n        };\n\n      // 带阴影圆柱图\n      case 'cylinderShadowBar':\n        return {\n          color: [createLinearGradient(theme.colors.primary50)],\n          series: [...createCylinderShadowSeries(theme, baseBarConfig, barData as BarSeriesData, max ?? 0), lineSeries],\n          tooltipFormatter: {\n            formatter: function (params: any) {\n              const str = `\n                  <div style=\"display: flex; align-items: center;\">\n                    <div style=\"\n                      width: 7px;\n                      height: 7px;\n                      background: linear-gradient(180deg, ${params[0]?.color} 0%, ${params[0]?.color} 100%);\n                      margin-right: 4px;\n                      border-radius: 7px;\n                    \"></div>\n                    ${params[0]?.seriesName}：${params[0]?.data?.value || params[0]?.data} ${\n                      barUnit ?? params[0]?.data?.unit ?? ''\n                    }\n                  </div>\n                  <div style=\"display: flex; align-items: center;\">\n                  <div style=\"\n                    width: 7px;\n                    height: 7px;\n                    background: linear-gradient(180deg, ${params?.[5]?.color?.colorStops?.[0]?.color} 0%, ${params?.[5]\n                      ?.color?.colorStops?.[1]?.color} 100%);\n                    margin-right: 4px;\n                    border-radius: 7px;\n                  \"></div>\n                  ${params?.[5]?.seriesName}：${params?.[5]?.value} ${lineUnit ?? params?.[5]?.data?.unit ?? ''}\n                </div>\n                `;\n\n              return `\n                  <div style=\"\n                    background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n                    border: 1px solid #017AFF;\n                    color: #fff;\n                    font-size: ${inModal ? '18px' : '14px'};\n                    line-height: ${inModal ? '25px' : '22px'};\n                    padding: 5px;\n                    border-radius: 6px;\n                  \">\n                    <div>${params[0]?.name}</div>\n                    ${str}\n                  </div>\n                `;\n            },\n          },\n        };\n\n      // 叠片柱状图\n      case 'sliceBar':\n        return {\n          series: [...createSliceSeries(theme, barData as BarSeriesData, max ?? 0), lineSeries],\n          tooltipFormatter: {\n            formatter: function (params: any) {\n              const str = `\n                  <div style=\"display: flex; align-items: center;\">\n                    <div style=\"\n                      width: 7px;\n                      height: 7px;\n                      background: linear-gradient(180deg, ${params[0]?.color?.colorStops?.[0]?.color} 0%, ${params[0]\n                        ?.color?.colorStops?.[1]?.color} 100%);\n                      margin-right: 4px;\n                      border-radius: 7px;\n                    \"></div>\n                    ${params[0]?.seriesName}：${params[0]?.data?.value || params[0]?.data} ${\n                      barUnit ?? params[0]?.data?.unit ?? ''\n                    }\n                  </div>\n                  <div style=\"display: flex; align-items: center;\">\n                  <div style=\"\n                    width: 7px;\n                    height: 7px;\n                    background: linear-gradient(180deg, ${params?.[2]?.color?.colorStops?.[0]?.color} 0%, ${params?.[2]\n                      ?.color?.colorStops?.[1]?.color} 100%);\n                    margin-right: 4px;\n                    border-radius: 7px;\n                  \"></div>\n                  ${params?.[2]?.seriesName}：${params?.[2]?.value} ${lineUnit ?? params?.[2]?.data?.unit ?? ''}\n                </div>\n                `;\n\n              return `\n                  <div style=\"\n                    background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n                    border: 1px solid #017AFF;\n                    color: #fff;\n                    font-size: ${inModal ? '18px' : '14px'};\n                    line-height: ${inModal ? '25px' : '22px'};\n                    padding: 5px;\n                    border-radius: 6px;\n                  \">\n                    <div>${params[0]?.name}</div>\n                    ${str}\n                  </div>\n                `;\n            },\n          } as any,\n        };\n\n      // 堆叠圆柱图\n      case 'stackBar':\n        const totalData: number[] = [];\n        for (let i = 0; i < xAxisData.length; i++) {\n          const element = +barData[0].data[i] + +barData[1].data[i];\n          totalData.push(element);\n        }\n        return {\n          series: [\n            ...createStackSeries(\n              [theme.colors.primary50, theme.colors.primary300],\n              baseBarConfig,\n              barData as any,\n              totalData,\n              barUnit\n            ),\n            lineSeries,\n          ],\n        };\n    }\n  };\n\n  const { series, color, tooltipFormatter } = createOption();\n  const option = merge(\n    {\n      color,\n      legend: {\n        ...baseChartConfig.legend,\n      },\n      grid: {\n        ...baseChartConfig.grid,\n      },\n      tooltip: {\n        ...baseChartConfig.tooltip,\n        axisPointer: {\n          type: 'shadow',\n        },\n        ...(tooltipFormatter ?? {}),\n      },\n      xAxis: {\n        type: 'category',\n        data: xAxisData,\n        ...baseChartConfig.xAxis,\n      },\n      yAxis: [\n        // 第一个是柱图\n        {\n          ...yAxis[0],\n          ...baseChartConfig.yAxis,\n          nameTextStyle: {\n            ...(baseChartConfig.yAxis as YAXisOption).nameTextStyle,\n            padding: [0, 40, 0, 0],\n          },\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n        },\n        // 第二个是线图\n        {\n          ...yAxis[1],\n          ...baseChartConfig.yAxis,\n          nameTextStyle: {\n            ...(baseChartConfig.yAxis as YAXisOption).nameTextStyle,\n            padding: [0, 0, 0, 30],\n          },\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n          splitLine: {\n            show: false,\n          },\n        },\n      ],\n      series,\n    },\n    config\n  );\n\n  return (\n    <ReactEcharts\n      ref={echartsRef}\n      notMerge={true}\n      echarts={echarts}\n      option={option}\n      style={style}\n      onEvents={onEvents}\n      opts={{ renderer }}\n    />\n  );\n}\n\nexport default forwardRef(BarLine);\n\nconst getAreaColorsByIndex = (colors: [string, string]) => {\n  const _color = [Color(colors[1]).alpha(0).string(), Color(colors[0]).alpha(0.4).string()];\n  return createLinearGradient(_color);\n};\n"
  },
  {
    "path": "packages/lego/src/base-pie/index.md",
    "content": "---\ntitle: 环形图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 饼图\n  order: 4\n---\n\n# 基本的饼图\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| data | `true` | 图表数据 | `{ value: string \\| number; name: string; percent?: number; itemStyle?: any }[]` |  |\n| unit | `false` | 单位 | `string` |  |\n| onlyPercentage | `false` | 不显示数值 | `boolean` | `false` |\n| style | `false` | 自定义样式 | `CSSProperties` |  |\n| autoLoop | `false` | 控制是否自动轮播 | `boolean` | `false` |\n| duration | `false` | 自动轮播的时长 | `number` | `2000` |\n| config | `false` | 自定义 Echarts 配置 | `ECOption` |  |\n| legendPosition | `false` | 自定义图例的位置 | `right` \\| `bottom` | `right` |\n| pieColors | `false` | 自定义颜色 | `[string, string][]` |  |\n| onEvents | `false` | 图表交互事件 | `Record<string, (params?: any) => void>` |  |\n| renderer | `false` | 图表渲染器 | `canvas \\| svg` | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/BasePieDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/BasePieDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3\n\n<code src=\"../../example/BasePieDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (手动控制图表轮播)\n\n<code src=\"../../example/BasePieDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5（图例在下方）\n\n<code src=\"../../example/BasePieDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6（不显示具体数值）\n\n<code src=\"../../example/BasePieDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7（SVG 渲染器）\n\n<code src=\"../../example/BasePieDemo/demo7.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/base-pie/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  PieChart, // 系列类型的定义后缀都为 SeriesOption\n  PieSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  LegendComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { merge } from 'lodash-es';\n\nimport useChartLoop from '../hooks/useChartLoop';\nimport useNodeBoundingRect from '../hooks/useNodeBoundingRect';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\nimport chartBg from './assets/chart_bg.svg';\nimport legendBg from './assets/legend_bg.svg';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<PieSeriesOption | TooltipComponentOption | GridComponentOption>;\n\n// 注册必须的组件\necharts.use([GridComponent, PieChart, CanvasRenderer, LegendComponent, SVGRenderer]);\n\nexport type DataType = {\n  value: string | number;\n  name: string;\n  percent?: number;\n  itemStyle?: any;\n};\n\nexport interface BasePieProps {\n  data: DataType[];\n  unit?: string;\n  onlyPercentage?: boolean;\n  style?: CSSProperties;\n  autoLoop?: boolean;\n  duration?: number;\n  config?: ECOption;\n  pieColors?: [string, string][];\n  legendPosition?: 'right' | 'bottom';\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\nconst BasePie = forwardRef<ReactEcharts, BasePieProps>(\n  (\n    {\n      data,\n      style,\n      unit = '',\n      autoLoop = false,\n      onlyPercentage = false,\n      duration = 2000,\n      pieColors = [],\n      config,\n      legendPosition = 'right',\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    // 图例选中的下标，图例不选中时不轮播\n    const [activeLegends, setActiveLegends] = useState<number[]>([]);\n    const echartsRef = useChartLoop(\n      ref,\n      data.filter((_item, idx) => activeLegends.includes(idx)),\n      autoLoop,\n      duration\n    );\n    // 数据长度，轮播时使用\n    const length = data.length;\n\n    const containerRef = useRef<HTMLDivElement>(null);\n    const rect = useNodeBoundingRect(containerRef);\n    const { width: rectWidth = 0, height: rectHeight = 0 } = rect;\n\n    const baseColors =\n      pieColors?.length > 0 && pieColors?.length >= data?.length\n        ? pieColors\n        : [\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary200,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const { imageRadius, left, centerX } = useMemo(() => {\n      if (!rectWidth) {\n        return {\n          imageRadius: 0,\n          left: 0,\n          centerX: '50%',\n        };\n      }\n\n      let circleWidth = 0;\n      if (rectWidth >= rectHeight * 2) {\n        circleWidth = rectHeight;\n      } else {\n        circleWidth = rectWidth / 2;\n      }\n\n      if (legendPosition === 'right') {\n        return {\n          imageRadius: circleWidth * 0.8,\n          centerX: circleWidth / 2,\n          left: circleWidth * 0.1,\n        };\n      }\n      return {\n        imageRadius: rectWidth * 0.8,\n        left: rectWidth * 0.1,\n        centerX: '50%',\n      };\n    }, [rectWidth, rectHeight, legendPosition]);\n\n    const newData = useMemo(() => {\n      const total = Math.round(\n        data\n          ?.map(item => +item.value)\n          .reduce((value: number, total: number) => {\n            return value + total;\n          }, 0)\n      );\n\n      //增加百分比\n      let formatData = data;\n      if (data?.[0]?.percent) {\n        formatData = data.map(item => {\n          return {\n            ...item,\n            value: Math.round(+item.value),\n            percent: (+item.value / total) * 100,\n          };\n        });\n      }\n\n      const gapValue = Number(total) * 0.01;\n\n      const newData: DataType[] = [];\n      if (formatData.length === 1) {\n        newData.push({\n          value: formatData[0].value,\n          name: formatData[0].name,\n          percent: (+formatData[0].value / total) * 100,\n        });\n      } else {\n        for (let i = 0; i < formatData.length; i++) {\n          newData.push(\n            {\n              value: formatData[i].value,\n              name: formatData[i].name,\n              percent: (+formatData[i].value / total) * 100,\n              itemStyle: {\n                borderRadius: 20,\n              },\n            },\n            {\n              value: gapValue,\n              name: '',\n              itemStyle: {\n                color: 'rgba(0, 0, 0, 0)',\n                borderColor: 'rgba(0, 0, 0, 0)',\n                borderWidth: 0,\n              },\n            }\n          );\n        }\n      }\n\n      return newData;\n    }, [data]);\n\n    const isSmall = useMemo(() => {\n      if (legendPosition === 'right') {\n        if (rectWidth <= 400 || rectHeight <= 260) {\n          return true;\n        }\n      } else {\n        if (rectWidth <= 200 || rectHeight <= 300) {\n          return true;\n        }\n      }\n      return false;\n    }, [rectWidth, rectHeight]);\n\n    const lineHeight = isSmall ? 20 : 35;\n    const itemGap = isSmall ? 3 : 7;\n    const legend = Object.assign(\n      {\n        icon: 'circle',\n        orient: 'vertical',\n        data,\n        show: true,\n        itemGap,\n        formatter: (name: string) => {\n          return `{name|${name}} {percent|${newData\n            ?.find((item: { name: string }) => item.name === name)\n            ?.percent?.toFixed(2)}%}`;\n        },\n        textStyle: {\n          width: 190,\n          height: lineHeight,\n          backgroundColor: {\n            image: legendBg,\n          },\n          rich: {\n            name: {\n              color: theme.colors.gray50,\n              padding: [8, 10],\n              ...theme.typography.p2,\n              lineHeight,\n            },\n            percent: {\n              color: '#6FCCFF',\n              align: 'right',\n              padding: [0, 15, 0, 0],\n              ...theme.typography[isSmall ? 'p1' : 'h4'],\n              lineHeight,\n            },\n          },\n        },\n      },\n      legendPosition === 'right'\n        ? {\n            right: 0,\n            top: 'center',\n          }\n        : {\n            left: 0,\n            bottom: 0,\n          }\n    );\n\n    const option = merge(\n      {\n        color: colors,\n        legend,\n        // 底部的环状背景\n        graphic: {\n          elements: [\n            {\n              type: 'image',\n              left: left,\n              top: legendPosition === 'right' ? 'middle' : 20,\n              x: 20,\n              z: 0,\n              style: {\n                image: chartBg,\n                width: imageRadius,\n                height: imageRadius,\n              },\n            },\n          ],\n        },\n        calculable: true,\n        series: [\n          {\n            name: '',\n            type: 'pie',\n            radius: [imageRadius / 2 - 20, imageRadius / 2 - 5],\n            center: [centerX, legendPosition === 'right' ? '50%' : imageRadius / 2 + 20],\n            hoverAnimation: false,\n            legendHoverLink: !autoLoop,\n            silent: autoLoop,\n            itemStyle: {\n              borderRadius: 20,\n            },\n            data: newData,\n            label: {\n              show: newData.length === 1,\n              position: 'center',\n              formatter: ({ data }: { data: DataType }) => {\n                if (!data.name) return;\n                if (onlyPercentage) return `{a|${data.name}}{b|\\n${data.percent?.toFixed(2)}}{c|%}`;\n                return `{a|${data.name}}{b|\\n${data.percent?.toFixed(2)}}{c|%}{d|\\n${data.value}${unit}}`;\n              },\n              rich: {\n                a: {\n                  color: theme.colors.gray50,\n                  align: 'center',\n                  padding: 10,\n                  ...theme.typography[isSmall ? 'p2' : 'p1'],\n                },\n                b: {\n                  color: theme.colors.gray50,\n                  align: 'center',\n                  ...theme.typography[isSmall ? 'h3' : 'h2'],\n                },\n                c: {\n                  color: theme.colors.gray50,\n                  padding: [10, 0, 0, 5],\n                  ...theme.typography.h4,\n                },\n                d: {\n                  color: theme.colors.gray50,\n                  padding: 8,\n                  ...theme.typography.p1,\n                },\n              },\n            },\n            emphasis: {\n              scale: true,\n              scaleSize: 10,\n              itemStyle: {\n                shadowBlur: 20,\n                shadowColor: 'rgba(255, 255, 255, 0.6)',\n              },\n              label: {\n                show: true,\n              },\n            },\n          },\n        ],\n      },\n      config\n    );\n\n    // 初始化轮播的下标\n    useEffect(() => {\n      const arr = new Array(length).fill(0).map((_, i) => i);\n      setActiveLegends(arr);\n    }, [length]);\n\n    // 记录图例的显示下标\n    const handleLegendSelectChanged = useCallback(({ selected }: { selected: { [name: string]: boolean } }) => {\n      const selectArr: number[] = [];\n      Object.keys(selected).forEach((key, index) => {\n        if (selected[key]) {\n          selectArr.push(index);\n        }\n      });\n      setActiveLegends(selectArr);\n    }, []);\n\n    return (\n      <div\n        style={{\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'start',\n          width: '95%',\n          height: '90%',\n          ...style,\n        }}\n        ref={containerRef}\n      >\n        <ReactEcharts\n          echarts={echarts}\n          ref={echartsRef}\n          option={option}\n          style={{ width: style?.width ?? '100%', height: style?.height ?? '100%' }}\n          onEvents={{\n            legendselectchanged: handleLegendSelectChanged,\n            ...onEvents,\n          }}\n          opts={{ renderer }}\n        />\n      </div>\n    );\n  }\n);\n\nexport default BasePie;\n"
  },
  {
    "path": "packages/lego/src/circular-solid-pie/index.less",
    "content": "@prefix: .td-lego-circular-solid-pie;\n\n@{prefix}-bg {\n  animation: innerLoading 8s linear infinite;\n}\n@{prefix}-outer-image {\n  animation: outerLoading 5s linear infinite;\n}\n@{prefix}-inner-image {\n  animation: innerLoading 3s linear infinite;\n}\n@keyframes innerLoading {\n  /*以百分比来规定改变发生的时间 也可以通过\"from\"和\"to\",等价于0% 和 100%*/\n  0% {\n    /*rotate(2D旋转) scale(放大或者缩小) translate(移动) skew(翻转)*/\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes outerLoading {\n  /*以百分比来规定改变发生的时间 也可以通过\"from\"和\"to\",等价于0% 和 100%*/\n  0% {\n    /*rotate(2D旋转) scale(放大或者缩小) translate(移动) skew(翻转)*/\n    transform: rotate(360deg);\n  }\n  100% {\n    transform: rotate(0deg);\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/circular-solid-pie/index.md",
    "content": "---\ntitle: 环形立体饼图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 饼图\n---\n\n# 环形立体饼图\n\n## API\n\n| 属性      | 必填    | 说明                | 类型                                     | 默认值   |\n| --------- | ------- | ------------------- | ---------------------------------------- | -------- |\n| data      | `true`  | 图表数据            | `{ name: string; value: string }[]`      |          |\n| style     | `false` | 自定义样式          | `CSSProperties`                          |          |\n| imgStyle  | `false` | 图片自定义样式      | `CSSProperties`                          |          |\n| autoLoop  | `false` | 控制是否自动轮播    | `boolean`                                |          |\n| duration  | `false` | 自动轮播的时长      | `number`                                 | `2000`   |\n| config    | `false` | 自定义 Echarts 配置 | `ECOption`                               |          |\n| pieColors | `false` | 自定义颜色          | `[string, string][]`                     |          |\n| onEvents  | `false` | 图表交互事件        | `Record<string, (params?: any) => void>` |          |\n| renderer  | `false` | 图表渲染器          | `canvas \\| svg`                          | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example//CircularSolidPieDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 (手动控制图表轮播)\n\n<code src=\"../../example//CircularSolidPieDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (弹窗)\n\n<code src=\"../../example/CircularSolidPieDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (SVG 渲染器)\n\n<code src=\"../../example/CircularSolidPieDemo/demo4.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/circular-solid-pie/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport { PieChart, PieSeriesOption } from 'echarts/charts';\nimport { GraphicComponent, GraphicComponentOption, TooltipComponent, TooltipComponentOption } from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { merge } from 'lodash-es';\n\nimport bg from '../assets/bg.png';\nimport innerBg from '../assets/inner.png';\nimport outerBg from '../assets/outer.png';\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useBasePieConfig from '../hooks/useBasePieConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useNodeBoundingRect from '../hooks/useNodeBoundingRect';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\nimport './index.less';\n\nconst prefixName = 'td-lego-circular-solid-pie';\n\ntype ECOption = echarts.ComposeOption<PieSeriesOption | TooltipComponentOption | GraphicComponentOption>;\n\necharts.use([TooltipComponent, PieChart, GraphicComponent, CanvasRenderer, SVGRenderer]);\n\nexport interface CircularSolidPieProps {\n  data: { name: string; value: string | number }[];\n  style?: CSSProperties;\n  imgStyle?: CSSProperties;\n  autoLoop?: boolean;\n  config?: ECOption;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  inModal?: boolean;\n  pieColors?: [string, string][];\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/** 透明圆环饼图-对应Figma饼图4 */\nexport default forwardRef<ReactEcharts, CircularSolidPieProps>(\n  (\n    {\n      data = [],\n      style,\n      imgStyle,\n      autoLoop = false,\n      config,\n      duration = 2000,\n      inModal = false,\n      pieColors = [],\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal);\n    const basePieConfig = useBasePieConfig();\n    // 图例选中的下标，图例不选中时不轮播\n    const [activeLegends, setActiveLegends] = useState<number[]>([]);\n    // 数据长度，轮播时使用\n    const length = data.length;\n    const echartsRef = useChartLoop(\n      ref,\n      data.filter((_item, idx) => activeLegends.includes(idx)),\n      autoLoop,\n      duration\n    );\n\n    const { style: modifiedStyle } = useStyle(style);\n\n    const divRef = useRef<HTMLDivElement>(null);\n    const rect = useNodeBoundingRect(divRef);\n    const { width = 0, height = 0 } = rect;\n\n    // 容器宽高比例\n    const proportion = height > 0 ? width / height : 0;\n\n    // 初始化轮播的下标\n    useEffect(() => {\n      const arr = new Array(length).fill(0).map((_, i) => i);\n      setActiveLegends(arr);\n    }, [length]);\n\n    // 记录图例改变后的数据\n    const legendSelectChanged = useCallback(({ selected }: { selected: { [name: string]: boolean } }) => {\n      const selectArr: number[] = [];\n      Object.keys(selected).forEach((key, index) => {\n        if (selected[key]) {\n          selectArr.push(index);\n        }\n      });\n      setActiveLegends(selectArr);\n    }, []);\n\n    const baseColors =\n      pieColors?.length > 0 && pieColors?.length >= data?.length\n        ? pieColors\n        : [\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary200,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const total = Math.round(\n      data\n        .map(item => +item.value)\n        .reduce((value: number, total: number) => {\n          return value + total;\n        }, 0)\n    );\n\n    const gapValue = Number(total) * 0.01;\n\n    const seriesData: any[] = [];\n    if (data.length == 1) {\n      seriesData.push({\n        ...data[0],\n        percent: 100,\n      });\n    } else {\n      data.forEach(ele => {\n        seriesData.push(\n          {\n            value: +ele.value,\n            name: ele.name,\n            percent: ((+ele.value / total) * 100).toFixed(2),\n          },\n          {\n            value: gapValue,\n            // echarts中name为''或者是'\\n'代笔legend换行\n            name: '',\n            itemStyle: {\n              color: 'transparent',\n              borderColor: 'transparent',\n              borderWidth: 0,\n            },\n          }\n        );\n      });\n    }\n\n    const option = merge(\n      {\n        color: colors,\n        legend: {\n          ...baseChartConfig.legend,\n          orient: 'horizontal',\n          left: '1%',\n          data: seriesData.filter(i => i.name),\n        },\n        series: [\n          {\n            ...basePieConfig,\n            name: '数据环',\n            left: 0,\n            right: 0,\n            center: ['50%', '60%'],\n            radius: ['62%', '72%'],\n            label: {\n              show: false,\n            },\n            data: seriesData,\n            zlevel: 3,\n            emphasis: {\n              scale: true,\n              scaleSize: 10,\n              itemStyle: {\n                shadowBlur: 20,\n                shadowColor: 'rgba(255, 255, 255, 0.6)',\n              },\n            },\n          },\n          {\n            ...basePieConfig,\n            name: '数据标签',\n            type: 'pie',\n            center: ['50%', '60%'],\n            radius: ['62%', '72%'],\n            itemStyle: {\n              opacity: 0,\n              borderWidth: 0,\n            },\n            label: {\n              position: 'outside',\n              padding: inModal ? [0, -70, 50, -50] : [10, -50, 50, -40],\n              formatter: ({ name }: { name: string }) => {\n                if (!name) return;\n                return `{a|${name}}{b|\\n${Number(seriesData.find(item => item.name === name)?.percent).toFixed(2)}%}`;\n              },\n              opacity: 1,\n              rich: {\n                a: {\n                  ...theme.typography[inModal ? 'p0' : 'p2'],\n                  color: theme.colors.gray50,\n                },\n                b: {\n                  ...theme.typography[inModal ? 'p0' : 'p2'],\n                  color: theme.colors.gray50,\n                },\n              },\n            },\n            labelLine: {\n              ...basePieConfig.labelLine,\n              show: true,\n              length2: inModal ? 85 : 60,\n              minTurnAngle: 45,\n            },\n            data: seriesData.filter(item => !!item.name),\n            zlevel: 3,\n          },\n          {\n            name: '透明环',\n            type: 'pie',\n            center: ['50%', '60%'],\n            radius: ['50%', '65%'],\n            silent: true,\n            itemStyle: {\n              opacity: 0.3,\n            },\n            label: {\n              show: false,\n            },\n            data: seriesData,\n          },\n        ],\n      },\n      config\n    );\n\n    const imageStyle: React.CSSProperties = {\n      position: 'absolute',\n      top: '60%',\n      left: '50%',\n      transform: 'translate(-50%, -50%)',\n      width: proportion > 1.67 ? 'auto' : '100%',\n      height: proportion > 1.67 ? '100%' : 'auto',\n      display: 'flex',\n      justifyContent: 'center',\n      alignItems: 'center',\n      ...imgStyle,\n    };\n\n    return (\n      <div\n        style={{\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'start',\n          width: '95%',\n          height: '90%',\n          ...modifiedStyle,\n        }}\n        ref={divRef}\n      >\n        <div style={imageStyle}>\n          <img src={bg} className={`${prefixName}-bg`} />\n        </div>\n        <div style={imageStyle}>\n          <img src={outerBg} className={`${prefixName}-outer-image`} />\n        </div>\n        <div style={imageStyle}>\n          <img src={innerBg} className={`${prefixName}-inner-image`} />\n        </div>\n\n        <ReactEcharts\n          ref={echartsRef}\n          style={{ width: modifiedStyle.width ?? '95%', height: modifiedStyle.height ?? '90%' }}\n          echarts={echarts}\n          option={option}\n          onEvents={{\n            legendSelectChanged,\n            ...onEvents,\n          }}\n          opts={{ renderer }}\n        />\n      </div>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/context/ThemeContext.tsx",
    "content": "import React, { createContext, FC, PropsWithChildren } from 'react';\n\nimport theme from '../theme';\n\nexport const ThemeContext = createContext(theme);\n\nexport const ThemeProvider: FC<PropsWithChildren<{ theme: typeof theme }>> = ({ theme, children }) => {\n  return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n};\n"
  },
  {
    "path": "packages/lego/src/cuboid-bar/index.md",
    "content": "---\ntitle: 长方体柱状图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n  order: 3\n---\n\n# 长方体柱状图\n\n## API\n\n| 属性          | 必填    | 说明                  | 类型                                     | 默认值   |\n| ------------- | ------- | --------------------- | ---------------------------------------- | -------- |\n| xAxisData     | `true`  | x 轴数据              | `any[]`                                  |          |\n| unit          | `false` | 单位                  | `string`                                 |          |\n| name          | `false` | 图例名称              | `string`                                 |          |\n| data          | `true`  | 图表数据              | `(number \\| string)[]`                   |          |\n| style         | `false` | 自定义样式            | `CSSProperties`                          |          |\n| autoLoop      | `false` | 控制是否自动轮播      | `boolean`                                |          |\n| duration      | `false` | 自动轮播的时长        | `number`                                 | `2000`   |\n| config        | `false` | 自定义 Echarts 配置   | `ECOption`                               |          |\n| inModal       | `false` | 是否在弹窗内显示      | `boolean`                                | `false`  |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean`                                | `true`   |\n| onEvents      | `false` | 图表交互事件          | `Record<string, (params?: any) => void>` |          |\n| renderer      | `false` | 图表渲染器            | `canvas \\| svg`                          | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/CuboidBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/CuboidBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3\n\n<code src=\"../../example/CuboidBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 自动轮播\n\n<code src=\"../../example/CuboidBarDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (轮播两次后停止)\n\n<code src=\"../../example/CuboidBarDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (弹窗)\n\n<code src=\"../../example/CuboidBarDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (手动控制图表轮播)\n\n<code src=\"../../example/CuboidBarDemo/demo7.tsx\" background=\"#040727\">\n\n## 效果图 8 (SVG 渲染器)\n\n<code src=\"../../example/CuboidBarDemo/demo8.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/cuboid-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  CustomChart, // 系列类型的定义后缀都为 SeriesOption\n  CustomSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { TooltipOption, YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\nimport createCuboidSeries from '../utils/createCuboidSeries';\nimport createLinearGradient from '../utils/createLinearGradient';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<CustomSeriesOption | TooltipComponentOption | GridComponentOption>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, CustomChart, CanvasRenderer, SVGRenderer]);\n\nexport interface CuboidBarProps {\n  /** x轴数据 */\n  xAxisData: any[];\n  /** 单位 */\n  unit?: string;\n  /** 图例名称 */\n  name?: string;\n  /** 图表数据 */\n  data: (number | string)[];\n  /** 自定义样式 */\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  /** 自定义Echarts配置 */\n  config?: ECOption;\n  /** 是否在弹窗内显示 */\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 长方体柱状图，对应figma柱状图4\n */\nconst CuboidBar = forwardRef<ReactEcharts, CuboidBarProps>(\n  (\n    {\n      xAxisData,\n      unit,\n      name,\n      data,\n      autoLoop,\n      duration = 2000,\n      style,\n      config,\n      inModal = false,\n      showYAxisLine = true,\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n\n    const option = merge(\n      {\n        color: [createLinearGradient(theme.colors.primary300)],\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n        },\n        tooltip: {\n          ...baseChartConfig.tooltip,\n          axisPointer: {\n            ...(baseChartConfig.tooltip as TooltipOption).axisPointer,\n            type: 'shadow',\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: xAxisData,\n          ...baseChartConfig.xAxis,\n        },\n        yAxis: {\n          name: unit,\n          ...baseChartConfig.yAxis,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n        },\n        series: [createCuboidSeries(theme, { name: name ?? '', data })],\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={echartsRef}\n        echarts={echarts}\n        option={option}\n        style={style}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n\nexport default CuboidBar;\n"
  },
  {
    "path": "packages/lego/src/cylinder-bar/index.md",
    "content": "---\ntitle: 分组圆柱图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n---\n\n# 分组圆柱图\n\n适用于分组展示一个组下多个不同维度数据的情况。\n\n## API\n\n| 属性          | 必填    | 说明                  | 类型                                     | 默认值   |\n| ------------- | ------- | --------------------- | ---------------------------------------- | -------- |\n| xAxisData     | `true`  | x 轴数据              | `any[]`                                  |          |\n| seriesData    | `true`  | 图表数据              | `BarSeriesData[]`                        |          |\n| style         | `false` | 自定义样式            | `CSSProperties`                          |          |\n| autoLoop      | `false` | 控制是否自动轮播      | `boolean`                                |          |\n| duration      | `false` | 自动轮播的时长        | `number`                                 | `2000`   |\n| config        | `false` | 自定义 Echarts 配置   | `ECOption`                               |          |\n| inModal       | `false` | 是否在弹窗内显示      | `boolean`                                | `false`  |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean`                                | `true`   |\n| onEvents      | `false` | 图表交互事件          | `Record<string, (params?: any) => void>` |          |\n| renderer      | `false` | 图表渲染器            | `canvas \\| svg`                          | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/CylinderBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 双 Y 轴（单位不一样时）\n\n<code src=\"../../example/CylinderBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 自动轮播\n\n<code src=\"../../example/CylinderBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (轮播两次后停止)\n\n<code src=\"../../example/CylinderBarDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (弹窗)\n\n<code src=\"../../example/CylinderBarDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (手动控制图表轮播)\n\n<code src=\"../../example/CylinderBarDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (SVG 渲染器)\n\n<code src=\"../../example/CylinderBarDemo/demo7.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/cylinder-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  CustomChart, // 系列类型的定义后缀都为 SeriesOption\n  CustomSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { TooltipOption, YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\nimport createCylinderBarSeries from '../utils/createCylinderSeries';\nimport createLinearGradient from '../utils/createLinearGradient';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<CustomSeriesOption | TooltipComponentOption | GridComponentOption>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, CustomChart, CanvasRenderer, SVGRenderer]);\n\nexport interface CylinderBarProps {\n  xAxisData: any[];\n  seriesData: BarSeriesData[];\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 圆柱体柱状图，对应figma柱状图1\n */\nexport default forwardRef<ReactEcharts, CylinderBarProps>(\n  (\n    {\n      xAxisData,\n      seriesData = [{ unit: '' }, { unit: '' }],\n      style,\n      /** 控制是否自动轮播 */\n      autoLoop,\n      /** 自动轮播的时长，默认为2s */\n      duration,\n      config,\n      inModal,\n      showYAxisLine = true,\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const colors = [createLinearGradient(theme.colors.primary50), createLinearGradient(theme.colors.primary300)];\n\n    const baseChartConfig = useBaseChartConfig(inModal);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n\n    const data = seriesData.slice(0, 2);\n    // 根据data里面的unit，判断有几个y轴\n    const yAxisCount = data[0].unit === data[1].unit ? 1 : 2;\n    const yAxis =\n      yAxisCount === 1\n        ? [\n            {\n              name: data[0].unit,\n              ...baseChartConfig.yAxis,\n              axisLine: {\n                ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n                show: showYAxisLine,\n              },\n            },\n          ]\n        : data.map(item => ({\n            name: item.unit,\n            ...baseChartConfig.yAxis,\n            axisLine: {\n              ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n              show: showYAxisLine,\n            },\n          }));\n\n    const option = merge(\n      {\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n        },\n        tooltip: {\n          ...baseChartConfig.tooltip,\n          axisPointer: {\n            ...(baseChartConfig.tooltip as TooltipOption).axisPointer,\n            type: 'shadow',\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: xAxisData,\n          ...baseChartConfig.xAxis,\n        },\n        yAxis,\n        series: createCylinderBarSeries(data as BarSeriesData[], colors, yAxisCount),\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={echartsRef}\n        notMerge\n        echarts={echarts}\n        option={option}\n        style={style}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/cylinder-shadow-bar/index.md",
    "content": "---\ntitle: 带阴影圆柱图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n---\n\n# 带阴影圆柱图\n\n## API\n\n| 属性          | 必填    | 说明                  | 类型                                            | 默认值   |\n| ------------- | ------- | --------------------- | ----------------------------------------------- | -------- |\n| xAxisData     | `true`  | x 轴数据              | `any[]`                                         |          |\n| unit          | `false` | 单位                  | `string`                                        |          |\n| name          | `false` | 图例名称              | `string`                                        |          |\n| max           | `true`  | 最大值                | `number`                                        |          |\n| data          | `true`  | 图表数据              | `(number \\| { name: string; value: number })[]` |          |\n| style         | `false` | 自定义样式            | `CSSProperties`                                 |          |\n| autoLoop      | `false` | 控制是否自动轮播      | `boolean`                                       |          |\n| duration      | `false` | 自动轮播的时长        | `number`                                        | `2000`   |\n| config        | `false` | 自定义 Echarts 配置   | `ECOption`                                      |          |\n| inModal       | `false` | 是否在弹窗内显示      | `boolean`                                       | `false`  |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean`                                       | `true`   |\n| onEvents      | `false` | 图表交互事件          | `Record<string, (params?: any) => void>`        |          |\n| renderer      | `false` | 图表渲染器            | `canvas \\| svg`                                 | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/CylinderShadowBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/CylinderShadowBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3\n\n<code src=\"../../example/CylinderShadowBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 自动轮播\n\n<code src=\"../../example/CylinderShadowBarDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (轮播两次后停止)\n\n<code src=\"../../example/CylinderShadowBarDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (弹窗)\n\n<code src=\"../../example/CylinderShadowBarDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (手动控制图表轮播)\n\n<code src=\"../../example/CylinderShadowBarDemo/demo7.tsx\" background=\"#040727\">\n\n## 效果图 8 (SVG 渲染器)\n\n<code src=\"../../example/CylinderShadowBarDemo/demo8.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/cylinder-shadow-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  CustomChart, // 系列类型的定义后缀都为 SeriesOption\n  CustomSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { TooltipOption, YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseBarConfig from '../hooks/useBaseBarConfig';\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\nimport createCylinderShadowSeries from '../utils/createCylinderShadowSeries';\nimport createLinearGradient from '../utils/createLinearGradient';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<CustomSeriesOption | TooltipComponentOption | GridComponentOption>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, CustomChart, CanvasRenderer, SVGRenderer]);\n\nexport interface CylinderShadowBarProps {\n  xAxisData: any[];\n  unit?: string;\n  name: string;\n  max: number;\n  data: (number | string)[];\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  imgStyle?: CSSProperties;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 带阴影柱状堆叠图，对应figma柱状图2\n */\nexport default forwardRef<ReactEcharts, CylinderShadowBarProps>(\n  (\n    {\n      xAxisData,\n      unit,\n      name,\n      data,\n      max,\n      style,\n      autoLoop,\n      duration = 2000,\n      config,\n      inModal = false,\n      showYAxisLine = true,\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseBarConfig = useBaseBarConfig(inModal);\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n    const { style: modifiedStyle } = useStyle(style);\n\n    const option = merge(\n      {\n        color: [createLinearGradient(theme.colors.primary50)],\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n        },\n        tooltip: {\n          ...baseChartConfig.tooltip,\n          axisPointer: {\n            ...(baseChartConfig.tooltip as TooltipOption).axisPointer,\n            type: 'shadow',\n          },\n          formatter: function (params: any) {\n            const str = `\n            <div style=\"display: flex; align-items: center;\">\n              <div style=\"\n                width: 7px;\n                height: 7px;\n                background: linear-gradient(180deg, ${params[0]?.color} 0%, ${params[0]?.color} 100%);\n                margin-right: 4px;\n                border-radius: 7px;\n              \"></div>\n              ${params[0]?.seriesName}：${params[0]?.data?.value || params[0]?.data} ${\n                unit ?? params[0]?.data?.unit ?? ''\n              }\n            </div>\n          `;\n\n            return `\n                <div style=\"\n                  background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n                  border: 1px solid #017AFF;\n                  color: #fff;\n                  font-size: ${inModal ? '18px' : '14px'};\n                  line-height: ${inModal ? '25px' : '22px'};\n                  padding: 5px;\n                  border-radius: 6px;\n                \">\n                  <div>${params[0]?.name}</div>\n                  ${str}\n                </div>\n              `;\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: xAxisData,\n          ...baseChartConfig.xAxis,\n        },\n        yAxis: {\n          name: unit,\n          max,\n          ...baseChartConfig.yAxis,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n        },\n        series: createCylinderShadowSeries(theme, baseBarConfig, { name, data }, max),\n      },\n      config\n    );\n\n    return (\n      <div style={modifiedStyle}>\n        <ReactEcharts\n          ref={echartsRef}\n          echarts={echarts}\n          option={option}\n          style={{ width: modifiedStyle.width, height: modifiedStyle.height }}\n          onEvents={onEvents}\n          opts={{ renderer }}\n        />\n      </div>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/data-show/index.less",
    "content": "@import '../style/index.less';\n\n@prefix: .td-lego-data-show;\n\n@{prefix}-container {\n  position: relative;\n  flex: 1;\n  overflow: hidden;\n  background-image: url('../assets/other_datashow_bg.png');\n  background-repeat: no-repeat;\n  background-size: 100% 100%;\n  animation: breathe 3s linear infinite;\n\n  @{prefix}-data-wrap {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n  }\n\n  @{prefix}-title-wrap {\n    flex: 1;\n    align-items: center;\n    justify-content: center;\n    width: 156px;\n    height: 65px;\n    background-image: url('./assets/rectangle.png');\n    background-repeat: no-repeat;\n    background-size: 100% 100%;\n\n    @{prefix}-title {\n      text-align: center;\n    }\n  }\n\n  @{prefix}-total {\n    margin-top: 12px;\n    text-align: center;\n  }\n}\n\n@{prefix}-title-wrap:after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 156px;\n  height: 65px;\n  content: '';\n  background: linear-gradient(45deg, transparent 40%, rgba(255, 255, 255, 0.15) 50%, transparent 60%);\n  background-size: 300% 100%;\n  animation: shine 15s linear infinite;\n}\n\n@keyframes shine {\n  0% {\n    background-position-x: 400%;\n  }\n\n  50% {\n    background-position-x: 0%;\n  }\n\n  100% {\n    background-position-x: -400%;\n  }\n}\n\n@keyframes breathe {\n  0% {\n    opacity: 1;\n  }\n\n  50% {\n    filter: brightness(150%) saturate(140%);\n  }\n\n  100% {\n    opacity: 1;\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/data-show/index.md",
    "content": "---\ntitle: 数据展示\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 基本的数据展示\n\n## API\n\n| 属性  | 必填    | 说明       | 类型            | 默认值 |\n| ----- | ------- | ---------- | --------------- | ------ |\n| title | `false` | 标题       | `string`        |        |\n| data  | `false` | 数量       | `string`        |        |\n| style | `false` | 自定义样式 | `CSSProperties` |        |\n\n## 效果图\n\n<code src=\"../../example/DataShowDemo/demo1.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/data-show/index.tsx",
    "content": "import React, { CSSProperties } from 'react';\n\nimport useTheme from '../hooks/useTheme';\nimport './index.less';\n\nconst prefixName = 'td-lego-data-show';\n\n// 默认宽高\nconst initialSize = 450;\n\nexport interface DataShowProps {\n  style?: CSSProperties;\n  title?: string;\n  data?: string;\n}\n\nexport default ({ style, title, data }: DataShowProps) => {\n  const theme = useTheme();\n  const { width = initialSize, height = initialSize } = style || {};\n  return (\n    <div\n      className={`${prefixName}-container`}\n      style={{\n        ...style,\n        width,\n        height,\n      }}\n    >\n      <div className={`${prefixName}-data-wrap`}>\n        <div className={`${prefixName}-title-wrap`}>\n          <div\n            className={`${prefixName}-title`}\n            style={{\n              ...theme.typography.h3,\n              color: theme.colors.gray50,\n              lineHeight: '65px',\n            }}\n          >\n            {title}\n          </div>\n        </div>\n        <div\n          className={`${prefixName}-total`}\n          style={{\n            color: theme.colors.gray50,\n            ...theme.typography.h4,\n            lineHeight: theme.typography.h4.lineHeight + 'px',\n          }}\n        >\n          {data}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/src/data-show-simple/index.less",
    "content": "@import '../style/index.less';\n\n@prefix: .td-lego-data-simple-show;\n\n@{prefix}-container {\n  display: flex;\n  padding-top: 40px;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-items: center;\n  background-image: url('../assets/data_show_bg.png');\n  background-size: contain;\n  background-repeat: no-repeat;\n  background-position: 0 75%;\n  animation: breathe 3s linear infinite;\n\n  @{prefix}-content {\n    display: flex;\n    flex-direction: column;\n    padding-top: 25%;\n    margin-left: 10%;\n    margin-right: 10%;\n  }\n\n  @{prefix}-title-wrap {\n    width: 156px;\n    height: 65px;\n    background-image: url('../assets/rectangle.png');\n    background-size: contain;\n    background-repeat: no-repeat;\n    object-fit: cover;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n\n    @{prefix}-title {\n      line-height: 65px;\n      text-align: center;\n    }\n  }\n\n  @{prefix}-data {\n    text-align: center;\n    margin-top: 25px;\n  }\n}\n\n@keyframes breathe {\n  0% {\n    opacity: 1;\n  }\n\n  50% {\n    filter: brightness(150%) saturate(140%);\n  }\n\n  100% {\n    opacity: 1;\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/data-show-simple/index.md",
    "content": "---\ntitle: 数据展示\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 基本的数据展示\n\n## API\n\n| 属性  | 必填    | 说明       | 类型            | 默认值 |\n| ----- | ------- | ---------- | --------------- | ------ |\n| title | `false` | 标题       | `string`        |        |\n| total | `false` | 数量       | `string`        |        |\n| style | `false` | 自定义样式 | `CSSProperties` |        |\n\n## 效果图\n\n<code src=\"../../example/DataShowSimpleDemo/demo1.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/data-show-simple/index.tsx",
    "content": "import React, { CSSProperties } from 'react';\n\nimport { DataShowProps } from '../data-show';\nimport useTheme from '../hooks/useTheme';\nimport './index.less';\n\n// 默认宽高\nconst initialSize = 450;\n\nconst prefixName = 'td-lego-data-simple-show';\n\nexport default ({ style, title, data }: DataShowProps) => {\n  const theme = useTheme();\n  const { width = initialSize, height = initialSize } = style || {};\n  return (\n    <div\n      className={`${prefixName}-container`}\n      style={{\n        ...style,\n        width,\n        height,\n      }}\n    >\n      <div className={`${prefixName}-content`}>\n        <div className={`${prefixName}-title-wrap`}>\n          <div\n            className={`${prefixName}-title`}\n            style={\n              {\n                ...theme.typography.h3,\n                color: theme.colors.gray50,\n              } as CSSProperties\n            }\n          >\n            {title}\n          </div>\n        </div>\n        <div\n          className={`${prefixName}-data`}\n          style={\n            {\n              color: theme.colors.gray50,\n              ...theme.typography.h4,\n              lineHeight: theme.typography.h4.lineHeight + 'px',\n            } as CSSProperties\n          }\n        >\n          {data}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/src/flip-number/index.less",
    "content": ".wrap {\n  height: 159px;\n  margin-top: 16px;\n  color: #ffffff;\n  font-weight: 400;\n  font-size: 120px;\n  line-height: 159px;\n}\n"
  },
  {
    "path": "packages/lego/src/flip-number/index.md",
    "content": "---\ntitle: 翻牌器\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 数字\n---\n\n# 数据展示\n\n## API\n\n| 属性          | 必填    | 说明                                   | 类型                        | 默认值 |\n| ------------- | ------- | -------------------------------------- | --------------------------- | ------ |\n| auto          | `false` | 是否自动                               | `boolean`                   |        |\n| decimals      | `false` | 要显示的小数位数                       | `number`                    |        |\n| delay         | `false` | 开始转换前的延迟（以秒为单位）         | `number`                    |        |\n| duration      | `false` | 持续时间（以秒为单位）                 | `number`                    |        |\n| preserveValue | `false` | 保存先前结束的数字以从中开始每个新动画 | `number`                    |        |\n| separator     | `false` | 指定千位分隔符的字符                   | `string`                    |        |\n| start         | `true`  | 开始值                                 | `number`                    |        |\n| end           | `true`  | 目标值                                 | `number`                    |        |\n| useEasing     | `false` | 启用缓动。设置 false 为线性过渡        | `boolean`                   |        |\n| formattingFn  | `false` | 自定义数字格式的功能                   | `(value: number) => string` |        |\n| onEnd         | `false` | 过渡结束时的回调函数                   | `() => void`                |        |\n| onStart       | `false` | 转换开始时的回调函数                   | `() => void`                |        |\n| onPause       | `false` | 暂停或恢复时的回调函数                 | `() => void`                |        |\n| onReset       | `false` | 复位时的回调函数                       | `() => void`                |        |\n| onUpdate      | `false` | 更新回调函数                           | `() => void`                |        |\n| style         | `false` | 容器样式                               | `CSSProperties`             |        |\n| className     | `false` | 自定义类名                             | `string`                    |        |\n\n## 1 常规\n\n<code src=\"../../example/FlipNumberDemo/demo1.tsx\" background=\"#040727\">\n\n## 2 千位分隔\n\n<code src=\"../../example/FlipNumberDemo/demo2.tsx\" background=\"#040727\">\n\n## 3 文字样式\n\n<code src=\"../../example/FlipNumberDemo/demo3.tsx\" background=\"#040727\">\n\n## 4 手动触发\n\n<code src=\"../../example/FlipNumberDemo/demo4.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/flip-number/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useImperativeHandle, useRef } from 'react';\nimport { useCountUp } from 'react-countup';\n\nimport classNames from 'classnames';\n\nimport './index.less';\n\nexport interface FlipNumberProps {\n  auto?: boolean;\n  decimals?: number; // 要显示的小数位数\n  delay?: number; // 开始转换前的延迟（以秒为单位）\n  duration?: number; // 持续时间（以秒为单位）\n  preserveValue?: number; // 保存先前结束的数字以从中开始每个新动画\n  separator?: string; // 指定千位分隔符的字符\n  start: number; // 开始值\n  end: number; // 目标值\n  useEasing?: boolean; // 启用缓动。设置false为线性过渡\n  formattingFn?: (value: number) => string; // 自定义数字格式的功能\n  onEnd?: () => void; // 过渡结束时的回调函数\n  onStart?: () => void; // 转换开始时的回调函数\n  onPause?: () => void; // 暂停或恢复时的回调函数\n  onReset?: () => void; // 复位时的回调函数\n  onUpdate?: () => void; // 更新回调函数\n  style?: CSSProperties; // 容器样式\n  className?: string;\n}\n\ninterface FlipNumberRef {\n  pause: () => void; // 暂停或恢复过渡\n  reset: () => void; //重置为初始值\n  start: () => void; // 开始或重新开始过渡\n  update: (newEnd: number) => void; //更新过渡到新的结束值（如果给定）\n}\n\nconst FlipNumber = forwardRef<FlipNumberRef, FlipNumberProps>((props, ref) => {\n  const { style = {}, className = '', duration = 3, ...res } = props;\n\n  const countUpRef = useRef(null);\n  const {\n    start,\n    update,\n    pauseResume: pause,\n    reset,\n  } = useCountUp({\n    ref: countUpRef,\n    duration,\n    ...res,\n  });\n\n  useImperativeHandle(ref, () => ({\n    start,\n    update,\n    pause,\n    reset,\n  }));\n\n  return <div ref={countUpRef} className={classNames('wrap', `${className}`)} style={style}></div>;\n});\n\nexport default FlipNumber;\n"
  },
  {
    "path": "packages/lego/src/float-ball/index.less",
    "content": "@prefix: .td-lego-float-ball;\n\n@{prefix}-container {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  min-height: 260px;\n  background: url(./assets/bottom_bg.png) no-repeat;\n  background-position: center;\n  background-size: contain;\n\n  @{prefix}-ball-container {\n    position: absolute;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    width: 142px;\n    height: 142px;\n    background-repeat: no-repeat;\n    background-size: 100% 100%;\n    border-radius: 50%;\n\n    @{prefix}-label {\n      font-size: 14px;\n    }\n\n    @{prefix}-value {\n      color: #fff;\n      font-size: 32px;\n    }\n  }\n\n  @{prefix}-blue {\n    background-image: url(./assets/blue.png);\n\n    @{prefix}-label {\n      color: #a6c0ff;\n    }\n  }\n\n  @{prefix}-label {\n    text-align: center;\n  }\n\n  @{prefix}-orange {\n    background-image: url(./assets/orange.png);\n\n    @{prefix}-label {\n      color: #ead261;\n    }\n  }\n\n  @{prefix}-green {\n    background-image: url(./assets/green.png);\n\n    @{prefix}-label {\n      color: #61e1ff;\n    }\n  }\n\n  @{prefix}-purple {\n    background-image: url(./assets/purple.png);\n\n    @{prefix}-label {\n      color: #a13ed6;\n    }\n  }\n}\n\n@{prefix}-normal {\n  @{prefix}-blue {\n    top: 10px;\n    left: calc(50% - 70px);\n    width: 142px;\n    height: 142px;\n    animation: float 3.5s ease-in-out infinite;\n  }\n  @{prefix}-orange {\n    top: 100px;\n    left: calc(50% - 170px);\n    width: 126px;\n    height: 126px;\n    animation: longFloat 7s ease-in-out infinite;\n  }\n  @{prefix}-green {\n    top: 100px;\n    left: calc(50% + 54px);\n    width: 122px;\n    height: 122px;\n    animation: longFloat 4.9s ease-in-out infinite;\n  }\n}\n\n@{prefix}-more {\n  @{prefix}-blue {\n    top: 10px;\n    left: calc(50% - 130px);\n    width: 128px;\n    height: 128px;\n    animation: shortFloat 3.5s ease-in-out infinite;\n  }\n  @{prefix}-orange {\n    top: 138px;\n    left: calc(50% - 126px);\n    width: 92px;\n    height: 92px;\n    animation: shortFloat 3.5s ease-in-out infinite;\n  }\n  @{prefix}-green {\n    top: 110px;\n    left: calc(50%);\n    width: 120px;\n    height: 120px;\n    animation: shortFloat 3.5s ease-in-out infinite;\n  }\n  @{prefix}-purple {\n    top: 10px;\n    left: calc(50% + 12px);\n    width: 98px;\n    height: 98px;\n    animation: shortFloat 3.5s ease-in-out infinite;\n  }\n}\n\n@keyframes float {\n  0%,\n  100% {\n    transform: translatey(-10px);\n  }\n  50% {\n    transform: translatey(10px);\n  }\n}\n\n@keyframes longFloat {\n  0%,\n  100% {\n    transform: translatey(-21px);\n  }\n  50% {\n    transform: translatey(7px);\n  }\n}\n\n@keyframes shortFloat {\n  0%,\n  100% {\n    transform: translatey(-5px);\n  }\n  50% {\n    transform: translatey(5px);\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/float-ball/index.md",
    "content": "---\ntitle: 浮动球\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 基本的数据展示\n\n主要用于 3 ~ 4 组数据的场景，大于 4 组数据按照 4 组数据显示。\n\n## API\n\n| 属性       | 必填    | 说明         | 类型                                                                | 默认值 |\n| ---------- | ------- | ------------ | ------------------------------------------------------------------- | ------ |\n| dataSource | `true`  | 标题         | `{value: string \\| number;label: string;element?: ReactElement;}[]` |        |\n| maxCount   | `false` | 最大展示数量 | `number`                                                            |        |\n| className  | `false` | 自定义样式名 | `string`                                                            |        |\n| style      | `false` | 自定义样式   | `CSSProperties`                                                     |        |\n\n## 3 组数据\n\n<code src=\"../../example/FloatBallDemo/demo1.tsx\" background=\"#040727\">\n\n## 4 组数据\n\n<code src=\"../../example/FloatBallDemo/demo2.tsx\" background=\"#040727\">\n\n## 限制最大显示个数为 3 组数据\n\n<code src=\"../../example/FloatBallDemo/demo3.tsx\" background=\"#040727\">\n\n## 自定义内部内容\n\n<code src=\"../../example/FloatBallDemo/demo4.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/float-ball/index.tsx",
    "content": "import React, { CSSProperties, FC, ReactElement } from 'react';\n\nimport classNames from 'classnames';\n\nimport './index.less';\n\nconst prefixName = 'td-lego-float-ball';\n// 颜色名称\nconst colorNamesArr = ['blue', 'orange', 'green', 'purple'];\n// 最大的气泡个数\nconst MAX_COUNT = 4;\n\nexport interface LabeledValue {\n  value: string | number;\n  label: string;\n  element?: ReactElement;\n}\n\nexport interface FloatBallProps {\n  dataSource: LabeledValue[];\n  maxCount?: number;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst FloatBall: FC<FloatBallProps> = ({ dataSource = [], maxCount, className, style }) => {\n  const moreThanMax = (maxCount ?? dataSource.length) >= MAX_COUNT;\n  // 如果数据个数超过4个，只显示4个\n  const modifiedCount = moreThanMax ? MAX_COUNT : dataSource.length;\n  // 限制最大显示个数\n  const limitedCount = maxCount ? Math.min(modifiedCount, maxCount) : modifiedCount;\n\n  const renderBall = (item: LabeledValue, idx: number) => {\n    const { label, value } = item;\n    return (\n      <div\n        key={`${label}${idx}`}\n        className={classNames(`${prefixName}-ball-container`, `${prefixName}-${colorNamesArr[idx]}`)}\n      >\n        {React.isValidElement(item.element) ? (\n          item.element\n        ) : (\n          <>\n            <div className={`${prefixName}-label`}>{label}</div>\n            <div className={`${prefixName}-value`}>{value}</div>\n          </>\n        )}\n      </div>\n    );\n  };\n\n  return (\n    <div\n      className={classNames(`${prefixName}-container`, `${prefixName}-${moreThanMax ? 'more' : 'normal'}`, className)}\n      style={style}\n    >\n      {dataSource.slice(0, limitedCount).map(renderBall)}\n    </div>\n  );\n};\n\nexport default FloatBall;\n"
  },
  {
    "path": "packages/lego/src/gauge/index.md",
    "content": "---\ntitle: 仪表盘\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 基本的数据展示\n\n## API\n\n| 属性  | 必填    | 说明       | 类型                 | 默认值 |\n| ----- | ------- | ---------- | -------------------- | ------ |\n| max   | `true`  | 最大值     | `number`             | `100`  |\n| value | `true`  | 当前值     | `number` \\| `string` |        |\n| style | `false` | 自定义样式 | `CSSProperties`      |        |\n\n## 效果图\n\n<code src=\"../../example/GaugeDemo/demo1.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/gauge/index.tsx",
    "content": "import React, { CSSProperties, useCallback, useEffect, useRef } from 'react';\n\nimport color from 'color';\n\nimport useNodeBoundingRect from '../hooks/useNodeBoundingRect';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\n\nexport interface GaugeProps {\n  max: number;\n  value: number | string;\n  style?: CSSProperties;\n}\n\n/**\n * 仪表盘图\n */\nexport default ({ max = 100, style = {}, ...props }: GaugeProps) => {\n  let value = +props.value;\n  value = value > max ? max : value;\n  const theme = useTheme();\n  // 当前的值,保存有动画\n  const valueRef = useRef(0);\n\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n\n  const { style: modifiedStyle } = useStyle(style);\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const rect = useNodeBoundingRect(containerRef);\n\n  // 间隔最小单位\n  const interval = max / 5;\n\n  const lineNums = 120;\n  const innerLineNums = 180;\n\n  const canvasWidth = (rect?.width ?? 0) * 2;\n  const canvasHeight = (rect?.height ?? 0) * 2;\n\n  // 根据长宽最短的进行计算半径\n  const radius = Math.min(canvasWidth, canvasHeight) / 2;\n\n  const colorArr = [\n    theme.colors.primary400[0],\n    theme.colors.primary300[0],\n    theme.colors.primary200[0],\n    theme.colors.primary100[0],\n  ];\n\n  const lineColor = [theme.colors.primary400[0], theme.colors.primary50[1], theme.colors.primary100[0]];\n\n  const numberColors = [\n    theme.colors.primary400,\n    theme.colors.primary400,\n    theme.colors.primary300,\n    theme.colors.primary200,\n    theme.colors.primary50,\n    theme.colors.primary100,\n  ];\n\n  const gradientColor = useCallback((startColor, endColor, step) => {\n    const startRGB = color.rgb(startColor).array(); //转换为rgb数组模式\n    const startR = startRGB[0];\n    const startG = startRGB[1];\n    const startB = startRGB[2];\n\n    const endRGB = color.rgb(endColor).array();\n    const endR = endRGB[0];\n    const endG = endRGB[1];\n    const endB = endRGB[2];\n\n    const sR = (+endR - +startR) / step; //总差值\n    const sG = (+endG - +startG) / step;\n    const sB = (+endB - +startB) / step;\n\n    const colorArr: any[] = [];\n\n    for (let i = 0; i < step; i++) {\n      //计算每一步的hex值\n      const hex = color.hsl(\n        'rgb(' +\n          parseInt(+sR * i + +startR + '') +\n          ',' +\n          parseInt(+sG * i + +startG + '') +\n          ',' +\n          parseInt(+sB * i + +startB + '') +\n          ')'\n      );\n      colorArr.push(hex);\n    }\n    return colorArr;\n  }, []);\n\n  let colorList: any[] = [];\n  for (let i = 0; i < colorArr.length - 1; i++) {\n    const next = colorArr[i + 1];\n    const cur = colorArr[i];\n    const colorStep = 40;\n    colorList = colorList.concat(gradientColor(cur, next, colorStep));\n  }\n\n  const splitLine = useCallback(\n    (radius: number) => {\n      const ctx = canvasRef.current?.getContext('2d');\n      if (!ctx) return;\n\n      ctx.save();\n\n      for (let i = 0; i <= 5; i++) {\n        ctx.beginPath();\n        ctx.lineWidth = 4;\n        const index = Math.ceil((i / 5) * 119);\n        ctx.strokeStyle = colorList[index];\n        ctx.moveTo(radius * 0.9, 0);\n        ctx.lineTo(radius * 0.9 + 26, 0);\n\n        ctx.stroke();\n        ctx.rotate(((Math.PI * 12) / (9 * 50)) * 10);\n        ctx.closePath();\n      }\n      ctx.restore();\n    },\n    [colorList]\n  );\n\n  const drawTick = useCallback(\n    (radius: number) => {\n      const ctx = canvasRef.current?.getContext('2d');\n      if (!ctx) return;\n\n      ctx.save();\n      for (let i = 0; i <= lineNums; i++) {\n        ctx.beginPath();\n        ctx.lineWidth = 4;\n        ctx.strokeStyle = colorList[i];\n\n        ctx.moveTo(radius * 0.9, 0);\n        ctx.lineTo(radius * 0.9 + 16, 0);\n        ctx.stroke();\n        //每个点的弧度,360°弧度为2π,即旋转弧度为 2π / 75\n        ctx.rotate((2 * Math.PI) / innerLineNums);\n        ctx.closePath();\n      }\n      ctx.restore();\n    },\n    [colorList]\n  );\n\n  const drawNumber = useCallback(\n    (radius: number) => {\n      const ctx = canvasRef.current?.getContext('2d');\n      if (!ctx) return;\n      ctx.save();\n\n      ctx.rotate(Math.PI / 2);\n      for (let i = 0; i <= 5; i++) {\n        const gradient = ctx.createLinearGradient(0, 0, 400, 0);\n        gradient.addColorStop(0, numberColors[i][0]);\n        gradient.addColorStop(1, numberColors[i][1]);\n        ctx.fillStyle = gradient;\n        ctx.font = '36px Alibaba PuHuiTi';\n        ctx.textAlign = 'center';\n        ctx.fillText(interval * i + '', 0, -radius * 0.8);\n        ctx.rotate(((Math.PI * 12) / (9 * 50)) * 10);\n      }\n      ctx.restore();\n    },\n    [interval, numberColors]\n  );\n\n  const drawLine = useCallback(\n    (radius: number) => {\n      const ctx = canvasRef.current?.getContext('2d');\n      if (!ctx) return;\n\n      let list: any[] = [];\n      for (let i = 0; i < lineColor.length - 1; i++) {\n        const next = lineColor[i + 1];\n        const cur = lineColor[i];\n        const colorStep = 150;\n        list = list.concat(gradientColor(cur, next, colorStep));\n      }\n\n      //外环渐变线\n      for (let i = 0; i < 300; i++) {\n        ctx.save();\n        ctx.beginPath();\n        ctx.lineWidth = 20;\n        ctx.strokeStyle = list[i];\n\n        ctx.arc(0, 0, (radius * 3) / 4, (60 / 45 / 300) * i * Math.PI, (60 / 45 / 300) * (i + 1.3) * Math.PI);\n        ctx.stroke();\n        ctx.closePath();\n        ctx.restore();\n      }\n    },\n    [gradientColor, lineColor]\n  );\n\n  const drawPointer = useCallback(\n    (value, radius) => {\n      if (!radius) {\n        return;\n      }\n      const ctx = canvasRef.current?.getContext('2d');\n      if (!ctx) return;\n      ctx.save();\n\n      ctx.beginPath();\n      ctx.rotate((((Math.PI * 4) / 3) * value) / max);\n      ctx.moveTo(0, 4);\n      ctx.lineTo(0, -4);\n      ctx.lineTo(radius * 0.9 + 24, 0);\n\n      ctx.fillStyle = '#3DE6FF';\n      ctx.fill();\n      ctx.closePath();\n      ctx.restore();\n    },\n    [max]\n  );\n\n  const drawCenter = useCallback(() => {\n    const ctx = canvasRef.current?.getContext('2d');\n    if (!ctx) return;\n    ctx.save();\n    ctx.beginPath();\n    ctx.rotate(((Math.PI * 12) / (9 * 50)) * 0);\n    ctx.lineWidth = 3;\n    ctx.strokeStyle = '#3DE6FF';\n    ctx.arc(0, 0, 12, 0, 2 * Math.PI);\n    ctx.stroke();\n    ctx.closePath();\n    ctx.beginPath();\n    ctx.fillStyle = '#3DE6FF';\n    ctx.arc(0, 0, 6, 0, 2 * Math.PI);\n    ctx.fill();\n    ctx.closePath();\n    ctx.restore();\n  }, []);\n\n  const drawValue = useCallback(\n    value => {\n      const ctx = canvasRef.current?.getContext('2d');\n      if (!ctx) return;\n      ctx.save();\n      ctx.rotate((210 / 180) * Math.PI);\n      ctx.fillStyle = theme.colors.gray50;\n      ctx.font = '72px Roboto';\n      ctx.textAlign = 'center';\n      ctx.fillText(value + '', 0, 120);\n      ctx.restore();\n    },\n    [theme.colors.gray50]\n  );\n\n  const resizeInit = useCallback(() => {\n    const ctx = canvasRef.current?.getContext('2d');\n    if (!ctx) return;\n    ctx.save();\n    ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n    ctx.translate(canvasWidth / 2, canvasHeight / 2);\n\n    ctx.rotate((150 * Math.PI) / 180);\n    drawTick(radius);\n    splitLine(radius);\n    drawNumber(radius);\n    drawLine(radius);\n    drawCenter();\n    drawValue(valueRef.current);\n    drawPointer(valueRef.current, radius);\n    ctx.translate(-canvasWidth / 2, -canvasHeight / 2);\n    ctx.restore();\n  }, [\n    canvasHeight,\n    canvasWidth,\n    drawCenter,\n    drawLine,\n    drawNumber,\n    drawPointer,\n    drawTick,\n    drawValue,\n    radius,\n    splitLine,\n  ]);\n\n  const init = useCallback(() => {\n    if (!radius) {\n      return;\n    }\n    if (valueRef.current !== value) {\n      if (value > valueRef.current) {\n        valueRef.current += 1;\n      }\n      if (value < valueRef.current) {\n        valueRef.current -= 1;\n      }\n\n      resizeInit();\n      requestAnimationFrame(init);\n    } else {\n      resizeInit();\n    }\n  }, [radius, value, resizeInit]);\n\n  useEffect(() => {\n    init();\n  }, [init]);\n\n  return (\n    <div style={modifiedStyle} ref={containerRef}>\n      <canvas\n        ref={canvasRef}\n        height={canvasHeight}\n        width={canvasWidth}\n        style={{ width: modifiedStyle.width, height: modifiedStyle.height }}\n      ></canvas>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego/src/hooks/useBaseBarConfig.ts",
    "content": "import { useMemo } from 'react';\n\nimport { BarSeriesOption } from 'echarts/charts';\n\nimport useTheme from './useTheme';\n\n/**\n * 柱状图的基础配置，如坐标轴样式、文字样式、tooltip样式等\n */\nexport default function useBaseBarConfig(inModal = false) {\n  const theme = useTheme();\n  const option: BarSeriesOption = useMemo(\n    () => ({\n      type: 'bar',\n      label: {\n        show: true,\n        ...theme.typography[inModal ? 'p0' : 'p2'],\n        color: theme.colors.gray100,\n      },\n    }),\n    [inModal, theme.colors.gray100, theme.typography]\n  );\n\n  return option;\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useBaseChartConfig.ts",
    "content": "import { useMemo } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport {\n  GridComponentOption,\n  LegendComponentOption,\n  SingleAxisComponentOption,\n  TooltipComponentOption,\n} from 'echarts/components';\n\nimport useTheme from './useTheme';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<\n  TooltipComponentOption | GridComponentOption | LegendComponentOption | SingleAxisComponentOption\n>;\n\n/**\n * 柱状图的基础配置，如坐标轴样式、文字样式、tooltip样式等\n */\nexport default function useBaseChartConfig(inModal = false, unit?: string) {\n  const theme = useTheme();\n  const option: ECOption = useMemo(\n    () => ({\n      legend: {\n        top: 0,\n        right: '1%',\n        itemWidth: inModal ? 16 : 12,\n        itemHeight: inModal ? 16 : 12,\n        textStyle: {\n          color: theme.colors.gray100,\n          ...theme.typography[inModal ? 'p0' : 'p2'],\n        },\n      },\n      grid: {\n        left: '1%',\n        right: '1%',\n        bottom: 10,\n        containLabel: true,\n      },\n      tooltip: {\n        trigger: 'axis',\n        className: 'echarts-tooltip',\n        padding: 0,\n        borderWidth: 0,\n        backgroundColor: 'transparent',\n        axisPointer: {\n          lineStyle: {\n            color: theme.colors.assist200,\n            opacity: 0.5,\n          },\n          shadowStyle: {},\n          crossStyle: {},\n        },\n        formatter: function (params: any) {\n          const strs = params\n            .filter((i: any) => i.seriesName && !i.seriesName.includes('series'))\n            .map((item: any) => {\n              const value =\n                item.data && typeof item.data === 'object' && 'value' in item.data ? item?.data?.value : item?.data;\n              return `\n                <div style=\"display: flex; align-items: center;\">\n                  <div style=\"\n                    width: 7px;\n                    height: 7px;\n                    background: linear-gradient(180deg, ${item?.color?.colorStops?.[0]?.color} 0%, ${item?.color\n                      ?.colorStops?.[1]?.color} 100%);\n                    margin-right: 4px;\n                    border-radius: 7px;\n                  \"></div>\n                  ${item?.seriesName}：${value} ${unit ?? item?.data?.unit ?? ''}\n                </div>\n              `;\n            });\n          return `\n            <div style=\"\n              background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n              border: 1px solid #017AFF;\n              color: #fff;\n              font-size: ${inModal ? '18px' : '14px'};\n              line-height: ${inModal ? '25px' : '22px'};\n              padding: 5px;\n              border-radius: 6px;\n            \">\n              <div>${params?.[0]?.name}</div>\n              ${strs.join('')}\n            </div>\n          `;\n        },\n      },\n      xAxis: {\n        type: 'category',\n        nameLocation: 'end',\n        nameTextStyle: {\n          ...theme.typography[inModal ? 'p0' : 'p2'],\n          color: theme.colors.gray100,\n        },\n        axisLine: {\n          show: false,\n          lineStyle: {\n            width: 1,\n            color: theme.colors.gray200,\n          },\n        },\n        axisTick: {\n          show: false,\n        },\n        axisLabel: {\n          show: true,\n          ...theme.typography[inModal ? 'p0' : 'p2'],\n          color: theme.colors.gray100,\n        },\n      },\n      yAxis: {\n        type: 'value',\n        nameLocation: 'end',\n        nameTextStyle: {\n          ...theme.typography[inModal ? 'p0' : 'p2'],\n          color: theme.colors.gray100,\n        },\n        axisLine: {\n          show: false,\n          lineStyle: {\n            width: 1,\n            color: theme.colors.gray200,\n          },\n        },\n        axisTick: {\n          show: false,\n        },\n        axisLabel: {\n          show: true,\n          ...theme.typography[inModal ? 'p0' : 'p2'],\n          color: theme.colors.gray100,\n        },\n        splitLine: {\n          lineStyle: {\n            width: 1,\n            color: theme.colors.gray200,\n          },\n        },\n      },\n    }),\n    [inModal, theme.colors.assist200, theme.colors.gray100, theme.colors.gray200, theme.typography, unit]\n  );\n\n  return option;\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useBaseLineConfig.ts",
    "content": "import { useMemo } from 'react';\n\nimport { LineSeriesOption } from 'echarts/charts';\n\nimport useTheme from './useTheme';\n\n/**\n * 柱状图的基础配置，如坐标轴样式、文字样式、tooltip样式等\n */\nexport default function useBaseLineConfig(inModal = false) {\n  const theme = useTheme();\n  const option: LineSeriesOption = useMemo(\n    () => ({\n      type: 'line',\n      symbol: 'circle',\n      symbolSize: 8,\n      connectNulls: true,\n      label: {\n        ...theme.typography[inModal ? 'p0' : 'p2'],\n        color: theme.colors.gray100,\n      },\n      lineStyle: {\n        width: 3,\n      },\n    }),\n    [inModal, theme.colors.gray100, theme.typography]\n  );\n\n  return option;\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useBasePieConfig.ts",
    "content": "import { useMemo } from 'react';\n\nimport { PieSeriesOption } from 'echarts/charts';\n\nimport useTheme from './useTheme';\n\n/**\n * 柱状图的基础配置，如坐标轴样式、文字样式、tooltip样式等\n */\nexport default function useBasePieConfig(inModal = false) {\n  const theme = useTheme();\n\n  const option: PieSeriesOption = useMemo(\n    () => ({\n      type: 'pie',\n      label: {\n        ...theme.typography[inModal ? 'p0' : 'p2'],\n        color: theme.colors.gray100,\n      },\n      labelLine: {\n        lineStyle: {\n          color: theme.colors.gray50,\n          width: 1.35,\n        },\n      },\n    }),\n    [inModal, theme.colors.gray100, theme.colors.gray50, theme.typography]\n  );\n\n  return option;\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useChartLoop.ts",
    "content": "import { ForwardedRef, useEffect, useRef, useState } from 'react';\n\nimport type ReactEcharts from 'echarts-for-react';\n\nimport useEchartsRef from './useEchartsRef';\nimport { useRAF } from './useRAF';\n\nexport default function useChartLoop(\n  ref: ForwardedRef<ReactEcharts>,\n  data: any[] = [],\n  autoLoop = false,\n  duration = 2000,\n  seriesIndex = 0\n) {\n  // 用来控制当前轮播到哪个\n  const [currentIndex, setCurrentIndex] = useState(-1);\n  // 图表实例，轮播的本质是用 currentIndex 来驱动图表实例去 dispatchAction\n  const { ref: echartsRef, getInstance } = useEchartsRef(ref);\n\n  const { raf } = useRAF();\n  const timer = useRef<symbol>();\n\n  const length = data?.length ?? 0;\n  const current = data[currentIndex];\n  const currentName = typeof current === 'string' ? current : current?.name;\n\n  useEffect(() => {\n    // 开启自动轮播，同时echarts有示例，同时有数据的情况下，才开始\n    if (autoLoop && (typeof echartsRef === 'function' || echartsRef.current) && length > 1) {\n      timer.current = raf.setInterval(() => {\n        setCurrentIndex(index => (index >= length - 1 ? 0 : index + 1));\n      }, duration);\n    } else {\n      setCurrentIndex(-1);\n      timer.current && raf.clearInterval(timer.current);\n    }\n    return () => {\n      timer.current && raf.clearInterval(timer.current);\n    };\n  }, [autoLoop, duration, raf, length, echartsRef]);\n\n  // 用 currentIndex 来驱动图表变化\n  useEffect(() => {\n    const instance = getInstance();\n    if (!instance) {\n      return;\n    }\n    // 取消高亮效果\n    instance.dispatchAction({\n      type: 'downplay',\n    });\n    // 先把提示框都隐藏\n    instance.dispatchAction({\n      type: 'hideTip',\n    });\n\n    if (currentIndex > -1) {\n      // 再根据 currentIndex 显示对应的提示框\n      instance.dispatchAction({\n        type: 'showTip',\n        seriesIndex,\n        dataIndex: currentIndex,\n      });\n\n      currentName &&\n        instance.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }\n  }, [currentIndex, currentName, getInstance, seriesIndex]);\n\n  return echartsRef;\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useEchartsRef.ts",
    "content": "import { ForwardedRef, MutableRefObject, useCallback, useRef } from 'react';\n\nimport { ECharts } from 'echarts';\nimport type ReactEcharts from 'echarts-for-react';\nimport EChartsReact from 'echarts-for-react';\n\nexport default function useEchartsRef(ref: ForwardedRef<ReactEcharts> | ((ref: ReactEcharts | null) => ECharts)) {\n  const _echartsRef = useRef<ReactEcharts>(null);\n\n  const echartsRef = ref\n    ? (ref as MutableRefObject<ReactEcharts> | ((ref: ReactEcharts | null) => ECharts))\n    : _echartsRef;\n  const currentRef = useRef<EChartsReact | null>(typeof echartsRef !== 'function' ? echartsRef.current : null);\n\n  // 如果 ref 是函数则执行\n  const handleEchartsRef = useCallback((ref: ReactEcharts) => {\n    // 执行传入的 ref 函数\n    typeof echartsRef === 'function' && echartsRef(ref);\n    if (!ref) {\n      return;\n    }\n    // 设置当前图表实例\n    currentRef.current = ref;\n  }, []);\n\n  const _ref = (typeof echartsRef === 'function' ? handleEchartsRef : echartsRef) as MutableRefObject<ReactEcharts>;\n\n  // 获得图表实例的方法\n  const getInstance = useCallback(() => _ref.current?.getEchartsInstance(), []);\n\n  return {\n    ref: _ref,\n    getInstance,\n  };\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useNodeBoundingRect.ts",
    "content": "import React, { useEffect } from 'react';\n\nexport default function useNodeBoundingRect(target: React.RefObject<HTMLDivElement>) {\n  const [rect, setRect] = React.useState<any>(null);\n\n  useEffect(() => {\n    const el = target?.current;\n    if (!el) return;\n\n    const resizeObserver = new ResizeObserver(entries => {\n      setRect(entries[0].contentRect);\n    });\n\n    resizeObserver.observe(el);\n\n    return () => {\n      resizeObserver.disconnect();\n    };\n  }, [target]);\n\n  return rect || {};\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useRAF.ts",
    "content": "import { useMemo } from 'react';\n\nimport RAF from '../utils/RAF';\n\nexport function useRAF() {\n  const raf = useMemo(() => {\n    return new RAF();\n  }, []);\n  return { raf };\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useStyle.ts",
    "content": "import { CSSProperties, useMemo } from 'react';\n\nexport default function useStyle(style: CSSProperties = {}) {\n  const modifiedStyle: CSSProperties = useMemo(\n    () => ({\n      position: 'relative',\n      width: '100%',\n      height: '100%',\n      ...style,\n    }),\n    [style]\n  );\n  return { style: modifiedStyle };\n}\n"
  },
  {
    "path": "packages/lego/src/hooks/useTheme.ts",
    "content": "import { useContext } from 'react';\n\nimport { ThemeContext } from '../context/ThemeContext';\n\nexport default function useTheme() {\n  const theme = useContext(ThemeContext);\n\n  return theme;\n}\n"
  },
  {
    "path": "packages/lego/src/horizontal-bar/index.md",
    "content": "---\ntitle: 条形图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n---\n\n# 条形图\n\n## API\n\n| 属性       | 必填    | 说明                | 类型                                                        | 默认值   |\n| ---------- | ------- | ------------------- | ----------------------------------------------------------- | -------- |\n| unit       | `false` | 单位                | `string`                                                    |          |\n| max        | `true`  | 最大值              | `number`                                                    |          |\n| seriesData | `true`  | 图表数据            | `{ name: string; data: { name: string; value: number }[] }` |          |\n| style      | `false` | 自定义样式          | `CSSProperties`                                             |          |\n| autoLoop   | `false` | 控制是否自动轮播    | `boolean`                                                   |          |\n| duration   | `false` | 自动轮播的时长      | `number`                                                    | `2000`   |\n| config     | `false` | 自定义 Echarts 配置 | `ECOption`                                                  |          |\n| inModal    | `false` | 是否在弹窗内显示    | `boolean`                                                   | `false`  |\n| onEvents   | `false` | 图表交互事件        | `Record<string, (params?: any) => void>`                    |          |\n| renderer   | `false` | 图表渲染器          | `canvas \\| svg`                                             | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/HorizontalBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 - 修改图表配置项\n\n<code src=\"../../example/HorizontalBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 自动轮播\n\n<code src=\"../../example/HorizontalBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (轮播两次后停止)\n\n<code src=\"../../example/HorizontalBarDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (弹窗)\n\n<code src=\"../../example/HorizontalBarDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (手动控制图表轮播)\n\n<code src=\"../../example//HorizontalBarDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (SVG 渲染器)\n\n<code src=\"../../example//HorizontalBarDemo/demo7.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/horizontal-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  PictorialBarChart, // 系列类型的定义后缀都为 SeriesOption\n  PictorialBarSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  SingleAxisComponent,\n  SingleAxisComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { TooltipOption, XAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<\n  PictorialBarSeriesOption | TooltipComponentOption | GridComponentOption | SingleAxisComponentOption\n>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, SingleAxisComponent, PictorialBarChart, CanvasRenderer, SVGRenderer]);\n\nexport interface HorizontalBarProps {\n  unit?: string;\n  max: number;\n  seriesData: {\n    name: string;\n    data: { name: string; value: number | string }[];\n  };\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 水平条形图，对应figma柱状图5\n */\nexport default forwardRef<ReactEcharts, HorizontalBarProps>(\n  ({ unit, max, seriesData, style, autoLoop, duration = 2000, config, inModal = false, onEvents, renderer }, ref) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const echartsRef = useChartLoop(ref, seriesData.data, autoLoop, duration);\n\n    const option = merge(\n      {\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n          top: seriesData.name ? 20 : 0,\n          left: '10%',\n          right: '10%',\n        },\n        tooltip: {\n          ...baseChartConfig.tooltip,\n          axisPointer: {\n            ...(baseChartConfig.tooltip as TooltipOption).axisPointer,\n            type: 'shadow',\n          },\n          formatter: function (params: any) {\n            const str = `\n            <div style=\"display: flex; align-items: center;\">\n              <div style=\"\n                width: 7px;\n                height: 7px;\n                background: linear-gradient(180deg, ${params[0]?.color?.colorStops?.[0]?.color} 0%, ${params[0]?.color\n                  ?.colorStops?.[1]?.color} 100%);\n                margin-right: 4px;\n                border-radius: 7px;\n              \"></div>\n              ${params[0]?.seriesName}：${params[0]?.data?.value || params[0]?.data} ${\n                unit ?? params[0]?.data?.unit ?? ''\n              }\n            </div>\n          `;\n\n            return `\n                <div style=\"\n                  background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n                  border: 1px solid #017AFF;\n                  color: #fff;\n                  font-size: ${inModal ? '18px' : '14px'};\n                  line-height: ${inModal ? '25px' : '22px'};\n                  padding: 5px;\n                  border-radius: 6px;\n                \">\n                  <div>${params[0]?.name}</div>\n                  ${str}\n                </div>\n              `;\n          },\n        },\n        xAxis: {\n          max,\n          name: unit,\n          nameLocation: 'end',\n          nameTextStyle: {\n            ...theme.typography[inModal ? 'p0' : 'p2'],\n            color: theme.colors.gray100,\n          },\n          splitLine: {\n            show: false,\n          },\n          axisLine: {\n            ...(baseChartConfig.xAxis as XAXisOption).axisLine,\n            show: true,\n          },\n          axisLabel: {\n            ...theme.typography[inModal ? 'p0' : 'p2'],\n            show: true,\n            color: theme.colors.gray100,\n          },\n          axisTick: {\n            show: true,\n          },\n        },\n        yAxis: [\n          {\n            type: 'category',\n            data: seriesData.data.map(item => item.name),\n            axisLine: {\n              show: false,\n            },\n            axisTick: {\n              show: false,\n            },\n            axisLabel: {\n              show: false,\n            },\n            inverse: true,\n          },\n        ],\n        series: [\n          {\n            name: seriesData.name,\n            type: 'pictorialBar',\n            silent: true,\n            itemStyle: {\n              color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [\n                { offset: 0, color: '#3FA4FF' },\n                { offset: 1, color: '#60F5FF' },\n              ]),\n            },\n            label: {\n              ...theme.typography[inModal ? 'p0' : 'p2'],\n              color: theme.colors.gray100,\n              formatter: '{b}',\n              position: 'left',\n              distance: 20, // 向右偏移位置\n              show: true,\n            },\n            symbolRepeat: 'fixed',\n            symbolMargin: 1,\n            symbol: 'rect',\n            symbolClip: true,\n            symbolSize: [3, 8],\n            symbolPosition: 'start',\n            symbolBoundingData: max * 0.96,\n            data: seriesData.data,\n            z: 3,\n            animationEasing: 'elasticOut',\n          },\n          {\n            name: seriesData.name,\n            type: 'pictorialBar',\n            itemStyle: {\n              color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [\n                { offset: 0, color: '#0F2623' },\n                { offset: 1, color: '#3BFFBA' },\n              ]),\n              opacity: 0.2,\n            },\n            symbolRepeat: 'fixed',\n            symbolMargin: 1,\n            symbol: 'rect',\n            symbolClip: true,\n            symbolSize: [3, 8],\n            symbolPosition: 'start',\n            symbolBoundingData: max * 0.96,\n            data: seriesData.data.map(() => max),\n            z: 2,\n            animationEasing: 'elasticOut',\n          },\n          {\n            name: seriesData.name,\n            type: 'pictorialBar',\n            itemStyle: {\n              color: 'rgba(9, 63, 160, 0.57)',\n            },\n            symbol: 'path://M 0 0 L 8 0 C 8 0 8 1 7.5 1 L -1 1 C -1 1 -1 0 -0.5 0',\n            symbolSize: ['102%', 24],\n            symbolOffset: ['-3%', 0],\n            symbolBoundingData: max,\n            data: seriesData.data.map(() => max),\n            z: 1,\n            animation: false,\n          },\n        ],\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={echartsRef}\n        echarts={echarts}\n        option={option}\n        style={style}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/img-line/index.md",
    "content": "---\ntitle: 带图片的折线图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 折线图\n---\n\n# 带图片的折线图\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| xAxisData | `true` | x 轴数据 | `string[]` |  |\n| yAxis | `true` | y 轴配置 | `{ name: string }[]` |  |\n| seriesData | `true` | 图表数据 | `{ name: string; data: number[]; yAxisIndex: number }[]` |  |\n| unit | `false` | 单位 | `string` |  |\n| img | `false` | 自定义图片 | `string` |  |\n| imgStyle | `false` | 自定义图片样式 | `CSSProperties` |  |\n| style | `false` | 自定义样式 | `CSSProperties` |  |\n| autoLoop | `false` | 控制是否自动轮播 | `boolean` |  |\n| duration | `false` | 自动轮播的时长 | `number` | `2000` |\n| config | `false` | 自定义 Echarts 配置 | `ECOption` |  |\n| inModal | `false` | 是否在弹窗内显示 | `boolean` | `false` |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean` | `true` |\n| lineColors | `false` | 自定义颜色 | `[string, string][]` |  |\n| onEvents | `false` | 图表交互事件 | `Record<string, (params?: any) => void>` |  |\n| renderer | `false` | 图表渲染器 | `canvas \\| svg` | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/ImgLineDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 自动轮播效果\n\n<code src=\"../../example/ImgLineDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (轮播两次后停止)\n\n<code src=\"../../example/ImgLineDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (弹窗)\n\n<code src=\"../../example/ImgLineDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (手动控制图表轮播)\n\n<code src=\"../../example/ImgLineDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (SVG 渲染器)\n\n<code src=\"../../example/ImgLineDemo/demo6.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/img-line/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useMemo } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport Color from 'color';\nimport ReactEcharts from 'echarts-for-react';\nimport { LineChart, LineSeriesOption } from 'echarts/charts';\nimport { GridComponent, GridComponentOption, TooltipComponent, TooltipComponentOption } from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useBaseLineConfig from '../hooks/useBaseLineConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\n\ntype ECOption = echarts.ComposeOption<LineSeriesOption | TooltipComponentOption | GridComponentOption>;\n\necharts.use([TooltipComponent, GridComponent, LineChart, CanvasRenderer, SVGRenderer]);\n\nexport interface ImgLineProps {\n  xAxisData: string[];\n  yAxis: { name: string }[];\n  seriesData: {\n    name: string;\n    data: (number | string | null)[];\n    yAxisIndex: number;\n  }[];\n  unit?: string;\n  img?: string;\n  imgStyle?: CSSProperties;\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  lineColors?: [string, string][];\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/** 带图片的折线图-对应Figma折线图2 */\nexport default forwardRef<ReactEcharts, ImgLineProps>(\n  (\n    {\n      xAxisData,\n      yAxis,\n      seriesData,\n      unit = yAxis[0]?.name,\n      img,\n      imgStyle,\n      style,\n      autoLoop,\n      duration = 2000,\n      config,\n      inModal = false,\n      showYAxisLine = true,\n      lineColors = [],\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const baseLineConfig = useBaseLineConfig(inModal);\n\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n    const { style: modifiedStyle } = useStyle(style);\n\n    const baseColors =\n      lineColors?.length > 0 && lineColors?.length >= seriesData?.length\n        ? lineColors\n        : [\n            theme.colors.primary200,\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const getColorsByIndex = (index: number) => {\n      return Color(baseColors[index][0]).alpha(0.85).string();\n    };\n\n    const getAreaColorsByIndex = (index: number) => {\n      const _color = [Color(baseColors[index][1]).alpha(0).string(), Color(baseColors[index][0]).alpha(0.4).string()];\n      return createLinearGradient(_color);\n    };\n\n    const option = merge(\n      {\n        color: colors,\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n          left: '3%',\n          right: '3%',\n        },\n        tooltip: {\n          ...baseChartConfig.tooltip,\n        },\n        xAxis: {\n          type: 'category',\n          ...baseChartConfig.xAxis,\n          data: xAxisData,\n        },\n        yAxis: yAxis.map((item, index) => ({\n          ...baseChartConfig.yAxis,\n          ...item,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n          nameTextStyle: {\n            ...(baseChartConfig.yAxis as YAXisOption).nameTextStyle,\n            padding: index === 0 ? [0, 40, 0, 0] : [0, 0, 0, 40],\n          },\n          splitLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).splitLine,\n            show: index === 0 ? true : false,\n          },\n        })),\n        series: seriesData.map((item, index) => ({\n          ...item,\n          ...baseLineConfig,\n          smooth: true,\n          lineStyle: {\n            width: 3,\n            shadowBlur: 11,\n            shadowColor: getColorsByIndex(index),\n          },\n          itemStyle: {\n            borderColor: colors[index],\n            borderWidth: 2,\n          },\n          emphasis: {\n            lineStyle: {\n              shadowBlur: 11,\n              shadowColor: getColorsByIndex(index),\n            },\n          },\n          areaStyle: {\n            color: getAreaColorsByIndex(index),\n            shadowColor: getColorsByIndex(index),\n          },\n        })),\n      },\n      config\n    );\n\n    return (\n      <div style={modifiedStyle}>\n        {img && (\n          <img\n            src={img}\n            style={{\n              position: 'absolute',\n              bottom: 33,\n              left: '3.6%',\n              width: '94%',\n              ...imgStyle,\n            }}\n          />\n        )}\n        <ReactEcharts\n          ref={echartsRef}\n          style={{ width: modifiedStyle.width, height: modifiedStyle.height }}\n          echarts={echarts}\n          option={option}\n          onEvents={onEvents}\n          opts={{ renderer }}\n        />\n      </div>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/img-pie/index.less",
    "content": "@prefix: .td-lego-img-pie;\n\n@{prefix}-image {\n  position: absolute;\n  top: 50%;\n  left: 49.5%;\n  transform: translate(-50%, -50%);\n}\n\n@{prefix}-bg {\n  width: 252px;\n  animation: bgLoading 10s linear infinite;\n}\n\n@keyframes bgLoading {\n  /*以百分比来规定改变发生的时间 也可以通过\"from\"和\"to\",等价于0% 和 100%*/\n  0% {\n    /*rotate(2D旋转) scale(放大或者缩小) translate(移动) skew(翻转)*/\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/img-pie/index.md",
    "content": "---\ntitle: 带图片的饼图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 饼图\n---\n\n# 带图片的饼图\n\n## API\n\n| 属性      | 必填    | 说明                | 类型                                     | 默认值   |\n| --------- | ------- | ------------------- | ---------------------------------------- | -------- |\n| data      | `true`  | 图表数据            | `{ name: string; value: string }[]`      |          |\n| style     | `false` | 自定义样式          | `CSSProperties`                          |          |\n| imgStyle  | `false` | 图片自定义样式      | `CSSProperties`                          |          |\n| autoLoop  | `false` | 控制是否自动轮播    | `boolean`                                |          |\n| config    | `false` | 自定义 Echarts 配置 | `ECOption`                               |          |\n| pieColors | `false` | 自定义颜色          | `[string, string][]`                     |          |\n| onEvents  | `false` | 图表交互事件        | `Record<string, (params?: any) => void>` |          |\n| renderer  | `false` | 图表渲染器          | `canvas \\| svg`                          | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/ImgPieDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 (手动控制图表轮播)\n\n<code src=\"../../example//ImgPieDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (SVG 渲染器)\n\n<code src=\"../../example//ImgPieDemo/demo3.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/img-pie/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport { PieChart, PieSeriesOption } from 'echarts/charts';\nimport { GraphicComponent, GraphicComponentOption, TooltipComponent, TooltipComponentOption } from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { merge } from 'lodash-es';\n\nimport bg from '../assets/bg.png';\nimport imgPieGraphic from '../assets/img_pie_graphic.png';\nimport imgPieBg from '../assets/pie.png';\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useBasePieConfig from '../hooks/useBasePieConfig';\nimport useEchartsRef from '../hooks/useEchartsRef';\nimport useNodeBoundingRect from '../hooks/useNodeBoundingRect';\nimport { useRAF } from '../hooks/useRAF';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\nimport './index.less';\n\nconst prefixName = 'td-lego-img-pie';\n\ntype ECOption = echarts.ComposeOption<PieSeriesOption | TooltipComponentOption | GraphicComponentOption>;\n\necharts.use([TooltipComponent, PieChart, GraphicComponent, CanvasRenderer, SVGRenderer]);\n\nexport interface ImgPieProps {\n  data: { name: string; value: string | number }[];\n  style?: CSSProperties;\n  imgStyle?: CSSProperties;\n  autoLoop?: boolean;\n  config?: ECOption;\n  pieColors?: [string, string][];\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/** 带图片的饼图-对应Figma饼图3 */\nexport default forwardRef<ReactEcharts, ImgPieProps>(\n  ({ data = [], style, imgStyle, autoLoop = false, config, pieColors = [], onEvents, renderer = 'canvas' }, ref) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig();\n    const basePieConfig = useBasePieConfig();\n    const { style: modifiedStyle } = useStyle(style);\n    const { raf } = useRAF();\n    // 数据长度，轮播时使用\n    const length = data.length;\n\n    // 记录轮播的位置，图例不显示的时候使用\n    const activeLegendsIndex = useRef(0);\n    const { ref: echartsRef, getInstance } = useEchartsRef(ref);\n    const timer = useRef<any>();\n\n    // 图例选中的下标，图例不选中时不轮播\n    const [activeLegends, setActiveLegends] = useState<number[]>([]);\n    const [currentIndex, setCurrentIndex] = useState(-1);\n\n    const divRef = useRef<HTMLDivElement>(null);\n    const rect = useNodeBoundingRect(divRef);\n    const { width = 0, height = 0 } = rect;\n\n    // 容器宽高比例\n    const proportion = height > 0 ? width / height : 0;\n\n    // 初始化轮播的下标\n    useEffect(() => {\n      const arr = new Array(length).fill(0).map((_, i) => i);\n      setActiveLegends(arr);\n    }, [length]);\n\n    //定时器\n    useEffect(() => {\n      if (!autoLoop) {\n        return;\n      }\n      requestAnimationFrame(() => {\n        if (echartsRef?.current && activeLegends?.length > 1) {\n          timer.current = raf.setInterval(() => {\n            setCurrentIndex(activeLegends[activeLegendsIndex.current]);\n            if (activeLegendsIndex.current < activeLegends.length - 1) {\n              activeLegendsIndex.current++;\n            } else {\n              activeLegendsIndex.current = 0;\n            }\n          }, 2000);\n        }\n      });\n      return () => {\n        raf.clearInterval(timer.current);\n      };\n    }, [activeLegends, autoLoop, activeLegends.length, raf, echartsRef]);\n\n    //currentIndex 驱动数据变化\n    useEffect(() => {\n      const instance = getInstance();\n      if (currentIndex === length) {\n        setCurrentIndex(0);\n      }\n      const currentName = data[currentIndex]?.name;\n      instance?.dispatchAction({\n        type: 'downplay',\n      });\n\n      currentName &&\n        instance?.dispatchAction({\n          type: 'highlight',\n          name: currentName,\n        });\n    }, [currentIndex, length, echartsRef, data, getInstance]);\n\n    // 记录图例的显示下标\n    const legendselectchanged = useCallback(({ selected }: { selected: { [name: string]: boolean } }) => {\n      const selectArr: number[] = [];\n      Object.keys(selected).forEach((key, index) => {\n        if (selected[key]) {\n          selectArr.push(index);\n        }\n      });\n      setActiveLegends(selectArr);\n    }, []);\n\n    const baseColors =\n      pieColors?.length > 0 && pieColors?.length >= data?.length\n        ? pieColors\n        : [\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary200,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const total = Math.round(\n      data\n        .map(item => +item.value)\n        .reduce((value: number, total: number) => {\n          return value + total;\n        }, 0)\n    );\n\n    const gapValue = Number(total) * 0.01;\n\n    const seriesData: any[] = [];\n    if (data.length == 1) {\n      seriesData.push(data[0]);\n    } else {\n      data.forEach(ele => {\n        seriesData.push(\n          {\n            value: +ele.value,\n            name: ele.name,\n            percent: (+ele.value / total) * 100,\n          },\n          {\n            value: gapValue,\n            name: '',\n            itemStyle: {\n              color: 'rgba(0, 0, 0, 0)',\n              borderColor: 'rgba(0, 0, 0, 0)',\n              borderWidth: 0,\n            },\n          }\n        );\n      });\n    }\n\n    const option = merge(\n      {\n        color: colors,\n        legend: {\n          ...baseChartConfig.legend,\n          orient: 'horizontal',\n          data: seriesData.filter(i => i.name),\n        },\n        graphic: {\n          elements: [\n            {\n              type: 'image',\n              left: 'center',\n              style: {\n                image: imgPieGraphic,\n                width: height / 5,\n                height: height / 5,\n              },\n              top: 'center',\n            },\n          ],\n        },\n        series: {\n          ...basePieConfig,\n          left: 0,\n          radius: ['35%', '55%'],\n          hoverAnimation: false,\n          silent: autoLoop,\n          data: seriesData,\n          legendHoverLink: false,\n          labelLine: {\n            show: false,\n          },\n          label: {\n            show: seriesData.length === 1,\n            position: 'center',\n            formatter: ({ name }: { name: string }) => {\n              if (!name) return;\n              return `{a|${name}}{b|\\n${Number(seriesData.find(item => item.name === name)?.percent).toFixed(1)}%}`;\n            },\n            rich: {\n              a: {\n                ...theme.typography.p2,\n                color: theme.colors.gray100,\n              },\n              b: {\n                ...theme.typography.h4,\n                color: theme.colors.gray50,\n              },\n            },\n          },\n          emphasis: {\n            scale: true,\n            scaleSize: 10,\n            itemStyle: {\n              shadowBlur: 20,\n              shadowColor: 'rgba(255, 255, 255, 0.6)',\n            },\n            label: {\n              show: true,\n            },\n          },\n        },\n      },\n      config\n    );\n\n    return (\n      <div\n        style={{\n          width: '95%',\n          height: '90%',\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'center',\n          ...modifiedStyle,\n        }}\n        ref={divRef}\n      >\n        <img\n          src={imgPieBg}\n          className={`${prefixName}-image`}\n          style={{\n            ...imgStyle,\n            width: proportion > 1.25 ? 'auto' : '90%',\n            height: proportion > 1.25 ? '90%' : 'auto',\n          }}\n        />\n        <div\n          className={`${prefixName}-image`}\n          style={{\n            ...imgStyle,\n          }}\n        >\n          <img src={bg} className={`${prefixName}-bg`} />\n        </div>\n        <ReactEcharts\n          ref={echartsRef}\n          style={{ width: modifiedStyle.width, height: modifiedStyle.height }}\n          echarts={echarts}\n          option={option}\n          onEvents={{\n            legendselectchanged: legendselectchanged,\n            ...onEvents,\n          }}\n          opts={{ renderer }}\n        />\n        ;\n      </div>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/img-rose-pie/index.less",
    "content": "@prefix: .td-lego-img-rose-pie;\n\n@{prefix}-bg {\n  animation: innerLoading 8s linear infinite;\n}\n@{prefix}-outer-image {\n  animation: outerLoading 5s linear infinite;\n}\n@{prefix}-inner-image {\n  animation: innerLoading 3s linear infinite;\n}\n@keyframes innerLoading {\n  /*以百分比来规定改变发生的时间 也可以通过\"from\"和\"to\",等价于0% 和 100%*/\n  0% {\n    /*rotate(2D旋转) scale(放大或者缩小) translate(移动) skew(翻转)*/\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes outerLoading {\n  /*以百分比来规定改变发生的时间 也可以通过\"from\"和\"to\",等价于0% 和 100%*/\n  0% {\n    /*rotate(2D旋转) scale(放大或者缩小) translate(移动) skew(翻转)*/\n    transform: rotate(360deg);\n  }\n  100% {\n    transform: rotate(0deg);\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/img-rose-pie/index.md",
    "content": "---\ntitle: 带图片的玫瑰图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 饼图\n---\n\n# 带图片的玫瑰图\n\n## API\n\n| 属性       | 必填    | 说明                | 类型                                     | 默认值   |\n| ---------- | ------- | ------------------- | ---------------------------------------- | -------- |\n| seriesData | `true`  | 图表数据            | `{ name: string; value: string }[]`      |          |\n| style      | `false` | 自定义样式          | `CSSProperties`                          |          |\n| imgStyle   | `false` | 图片自定义样式      | `CSSProperties`                          |          |\n| autoLoop   | `false` | 控制是否自动轮播    | `boolean`                                |          |\n| duration   | `false` | 自动轮播的时长      | `number`                                 | `2000`   |\n| config     | `false` | 自定义 Echarts 配置 | `ECOption`                               |          |\n| pieColors  | `false` | 自定义颜色          | `[string, string][]`                     |          |\n| onEvents   | `false` | 图表交互事件        | `Record<string, (params?: any) => void>` |          |\n| renderer   | `false` | 图表渲染器          | `canvas \\| svg`                          | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/ImgRosePieDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 (SVG 渲染器)\n\n<code src=\"../../example/ImgRosePieDemo/demo2.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/img-rose-pie/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useCallback } from 'react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport { PieChart, PieSeriesOption } from 'echarts/charts';\nimport { GraphicComponent, GraphicComponentOption, TooltipComponent, TooltipComponentOption } from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { merge } from 'lodash-es';\n\nimport bg from '../assets/bg.png';\nimport imgPieGraphic from '../assets/img_pie_graphic.png';\nimport imgRosePieGraphic from '../assets/img_rose_pie_graphic.png';\nimport innerBg from '../assets/inner.png';\nimport outerBg from '../assets/outer.png';\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useBasePieConfig from '../hooks/useBasePieConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useNodeBoundingRect from '../hooks/useNodeBoundingRect';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\nimport './index.less';\n\nconst prefixName = 'td-lego-img-rose-pie';\n\ntype ECOption = echarts.ComposeOption<PieSeriesOption | TooltipComponentOption | GraphicComponentOption>;\n\necharts.use([TooltipComponent, PieChart, GraphicComponent, CanvasRenderer, SVGRenderer]);\n\nexport interface ImgRosePieProps {\n  seriesData: {\n    name: string;\n    value: string | number;\n    percent?: number | string;\n  }[];\n  style?: CSSProperties;\n  imgStyle?: CSSProperties;\n  autoLoop?: boolean;\n  config?: ECOption;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  pieColors?: [string, string][];\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/** 带图片的玫瑰图-对应Figma饼图5 */\nexport default forwardRef<ReactEcharts, ImgRosePieProps>(\n  (\n    {\n      seriesData,\n      style,\n      imgStyle,\n      config,\n      pieColors = [],\n      duration = 2000,\n      autoLoop = false,\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig();\n    const basePieConfig = useBasePieConfig();\n    const { style: modifiedStyle } = useStyle(style);\n\n    // 数据长度，轮播时使用\n    const length = seriesData.length;\n\n    // 图例选中的下标，图例不选中时不轮播\n    const [activeLegends, setActiveLegends] = useState<number[]>([]);\n    const echartsRef = useChartLoop(\n      ref,\n      seriesData.filter((_item, idx) => activeLegends.includes(idx)),\n      autoLoop,\n      duration\n    );\n\n    const divRef = useRef<HTMLDivElement>(null);\n    const rect = useNodeBoundingRect(divRef);\n    const { width = 0, height = 0 } = rect;\n\n    // 容器宽高比例\n    const proportion = height > 0 ? width / height : 0;\n\n    // 初始化轮播的下标\n    useEffect(() => {\n      const arr = new Array(length).fill(0).map((_, i) => i);\n      setActiveLegends(arr);\n    }, [length]);\n\n    // 记录图例改变后的数据\n    const legendSelectChanged = useCallback(({ selected }: { selected: { [name: string]: boolean } }) => {\n      const selectArr: number[] = [];\n      Object.keys(selected).forEach((key, index) => {\n        if (selected[key]) {\n          selectArr.push(index);\n        }\n      });\n      setActiveLegends(selectArr);\n    }, []);\n\n    const baseColors =\n      pieColors?.length > 0 && pieColors?.length >= seriesData?.length\n        ? pieColors\n        : [\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary200,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const option = merge(\n      {\n        color: colors,\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        series: {\n          ...basePieConfig,\n          left: 0,\n          right: 0,\n          center: ['50%', '54%'],\n          radius: ['33%', '62%'],\n          hoverAnimation: false,\n          silent: true,\n          data: seriesData,\n          roseType: 'radius',\n          legendHoverLink: false,\n          zlevel: 3,\n          emphasis: {\n            scale: true,\n            scaleSize: 10,\n            itemStyle: {\n              shadowBlur: 20,\n              shadowColor: 'rgba(255, 255, 255, 0.6)',\n            },\n          },\n          label: {\n            position: 'outside',\n            padding: [10, -50, 50, -40],\n            formatter: '{a|{b}}\\n{a|{d}%}',\n            rich: {\n              a: {\n                ...theme.typography.p2,\n                color: theme.colors.gray50,\n              },\n            },\n          },\n          labelLine: {\n            ...basePieConfig.labelLine,\n            show: true,\n            length2: 40,\n            minTurnAngle: 45,\n          },\n        },\n      },\n      config\n    );\n    const imageStyle: React.CSSProperties = {\n      position: 'absolute',\n      top: '54%',\n      left: '50%',\n      transform: 'translate(-50%, -50%)',\n      width: proportion > 1.67 ? 'auto' : '100%',\n      height: proportion > 1.67 ? '100%' : 'auto',\n      display: 'flex',\n      justifyContent: 'center',\n      alignItems: 'center',\n      ...imgStyle,\n    };\n\n    return (\n      <div\n        style={{\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'start',\n          width: '95%',\n          height: '90%',\n          ...modifiedStyle,\n        }}\n        ref={divRef}\n      >\n        {/* 旋转背景 图 */}\n        <div style={imageStyle}>\n          <img src={bg} className={`${prefixName}-bg`} />\n        </div>\n        <div style={imageStyle}>\n          <img src={outerBg} className={`${prefixName}-outer-image`} />\n        </div>\n        <div style={imageStyle}>\n          <img src={innerBg} className={`${prefixName}-inner-image`} />\n        </div>\n        {/* 大圆 */}\n        <img\n          src={imgPieGraphic}\n          style={{\n            position: 'absolute',\n            top: '54%',\n            left: '50%',\n            transform: 'translate(-50%, -50%)',\n            zIndex: 2,\n            width: proportion > 1.67 ? 'auto' : '15%',\n            height: proportion > 1.67 ? '25%' : 'auto',\n            ...imgStyle,\n          }}\n        />\n        {/* 小圆 */}\n        <img\n          src={imgRosePieGraphic}\n          style={{\n            position: 'absolute',\n            top: '54%',\n            left: '50%',\n            transform: 'translate(-50%, -50%)',\n            zIndex: 3,\n            width: proportion > 1.67 ? 'auto' : '8%',\n            height: proportion > 1.67 ? '16%' : 'auto',\n            ...imgStyle,\n          }}\n        />\n        <ReactEcharts\n          ref={echartsRef}\n          style={{ width: modifiedStyle.width ?? '95%', height: modifiedStyle.height ?? '90%' }}\n          echarts={echarts}\n          option={option}\n          onEvents={{\n            legendSelectChanged,\n            ...onEvents,\n          }}\n          opts={{ renderer }}\n        />\n      </div>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/index.ts",
    "content": "// bar\nexport { default as ReactEcharts } from 'echarts-for-react';\nexport { default as CuboidBar } from './cuboid-bar';\nexport { default as CylinderBar } from './cylinder-bar';\nexport { default as CylinderShadowBar } from './cylinder-shadow-bar';\nexport { default as HorizontalBar } from './horizontal-bar';\nexport { default as MultiHorizontalBar } from './multi-horizontal-bar';\nexport { default as PictorialBar } from './pictorial-bar';\nexport { default as SliceBar } from './slice-bar';\nexport { default as StackBar } from './stack-bar';\nexport { ThemeProvider } from './context/ThemeContext';\nexport { default as BarLine } from './bar-line';\nexport { default as ImgLine } from './img-line';\nexport { default as MultiLine } from './multi-line';\nexport { default as FlipNumber } from './flip-number';\nexport { default as ScrollNumber } from './scroll-number';\nexport { default as AccumulatedData } from './accumulated-data';\nexport { default as DataShow } from './data-show';\nexport { default as DataShowSimple } from './data-show-simple';\nexport { default as FloatBall } from './float-ball';\nexport { default as Gauge } from './gauge';\nexport { default as Progress } from './progress';\n// other\nexport { default as Radar } from './radar';\nexport { default as Scatter } from './scatter';\nexport { default as Swiper } from './swiper';\nexport { default as Table } from './table';\nexport { default as TextScroll } from './text-scroll';\nexport { default as WordCloud } from './word-cloud';\nexport { default as Modal } from './modal';\n// pie\nexport { default as BasePie } from './base-pie';\nexport { default as CircularSolidPie } from './circular-solid-pie';\nexport { default as ImgPie } from './img-pie';\nexport { default as ImgRosePie } from './img-rose-pie';\nexport { default as ThreeDimensionalPie } from './three-dimensional-pie';\nexport { default as theme } from './theme';\n"
  },
  {
    "path": "packages/lego/src/modal/index.md",
    "content": "---\ntitle: 弹窗\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 弹窗\n\n## API\n\n| 属性            | 必填    | 说明                         | 类型       | 默认值                          |\n| --------------- | ------- | ---------------------------- | ---------- | ------------------------------- |\n| visible         | `true`  | 弹窗是否可见                 | `boolean`  | `false`                         |\n| width           | `false` | 弹窗宽度                     | `number`   | 784                             |\n| height          | `false` | 弹窗高度                     | `number`   | 800                             |\n| left            | `false` | 弹窗出现的位置（离左侧距离） | `number`   | （浏览器窗口宽度 - 弹窗宽度）/2 |\n| top             | `false` | 弹窗出现的位置（离上侧距离） | `number`   | （浏览器窗口高度 - 弹窗高度）/2 |\n| onClose         | `true`  | 弹窗关闭                     | `Function` |                                 |\n| backgroundImage | `false` | 弹窗背景图                   | `string`   |                                 |\n\n## 效果图 1\n\n<code src=\"../../example/ModalDemo/demo1.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/modal/index.tsx",
    "content": "import React, { PropsWithChildren, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { animated, useSpring } from '@react-spring/web';\n\nimport defaultBg from './assets/modal_bg.png';\n\nexport interface ModalProps {\n  /** 弹窗是否可见 */\n  visible: boolean;\n  /** 弹窗的宽度 */\n  width?: number;\n  /** 弹窗的高度 */\n  height?: number;\n  /** 弹窗出现的位置离左侧距离 */\n  left?: number;\n  /** 弹窗出现的位置离上侧距离 */\n  top?: number;\n  /** 弹窗关闭 */\n  onClose: () => void;\n  /** 弹窗的背景图 */\n  backgroundImage?: string;\n}\n\nconst Modal = ({\n  visible,\n  onClose,\n  children,\n  width = 784,\n  backgroundImage = `url(${defaultBg})`,\n  height = 800,\n  left,\n  top,\n}: PropsWithChildren<ModalProps>) => {\n  const [animatedStyles, api] = useSpring(() => ({}));\n  const isFirstLoad = useRef(true);\n  const [animatedVisible, setAnimatedVisible] = useState(visible);\n\n  const modalLeft = left ?? (window.innerWidth - width) / 2;\n  const modalTop = top ?? (window.innerHeight - height) / 2;\n\n  useEffect(() => {\n    if (visible) {\n      isFirstLoad.current = false;\n      setAnimatedVisible(true);\n      api.start({\n        opacity: 1,\n        width,\n        height,\n        left: modalLeft,\n        top: modalTop,\n      });\n    } else {\n      api\n        .start({\n          opacity: 0,\n          width: 0,\n          height: 0,\n        })?.[0]\n        .then(() => {\n          setAnimatedVisible(false);\n          if (!isFirstLoad.current) {\n            onClose();\n          }\n        });\n    }\n  }, [visible]);\n\n  const modal = createPortal(\n    <>\n      <animated.div\n        style={{\n          position: 'absolute',\n          zIndex: 999999,\n          overflow: 'hidden',\n          backgroundSize: '100% 100%',\n          backgroundImage,\n          ...animatedStyles,\n        }}\n      >\n        <div style={{ width, height }}>{children}</div>\n      </animated.div>\n      {/* 蒙层点击可关闭 */}\n      <div\n        style={{\n          position: 'fixed',\n          left: 0,\n          top: 0,\n          width: '100%',\n          height: '100%',\n          backgroundColor: 'rgba(7, 3, 28, 0.3)',\n          zIndex: 99,\n        }}\n        onClick={onClose}\n      />\n    </>,\n    document.body\n  );\n  return <>{animatedVisible && modal}</>;\n};\n\nexport default Modal;\n"
  },
  {
    "path": "packages/lego/src/multi-horizontal-bar/index.md",
    "content": "---\ntitle: 条形对比图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n---\n\n# 条形对比图\n\n## API\n\n| 属性      | 必填    | 说明                | 类型                                                        | 默认值   |\n| --------- | ------- | ------------------- | ----------------------------------------------------------- | -------- |\n| leftData  | `true`  |                     | `{ name: string; data: { name: string; value: number }[] }` |          |\n| rightData | `true`  |                     | `{ name: string; data: { name: string; value: number }[] }` |          |\n| unit      | `false` | 单位                | `string \\| [string, string]`                                |          |\n| max       | `true`  | 最大值              | `number \\| [number, number]`                                |          |\n| style     | `false` | 自定义样式          | `CSSProperties`                                             |          |\n| config    | `false` | 自定义 Echarts 配置 | `ECOption`                                                  |          |\n| inModal   | `false` | 是否在弹窗内显示    | `boolean`                                                   | `false`  |\n| onEvents  | `false` | 图表交互事件        | `Record<string, (params?: any) => void>`                    |          |\n| renderer  | `false` | 图表渲染器          | `canvas \\| svg`                                             | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/MultiHorizontalBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 - 修改图表配置项\n\n<code src=\"../../example/MultiHorizontalBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (弹窗)\n\n<code src=\"../../example/MultiHorizontalBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (SVG 渲染器)\n\n<code src=\"../../example/MultiHorizontalBarDemo/demo4.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/multi-horizontal-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  PictorialBarChart, // 系列类型的定义后缀都为 SeriesOption\n  PictorialBarSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  SingleAxisComponent,\n  SingleAxisComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { TooltipOption, YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<\n  PictorialBarSeriesOption | TooltipComponentOption | GridComponentOption | SingleAxisComponentOption\n>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, SingleAxisComponent, PictorialBarChart, CanvasRenderer, SVGRenderer]);\n\nexport interface MultiHorizontalBarProps {\n  unit?: string | [string, string];\n  max: number | [number, number];\n  leftData: { name: string; data: { name: string; value: number | string }[] };\n  rightData: { name: string; data: { name: string; value: number | string }[] };\n  style?: CSSProperties;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 双列水平条形图，对应figma柱状图6\n */\nexport default forwardRef<ReactEcharts, MultiHorizontalBarProps>(\n  ({ unit = '', max, leftData, rightData, style, config, inModal = false, onEvents, renderer = 'canvas' }, ref) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal);\n    const leftUnit = typeof unit === 'string' ? unit : unit[0];\n    const rightUnit = typeof unit === 'string' ? unit : unit[1];\n    const leftMax = typeof max === 'number' ? max : max[0];\n    const rightMax = typeof max === 'number' ? max : max[1];\n\n    const option = merge(\n      {\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: [\n          {\n            show: false,\n            left: '4%',\n            top: '5%',\n            bottom: '10%',\n            width: '42%',\n          },\n          {\n            show: false,\n            left: '50%',\n            top: '5%',\n            bottom: '10%',\n            width: '0%',\n          },\n          {\n            show: false,\n            right: '4%',\n            top: '5%',\n            bottom: '10%',\n            width: '42%',\n          },\n        ],\n        tooltip: {\n          ...baseChartConfig.tooltip,\n          axisPointer: {\n            ...(baseChartConfig.tooltip as TooltipOption).axisPointer,\n            type: 'shadow',\n          },\n          formatter: function (params: any) {\n            const str = `\n            <div style=\"display: flex; align-items: center;\">\n              <div style=\"\n                width: 7px;\n                height: 7px;\n                background: linear-gradient(180deg, ${params[0]?.color?.colorStops?.[0]?.color} 0%, ${params[0]?.color\n                  ?.colorStops?.[1]?.color} 100%);\n                margin-right: 4px;\n                border-radius: 7px;\n              \"></div>\n              ${params[0]?.seriesName}：${params[0]?.data?.value || params[0]?.data} ${params[0]?.data?.unit ?? ''}\n            </div>\n          `;\n\n            return `\n                <div style=\"\n                  background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n                  border: 1px solid #017AFF;\n                  color: #fff;\n                  font-size: ${inModal ? '18px' : '14px'};\n                  line-height: ${inModal ? '25px' : '22px'};\n                  padding: 5px;\n                  border-radius: 6px;\n                \">\n                  <div>${params[0]?.name}</div>\n                  ${str}\n                </div>\n              `;\n          },\n        },\n        xAxis: [\n          {\n            type: 'value',\n            inverse: true,\n            name: leftUnit,\n            nameGap: 5,\n            nameLocation: 'end',\n            nameTextStyle: {\n              ...theme.typography[inModal ? 'p0' : 'p2'],\n              color: theme.colors.gray100,\n            },\n            axisLine: {\n              ...(baseChartConfig.xAxis as YAXisOption).axisLine,\n              show: true,\n            },\n            axisTick: {\n              show: true,\n            },\n            axisLabel: {\n              ...(baseChartConfig.xAxis as YAXisOption).axisLabel,\n              show: true,\n            },\n            splitLine: {\n              show: false,\n            },\n          },\n          {\n            gridIndex: 1,\n            show: false,\n          },\n          {\n            gridIndex: 2,\n            show: true,\n            type: 'value',\n            inverse: false,\n            name: rightUnit,\n            nameGap: 5,\n            nameLocation: 'end',\n            nameTextStyle: {\n              ...theme.typography[inModal ? 'p0' : 'p2'],\n              color: theme.colors.gray100,\n            },\n            axisLine: {\n              ...(baseChartConfig.xAxis as YAXisOption).axisLine,\n              show: true,\n            },\n            axisTick: {\n              show: true,\n            },\n            axisLabel: {\n              ...(baseChartConfig.xAxis as YAXisOption).axisLabel,\n              show: true,\n            },\n            splitLine: {\n              show: false,\n            },\n          },\n        ],\n        yAxis: [\n          {\n            gridIndex: 0,\n            triggerEvent: true,\n            inverse: true,\n            data: getArrByKey(leftData.data, 'name'),\n            axisLine: {\n              show: false,\n            },\n            splitLine: {\n              show: false,\n            },\n            axisTick: {\n              show: false,\n            },\n            axisLabel: {\n              show: false,\n            },\n          },\n          // 控制 Y 轴\n          {\n            gridIndex: 1,\n            type: 'category',\n            inverse: true,\n            axisLine: {\n              show: false,\n            },\n            axisTick: {\n              show: false,\n            },\n            axisLabel: {\n              ...(baseChartConfig.yAxis as YAXisOption).axisLabel,\n              show: true,\n              interval: 0,\n              align: 'auto',\n              verticalAlign: 'middle',\n            },\n            data: getArrByKey(leftData.data, 'name'),\n          },\n          {\n            gridIndex: 2,\n            triggerEvent: true,\n            inverse: true,\n            data: getArrByKey(rightData.data, 'name'),\n            axisLine: {\n              show: false,\n            },\n            splitLine: {\n              show: false,\n            },\n            axisTick: {\n              show: false,\n            },\n            axisLabel: {\n              show: false,\n            },\n          },\n        ],\n        series: [\n          // 左侧\n          {\n            name: leftData.name,\n            type: 'pictorialBar',\n            xAxisIndex: 0,\n            yAxisIndex: 0,\n            gridIndex: 0,\n            silent: true,\n            itemStyle: {\n              color: createLinearGradient(theme.colors.primary300, false),\n            },\n            symbolRepeat: 'fixed',\n            symbolMargin: 1,\n            symbol: 'rect',\n            symbolClip: true,\n            symbolSize: [3, 8],\n            symbolPosition: 'start',\n            symbolBoundingData: leftMax * 0.92,\n            data: leftData.data.map(item => ({ ...item, unit: leftUnit })),\n            z: 3,\n            animationEasing: 'elasticOut',\n          },\n          {\n            name: leftData.name,\n            type: 'pictorialBar',\n            xAxisIndex: 0,\n            yAxisIndex: 0,\n            gridIndex: 0,\n            itemStyle: {\n              color: theme.colors.assist1100,\n              opacity: 0.2,\n            },\n            symbolRepeat: 'fixed',\n            symbolMargin: 1,\n            symbol: 'rect',\n            symbolClip: true,\n            symbolSize: [3, 8],\n            symbolPosition: 'start',\n            symbolBoundingData: leftMax * 0.92,\n            data: leftData.data.map(() => leftMax),\n            z: 2,\n            animationEasing: 'elasticOut',\n          },\n          {\n            name: leftData.name,\n            type: 'pictorialBar',\n            itemStyle: {\n              color: 'rgba(9, 63, 160, 0.57)',\n            },\n            xAxisIndex: 0,\n            yAxisIndex: 0,\n            gridIndex: 0,\n            symbol: 'path://M 0 0 L 8 0 C 8 0 8 1 7.5 1 L -1 1 C -1 1 -1 0 -0.5 0',\n            symbolSize: ['100%', 24],\n            symbolOffset: ['3%', 0],\n            symbolBoundingData: leftMax,\n            data: leftData.data.map(() => leftMax),\n            z: 1,\n            animation: false,\n          },\n\n          // 右侧\n          {\n            name: rightData.name,\n            type: 'pictorialBar',\n            xAxisIndex: 2,\n            yAxisIndex: 2,\n            gridIndex: 2,\n            silent: true,\n            itemStyle: {\n              color: createLinearGradient(theme.colors.primary50, false),\n            },\n            symbolRepeat: 'fixed',\n            symbolMargin: 1,\n            symbol: 'rect',\n            symbolClip: true,\n            symbolSize: [3, 8],\n            symbolPosition: 'start',\n            symbolBoundingData: rightMax * 0.92,\n            data: rightData.data.map(item => ({\n              ...item,\n              unit: rightUnit,\n            })),\n            z: 3,\n            animationEasing: 'elasticOut',\n          },\n          {\n            name: rightData.name,\n            type: 'pictorialBar',\n            xAxisIndex: 2,\n            yAxisIndex: 2,\n            gridIndex: 2,\n            itemStyle: {\n              color: theme.colors.assist1100,\n              opacity: 0.2,\n            },\n            symbolRepeat: 'fixed',\n            symbolMargin: 1,\n            symbol: 'rect',\n            symbolClip: true,\n            symbolSize: [3, 8],\n            symbolPosition: 'start',\n            symbolBoundingData: rightMax * 0.92,\n            data: rightData.data.map(() => rightMax),\n            z: 2,\n            animationEasing: 'elasticOut',\n          },\n          {\n            name: rightData.name,\n            type: 'pictorialBar',\n            xAxisIndex: 2,\n            yAxisIndex: 2,\n            gridIndex: 2,\n            itemStyle: {\n              color: 'rgba(9, 63, 160, 0.57)',\n            },\n            symbol: 'path://M 0 0 L 8 0 C 8 0 8 1 7.5 1 L -1 1 C -1 1 -1 0 -0.5 0',\n            symbolSize: ['100%', 24],\n            symbolOffset: ['-3%', 0],\n            symbolBoundingData: rightMax,\n            data: rightData.data.map(() => rightMax),\n            z: 1,\n            animation: false,\n          },\n        ],\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts ref={ref} echarts={echarts} option={option} style={style} onEvents={onEvents} opts={{ renderer }} />\n    );\n  }\n);\n\nfunction getArrByKey(list: { name: string; value: number | string }[], key: string) {\n  return list.map(item => item[key]);\n}\n"
  },
  {
    "path": "packages/lego/src/multi-line/index.md",
    "content": "---\ntitle: 多折线图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 折线图\n---\n\n# 多折线图\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| xAxisData | `true` | x 轴数据 | `string[]` |  |\n| yAxis | `true` | y 轴配置 | `{ name: string }[]` |  |\n| seriesData | `true` | 图表数据 | `{ name: string; data: { name: string; value: string \\| number }[]; yAxisIndex: number }[]` |  |\n| style | `false` | 自定义样式 | `CSSProperties` |  |\n| autoLoop | `false` | 控制是否自动轮播 | `boolean` |  |\n| duration | `false` | 自动轮播的时长 | `number` | `2000` |\n| config | `false` | 自定义 Echarts 配置 | `ECOption` |  |\n| inModal | `false` | 是否在弹窗内显示 | `boolean` | `false` |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean` | `true` |\n| onEvents | `false` | 图表交互事件 | `Record<string, (params?: any) => void>` |  |\n| renderer | `false` | 图表渲染器 | `canvas \\| svg` | `canvas` |\n| lineColors | `false` | 自定义颜色 | `[string, string][]` |  |\n\n## 效果图 1\n\n<code src=\"../../example/MultiLineDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/MultiLineDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3\n\n<code src=\"../../example/MultiLineDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4\n\n<code src=\"../../example/MultiLineDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5\n\n<code src=\"../../example/MultiLineDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (自动轮播)\n\n<code src=\"../../example/MultiLineDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (轮播两次后停止)\n\n<code src=\"../../example/MultiLineDemo/demo7.tsx\" background=\"#040727\">\n\n## 效果图 8 (弹窗)\n\n<code src=\"../../example/MultiLineDemo/demo8.tsx\" background=\"#040727\">\n\n## 效果图 9 (手动控制图表轮播)\n\n<code src=\"../../example/MultiLineDemo/demo9.tsx\" background=\"#040727\">\n\n## 效果图 10 (控制是否显示 y 轴的线，默认显示，控制为不显示)\n\n<code src=\"../../example/MultiLineDemo/demo10.tsx\" background=\"#040727\">\n\n## 效果图 11 (SVG 渲染器)\n\n<code src=\"../../example/MultiLineDemo/demo11.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/multi-line/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport Color from 'color';\nimport ReactEcharts from 'echarts-for-react';\nimport { LineChart, LineSeriesOption } from 'echarts/charts';\nimport { GridComponent, GridComponentOption, TooltipComponent, TooltipComponentOption } from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useBaseLineConfig from '../hooks/useBaseLineConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\n\ntype ECOption = echarts.ComposeOption<LineSeriesOption | TooltipComponentOption | GridComponentOption>;\n\necharts.use([TooltipComponent, GridComponent, LineChart, CanvasRenderer, SVGRenderer]);\n\nexport interface MultiLineProps {\n  xAxisData: string[];\n  yAxis: { name: string }[];\n  seriesData: {\n    name: string;\n    data: { name: string; value: string | number | null }[];\n    yAxisIndex: number;\n  }[];\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n  lineColors?: [string, string][];\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n}\n\n/** 折线图1 */\nexport default forwardRef<ReactEcharts, MultiLineProps>(\n  (\n    {\n      xAxisData,\n      yAxis,\n      seriesData,\n      style,\n      autoLoop,\n      duration = 2000,\n      config,\n      inModal = false,\n      lineColors = [],\n      showYAxisLine = true,\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal);\n    const baseLineConfig = useBaseLineConfig(inModal);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n\n    const baseColors =\n      lineColors?.length > 0 && seriesData?.length === lineColors?.length\n        ? lineColors\n        : [\n            theme.colors.primary200,\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const getColorsByIndex = (index: number) => {\n      return Color(baseColors[index][0]).alpha(0.85).string();\n    };\n\n    const getAreaColorsByIndex = (index: number) => {\n      const _color = [Color(baseColors[index][1]).alpha(0).string(), Color(baseColors[index][0]).alpha(0.4).string()];\n      return createLinearGradient(_color);\n    };\n    const option = merge(\n      {\n        color: colors,\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n          left: '3%',\n          right: '3%',\n        },\n        tooltip: { ...baseChartConfig.tooltip },\n        xAxis: {\n          type: 'category',\n          ...baseChartConfig.xAxis,\n          data: xAxisData,\n        },\n        yAxis: yAxis.map((item, index) => ({\n          ...baseChartConfig.yAxis,\n          ...item,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n          nameTextStyle: {\n            ...(baseChartConfig.yAxis as YAXisOption).nameTextStyle,\n            padding: index === 0 ? [0, 40, 0, 0] : [0, 0, 0, 40],\n          },\n          splitLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).splitLine,\n            show: index === 0 ? true : false,\n          },\n        })),\n        series: seriesData.map((item, index) => {\n          const data = item.data.map(ele => ({\n            name: ele.name,\n            value: ele.value ? +ele.value : 0,\n            unit: yAxis[item.yAxisIndex]?.name,\n          }));\n          return {\n            ...item,\n            ...baseLineConfig,\n            data,\n            smooth: true,\n            lineStyle: {\n              width: 3,\n              shadowBlur: 11,\n              shadowColor: getColorsByIndex(index),\n            },\n            itemStyle: {\n              borderColor: colors[index],\n              borderWidth: 2,\n            },\n            emphasis: {\n              lineStyle: {\n                shadowBlur: 11,\n                shadowColor: getColorsByIndex(index),\n              },\n            },\n            areaStyle: {\n              color: getAreaColorsByIndex(index),\n              shadowColor: getColorsByIndex(index),\n            },\n          };\n        }),\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={echartsRef}\n        style={style}\n        echarts={echarts}\n        notMerge\n        option={option}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/pictorial-bar/index.md",
    "content": "---\ntitle: 象形柱状图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n---\n\n# 象形柱状图\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| xAxisData | `true` | x 轴数据 | `any[]` |  |\n| unit | `false` | 单位 | `string` |  |\n| name | `false` | 图例名称 | `string` |  |\n| data | `true` | 图表数据 | `(string \\| number \\| { name: string; value: string \\| number; unit: string })[]` |\n| style | `false` | 自定义样式 | `CSSProperties` |  |\n| autoLoop | `false` | 控制是否自动轮播 | `boolean` |  |\n| duration | `false` | 自动轮播的时长 | `number` | `2000` |\n| config | `false` | 自定义 Echarts 配置 | `ECOption` |  |\n| inModal | `false` | 是否在弹窗内显示 | `boolean` | `false` |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean` | `true` |\n| barColors | `false` | 自定义颜色 | `[string, string][]` |  |\n| onEvents | `false` | 图表交互事件 | `Record<string, (params?: any) => void>` |  |\n| renderer | `false` | 图表渲染器 | `canvas \\| svg` | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/PictorialBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/PictorialBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3\n\n<code src=\"../../example/PictorialBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 自动轮播\n\n<code src=\"../../example/PictorialBarDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (轮播两次后停止)\n\n<code src=\"../../example/PictorialBarDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (弹窗)\n\n<code src=\"../../example/PictorialBarDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (手动控制图表轮播)\n\n<code src=\"../../example/PictorialBarDemo/demo7.tsx\" background=\"#040727\">\n\n## 效果图 8 (SVG 渲染器)\n\n<code src=\"../../example/PictorialBarDemo/demo8.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/pictorial-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  PictorialBarChart, // 系列类型的定义后缀都为 SeriesOption\n  PictorialBarSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<PictorialBarSeriesOption | TooltipComponentOption | GridComponentOption>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, PictorialBarChart, CanvasRenderer, SVGRenderer]);\n\nexport interface PictorialBarProps {\n  xAxisData: any[];\n  name: string;\n  unit?: string;\n  data: (string | number | { name: string; value: string | number; unit: string })[];\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  barColors?: [string, string][];\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 象形柱状图，对应figma柱状图7\n */\nexport default forwardRef<ReactEcharts, PictorialBarProps>(\n  (\n    {\n      name,\n      data,\n      unit,\n      xAxisData,\n      style,\n      autoLoop,\n      duration = 2000,\n      config,\n      showYAxisLine = true,\n      inModal = false,\n      barColors = [],\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n\n    const baseColors =\n      barColors?.length > 0 && barColors?.length >= data?.length\n        ? barColors\n        : [\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary200,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const option = merge(\n      {\n        grid: {\n          ...baseChartConfig.grid,\n        },\n        tooltip: { ...baseChartConfig.tooltip },\n        xAxis: {\n          type: 'category',\n          data: xAxisData,\n          ...baseChartConfig.xAxis,\n        },\n        yAxis: {\n          name: unit,\n          ...baseChartConfig.yAxis,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n        },\n        series: [\n          {\n            name,\n            type: 'pictorialBar',\n            barCategoryGap: '-100%',\n            symbol: 'path://M0,10 L10,10 C5.5,10 5.5,5 5,0 C4.5,5 4.5,10 0,10 z',\n            data: data.map((item, index) => ({\n              ...(typeof item === 'object' ? item : { value: item, unit }),\n              itemStyle: {\n                opacity: 0.5,\n                color: colors[index],\n              },\n            })),\n          },\n        ],\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={echartsRef}\n        echarts={echarts}\n        option={option}\n        style={style}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/progress/index.md",
    "content": "---\ntitle: 进度条图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n  order: 5\n---\n\n# 进度条图\n\n## API\n\n| 属性     | 必填    | 说明                | 类型                                          | 默认值   |\n| -------- | ------- | ------------------- | --------------------------------------------- | -------- |\n| name     | `false` | 图例名称            | `string`                                      |          |\n| data     | `true`  | 图表数据            | `{ name: string; value: number \\| string }[]` |          |\n| style    | `false` | 自定义样式          | `CSSProperties`                               |          |\n| config   | `false` | 自定义 Echarts 配置 | `ECOption`                                    |          |\n| inModal  | `false` | 是否在弹窗内显示    | `boolean`                                     | `false`  |\n| onEvents | `false` | 图表交互事件        | `Record<string, (params?: any) => void>`      |          |\n| renderer | `false` | 图表渲染器          | `canvas \\| svg`                               | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/ProgressDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 (弹窗)\n\n<code src=\"../../example/ProgressDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (SVG 渲染器)\n\n<code src=\"../../example/ProgressDemo/demo3.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/progress/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  BarChart, // 系列类型的定义后缀都为 SeriesOption\n  BarSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  SingleAxisComponent,\n  SingleAxisComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { merge } from 'lodash-es';\n\nimport useBaseBarConfig from '../hooks/useBaseBarConfig';\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<\n  BarSeriesOption | TooltipComponentOption | GridComponentOption | SingleAxisComponentOption\n>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, SingleAxisComponent, BarChart, CanvasRenderer, SVGRenderer]);\n\nexport interface ProgressProps {\n  name: string;\n  data: { name: string; value: number | string }[];\n  style?: CSSProperties;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n  /** 显示模式： percentage百分比； normal数字 */\n  mode: 'percentage' | 'normal';\n}\n\n/**\n * 进度条图，对应Figma其他图6\n */\nexport default forwardRef<ReactEcharts, ProgressProps>(\n  (\n    {\n      name,\n      data,\n      style = { width: 300, height: 300 },\n      config,\n      inModal = false,\n      mode = 'percentage',\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal);\n    const baseBarConfig = useBaseBarConfig(inModal);\n\n    const option = merge(\n      {\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n          left: '5%',\n          right: '5%',\n          top: 20,\n          bottom: 0,\n        },\n        xAxis: {\n          show: false,\n        },\n        yAxis: [\n          {\n            type: 'category',\n            data,\n            axisLine: {\n              show: false,\n            },\n            axisTick: {\n              show: false,\n            },\n            axisLabel: {\n              show: false,\n            },\n            inverse: true,\n          },\n        ],\n        series: [\n          {\n            name,\n            type: 'bar',\n            barWidth: 6,\n            yAxisIndex: 0,\n            data: data,\n            z: 3,\n            barCategoryGap: '30%',\n            label: {\n              ...baseBarConfig.label,\n              offset: [-5, -3],\n              position: 'insideBottomLeft',\n              formatter: '{b}',\n            },\n            itemStyle: {\n              color: createLinearGradient(theme.colors.primary50, false),\n              borderRadius: 11,\n            },\n          },\n          {\n            name,\n            type: 'bar',\n            barWidth: 6,\n            yAxisIndex: 0,\n            barGap: '-100%',\n            barCategoryGap: '30%',\n            z: 2,\n            silent: true,\n            data: data.map(item => ({\n              name: item.value + (mode === 'percentage' ? '%' : ''),\n              value: mode === 'percentage' ? 100 : Math.max(...data.map(item => +item.value)) * 2.5,\n            })),\n            label: {\n              ...baseBarConfig.label,\n              position: 'insideBottomRight',\n              offset: [5, -3],\n              formatter: '{b}',\n            },\n            itemStyle: {\n              color: createLinearGradient(theme.colors.primary100, false),\n              borderRadius: 11,\n            },\n          },\n          {\n            name,\n            type: 'scatter',\n            data,\n            yAxisIndex: 0,\n            symbolSize: 10,\n            itemStyle: {\n              color: theme.colors.assist1000,\n              opacity: 1,\n              borderWidth: 0.5,\n              borderColor: theme.colors.gray50,\n            },\n            z: 4,\n          },\n        ],\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts ref={ref} echarts={echarts} option={option} style={style} onEvents={onEvents} opts={{ renderer }} />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/radar/index.md",
    "content": "---\ntitle: 雷达图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 雷达图\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| seriesData | `true` | 图表数据 | `{ name: string; data: { name: string; unit: string; value: string }[] }[]` |  |\n| indicatorData | `true` | 雷达指标数据 | `{ name: string; max: string; unit: string }[]` |  |\n| style | `false` | 自定义样式 | `CSSProperties` |  |\n| config | `false` | 自定义 Echarts 配置 | `ECOption` |  |\n| inModal | `false` | 是否在弹窗内显示 | `boolean` | `false` |\n| radarColors | `false` | 自定义颜色 | `[string, string][]` |  |\n| onEvents | `false` | 图表交互事件 | `Record<string, (params?: any) => void>` |  |\n| renderer | `false` | 图表渲染器 | `canvas \\| svg` | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/RadarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 (弹窗)\n\n<code src=\"../../example/RadarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (SVG 渲染器)\n\n<code src=\"../../example/RadarDemo/demo3.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/radar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport Color from 'color';\nimport ReactEcharts from 'echarts-for-react';\nimport { RadarSeriesOption } from 'echarts/charts';\nimport { RadarComponent, TooltipComponent, TooltipComponentOption } from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\n\ntype ECOption = echarts.ComposeOption<RadarSeriesOption | TooltipComponentOption>;\n\necharts.use([TooltipComponent, RadarComponent, CanvasRenderer, SVGRenderer]);\n\nexport type IndicatorItem = { name: string; unit: string; max: string };\n\nexport interface RadarProps {\n  seriesData: { name: string; data: (number | string)[] }[];\n  indicatorData: { name: string; max: string; unit: string }[];\n  style?: CSSProperties;\n  config?: ECOption;\n  inModal?: boolean;\n  radarColors?: [string, string][];\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/** 其他1-雷达图 */\nexport default forwardRef<ReactEcharts, RadarProps>(\n  (\n    {\n      seriesData,\n      indicatorData = [\n        {\n          name: ' ',\n          max: 100,\n        },\n      ],\n      style = { width: 500, height: 500 },\n      config,\n      inModal = false,\n      radarColors = [],\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal);\n\n    // 雷达图的底色（带层次感）\n    const colors = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]\n      .reverse()\n      .map(num => Color(theme.colors.assist200).alpha(num).string());\n\n    const baseColors =\n      radarColors?.length > 0 && radarColors?.length >= seriesData?.length\n        ? radarColors\n        : [theme.colors.primary50, theme.colors.primary300];\n\n    const gradientColors = baseColors.map(item => createLinearGradient(item));\n\n    const option = merge(\n      {\n        legend: {\n          ...baseChartConfig.legend,\n          icon: 'circle',\n          data: seriesData.map(item => item.name),\n        },\n        tooltip: {\n          show: true,\n          trigger: 'item',\n          appendToBody: false,\n          padding: 0,\n          borderWidth: 0,\n          className: 'echarts-radar-tooltip',\n          formatter: (params: any) => {\n            const strs = params.data.map(\n              (value: number, index: number) => `\n                    <div>\n                      ${params.marker}\n                      ${indicatorData[index]?.name}： ${value} ${indicatorData[index]?.unit ?? ''}\n                    </div>\n                  `\n            );\n            return `\n                  <div style=\"\n                    background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n                    border: 1px solid #017AFF;\n                    color: #fff;\n                    font-size: ${inModal ? '18px' : '14px'};\n                    line-height: ${inModal ? '25px' : '22px'};\n                    padding: 5px;\n                    border-radius: 4px;\n                  \">\n                    <div>${params.seriesName}</div>\n                    ${strs.join('')}\n                  </div>\n                `;\n          },\n        },\n        radar: {\n          center: ['50%', '50%'],\n          radius: '70%',\n          axisNameGap: 5,\n          axisName: {\n            formatter: (_: string, indicator: IndicatorItem) => {\n              return `{a|${indicator.name ?? ''}}\\n{a|${indicator.max}${indicator.unit ?? ''}}`;\n            },\n            rich: {\n              a: {\n                ...theme.typography[inModal ? 'p0' : 'p2'],\n                color: theme.colors.gray50,\n              },\n            },\n          },\n          indicator: indicatorData,\n          splitArea: {\n            show: true,\n            areaStyle: {\n              color: colors,\n            },\n          },\n          axisLine: {\n            lineStyle: {\n              color: theme.colors.assist50,\n            },\n          },\n          splitLine: {\n            show: false,\n            lineStyle: {\n              type: 'solid',\n              color: theme.colors.assist200, // 分隔线颜色\n              opacity: 0.2,\n              width: 1, // 分隔线线宽\n            },\n          },\n        },\n        series: seriesData.map((item, index) => ({\n          type: 'radar',\n          name: item?.name,\n          data: [item?.data],\n          symbol: 'circle',\n          symbolSize: 10,\n          itemStyle: {\n            color: gradientColors[index],\n            opacity: 0.6,\n          },\n          areaStyle: {\n            color: gradientColors[index],\n            opacity: 0.3,\n          },\n          lineStyle: {\n            type: 'dashed',\n            width: 1,\n            color: gradientColors[index],\n          },\n          emphasis: {\n            lineStyle: {\n              type: 'solid',\n              width: 2,\n              color: gradientColors[index],\n            },\n          },\n        })),\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts ref={ref} style={style} echarts={echarts} option={option} onEvents={onEvents} opts={{ renderer }} />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/registerShape.ts",
    "content": "import * as echarts from 'echarts/core';\n\nexport function registerCuboidShape() {\n  // cube\n  const CubeLeft = echarts.graphic.extendShape({\n    shape: {\n      x: 0,\n      y: 0,\n    },\n    buildPath: function (ctx, shape) {\n      const xAxisPoint = shape.xAxisPoint;\n      const c0 = [shape.x, shape.y];\n      const c1 = [shape.x - 9, shape.y - 9];\n      const c2 = [xAxisPoint[0] - 9, xAxisPoint[1] - 9];\n      const c3 = [xAxisPoint[0], xAxisPoint[1]];\n      ctx.moveTo(c0[0], c0[1])!.lineTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).closePath();\n    },\n  });\n  const CubeRight = echarts.graphic.extendShape({\n    shape: {\n      x: 0,\n      y: 0,\n    },\n    buildPath: function (ctx, shape) {\n      const xAxisPoint = shape.xAxisPoint;\n      const c1 = [shape.x, shape.y];\n      const c2 = [xAxisPoint[0], xAxisPoint[1]];\n      const c3 = [xAxisPoint[0] + 18, xAxisPoint[1] - 9];\n      const c4 = [shape.x + 18, shape.y - 9];\n      ctx.moveTo(c1[0], c1[1])!.lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).lineTo(c4[0], c4[1]).closePath();\n    },\n  });\n  const CubeTop = echarts.graphic.extendShape({\n    shape: {\n      x: 0,\n      y: 0,\n    },\n    buildPath: function (ctx, shape) {\n      const c1 = [shape.x, shape.y];\n      const c2 = [shape.x + 18, shape.y - 9];\n      const c3 = [shape.x + 9, shape.y - 18];\n      const c4 = [shape.x - 9, shape.y - 9];\n      ctx.moveTo(c1[0], c1[1])!.lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).lineTo(c4[0], c4[1]).closePath();\n    },\n  });\n  echarts.graphic.registerShape('CubeLeft', CubeLeft);\n  echarts.graphic.registerShape('CubeRight', CubeRight);\n  echarts.graphic.registerShape('CubeTop', CubeTop);\n}\n\nexport function registerCylinderShape() {\n  // cylinder\n  const CylinderTop = echarts.graphic.extendShape({\n    shape: {\n      x: 0,\n      y: 0,\n    },\n    buildPath: function (ctx, shape) {\n      const { x, y, itemWidth } = shape;\n      const c0 = [x + itemWidth / 2, y];\n\n      const arc1 = [x, y + itemWidth / 2];\n      const arc2 = [x, y - itemWidth / 2];\n\n      ctx\n        .moveTo(c0[0], c0[1])!\n        .arc(arc1[0], arc1[1], (itemWidth / 2) * Math.sqrt(2), 1.25 * Math.PI, 1.75 * Math.PI, false)\n        .arc(arc2[0], arc2[1], (itemWidth / 2) * Math.sqrt(2), 0.25 * Math.PI, 0.75 * Math.PI, false)\n        .closePath();\n    },\n  });\n\n  const CylinderBody = echarts.graphic.extendShape({\n    shape: {\n      x: 0,\n      y: 0,\n    },\n    buildPath: function (ctx, shape) {\n      const { x, y, xAxisPoint, itemWidth } = shape;\n\n      const c0 = [x + itemWidth / 2, y];\n      const c1 = [x - itemWidth / 2, y];\n      const c2 = [xAxisPoint[0] - itemWidth / 2, xAxisPoint[1]];\n      const c3 = [xAxisPoint[0] + itemWidth / 2, xAxisPoint[1]];\n\n      const arc = [xAxisPoint[0], xAxisPoint[1] - itemWidth / 2];\n\n      ctx\n        .moveTo(c0[0], c0[1])!\n        .lineTo(c1[0], c1[1])\n        .lineTo(c2[0], c2[1])\n        .arc(arc[0], arc[1], (itemWidth / 2) * Math.sqrt(2), 0.25 * Math.PI, 0.75 * Math.PI, false)\n        .lineTo(c3[0], c3[1])\n        .closePath();\n    },\n  });\n  echarts.graphic.registerShape('CylinderTop', CylinderTop);\n  echarts.graphic.registerShape('CylinderBody', CylinderBody);\n}\n"
  },
  {
    "path": "packages/lego/src/scatter/index.md",
    "content": "---\ntitle: 直角坐标系散点图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 直角坐标系散点图\n\n## API\n\n| 属性          | 必填    | 说明                  | 类型                                             | 默认值   |\n| ------------- | ------- | --------------------- | ------------------------------------------------ | -------- |\n| xAxisData     | `true`  | x 轴数据              | `any[]`                                          |          |\n| unit          | `false` | 单位                  | `string`                                         |          |\n| seriesData    | `true`  | 图表数据              | `{ name: string; data: (string \\| number)[] }[]` |          |\n| style         | `false` | 自定义样式            | `CSSProperties`                                  |          |\n| autoLoop      | `false` | 控制是否自动轮播      | `boolean`                                        |          |\n| duration      | `false` | 自动轮播的时长        | `number`                                         | `2000`   |\n| config        | `false` | 自定义 Echarts 配置   | `ECOption`                                       |          |\n| inModal       | `false` | 是否在弹窗内显示      | `boolean`                                        | `false`  |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean`                                        | `true`   |\n| scatterColors | `false` | 自定义颜色            | `[string, string][]`                             |          |\n| onEvents      | `false` | 图表交互事件          | `Record<string, (params?: any) => void>`         |          |\n| renderer      | `false` | 图表渲染器            | `canvas \\| svg`                                  | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/ScatterDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 自动轮播\n\n<code src=\"../../example/ScatterDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (轮播两次后停止)\n\n<code src=\"../../example/ScatterDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (弹窗)\n\n<code src=\"../../example/ScatterDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (手动控制图表轮播)\n\n<code src=\"../../example/ScatterDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (SVG 渲染器)\n\n<code src=\"../../example/ScatterDemo/demo6.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/scatter/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  ScatterChart, // 系列类型的定义后缀都为 SeriesOption\n  ScatterSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  SingleAxisComponent,\n  SingleAxisComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\nimport createLinearGradient from '../utils/createLinearGradient';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<\n  ScatterSeriesOption | TooltipComponentOption | GridComponentOption | SingleAxisComponentOption\n>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, SingleAxisComponent, ScatterChart, CanvasRenderer, SVGRenderer]);\n\nexport interface ScatterProps {\n  unit?: string;\n  xAxisData: string[];\n  seriesData: { name: string; data: (string | number)[] }[];\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  scatterColors?: [string, string][];\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 直角坐标系散点图，对应Figma其他图7\n */\nexport default forwardRef<ReactEcharts, ScatterProps>(\n  (\n    {\n      unit,\n      xAxisData,\n      seriesData,\n      style,\n      autoLoop,\n      duration = 2000,\n      config,\n      inModal = false,\n      showYAxisLine = true,\n      scatterColors = [],\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n\n    const baseColors =\n      scatterColors?.length > 0 && scatterColors?.length >= seriesData?.length\n        ? scatterColors\n        : [\n            theme.colors.primary50,\n            theme.colors.primary100,\n            theme.colors.primary200,\n            theme.colors.primary300,\n            theme.colors.primary400,\n            theme.colors.primary500,\n          ];\n\n    const colors = baseColors.map(item => createLinearGradient(item));\n\n    const option = merge(\n      {\n        color: colors,\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n        },\n        tooltip: { ...baseChartConfig.tooltip },\n        xAxis: {\n          ...baseChartConfig.xAxis,\n          data: xAxisData,\n        },\n        yAxis: {\n          ...baseChartConfig.yAxis,\n          name: unit,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n        },\n        series: seriesData.map(item => ({\n          name: item.name,\n          data: item.data,\n          type: 'scatter',\n          itemStyle: {\n            opacity: 0.8,\n            shadowBlur: 10,\n            shadowOffsetX: 0,\n            shadowOffsetY: 0,\n            shadowColor: 'rgba(0, 0, 0, 0.5)',\n          },\n        })),\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={echartsRef}\n        echarts={echarts}\n        option={option}\n        style={style}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/scroll-number/index.less",
    "content": ".container {\n  color: #fff;\n\n  .boxItem {\n    position: relative;\n    display: inline-block;\n    width: 18px;\n    height: 32px;\n    overflow: hidden;\n    color: #fff;\n    font-weight: bold;\n    font-size: 28px;\n    font-family: Roboto-Bold, Roboto;\n  }\n\n  .boxList {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    transition: transform 0.5s ease-in-out;\n\n    & > div {\n      text-align: center;\n    }\n  }\n\n  .boxItem:last-child {\n    margin-right: 0;\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/scroll-number/index.md",
    "content": "---\ntitle: 滚动数字\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 数字\n---\n\n# 数据展示\n\n## API\n\n| 属性           | 必填    | 说明             | 类型               | 默认值 |\n| -------------- | ------- | ---------------- | ------------------ | ------ |\n| value          | `true`  | 数字             | `string \\| number` |        |\n| containerStyle | `false` | 容器自定义样式   | `CSSProperties`    |        |\n| itemStyle      | `false` | 数字自定义样式   | `CSSProperties`    |        |\n| separatorStyle | `false` | 分隔符自定义样式 | `CSSProperties`    |        |\n\n## 1 常规\n\n<code src=\"../../example/ScrollNumberDemo/demo1.tsx\" background=\"#040727\">\n\n## 2 动态改变数值\n\n<code src=\"../../example/ScrollNumberDemo/demo2.tsx\" background=\"#040727\">\n\n## 3 自定义样式\n\n<code src=\"../../example/ScrollNumberDemo/demo3.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/scroll-number/index.tsx",
    "content": "import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\n\nimport './index.less';\n\nexport interface ScrollNumberProps {\n  value: string | number;\n  separatorStyle?: React.CSSProperties;\n  containerStyle?: React.CSSProperties;\n  itemStyle?: React.CSSProperties;\n}\n\nconst ScrollNumber: FC<ScrollNumberProps> = ({ value, containerStyle, itemStyle, separatorStyle }) => {\n  const numberItem = useRef<HTMLDivElement>(null);\n\n  const [numStr, setNumStr] = useState(String(value));\n\n  const width = itemStyle?.width || 18;\n  const height = itemStyle?.height || 32;\n\n  // 设置每一位数字的偏移\n  const setNumberTransform = useCallback(() => {\n    if (numberItem) {\n      if (!numStr) {\n        return;\n      }\n      const items = numberItem?.current?.children || [];\n      const numberArr = numStr.split('');\n      for (let index = 0; index < items.length; index++) {\n        const elem = items[index].children[0] as HTMLElement;\n        if (!elem) {\n          continue;\n        }\n        elem.style.transform = `translate(0%, -${parseInt(numberArr[index]) * 10}%)`;\n      }\n    }\n  }, [numStr]);\n\n  useEffect(() => {\n    setNumStr(String(value));\n    requestAnimationFrame(() => {\n      setNumberTransform();\n    });\n  }, [value, setNumberTransform]);\n\n  return (\n    <div style={containerStyle} className=\"container\" ref={numberItem}>\n      {numStr &&\n        numStr.split('').map((item, index) => {\n          if (item && isNaN(parseInt(item))) {\n            return (\n              <span style={separatorStyle} key={numStr + index}>\n                {item}\n              </span>\n            );\n          }\n          return (\n            <div key={numStr + index} className=\"boxItem\" style={itemStyle}>\n              <div className=\"boxList\">\n                {[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(item => {\n                  return (\n                    <div key={item} style={{ width, height, lineHeight: `${height}px` }}>\n                      {item}\n                    </div>\n                  );\n                })}\n              </div>\n            </div>\n          );\n        })}\n    </div>\n  );\n};\n\nexport default ScrollNumber;\n"
  },
  {
    "path": "packages/lego/src/slice-bar/index.md",
    "content": "---\ntitle: 叠片柱状图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n---\n\n# 叠片柱状图\n\n## API\n\n| 属性          | 必填    | 说明                  | 类型                                            | 默认值   |\n| ------------- | ------- | --------------------- | ----------------------------------------------- | -------- |\n| xAxisData     | `true`  | x 轴数据              | `any[]`                                         |          |\n| unit          | `false` | 单位                  | `string`                                        |          |\n| name          | `false` | 图例名称              | `string`                                        |          |\n| data          | `true`  | 图表数据              | `(number \\| { name: string; value: number })[]` |\n| style         | `false` | 自定义样式            | `CSSProperties`                                 |          |\n| autoLoop      | `false` | 控制是否自动轮播      | `boolean`                                       |          |\n| duration      | `false` | 自动轮播的时长        | `number`                                        | `2000`   |\n| config        | `false` | 自定义 Echarts 配置   | `ECOption`                                      |          |\n| inModal       | `false` | 是否在弹窗内显示      | `boolean`                                       | `false`  |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean`                                       | `true`   |\n| onEvents      | `false` | 图表交互事件          | `Record<string, (params?: any) => void>`        |          |\n| renderer      | `false` | 图表渲染器            | `canvas \\| svg`                                 | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/SliceBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/SliceBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 自动轮播\n\n<code src=\"../../example/SliceBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (轮播两次后停止)\n\n<code src=\"../../example/SliceBarDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (弹窗)\n\n<code src=\"../../example/SliceBarDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (手动控制图表轮播)\n\n<code src=\"../../example/SliceBarDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (SVG 渲染器)\n\n<code src=\"../../example/SliceBarDemo/demo7.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/slice-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  PictorialBarChart, // 系列类型的定义后缀都为 SeriesOption\n  PictorialBarSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  SingleAxisComponent,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { TooltipOption, YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useTheme from '../hooks/useTheme';\nimport createSliceSeries from '../utils/createSliceSeries';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<PictorialBarSeriesOption | TooltipComponentOption | GridComponentOption>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, SingleAxisComponent, PictorialBarChart, CanvasRenderer, SVGRenderer]);\n\nexport interface SliceBarProps {\n  unit?: string;\n  xAxisData: any[];\n  name?: string;\n  max: number;\n  data: (number | string)[];\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 片状体柱状图，对应figma柱状图3\n */\nexport default forwardRef<ReactEcharts, SliceBarProps>(\n  (\n    {\n      unit,\n      max,\n      xAxisData,\n      name,\n      data,\n      style,\n      autoLoop,\n      duration = 2000,\n      config,\n      inModal = false,\n      showYAxisLine = true,\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n\n    const option = merge(\n      {\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n        },\n        tooltip: {\n          ...baseChartConfig.tooltip,\n          axisPointer: {\n            ...(baseChartConfig.tooltip as TooltipOption).axisPointer,\n            type: 'shadow',\n          },\n          formatter: function (params: any) {\n            const str = `\n            <div style=\"display: flex; align-items: center;\">\n              <div style=\"\n                width: 7px;\n                height: 7px;\n                background: linear-gradient(180deg, ${params[0]?.color?.colorStops?.[0]?.color} 0%, ${params[0]?.color\n                  ?.colorStops?.[1]?.color} 100%);\n                margin-right: 4px;\n                border-radius: 7px;\n              \"></div>\n              ${params[0]?.seriesName}：${params[0]?.data?.value || params[0]?.data} ${\n                unit ?? params[0]?.data?.unit ?? ''\n              }\n            </div>\n          `;\n\n            return `\n                <div style=\"\n                  background: linear-gradient(180deg, rgba(18, 81, 204, 0.9) 0%, rgba(12, 49, 117, 0.9) 100%);\n                  border: 1px solid #017AFF;\n                  color: #fff;\n                  font-size: ${inModal ? '18px' : '14px'};\n                  line-height: ${inModal ? '25px' : '22px'};\n                  padding: 5px;\n                  border-radius: 6px;\n                \">\n                  <div>${params[0]?.name}</div>\n                  ${str}\n                </div>\n              `;\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: xAxisData,\n          ...baseChartConfig.xAxis,\n        },\n        yAxis: {\n          name: unit,\n          ...baseChartConfig.yAxis,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n        },\n        series: createSliceSeries(theme, { name: name ?? '', data }, max),\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={echartsRef}\n        echarts={echarts}\n        option={option}\n        style={style}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/stack-bar/index.md",
    "content": "---\ntitle: 堆叠圆柱图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 柱状图\n---\n\n# 堆叠圆柱图\n\n## API\n\n| 属性          | 必填    | 说明                  | 类型                                     | 默认值   |\n| ------------- | ------- | --------------------- | ---------------------------------------- | -------- |\n| xAxisData     | `true`  | x 轴数据              | `any[]`                                  |          |\n| unit          | `false` | 单位                  | `string`                                 |          |\n| seriesData    | `true`  | 图表数据              | `{ name: string; data: number[] }[]`     |          |\n| seriesColor   | `false` | 图表颜色              | `[[string, string], [string, string]]`   |          |\n| style         | `false` | 自定义样式            | `CSSProperties`                          |          |\n| autoLoop      | `false` | 控制是否自动轮播      | `boolean`                                |          |\n| duration      | `false` | 自动轮播的时长        | `number`                                 | `2000`   |\n| config        | `false` | 自定义 Echarts 配置   | `ECOption`                               |          |\n| inModal       | `false` | 是否在弹窗内显示      | `boolean`                                | `false`  |\n| showYAxisLine | `false` | 控制是否显示 y 轴的线 | `boolean`                                | `true`   |\n| onEvents      | `false` | 图表交互事件          | `Record<string, (params?: any) => void>` |          |\n| renderer      | `false` | 图表渲染器            | `canvas \\| svg`                          | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/StackBarDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 (自定义颜色)\n\n<code src=\"../../example/StackBarDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (自动轮播)\n\n<code src=\"../../example/StackBarDemo/demo3.tsx\" background=\"#040727\">\n\n## 效果图 4 (轮播两次后停止)\n\n<code src=\"../../example/StackBarDemo/demo4.tsx\" background=\"#040727\">\n\n## 效果图 5 (弹窗)\n\n<code src=\"../../example/StackBarDemo/demo5.tsx\" background=\"#040727\">\n\n## 效果图 6 (手动控制图表轮播)\n\n<code src=\"../../example/StackBarDemo/demo6.tsx\" background=\"#040727\">\n\n## 效果图 7 (显示背景图)\n\n<code src=\"../../example/StackBarDemo/demo7.tsx\" background=\"#040727\">\n\n## 效果图 8 (SVG 渲染器)\n\n<code src=\"../../example/StackBarDemo/demo8.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/stack-bar/index.tsx",
    "content": "import React, { CSSProperties, forwardRef } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport {\n  CustomChart, // 系列类型的定义后缀都为 SeriesOption\n  CustomSeriesOption,\n} from 'echarts/charts';\nimport {\n  // 组件类型的定义后缀都为 ComponentOption\n  GridComponent,\n  GridComponentOption,\n  TooltipComponent,\n  TooltipComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { TooltipOption, YAXisOption } from 'echarts/types/dist/shared';\nimport { merge } from 'lodash-es';\n\nimport useBaseBarConfig from '../hooks/useBaseBarConfig';\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useChartLoop from '../hooks/useChartLoop';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\nimport createStackSeries from '../utils/createStackSeries';\n\n// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型\ntype ECOption = echarts.ComposeOption<CustomSeriesOption | TooltipComponentOption | GridComponentOption>;\n\n// 注册必须的组件\necharts.use([TooltipComponent, GridComponent, CustomChart, CanvasRenderer, SVGRenderer]);\n\nexport interface StackBarProps {\n  xAxisData: string[];\n  unit?: string;\n  seriesData: { name: string; data: (number | string)[] }[];\n  seriesColor?: [[string, string], [string, string]];\n  style?: CSSProperties;\n  /** 控制是否自动轮播 */\n  autoLoop?: boolean;\n  /** 自动轮播的时长，默认为2s */\n  duration?: number;\n  config?: ECOption;\n  inModal?: boolean;\n  /** 控制是否显示y轴的线，默认显示 */\n  showYAxisLine?: boolean;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 带阴影柱状堆叠图，对应figma柱状图2\n */\nexport default forwardRef<ReactEcharts, StackBarProps>(\n  (\n    {\n      xAxisData,\n      seriesData,\n      seriesColor,\n      unit,\n      style,\n      autoLoop,\n      duration = 2000,\n      config,\n      inModal = false,\n      showYAxisLine = true,\n      onEvents,\n      renderer = 'canvas',\n    },\n    ref\n  ) => {\n    const theme = useTheme();\n    const baseBarConfig = useBaseBarConfig(inModal);\n    const baseChartConfig = useBaseChartConfig(inModal, unit);\n    const echartsRef = useChartLoop(ref, xAxisData, autoLoop, duration);\n    const { style: modifiedStyle } = useStyle(style);\n\n    const chartColor = seriesColor || [theme.colors.primary50, theme.colors.primary300];\n    const totalData: number[] = [];\n    for (let i = 0; i < xAxisData.length; i++) {\n      const element = +seriesData[0].data[i] + +seriesData[1].data[i];\n      totalData.push(element);\n    }\n\n    const option = merge(\n      {\n        legend: {\n          ...baseChartConfig.legend,\n        },\n        grid: {\n          ...baseChartConfig.grid,\n        },\n        tooltip: {\n          ...baseChartConfig.tooltip,\n          axisPointer: {\n            ...(baseChartConfig.tooltip as TooltipOption).axisPointer,\n            type: 'shadow',\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: xAxisData,\n          ...baseChartConfig.xAxis,\n        },\n        yAxis: {\n          name: unit,\n          ...baseChartConfig.yAxis,\n          axisLine: {\n            ...(baseChartConfig.yAxis as YAXisOption).axisLine,\n            show: showYAxisLine,\n          },\n        },\n        series: createStackSeries(chartColor, baseBarConfig, seriesData, totalData, unit),\n      },\n      config\n    );\n\n    return (\n      <div style={modifiedStyle}>\n        <ReactEcharts\n          ref={echartsRef}\n          echarts={echarts}\n          option={option}\n          style={{ width: modifiedStyle.width, height: modifiedStyle.height }}\n          onEvents={onEvents}\n          opts={{ renderer }}\n        />\n      </div>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/src/style/index.less",
    "content": "@font-face {\n  font-family: 'PangMenZhengDao-3';\n  src: url('./font/pmzd.otf');\n}\n"
  },
  {
    "path": "packages/lego/src/swiper/index.less",
    "content": ".td-lego-swiper-container {\n  width: 100%;\n  min-height: 100px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  .swiper-slide {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: -webkit-flex;\n    display: flex;\n    -webkit-align-items: center;\n    align-items: center;\n    -webkit-justify-content: center;\n    justify-content: center;\n    font-size: 18px;\n    text-align: center;\n    transition: 300ms;\n    -webkit-box-pack: center;\n    -ms-flex-pack: center;\n    -webkit-box-align: center;\n    -ms-flex-align: center;\n  }\n\n  .swiper-button-prev,\n  .swiper-button-next {\n    color: #00b7fa;\n  }\n\n  .swiper-pagination-bullet {\n    background-color: #fff;\n  }\n\n  .swiper-pagination-fraction,\n  .swiper-pagination-custom,\n  .swiper-container-horizontal > .swiper-pagination-bullets {\n    bottom: 0px;\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/swiper/index.md",
    "content": "---\ntitle: 轮播图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 轮播图\n\n## API\n\n| 属性           | 必填    | 说明                               | 类型               | 默认值 |\n| -------------- | ------- | ---------------------------------- | ------------------ | ------ |\n| imgs           | `false` | 需要轮播的图片                     | `string[]`         |        |\n| list           | `false` | 解决除图片轮播之外的情况           | `ReactNode[]`      |        |\n| style          | `false` | img 的样式，主要为宽度和高度       | `CSSProperties`    |        |\n| autoplay       | `false` | 是否自动播放，delay 为切换速度(ms) | `{delay: number;}` |        |\n| imgNumPerSlide | `false` | 每次轮播时展示几张图片             | `number`           |        |\n| pagination     | `false` | 分页器配置                         | `any`              |        |\n\n## 效果图 1\n\n<code src=\"../../example/SwiperDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/SwiperDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3\n\n<code src=\"../../example/SwiperDemo/demo3.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/swiper/index.tsx",
    "content": "import React, { forwardRef, ReactNode, useImperativeHandle } from 'react';\n\nimport { Autoplay, Pagination } from 'swiper';\nimport 'swiper/css/pagination';\nimport { Swiper, SwiperSlide, useSwiper } from 'swiper/react';\nimport 'swiper/swiper.min.css';\n\nimport './index.less';\n\nexport interface CustomSwiperProps {\n  /** 需要轮播的图片 */\n  imgs?: string[];\n  /** img的样式，主要为宽度和高度 */\n  style?: React.CSSProperties;\n  /** 是否自动播放，delay为切换速度(ms) */\n  autoplay?: {\n    delay: number;\n  };\n  /** 每次轮播时展示几张图片 */\n  imgNumPerSlide?: number;\n  /** 解决除图片轮播之外的情况 */\n  list?: ReactNode[];\n  /** 分页器 */\n  pagination?: any;\n}\n\nconst CustomSwiper = forwardRef<any, CustomSwiperProps>(\n  ({ imgs = [], style, imgNumPerSlide = 1, autoplay, list = [], pagination }, ref) => {\n    const auto = autoplay?.delay ? { pauseOnMouseEnter: true, disableOnInteraction: false, ...autoplay } : false;\n    const paddingBottom = pagination === false ? 0 : 40;\n\n    const swiperInstance = useSwiper();\n\n    useImperativeHandle(ref, () => {\n      return {\n        enable() {\n          swiperInstance.enable();\n        },\n        disable() {\n          swiperInstance.disable();\n        },\n        slideNext() {\n          swiperInstance.slideNext();\n        },\n        slidePrev() {\n          swiperInstance.slidePrev();\n        },\n        slideReset() {\n          swiperInstance.slideReset();\n        },\n        slideTo(index: number, speed?: number) {\n          swiperInstance.slideTo(index, speed);\n        },\n      };\n    });\n\n    return (\n      <div className=\"td-lego-swiper-container\">\n        {imgs.length > 0 || list.length > 0 ? (\n          <Swiper\n            modules={[Pagination, Autoplay]}\n            spaceBetween={0}\n            slidesPerView={imgNumPerSlide}\n            slidesPerGroup={imgNumPerSlide}\n            loop\n            pagination={pagination === false ? false : { clickable: true, ...pagination }}\n            autoplay={auto}\n            initialSlide={0}\n          >\n            {imgs.length > 0\n              ? imgs.map((item, index) => (\n                  <SwiperSlide key={index}>\n                    <img\n                      src={item}\n                      key={index}\n                      style={{\n                        width: 692,\n                        height: 297,\n                        paddingBottom,\n                        ...style,\n                      }}\n                    />\n                  </SwiperSlide>\n                ))\n              : list.map((ele, index) => (\n                  <SwiperSlide key={index} style={{ paddingBottom, ...style }}>\n                    {ele}\n                  </SwiperSlide>\n                ))}\n          </Swiper>\n        ) : null}\n      </div>\n    );\n  }\n);\n\nexport default CustomSwiper;\n"
  },
  {
    "path": "packages/lego/src/table/index.less",
    "content": ".td-lego-table-container {\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n  padding: 8px;\n\n  .table-view {\n    padding: 3px;\n    background-size: 100% 100%;\n    height: 100%;\n\n    .td-lego-table-header {\n      width: 100%;\n      height: 36px;\n      color: #fff;\n      border-top-left-radius: 4px;\n      border-top-right-radius: 4px;\n    }\n\n    .td-lego-table-waybill-table {\n      width: 100%;\n      color: #fff;\n\n      .table-swiper {\n        min-height: 30px;\n        overflow: hidden;\n      }\n    }\n\n    .td-lego-table-content {\n      display: flex;\n      flex-direction: row;\n      align-items: center;\n      justify-content: space-between;\n      /** 100% */\n      height: 100%;\n\n      .text {\n        text-align: center;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n    }\n  }\n}\n\n.waybill-table::-webkit-scrollbar {\n  width: 6px;\n}\n/* 滚动槽 */\n::-webkit-scrollbar-track {\n  border-radius: 10px;\n}\n/* 滚动条滑块 */\n::-webkit-scrollbar-thumb {\n  background: rgba(126, 112, 112, 0.1);\n  border-radius: 10px;\n}\n::-webkit-scrollbar-thumb:window-inactive {\n  background: rgba(0, 0, 0, 0.1);\n}\n"
  },
  {
    "path": "packages/lego/src/table/index.md",
    "content": "---\ntitle: 表格\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 表格\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| columns | `true` | 列数据 | `Column[]` |  |\n| data | `true` | 数据源 | `T[]` |  |\n| height | `false` | 除了表头的表格内容高度, 如果不填默认撑满父组件 | `number` | `calc(100% - 36px)` |\n| pageSize | `true` | 每屏显示几条数据 | `number` |  |\n| speed | `false` | 速度（ms） | `number` |  |\n| autoplay | `false` | 自动轮播, 注：pageSize必须小于等于数量的一半才能自动轮播 | `boolean` |  |\n| inModal | `false` | 是否在弹窗中 | `boolean` |  |\n| colors | `false` | 自定义颜色 | `[string, string] \\| [string, string, string]` |  |\n| headerClass | `false` | 表头的类 | `string` |  |\n| contentClass | `false` | 内容的类 | `string` |  |\n\n```ts\ntype Column<T> = {\n  title: string;\n  dataIndex: string;\n  id?: number | string;\n  width?: number;\n  // 使用flex计算宽度 优先级比width高\n  flex?: number;\n  // 文本对齐方式\n  textAlign?: 'center' | 'left' | 'right';\n  render?: (data: T) => ReactElement;\n};\n```\n\n## 默认效果\n\n<code src=\"../../example/TableDemo/demo1.tsx\" background=\"#040727\">\n\n## 弹窗内 Table\n\n<code src=\"../../example/TableDemo/demo2.tsx\" background=\"#040727\">\n\n## 修改 Table 的渲染颜色\n\n<code src=\"../../example/TableDemo/demo3.tsx\" background=\"#040727\">\n\n## 自定义渲染函数\n\n<code src=\"../../example/TableDemo/demo4.tsx\" background=\"#040727\">\n\n## 不滚动并自定义高度\n\n<code src=\"../../example/TableDemo/demo5.tsx\" background=\"#040727\">\n\n## flex 控制列宽度\n\n<code src=\"../../example/TableDemo/demo6.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/table/index.tsx",
    "content": "import React, { memo, PropsWithChildren, ReactElement } from 'react';\n\nimport classnames from 'classnames';\nimport { isEmpty } from 'lodash-es';\nimport { Autoplay } from 'swiper';\nimport 'swiper/css/pagination';\nimport { Swiper, SwiperSlide } from 'swiper/react';\n\nimport useTheme from '../hooks/useTheme';\nimport './index.less';\n\nexport type TextAlign = 'center' | 'left' | 'right';\n\nexport type Column<T = any> = {\n  title: string;\n  dataIndex: string;\n  id?: number | string;\n  width?: number;\n  flex?: number;\n  /** 文字对齐方式 */\n  textAlign?: TextAlign;\n  render?: (data: T, index: number) => ReactElement;\n};\n\nexport type CustomTableProps<T> = {\n  /** 列数据 */\n  columns: Column<T>[];\n  /** 数据源 */\n  data: T[];\n  /** 容器高度 */\n  height?: number;\n  /** 每屏显示几条数据 */\n  pageSize: number;\n  /** 速度（ms） */\n  speed?: number;\n  /** 自动轮播 */\n  autoplay?: boolean;\n  /** 是否在弹窗中 */\n  inModal?: boolean;\n  /** 背景颜色 */\n  colors?: [string, string] | [string, string, string];\n  /** 表头的类 */\n  headerClass?: string;\n  /** 内容的class */\n  contentClass?: string;\n};\n\nfunction Table<T extends Record<string, any>>({\n  columns = [],\n  data = [],\n  height = 0,\n  pageSize = 1,\n  speed = 1000,\n  autoplay = true,\n  inModal = false,\n  colors = ['rgba(51, 64, 146, 1)', 'rgba(35, 40, 129, 1)'],\n  headerClass,\n  contentClass,\n}: CustomTableProps<T>) {\n  const theme = useTheme();\n\n  const cellStyle = ({ width, flex }: { width: number | string; flex?: number }) => {\n    if (flex) {\n      return { flex };\n    }\n\n    return { width };\n  };\n\n  const slidesPerViewParams = pageSize > data.length ? data.length : pageSize;\n\n  const bgHeight: string = height\n    ? `${(height / slidesPerViewParams) * 2}px`\n    : `calc(100% / ${slidesPerViewParams / 2})`;\n\n  return (\n    <div className=\"td-lego-table-container\">\n      <div style={{ width: '100%', height: '100%' }}>\n        <div className=\"table-view\">\n          <div\n            className={classnames('td-lego-table-header', headerClass)}\n            style={{ backgroundColor: colors?.[2] ?? colors?.[1] }}\n          >\n            {!isEmpty(columns) && (\n              <div className=\"td-lego-table-content\">\n                {columns.map(item => {\n                  return (\n                    <div\n                      className=\"text\"\n                      key={item.id}\n                      style={{\n                        ...theme.typography[inModal ? 'p0' : 'p2'],\n                        lineHeight: inModal ? '25px' : '19px',\n                        textAlign: 'center',\n                        ...cellStyle({\n                          width: item.width || `${100 / columns?.length}%`,\n                          flex: item.flex,\n                        }),\n                      }}\n                    >\n                      {item.title}\n                    </div>\n                  );\n                })}\n              </div>\n            )}\n          </div>\n          <div\n            className={classnames('td-lego-table-waybill-table', contentClass)}\n            style={{\n              // 如果直接设置background，切换colors会报错（background和backgroundSize属性冲突）\n              backgroundImage: `linear-gradient( ${colors[0]} 50%, ${colors[1]} 0)`,\n              backgroundSize: `100% ${bgHeight}`,\n              height: `${height === 0 ? 'calc(100% - 36px)' : height}`,\n              overflow: autoplay ? 'hidden' : 'auto',\n            }}\n          >\n            {!isEmpty(data) && !isEmpty(columns) && (\n              <Container\n                {...{\n                  height: `${height ? height + 'px' : '100%'}`,\n                  pageSize: slidesPerViewParams,\n                  speed,\n                  autoplay,\n                }}\n              >\n                {data.map((item, index) => {\n                  return (\n                    <SwiperSlide key={index}>\n                      <div\n                        className=\"td-lego-table-content\"\n                        style={{\n                          ...theme.typography[inModal ? 'p0' : 'p2'],\n                          lineHeight: inModal ? '25px' : '19px',\n                        }}\n                      >\n                        {columns.map((term, idx) => {\n                          return (\n                            <div\n                              key={term.id}\n                              className=\"text\"\n                              style={{\n                                ...cellStyle({\n                                  width: term.width || `${100 / columns?.length}%`,\n                                  flex: term.flex,\n                                }),\n                                textAlign: term.textAlign || 'center',\n                              }}\n                            >\n                              {term.render ? term.render(item, index) : item?.[term.dataIndex]}\n                            </div>\n                          );\n                        })}\n                      </div>\n                    </SwiperSlide>\n                  );\n                })}\n              </Container>\n            )}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nconst Container = memo(\n  ({\n    height,\n    pageSize,\n    autoplay,\n    speed,\n    children,\n  }: PropsWithChildren<{\n    height: string | number;\n    pageSize: number;\n    autoplay: boolean;\n    speed: number;\n  }>) => {\n    return (\n      <Swiper\n        direction={'vertical'}\n        modules={[Autoplay]}\n        slidesPerView={pageSize}\n        spaceBetween={0}\n        loop\n        autoplay={\n          autoplay\n            ? {\n                delay: speed,\n                disableOnInteraction: false,\n                pauseOnMouseEnter: true,\n              }\n            : false\n        }\n        style={{ height }}\n      >\n        {children}\n      </Swiper>\n    );\n  }\n);\n\nexport default Table;\n"
  },
  {
    "path": "packages/lego/src/text-scroll/index.less",
    "content": ".td-lego-text-scroll-list {\n  padding-bottom: 1px;\n  &:hover {\n    animation-play-state: paused !important;\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/text-scroll/index.md",
    "content": "---\ntitle: 文字滚动\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 文字滚动\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| texts | `true` | 文字数组 | `string[]` |  |\n| scrollSpeed | `false` | 滚动速度，通过时间控制，单位 s | `number` | `5` |\n| delay | `false` | 文字滚动的延迟时间，单位 s | `number` | `2` |\n| textStyle | `false` | 文字的样式 | `CSSProperties` |  |\n| contentStyle | `false` | 内容的样式，主要用于设置文字滚动的高度, 高度最好设置为数据 \\* 单个数据的高度，可以实现无缝轮播 | `CSSProperties` |  |\n| inModal | `false` | 是否在弹窗中 | `boolean` | `false` |\n\n## 效果图 1\n\n<code src=\"../../example/TextScrollDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2\n\n<code src=\"../../example/TextScrollDemo/demo2.tsx\" background=\"#040727\">\n\n## 效果图 3 (弹窗)\n\n<code src=\"../../example/TextScrollDemo/demo3.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/text-scroll/index.tsx",
    "content": "import React, { CSSProperties, useEffect } from 'react';\n\nimport useTheme from '../hooks/useTheme';\nimport './index.less';\n\nexport interface TextScrollProps {\n  texts: string[];\n  /** 滚动速度，通过时间控制，单位s */\n  scrollSpeed?: number;\n  /** 文字滚动的延迟时间，单位s */\n  delay?: number;\n  /** 文字的样式 */\n  textStyle?: CSSProperties;\n  /** 内容的样式，主要用于设置文字滚动的高度 */\n  contentStyle?: CSSProperties;\n  /** 在弹窗中 */\n  inModal?: boolean;\n}\n\nexport default ({\n  texts = [],\n  textStyle,\n  scrollSpeed = 5,\n  delay = 2,\n  contentStyle,\n  inModal = false,\n}: TextScrollProps) => {\n  const theme = useTheme();\n\n  useEffect(() => {\n    if (texts.length > 0) {\n      const node = document.getElementById('list');\n      const runKeyframes = `\n        @keyframes scroll {\n          0% {\n            transform: translateY(0);\n          }\n          100% {\n            transform: translateY(-50%);\n          }\n        }`;\n      const style = document.createElement('style');\n      style.innerHTML = runKeyframes;\n      node?.appendChild(style);\n    }\n  }, [texts]);\n\n  const lineHeight = inModal ? 25 : 19;\n  /** 两组数据解决轮播后面会空白的问题 */\n  const textList = [...texts, ...texts];\n  const content = textList?.map((item: string, index: number) => (\n    <div\n      key={index}\n      style={\n        {\n          color: theme.colors.gray50,\n          ...theme.typography[inModal ? 'p0' : 'p2'],\n          lineHeight: `${lineHeight}px`,\n          textIndent: '2em',\n          wordSpacing: -0.7,\n          marginBottom: 7,\n          ...textStyle,\n        } as CSSProperties\n      }\n      dangerouslySetInnerHTML={{ __html: decodeHTML(item) }}\n    ></div>\n  ));\n\n  return (\n    <div style={{ height: lineHeight * texts?.length, overflow: 'hidden', ...contentStyle }}>\n      <div\n        id=\"list\"\n        style={{\n          animation: `scroll ${scrollSpeed}s ${delay}s linear infinite`,\n        }}\n        className=\"td-lego-text-scroll-list\"\n      >\n        {content}\n      </div>\n    </div>\n  );\n};\n\nconst decodeHTML = (text: string) => {\n  if (!text) return '';\n  const temp = document.createElement('div');\n  temp.innerHTML = text;\n  const output = temp.innerText || temp.textContent;\n  return output || '';\n};\n"
  },
  {
    "path": "packages/lego/src/theme.ts",
    "content": "import createLinearGradient from './utils/createLinearGradient';\n\nconst theme = {\n  typography: {\n    h0: {\n      fontSize: 48,\n      lineHeight: 55,\n      fontWeight: 'normal',\n      fontStyle: 'normal',\n      fontFamily: 'PangMenZhengDao-3',\n    },\n    h1: {\n      fontSize: 38,\n      lineHeight: 45,\n      fontWeight: 'bold',\n      fontStyle: 'normal',\n      fontFamily: 'Roboto',\n    },\n    h2: {\n      fontSize: 32,\n      lineHeight: 37,\n      fontWeight: 'normal',\n      fontStyle: 'normal',\n      fontFamily: 'PangMenZhengDao-3',\n    },\n    h3: {\n      fontSize: 24,\n      lineHeight: 27,\n      fontWeight: 'normal',\n      fontStyle: 'normal',\n      fontFamily: 'PangMenZhengDao-3',\n    },\n    h4: {\n      fontSize: 20,\n      lineHeight: 23,\n      fontWeight: 'bold',\n      fontStyle: 'normal',\n      fontFamily: 'Roboto',\n    },\n    h5: {\n      fontSize: 18,\n      lineHeight: 21,\n      fontWeight: 'bold',\n      fontStyle: 'normal',\n      fontFamily: 'Roboto',\n    },\n    p0: {\n      fontSize: 18,\n      lineHeight: 25,\n      fontWeight: 'normal',\n      fontStyle: 'normal',\n      fontFamily: 'Alibaba PuHuiTi',\n    },\n    p1: {\n      fontSize: 16,\n      lineHeight: 22,\n      fontWeight: 'normal',\n      fontStyle: 'normal',\n      fontFamily: 'Alibaba PuHuiTi',\n    },\n    p2: {\n      fontSize: 14,\n      lineHeight: 19,\n      fontWeight: 'normal',\n      fontStyle: 'normal',\n      fontFamily: 'Alibaba PuHuiTi',\n    },\n    p3: {\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 'normal',\n      fontStyle: 'normal',\n      fontFamily: 'Alibaba PuHuiTi',\n    },\n  },\n  colors: {\n    primary50: ['#3FA4FF', '#60F5FF'],\n    primary100: ['#413ED6', '#728DED'],\n    primary200: ['#46E081', '#0DFFB7'],\n    primary300: ['#FEB01E', '#F2F756'],\n    primary400: ['#FF3657', '#FF72A6'],\n    primary500: ['#A13ED6', '#CF72ED'],\n    func50: '#FF4D4D',\n    gray50: '#ffffff',\n    gray100: '#cccccc',\n    gray200: 'rgba(255,255,255,0.15)',\n    assist50: createLinearGradient(['#24689E', '#1C3D62']),\n    assist100: '#CC9F08',\n    assist200: '#85C5FF',\n    assist300: createLinearGradient(['rgba(13, 255, 187, 0)', 'rgba(70, 224, 129, 0.4)']),\n    assist400: createLinearGradient(['rgba(63, 164, 255, 0)', 'rgba(96, 154, 255, 0.4)']),\n    assist500: '#1968FF',\n    assist600: '#47FFC6',\n    assist700: '#00ABFF',\n    assist800: '#FDB522',\n    assist900: createLinearGradient(['#FEB01E', '#ECD542'], false),\n    assist1000: '#50DFFF',\n    assist1100: createLinearGradient(['#3BFFBA', '#0F2623'], false),\n  },\n} as any;\n\nexport default theme;\nexport type Theme = typeof theme;\n"
  },
  {
    "path": "packages/lego/src/three-dimensional-pie/index.less",
    "content": ".td-lego-3d-pie {\n  position: relative;\n\n  .td-lego-3d-pie-text-wrap {\n    position: absolute;\n    color: #fff;\n    left: 39%;\n    top: 40%;\n    z-index: 999;\n\n    .td-lego-3d-pie-title {\n      text-align: center;\n      font-family: Roboto;\n      font-size: 38px;\n      font-style: normal;\n      font-weight: 700;\n      line-height: 38px;\n    }\n\n    .td-lego-3d-pie-text {\n      font-family: Alibaba PuHuiTi;\n      text-align: center;\n      font-size: 14px;\n      font-style: normal;\n      font-weight: 400;\n    }\n  }\n}"
  },
  {
    "path": "packages/lego/src/three-dimensional-pie/index.md",
    "content": "---\ntitle: 3D立体饼图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 饼图\n---\n\n# 3D 立体饼图\n\n## API\n\n| 属性        | 必填    | 说明             | 类型                                     | 默认值  |\n| ----------- | ------- | ---------------- | ---------------------------------------- | ------- |\n| seriesData  | `true`  | 图表数据         | `{ name: string; value: string }[]`      |         |\n| style       | `false` | 自定义样式       | `CSSProperties`                          |         |\n| barConfig   | `false` | 3D 饼图纵向配置  | `ECOption`                               |         |\n| pieConfig   | `false` | 3D 饼图配置      | `ECOption`                               |         |\n| autoLoop    | `false` | 是否自动切换     | `boolean`                                |         |\n| isFlat      | `false` | 是否扁平         | `boolean`                                | `true`  |\n| loopSpeed   | `false` | 切换速度         | `number`                                 | `2000`  |\n| coefficient | `false` | 高度系数         | `number`                                 | `1`     |\n| pieColors   | `false` | 自定义颜色       | `string[]`                               |         |\n| showTitle   | `false` | 是否显示中心标题 | `boolean`                                | `false` |\n| titleStyle  | `false` | 中心标题的样式   | `CSSProperties`                          |         |\n| onEvents    | `false` | 自定义事件       | `Record<string, (params?: any) => void>` |         |\n\n## 基本效果\n\n<code src=\"../../example/ThreeDimensionalPieDemo/demo1.tsx\" background=\"#040727\">\n\n## 根据数量有高低\n\n<code src=\"../../example/ThreeDimensionalPieDemo/demo2.tsx\" background=\"#040727\">\n\n## 弹窗效果\n\n<code src=\"../../example/ThreeDimensionalPieDemo/demo3.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/three-dimensional-pie/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport 'echarts-gl';\nimport { PieChart, PieSeriesOption } from 'echarts/charts';\nimport { GraphicComponent, GraphicComponentOption, TooltipComponent, TooltipComponentOption } from 'echarts/components';\nimport { merge } from 'lodash-es';\n\nimport useBaseChartConfig from '../hooks/useBaseChartConfig';\nimport useBasePieConfig from '../hooks/useBasePieConfig';\nimport useEchartsRef from '../hooks/useEchartsRef';\nimport { useRAF } from '../hooks/useRAF';\nimport useStyle from '../hooks/useStyle';\nimport useTheme from '../hooks/useTheme';\nimport './index.less';\n\ntype ECOption = echarts.ComposeOption<PieSeriesOption | TooltipComponentOption | GraphicComponentOption>;\n\necharts.use([TooltipComponent, PieChart, GraphicComponent]);\n\nconst BAR_WIDTH_COEFFICIENT = 0.6;\n\nexport interface ThreeDimensionalPieProps {\n  seriesData: { name: string; value: string | number }[];\n  style?: CSSProperties;\n  barConfig?: ECOption;\n  pieConfig?: ECOption;\n  autoLoop?: boolean;\n  isFlat?: boolean;\n  loopSpeed?: number;\n  inModal?: boolean;\n  onEvents?: Record<string, (params?: any) => void>;\n  coefficient?: number;\n  pieColors?: string[];\n  showTitle?: boolean;\n  titleStyle?: CSSProperties;\n}\n\n/** 3D立体饼图-对应Figma饼图2 */\nexport default forwardRef<ReactEcharts, ThreeDimensionalPieProps>(\n  (\n    {\n      seriesData,\n      style,\n      autoLoop,\n      loopSpeed = 2000,\n      barConfig,\n      pieConfig,\n      isFlat = true,\n      inModal = false,\n      pieColors = [],\n      onEvents,\n      coefficient = 1,\n      showTitle = false,\n      titleStyle,\n    },\n    ref\n  ) => {\n    const { ref: echartsRef, getInstance } = useEchartsRef(ref);\n    const { raf } = useRAF();\n    const theme = useTheme();\n    const basePieConfig = useBasePieConfig(inModal);\n    const baseChartConfig = useBaseChartConfig();\n    const { style: modifiedStyle } = useStyle(style);\n\n    const colors =\n      pieColors?.length > 0 && pieColors.length >= seriesData?.length\n        ? pieColors\n        : [\n            theme.colors.primary50[0],\n            theme.colors.primary100[0],\n            theme.colors.primary200[0],\n            theme.colors.primary300[0],\n            theme.colors.primary400[0],\n            theme.colors.primary500[0],\n          ];\n\n    const len = seriesData?.length || 0;\n\n    const [index, setIndex] = useState(0);\n    const [hoveredIndex, setHoveredIndex] = useState<string>('');\n\n    // 生成数据\n    const generateData = useCallback(\n      (props: { option: any; hoveredIndex?: any; seriesIndex?: string; kCondition?: number; upCondition?: number }) => {\n        const { option, hoveredIndex, kCondition = 1, upCondition = 1 } = props;\n        if (!option?.series) {\n          return;\n        }\n        const isHovered = hoveredIndex !== '' ? false : true;\n\n        // 准备重新渲染扇形所需的参数\n        const isSelected = option.series[hoveredIndex]?.pieStatus?.selected;\n        const startRatio = option.series[hoveredIndex]?.pieData?.startRatio;\n        const endRatio = option.series[hoveredIndex]?.pieData?.endRatio;\n        const k = option.series[hoveredIndex]?.pieStatus?.k;\n\n        const value =\n          option.series[hoveredIndex] && option.series[hoveredIndex].pieData\n            ? option.series[hoveredIndex].pieData.value\n            : 30;\n        // 对当前点击的扇形，执行取消高亮操作（对 option 更新）\n        option.series[hoveredIndex].parametricEquation = getParametricEquation(\n          startRatio,\n          endRatio,\n          isSelected,\n          isHovered,\n          k * kCondition,\n          generate3DHeight(isFlat, value, upCondition * coefficient)\n        );\n\n        if (option?.series[hoveredIndex]?.pieStatus) {\n          option.series[hoveredIndex].pieStatus.hovered = isHovered;\n        }\n      },\n      [coefficient, isFlat]\n    );\n\n    const total = seriesData\n      .map(item => +item.value)\n      .reduce((value: number, total: number) => {\n        return value + total;\n      }, 0);\n\n    const newData = seriesData.map((item, index: number) => {\n      let value = +item.value / total;\n      value = Math.ceil(value * 100);\n      return { name: item.name, value, itemStyle: { color: colors[index] } };\n    });\n\n    const option = getPie3D(\n      barConfig,\n      pieConfig,\n      theme,\n      basePieConfig,\n      baseChartConfig,\n      newData,\n      0.7,\n      isFlat,\n      inModal,\n      coefficient\n    );\n\n    const updateData = useCallback(() => {\n      const seriesIndex = index.toString();\n      if (echartsRef && seriesData) {\n        const myChart = getInstance();\n        if (hoveredIndex === seriesIndex) {\n          return;\n          // 否则进行高亮及必要的取消高亮操作\n        } else {\n          // 如果当前有高亮的扇形，取消其高亮状态（对 option 更新）\n          if (hoveredIndex !== '' && option?.series) {\n            generateData({ option, hoveredIndex });\n            // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空\n            setHoveredIndex('');\n          }\n          // 如果触发 mouseover 的扇形不是透明圆环，将其高亮（对 option 更新）\n          if (option?.series) {\n            generateData({\n              option,\n              hoveredIndex: seriesIndex,\n              kCondition: BAR_WIDTH_COEFFICIENT,\n              upCondition: 1.5,\n            });\n            setHoveredIndex(seriesIndex);\n            // 记录上次高亮的扇形对应的系列号 seriesIndex\n          }\n          // 使用更新后的 option，渲染图表\n          myChart?.setOption(option);\n        }\n      }\n    }, [echartsRef, generateData, hoveredIndex, index, getInstance, option, seriesData]);\n\n    useEffect(() => {\n      if (!autoLoop) {\n        return;\n      }\n      const newIndex = index + 1 === len ? 0 : index + 1;\n      const interval = raf.setInterval(() => {\n        setIndex(newIndex);\n        updateData();\n      }, loopSpeed);\n      return () => raf.clearInterval(interval);\n    }, [len, index, updateData, raf, autoLoop, loopSpeed]);\n\n    // 监听鼠标事件\n    useEffect(() => {\n      let hoveredIndex = '';\n      if (autoLoop) return;\n      if (echartsRef && seriesData) {\n        const myChart = getInstance();\n        myChart.on('mouseover', function (params: { seriesName?: string }) {\n          let seriesIndex = '0';\n          const newSeries = option?.series as typeof seriesData;\n          option?.series &&\n            newSeries.forEach((element, index) => {\n              if (params.seriesName === element.name) {\n                seriesIndex = index.toString();\n              }\n            });\n          // 如果触发 mouseover 的扇形当前已高亮，则不做操作\n          if (hoveredIndex === seriesIndex) {\n            return;\n          } else {\n            if (hoveredIndex !== '') {\n              generateData({ option, hoveredIndex });\n            }\n            // 如果触发 mouseover 的扇形不是透明圆环，将其高亮（对 option 更新）\n            if (params.seriesName !== 'mouseoutSeries' && params.seriesName !== 'pie2d') {\n              generateData({\n                option,\n                hoveredIndex: seriesIndex,\n                kCondition: BAR_WIDTH_COEFFICIENT,\n                upCondition: 1.5,\n              });\n            }\n            hoveredIndex = hoveredIndex !== '' ? '' : seriesIndex;\n            myChart.setOption(option);\n          }\n        });\n\n        // 修正取消高亮失败的 bug\n        myChart.on('globalout', function () {\n          if (hoveredIndex !== '' && option?.series) {\n            generateData({ option, hoveredIndex });\n            // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空\n            hoveredIndex = '';\n          }\n          myChart.setOption(option);\n        });\n      }\n    }, [echartsRef, seriesData, option, isFlat, generateData, getInstance]);\n\n    return (\n      <div className=\"td-lego-3d-pie\" style={modifiedStyle}>\n        {showTitle && hoveredIndex ? (\n          <div className=\"td-lego-3d-pie-text-wrap\" style={titleStyle}>\n            <div className=\"td-lego-3d-pie-title\">\n              {((seriesData?.[hoveredIndex]?.value / total) * 100).toFixed(2) + '%'}\n            </div>\n            <div className=\"td-lego-3d-pie-text\">{seriesData?.[hoveredIndex]?.name}</div>\n          </div>\n        ) : null}\n        <ReactEcharts\n          ref={echartsRef}\n          style={{ width: modifiedStyle.width, height: modifiedStyle.height }}\n          echarts={echarts}\n          option={option}\n          onEvents={onEvents}\n        />\n      </div>\n    );\n  }\n);\n\nfunction getParametricEquation(\n  startRatio: number,\n  endRatio: number,\n  isSelected: boolean,\n  isHovered: boolean,\n  k: number,\n  h: number\n) {\n  // 计算\n  const midRatio = (startRatio + endRatio) / 2;\n\n  const startRadian = startRatio * Math.PI * 2;\n  const endRadian = endRatio * Math.PI * 2;\n  const midRadian = midRatio * Math.PI * 2;\n\n  // 如果只有一个扇形，则不实现选中效果。\n  if (startRatio === 0 && endRatio === 1) {\n    isSelected = false;\n  }\n\n  // 通过扇形内径/外径的值，换算出辅助参数 k（默认值 1/3）\n  k = typeof k !== 'undefined' ? k : 1 / 3;\n\n  // 计算选中效果分别在 x 轴、y 轴方向上的位移（未选中，则位移均为 0）\n  const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;\n  const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;\n\n  // 计算高亮效果的放大比例（未高亮，则比例为 1）\n  const hoverRate = isHovered ? 1.05 : 1;\n\n  // 返回曲面参数方程\n  return {\n    u: {\n      min: -Math.PI,\n      max: Math.PI * 3,\n      step: Math.PI / 32,\n    },\n    v: {\n      min: 0,\n      max: Math.PI * 2,\n      step: Math.PI / 20,\n    },\n    x: function (u: number, v: number) {\n      if (u < startRadian) {\n        return offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate;\n      }\n      if (u > endRadian) {\n        return offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate;\n      }\n      return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;\n    },\n\n    y: function (u: number, v: number) {\n      if (u < startRadian) {\n        return offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate;\n      }\n      if (u > endRadian) {\n        return offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate;\n      }\n      return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;\n    },\n\n    z: function (u: number, v: number) {\n      if (u < -Math.PI * 0.5) {\n        return Math.sin(u);\n      }\n      if (u > Math.PI * 2.5) {\n        return Math.sin(u) * h * 0.1;\n      }\n      return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;\n    },\n  };\n}\n\n// 生成模拟 3D 饼图的配置项\nfunction getPie3D(\n  barConfig: ECOption = {},\n  pieConfig: ECOption = {},\n  theme: any,\n  basePieConfig: PieSeriesOption,\n  baseChartConfig: any,\n  pieData: string | any[],\n  internalDiameterRatio: number,\n  isFlat = true,\n  inModal = false,\n  coefficient = 1\n) {\n  const series: any[] = [];\n  let sumValue = 0;\n  let startValue = 0;\n  let endValue = 0;\n  const legendData: any[] = [];\n  const k =\n    typeof internalDiameterRatio !== 'undefined' ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio) : 1 / 3;\n\n  // 为每一个饼图数据，生成一个 series-surface 配置\n  for (let i = 0; i < pieData.length; i++) {\n    sumValue += pieData[i].value;\n\n    const seriesItem = {\n      name: typeof pieData[i].name === 'undefined' ? `series${i}` : pieData[i].name,\n      type: 'surface',\n      parametric: true,\n      wireframe: {\n        show: false,\n      },\n      shading: 'realistic',\n      itemStyle: {},\n      pieData: pieData[i],\n      parametricEquation: {},\n      pieStatus: {\n        selected: false,\n        hovered: false,\n        k: k,\n      },\n      zlevel: 10,\n    };\n\n    if (typeof pieData[i].itemStyle != 'undefined') {\n      const itemStyle = { color: '', opacity: 1 };\n\n      typeof pieData[i].itemStyle.color != 'undefined' ? (itemStyle.color = pieData[i].itemStyle.color) : null;\n      typeof pieData[i].itemStyle.opacity != 'undefined' ? (itemStyle.opacity = pieData[i].itemStyle.opacity) : null;\n\n      seriesItem.itemStyle = itemStyle;\n    }\n    series.push(seriesItem);\n  }\n\n  // 使用上一次遍历时，计算出的数据和 sumValue，调用 getParametricEquation 函数，\n  // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation，也就是实现每一个扇形。\n  for (let i = 0; i < series.length; i++) {\n    endValue = startValue + series[i].pieData.value;\n\n    series[i].pieData.startRatio = startValue / sumValue;\n    series[i].pieData.endRatio = endValue / sumValue;\n\n    series[i].parametricEquation = getParametricEquation(\n      series[i].pieData.startRatio,\n      series[i].pieData.endRatio,\n      false,\n      false,\n      k,\n      generate3DHeight(isFlat, series[i].pieData?.value, coefficient)\n    );\n\n    startValue = endValue;\n    legendData.push(series[i].name);\n  }\n\n  // 添加2D饼图\n  const pieSeries = {\n    name: 'pie2d',\n    type: 'pie',\n    itemStyle: {\n      opacity: 0,\n      borderWidth: 0,\n      color: 'transparent',\n    },\n    legendHoverLink: false,\n    emphasis: { scale: false },\n    label: {\n      show: true,\n      position: 'outside',\n      padding: [10, -70, 40, -80],\n      formatter: '{a|{b}}{a|{d}%}',\n      align: 'left',\n      opacity: 1,\n      rich: {\n        a: {\n          ...theme.typography[inModal ? 'p0' : 'p2'],\n          color: theme.colors.gray50,\n        },\n      },\n    },\n    labelLine: {\n      ...basePieConfig.labelLine,\n      show: true,\n      length: inModal ? 70 : 50,\n      length2: inModal ? 110 : 90,\n      minTurnAngle: 45,\n      lineStyle: {\n        color: theme.colors.gray50,\n      },\n    },\n    zlevel: 1,\n    startAngle: 0,\n    //起始角度，支持范围[0,360],\n    clockwise: false, //饼图的扇区是否是顺时针排布。上述这两项配置主要是为了对齐3d的样式\n    radius: ['46%', '46%'],\n    center: ['50%', '58%'],\n    data: pieData,\n  };\n  series?.push(merge(pieSeries, pieConfig));\n\n  // 准备待返回的配置项，把准备好的 legendData、series 传入。\n  const option = {\n    legend: {\n      ...baseChartConfig.legend,\n      orient: 'vertical',\n    },\n    xAxis3D: {\n      min: -1,\n      max: 1,\n    },\n    yAxis3D: {\n      min: -1,\n      max: 1,\n    },\n    zAxis3D: {\n      min: -1,\n      max: 1,\n    },\n    grid3D: {\n      show: false,\n      boxHeight: 8,\n      viewControl: {\n        //3d效果可以放大、旋转等，请自己去查看官方配置\n        alpha: 25,\n        beta: 5,\n        rotateSensitivity: 0,\n        zoomSensitivity: 0,\n        panSensitivity: 0,\n        autoRotate: false,\n        distance: 140,\n      },\n      light: {\n        ambient: {\n          color: '#fff',\n          intensity: 0.7,\n        },\n        main: {\n          intensity: 0.5,\n          shadow: true,\n          alpha: 80,\n        },\n        ambientCubemap: {\n          exposure: 1,\n          diffuseIntensity: 0.5,\n          specularIntensity: 2,\n        },\n      },\n    },\n    series: series,\n  };\n\n  const mergeOptions = merge(option, barConfig);\n  return mergeOptions;\n}\n\n// 计算3d扇区高度\nfunction generate3DHeight(isFlat: boolean, value = 30, coefficient = 1): number {\n  return (isFlat ? 30 : value) * coefficient;\n}\n"
  },
  {
    "path": "packages/lego/src/utils/RAF.ts",
    "content": "/**\n * 使用RequestAnimationFrame实现setTimeout和setInterval\n * 代码来源：https://zhuanlan.zhihu.com/p/34868095\n */\ntype RAFType = 'interval' | 'timeout';\ntype RAFCallback = (...args: any[]) => void;\n\nexport default class RAF {\n  private _timerIdMap: Record<RAFType, Record<symbol, number>>;\n\n  constructor() {\n    this._timerIdMap = {\n      timeout: {},\n      interval: {},\n    };\n  }\n  run(type: RAFType = 'interval', cb: RAFCallback, interval = 16.7) {\n    // 每16.7毫秒刷新一次（一帧）\n    const now = Date.now;\n    let startTime = now();\n    let endTime = startTime;\n    const timerSymbol = Symbol();\n    const loop = () => {\n      this.setIdMap(timerSymbol, type, loop);\n      endTime = now();\n      if (endTime - startTime >= interval) {\n        if (type === 'interval') {\n          startTime = now();\n          endTime = startTime;\n        }\n        cb();\n        type === 'timeout' && this.clearTimeout(timerSymbol);\n      }\n    };\n    this.setIdMap(timerSymbol, type, loop);\n    return timerSymbol;\n  }\n  setIdMap(timerSymbol: symbol, type: RAFType, loop: () => void) {\n    const id = requestAnimationFrame(loop);\n    this._timerIdMap[type][timerSymbol] = id;\n  }\n  setTimeout(cb: RAFCallback, interval: number) {\n    return this.run('timeout', cb, interval);\n  }\n  clearTimeout(timer: symbol) {\n    cancelAnimationFrame(this._timerIdMap.timeout[timer]);\n  }\n  setInterval(cb: RAFCallback, interval: number) {\n    return this.run('interval', cb, interval);\n  }\n  clearInterval(timer: symbol) {\n    cancelAnimationFrame(this._timerIdMap.interval[timer]);\n  }\n}\n"
  },
  {
    "path": "packages/lego/src/utils/createCuboidSeries.ts",
    "content": "import { CustomSeriesOption } from 'echarts/charts';\nimport { CustomSeriesRenderItemReturn } from 'echarts/types/dist/shared';\n\nimport { registerCuboidShape } from '../registerShape';\nimport { Theme } from '../theme';\nimport createLinearGradient from './createLinearGradient';\n\nexport default function createCuboidSeries(theme: Theme, seriesData: BarSeriesData, unit = '') {\n  registerCuboidShape();\n\n  return {\n    type: 'custom',\n    name: seriesData.name,\n    data: seriesData.data.map(item => ({ value: item, unit })),\n    yAxisIndex: 0,\n    renderItem: (_, api) => {\n      const location = api.coord([api.value(0), api.value(1)]);\n      return {\n        type: 'group',\n        children: [\n          {\n            type: 'CubeLeft',\n            shape: {\n              api,\n              xValue: api.value(0),\n              yValue: api.value(1),\n              x: location[0],\n              y: location[1],\n              xAxisPoint: api.coord([api.value(0), 0]),\n            },\n            style: {\n              fill: theme.colors.assist100,\n            },\n            styleEmphasis: {\n              shadowBlur: 20,\n              shadowColor: 'rgba(255, 255, 255, 1)',\n            },\n          },\n          {\n            type: 'CubeRight',\n            shape: {\n              api,\n              xValue: api.value(0),\n              yValue: api.value(1),\n              x: location[0],\n              y: location[1],\n              xAxisPoint: api.coord([api.value(0), 0]),\n            },\n            style: {\n              fill: createLinearGradient(theme.colors.primary300),\n            },\n            styleEmphasis: {\n              shadowBlur: 20,\n              shadowColor: 'rgba(255, 255, 255, 1)',\n            },\n          },\n          {\n            type: 'CubeTop',\n            shape: {\n              api,\n              xValue: api.value(0),\n              yValue: api.value(1),\n              x: location[0],\n              y: location[1],\n              xAxisPoint: api.coord([api.value(0), 0]),\n            },\n            style: {\n              fill: createLinearGradient(theme.colors.primary300, false),\n            },\n            styleEmphasis: {\n              shadowBlur: 20,\n              shadowColor: 'rgba(255, 255, 255, 1)',\n            },\n          },\n        ],\n      } as any as CustomSeriesRenderItemReturn;\n    },\n  } as CustomSeriesOption;\n}\n"
  },
  {
    "path": "packages/lego/src/utils/createCylinderSeries.ts",
    "content": "import { flatten } from 'lodash-es';\n\nexport default function createCylinderBarSeries(data: BarSeriesData[], colors: any[], yAxisCount: number) {\n  const result = data.map((item, index) =>\n    createCylinderSeries(item, colors[index], yAxisCount === 1 ? 0 : index, index)\n  );\n  const series = flatten(result);\n  return series;\n}\n\nfunction createCylinderSeries(seriesData: BarSeriesData, color: any, yAxisIndex: number, index: number) {\n  return [\n    {\n      name: seriesData.name,\n      type: 'bar',\n      barMaxWidth: 20,\n      data: seriesData.data?.map(i => ({ value: i, unit: seriesData.unit })),\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 20,\n          shadowColor: 'rgba(255, 255, 255, 1)',\n        },\n      },\n      yAxisIndex,\n      itemStyle: {\n        color,\n        borderRadius: [0, 0, 10, 10],\n      },\n      barGap: index === 0 ? '-25%' : '25%',\n      animation: false,\n    },\n    // 顶部垫片\n    {\n      z: 3,\n      silent: true,\n      type: 'pictorialBar',\n      symbolPosition: 'end',\n      data: seriesData.data,\n      yAxisIndex,\n      symbol: 'circle',\n      symbolOffset: [0, '-50%'],\n      symbolSize: ['100%', 10],\n      itemStyle: {\n        color,\n      },\n      barMaxWidth: 20,\n      barGap: index === 0 ? '-25%' : '25%',\n      animation: false,\n    },\n  ];\n}\n"
  },
  {
    "path": "packages/lego/src/utils/createCylinderShadowSeries.ts",
    "content": "import { Theme } from '../theme';\nimport createLinearGradient from './createLinearGradient';\n\nexport default function createCylinderShadowSeries(\n  theme: Theme,\n  baseBarConfig: any,\n  seriesData: BarSeriesData,\n  max: number\n) {\n  const { name = '', data = [] } = seriesData || { name: '', data: [] };\n  return [\n    {\n      name,\n      type: 'pictorialBar',\n      symbolSize: ['100%', 10],\n      symbolOffset: [0, '50%'],\n      z: 1,\n      silent: true,\n      color: theme.colors.assist700,\n      data: data,\n      animation: false,\n      barMaxWidth: 20,\n      barGap: '-100%',\n      barCateGoryGap: '-100%',\n    },\n    {\n      name,\n      type: 'bar',\n      barMaxWidth: 20,\n      z: 2,\n      data: data,\n      animation: false,\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 20,\n          shadowColor: 'rgba(255, 255, 255, 1)',\n        },\n      },\n      barGap: '-100%',\n    },\n    {\n      name,\n      type: 'pictorialBar',\n      symbolSize: ['100%', 10],\n      symbolOffset: [0, '-50%'],\n      symbolPosition: 'end',\n      z: 3,\n      silent: true,\n      color: createLinearGradient(theme.colors.primary50, false),\n      data: data,\n      label: {\n        show: true,\n        position: 'top',\n        ...baseBarConfig.label,\n      },\n      barMaxWidth: 20,\n      barGap: '-100%',\n    },\n    {\n      name,\n      type: 'bar',\n      barMaxWidth: 20,\n      barGap: '-100%',\n      z: 2,\n      silent: true,\n      data: data.map(() => max),\n      itemStyle: {\n        color: createLinearGradient(theme.colors.primary50),\n        opacity: 0.2,\n      },\n      animation: false,\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 20,\n          shadowColor: 'rgba(255, 255, 255, 1)',\n        },\n      },\n    },\n    {\n      name,\n      type: 'pictorialBar',\n      symbolSize: ['100%', 10],\n      symbolOffset: [0, '-50%'],\n      symbolPosition: 'end',\n      z: 3,\n      silent: true,\n      color: theme.colors.assist50,\n      data: data.map(() => max),\n      barGap: '-100%',\n      barMaxWidth: 20,\n    },\n  ];\n}\n"
  },
  {
    "path": "packages/lego/src/utils/createLinearGradient.ts",
    "content": "import * as echarts from 'echarts/core';\n\n/**\n * 根据颜色和渐变方向生成渐变色\n * @param color : 渐变颜色，是一个长度为2的数组\n * @param horizontal 水平渐变；默认为true\n */\nexport default function createLinearGradient(color: string[], vertical = true): unknown {\n  if (!color || color.length !== 2) return color;\n  if (!vertical) {\n    return new echarts.graphic.LinearGradient(0, 0, 1, 0, [\n      { offset: 0, color: color[1] },\n      { offset: 1, color: color[0] },\n    ]);\n  }\n\n  return new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n    { offset: 0, color: color[1] },\n    { offset: 1, color: color[0] },\n  ]);\n}\n"
  },
  {
    "path": "packages/lego/src/utils/createSliceSeries.ts",
    "content": "import { Theme } from '../theme';\nimport createLinearGradient from './createLinearGradient';\n\nexport default function createSliceSeries(theme: Theme, seriesData: BarSeriesData, max: number) {\n  const { name = '', data = [] } = seriesData || { name: '', data: [] };\n\n  return [\n    {\n      name,\n      type: 'pictorialBar',\n      silent: true,\n      itemStyle: {\n        color: createLinearGradient(theme.colors.primary50),\n      },\n      symbolRepeat: 'fixed',\n      symbolMargin: 2,\n      symbol: 'rect',\n      symbolClip: true,\n      symbolSize: [16, 2],\n      symbolPosition: 'start',\n      symbolBoundingData: max,\n      data,\n      z: 2,\n      animationEasing: 'elasticOut',\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 20,\n          shadowColor: 'rgba(255, 255, 255, 1)',\n        },\n      },\n    },\n    {\n      name,\n      type: 'pictorialBar',\n      itemStyle: {\n        color: createLinearGradient(theme.colors.primary100),\n        opacity: 0.2,\n      },\n      symbolRepeat: 'fixed',\n      symbolMargin: 2,\n      symbol: 'rect',\n      symbolClip: true,\n      symbolSize: [16, 2],\n      symbolPosition: 'start',\n      symbolBoundingData: max,\n      data: data.map(() => max),\n      z: 1,\n      animation: false,\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 20,\n          shadowColor: 'rgba(255, 255, 255, 1)',\n        },\n      },\n    },\n  ];\n}\n"
  },
  {
    "path": "packages/lego/src/utils/createStackSeries.ts",
    "content": "import createLinearGradient from './createLinearGradient';\n\nexport default function createStackSeries(\n  chartColor: any[],\n  baseBarConfig: any,\n  seriesData: { name: string; data: (number | string)[] }[],\n  totalData: number[],\n  unit?: string\n) {\n  return [\n    // 底部垫片\n    {\n      z: 3,\n      type: 'pictorialBar',\n      symbolPosition: 'end',\n      data: seriesData[0].data.map(() => 1),\n      symbol: 'circle',\n      symbolOffset: [0, '-50%'],\n      symbolSize: ['100%', 10],\n      symbolRotate: 0,\n      itemStyle: {\n        borderWidth: 0,\n        color: chartColor[0][0],\n      },\n      animation: false,\n      barMaxWidth: 20,\n      barGap: '-100%',\n    },\n    {\n      name: seriesData[0].name,\n      type: 'bar',\n      stack: 'account',\n      barMaxWidth: 20,\n      itemStyle: {\n        color: createLinearGradient(chartColor[0]),\n      },\n      data: seriesData[0].data?.map(i => ({ value: i, unit })),\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 20,\n          shadowColor: 'rgba(255, 255, 255, 1)',\n        },\n      },\n      animation: false,\n    },\n    // 中间垫片\n    {\n      z: 3,\n      type: 'pictorialBar',\n      symbolPosition: 'end',\n      data: seriesData[0].data?.map(i => ({ value: i, unit })),\n      symbol: 'circle',\n      symbolOffset: [0, '-50%'],\n      symbolSize: ['100%', 10],\n      symbolRotate: 0,\n      itemStyle: {\n        color: chartColor[1][0],\n      },\n      animation: false,\n      barMaxWidth: 20,\n      barGap: '-100%',\n    },\n    {\n      name: seriesData[1].name,\n      type: 'bar',\n      stack: 'account',\n      barMaxWidth: 20,\n      itemStyle: {\n        color: createLinearGradient(chartColor[1]),\n      },\n      data: seriesData[1].data?.map(i => ({ value: i, unit })),\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 20,\n          shadowColor: 'rgba(255, 255, 255, 1)',\n        },\n      },\n      animation: false,\n    },\n    // 顶部垫片\n    {\n      z: 3,\n      type: 'pictorialBar',\n      symbolPosition: 'end',\n      data: totalData,\n      symbol: 'circle',\n      symbolOffset: [0, '-50%'],\n      symbolSize: ['100%', 10],\n      itemStyle: {\n        color: chartColor[1][1],\n      },\n      label: {\n        show: true,\n        position: 'top',\n        ...baseBarConfig.label,\n      },\n      animation: false,\n      barMaxWidth: 20,\n      barGap: '-100%',\n    },\n  ];\n}\n"
  },
  {
    "path": "packages/lego/src/word-cloud/index.md",
    "content": "---\ntitle: 词云图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 词云图\n\n## API\n\n| 属性     | 必填    | 说明             | 类型                                     | 默认值   |\n| -------- | ------- | ---------------- | ---------------------------------------- | -------- |\n| data     | `true`  | 图表数据         | `{ name: string; value: number }[]`      |          |\n| width    | `false` | 词云图宽度       | `number`                                 |          |\n| height   | `false` | 词云图高度       | `number`                                 |          |\n| config   | `false` | 自定义词云图配置 | `any`                                    |          |\n| onEvents | `false` | 图表交互事件     | `Record<string, (params?: any) => void>` |          |\n| renderer | `false` | 图表渲染器       | `canvas \\| svg`                          | `canvas` |\n\n## 效果图 1\n\n<code src=\"../../example/WordCloudDemo/demo1.tsx\" background=\"#040727\">\n\n## 效果图 2 (SVG 渲染器)\n\n<code src=\"../../example/WordCloudDemo/demo2.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego/src/word-cloud/index.tsx",
    "content": "import React, { forwardRef, useMemo } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport ReactEcharts from 'echarts-for-react';\nimport 'echarts-wordcloud';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport { merge } from 'lodash-es';\n\necharts.use([CanvasRenderer, SVGRenderer]);\n\nexport interface WordCloudProps {\n  data: { name: string; value: number }[];\n  width?: number;\n  height?: number;\n  config?: any;\n  /** 图表交互事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n  /** 图表渲染器 */\n  renderer?: 'canvas' | 'svg';\n}\n\n/**\n * 词云图，对应Figma其他图8\n */\nexport default forwardRef<ReactEcharts, WordCloudProps>(\n  ({ data, width = 469, height = 227, config, onEvents, renderer = 'canvas' }, ref) => {\n    const option = merge(\n      {\n        series: [\n          {\n            type: 'wordCloud',\n            // 词云宽高\n            width,\n            height,\n            // 词云形状\n            shape: 'diamond',\n            // 文字之间的间隔\n            gridSize: 2,\n            // 词云里文字大小区间\n            sizeRange: [12, 38],\n            // 词云里文字旋转区间\n            rotationRange: [-90, 90],\n            rotationStep: 45,\n            // 是否允许文字超出canvas范围\n            drawOutOfBound: false,\n            layoutAnimation: true,\n            // 文字样式\n            textStyle: {\n              color: function () {\n                return (\n                  'rgb(' +\n                  [\n                    Math.round(Math.random() * 160),\n                    Math.round(Math.random() * 160),\n                    Math.round(Math.random() * 160),\n                  ].join(',') +\n                  ')'\n                );\n              },\n            },\n            data,\n          },\n        ],\n      },\n      config\n    );\n\n    return (\n      <ReactEcharts\n        ref={ref}\n        echarts={echarts}\n        option={option}\n        style={{ width, height }}\n        onEvents={onEvents}\n        opts={{ renderer }}\n      />\n    );\n  }\n);\n"
  },
  {
    "path": "packages/lego/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"lib\": [\"dom\", \"ESNext\"],\n    \"moduleResolution\": \"node\",\n    \"jsx\": \"react\",\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"downlevelIteration\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": false,\n    \"strictNullChecks\": true,\n    \"baseUrl\": \".\",\n\n  },\n  \"exclude\": [\"node_modules\", \"lib\", \"es\", \"dist\", \"**/index.test.ts\", \"**/demo\", \"coverage\", \"**/*.js\", \"example\"]\n}\n"
  },
  {
    "path": "packages/lego/typings.d.ts",
    "content": "declare module '*.css';\ndeclare module '*.less';\ndeclare module '*.png';\ndeclare module '*.webp';\ndeclare module '*.svg';\n\ndeclare interface Window {\n  echarts: any;\n}\n\ndeclare module '*.json' {\n  const value: any;\n  export default value;\n}\n\ninterface BarSeriesData {\n  name: string;\n  data: (string | number | { name: string; value: string | number })[];\n  unit?: string;\n}\n"
  },
  {
    "path": "packages/lego-map/CHANGELOG.md",
    "content": "# @td-design/lego-map\n\n## 1.4.1\n\n### Patch Changes\n\n- [#651](https://github.com/thundersdata-frontend/td-design/pull/651) [`94033922d`](https://github.com/thundersdata-frontend/td-design/commit/94033922d7cda587369bd2eef37341c19a26db53) Thanks [@chj-damon](https://github.com/chj-damon)! - 新增地图缩放功能\n\n## 1.4.0\n\n### Minor Changes\n\n- [#649](https://github.com/thundersdata-frontend/td-design/pull/649) [`454e8c345`](https://github.com/thundersdata-frontend/td-design/commit/454e8c345964261585c4322a932e55857f2543ef) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复地图使用报错的问题\n\n## 1.3.0\n\n### Minor Changes\n\n- [#638](https://github.com/thundersdata-frontend/td-design/pull/638) [`40bbbdb0d`](https://github.com/thundersdata-frontend/td-design/commit/40bbbdb0d1e4d11a9245fa782d84529312694ed7) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复下钻地图的 bug\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/demo1.tsx",
    "content": "import { BasicMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <BasicMap style={{ width: '100%', height: 900 }} />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/demo2.tsx",
    "content": "import { BasicMap } from '@td-design/lego-map';\nimport sichuan from './sichuan.json';\n\nexport default () => {\n  return (\n    <BasicMap\n      mapName=\"sichuan\"\n      mapJson={sichuan}\n      style={{ width: '100%', height: 400 }}\n      top={40}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/demo3.tsx",
    "content": "import { BasicMap } from '@td-design/lego-map';\nimport sichuan from './sichuan.json';\n\nexport default () => {\n  return (\n    <BasicMap\n      mapName=\"sichuan\"\n      mapJson={sichuan}\n      showLabel={false}\n      style={{ width: '100%', height: 400 }}\n      top={40}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/demo4.tsx",
    "content": "import { BasicMap } from '@td-design/lego-map';\nimport sichuan from './sichuan.json';\n\nexport default () => {\n  return (\n    <BasicMap\n      mapName=\"sichuan\"\n      mapJson={sichuan}\n      silent\n      style={{ width: '100%', height: 400 }}\n      top={40}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/demo5.tsx",
    "content": "import { BasicMap } from '@td-design/lego-map';\n\nexport default () => {\n  const data = [\n    [104.075045, 30.663774, 10],\n    [104.689584, 31.476866, 10],\n    [106.55408, 29.578697, 10],\n    [108.94113, 34.352069, 10],\n    [116.382836, 39.926047, 10],\n    [103.799085, 36.114321, 10],\n    [114.285544, 30.65433, 10],\n    [106.669064, 26.696559, 10],\n    [113.218501, 23.2084522, 10],\n    [118.802027, 32.095359, 10],\n    [121.423696, 31.320051, 10],\n  ];\n\n  return (\n    <BasicMap\n      config={{\n        tooltip: {},\n        series: [\n          {\n            type: 'effectScatter',\n            coordinateSystem: 'geo',\n            zlevel: 2,\n            rippleEffect: {\n              //涟漪特效\n              period: 2, //动画时间，值越小速度越快\n              brushType: 'stroke', //波纹绘制方式 stroke, fill\n              scale: 2, //波纹圆环最大限制，值越大波纹越大\n            },\n            symbol: 'circle',\n            symbolSize: 20,\n            itemStyle: {\n              color: '#f00',\n            },\n            data,\n          },\n        ],\n      }}\n      style={{ width: '100%', height: 900 }}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/demo6.tsx",
    "content": "import { BasicMap } from '@td-design/lego-map';\nimport { Select } from 'antd';\nimport { useState } from 'react';\nimport sichuan from './sichuan.json';\n\nexport default () => {\n  const [mapName, setMapName] = useState('china');\n\n  return (\n    <div>\n      <Select value={mapName} onChange={setMapName} style={{ width: 100 }}>\n        <Select.Option key=\"china\">全国</Select.Option>\n        <Select.Option key=\"sichuan\">四川</Select.Option>\n      </Select>\n      <BasicMap\n        mapName={mapName}\n        mapJson={mapName === 'sichuan' ? sichuan : undefined}\n        style={{ width: '100%', height: 900 }}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/demo7.tsx",
    "content": "import { BasicMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <BasicMap style={{ width: '100%', height: 900 }} zoom={1.2} top={80} />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/BasicMapDemo/sichuan.json",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510100,\n        \"name\": \"成都市\",\n        \"center\": [104.065735, 30.659462],\n        \"centroid\": [103.931804, 30.652329],\n        \"childrenNum\": 20,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 0,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.959259, 30.320742],\n              [103.965866, 30.316774],\n              [103.974713, 30.290727],\n              [103.998343, 30.264508],\n              [104.030035, 30.266245],\n              [104.030035, 30.266245],\n              [104.047393, 30.270381],\n              [104.091628, 30.24879],\n              [104.116601, 30.227194],\n              [104.150533, 30.245646],\n              [104.152213, 30.265335],\n              [104.174051, 30.298666],\n              [104.17853, 30.318262],\n              [104.192977, 30.329836],\n              [104.2016, 30.316526],\n              [104.232284, 30.313798],\n              [104.2315, 30.282209],\n              [104.232732, 30.281878],\n              [104.23318, 30.281051],\n              [104.231836, 30.280472],\n              [104.243371, 30.267403],\n              [104.23094, 30.256153],\n              [104.243259, 30.244239],\n              [104.264537, 30.241592],\n              [104.2726, 30.217842],\n              [104.282231, 30.220904],\n              [104.315379, 30.200792],\n              [104.327138, 30.204269],\n              [104.364541, 30.185974],\n              [104.358158, 30.173638],\n              [104.386379, 30.161798],\n              [104.39881, 30.124776],\n              [104.41012, 30.125521],\n              [104.428374, 30.089729],\n              [104.450212, 30.101081],\n              [104.437109, 30.107544],\n              [104.457715, 30.120634],\n              [104.449428, 30.132894],\n              [104.464994, 30.151529],\n              [104.468354, 30.157077],\n              [104.485264, 30.156001],\n              [104.484368, 30.181504],\n              [104.533754, 30.193673],\n              [104.541594, 30.184236],\n              [104.569254, 30.196985],\n              [104.600163, 30.220408],\n              [104.599603, 30.244488],\n              [104.653133, 30.240185],\n              [104.638239, 30.268148],\n              [104.643614, 30.283036],\n              [104.691993, 30.275427],\n              [104.703975, 30.301643],\n              [104.723797, 30.308341],\n              [104.738579, 30.290314],\n              [104.774863, 30.30156],\n              [104.795133, 30.279397],\n              [104.807228, 30.296847],\n              [104.823354, 30.293787],\n              [104.848775, 30.306852],\n              [104.850455, 30.338929],\n              [104.837016, 30.361988],\n              [104.855494, 30.347194],\n              [104.860982, 30.364384],\n              [104.881027, 30.360831],\n              [104.895922, 30.382315],\n              [104.881699, 30.393551],\n              [104.875092, 30.437078],\n              [104.8761, 30.5131],\n              [104.892786, 30.541645],\n              [104.879124, 30.550635],\n              [104.858854, 30.582385],\n              [104.819098, 30.580076],\n              [104.819994, 30.598296],\n              [104.847319, 30.631101],\n              [104.842728, 30.649395],\n              [104.821226, 30.643874],\n              [104.818315, 30.664307],\n              [104.800956, 30.690995],\n              [104.78875, 30.694043],\n              [104.788526, 30.721299],\n              [104.768032, 30.71817],\n              [104.750786, 30.726898],\n              [104.732084, 30.778257],\n              [104.718086, 30.771756],\n              [104.698376, 30.825559],\n              [104.640366, 30.837895],\n              [104.629952, 30.852449],\n              [104.613937, 30.847763],\n              [104.596355, 30.864535],\n              [104.585269, 30.862891],\n              [104.520764, 30.882456],\n              [104.533083, 30.917875],\n              [104.511917, 30.935868],\n              [104.495791, 30.935457],\n              [104.465218, 30.9509],\n              [104.44506, 30.940468],\n              [104.39601, 30.942358],\n              [104.389739, 30.925681],\n              [104.367117, 30.93365],\n              [104.351887, 30.902345],\n              [104.322322, 30.891743],\n              [104.288726, 30.90292],\n              [104.244491, 30.896921],\n              [104.21571, 30.8984],\n              [104.202384, 30.91311],\n              [104.168787, 30.918533],\n              [104.149974, 30.91311],\n              [104.142582, 30.925845],\n              [104.166324, 30.951311],\n              [104.166884, 30.993438],\n              [104.143478, 31.01158],\n              [104.117385, 31.017572],\n              [104.10697, 31.032263],\n              [104.107194, 31.032017],\n              [104.106522, 31.031607],\n              [104.10641, 31.031771],\n              [104.094876, 31.032756],\n              [104.060608, 31.0641],\n              [104.057584, 31.07821],\n              [104.019844, 31.103963],\n              [104.022868, 31.142661],\n              [104.009429, 31.153235],\n              [104.014693, 31.167577],\n              [103.983, 31.200925],\n              [103.949404, 31.215997],\n              [103.929134, 31.234425],\n              [103.928014, 31.272497],\n              [103.914128, 31.278964],\n              [103.891618, 31.308017],\n              [103.894418, 31.326018],\n              [103.92835, 31.355139],\n              [103.894754, 31.408858],\n              [103.897554, 31.416377],\n              [103.868437, 31.420954],\n              [103.828682, 31.412454],\n              [103.816027, 31.431906],\n              [103.802588, 31.430108],\n              [103.787246, 31.434439],\n              [103.75029, 31.419156],\n              [103.739876, 31.398885],\n              [103.700792, 31.391118],\n              [103.669323, 31.354812],\n              [103.627104, 31.344097],\n              [103.60717, 31.351295],\n              [103.569543, 31.338453],\n              [103.569991, 31.314563],\n              [103.579733, 31.291241],\n              [103.569095, 31.262019],\n              [103.581413, 31.246626],\n              [103.57671, 31.215834],\n              [103.583205, 31.191422],\n              [103.564839, 31.175034],\n              [103.557224, 31.149055],\n              [103.525644, 31.101092],\n              [103.521164, 31.067792],\n              [103.504814, 31.041044],\n              [103.517132, 31.030129],\n              [103.52094, 31.005095],\n              [103.516461, 30.971761],\n              [103.465058, 30.941536],\n              [103.454644, 30.924695],\n              [103.451396, 30.892565],\n              [103.409401, 30.864946],\n              [103.383084, 30.862891],\n              [103.354527, 30.850887],\n              [103.337617, 30.824655],\n              [103.305252, 30.810507],\n              [103.284647, 30.829589],\n              [103.25833, 30.842418],\n              [103.228653, 30.836579],\n              [103.199088, 30.845707],\n              [103.165716, 30.842171],\n              [103.123945, 30.79282],\n              [103.083629, 30.812728],\n              [103.037938, 30.802364],\n              [102.992919, 30.778339],\n              [103.005126, 30.74649],\n              [103.033907, 30.719076],\n              [103.031331, 30.703678],\n              [103.068735, 30.716194],\n              [103.103115, 30.672957],\n              [103.119017, 30.670898],\n              [103.13156, 30.65475],\n              [103.135591, 30.624096],\n              [103.126856, 30.593927],\n              [103.147798, 30.585847],\n              [103.166276, 30.555749],\n              [103.157765, 30.530013],\n              [103.180834, 30.525228],\n              [103.185874, 30.511945],\n              [103.162244, 30.472579],\n              [103.141751, 30.470845],\n              [103.12596, 30.451115],\n              [103.115993, 30.413954],\n              [103.116329, 30.380002],\n              [103.127976, 30.367111],\n              [103.091132, 30.326529],\n              [103.079038, 30.324545],\n              [103.062128, 30.302553],\n              [103.068623, 30.294283],\n              [103.061456, 30.270464],\n              [103.071534, 30.260951],\n              [103.076798, 30.220242],\n              [103.147238, 30.207],\n              [103.183634, 30.248128],\n              [103.211631, 30.232407],\n              [103.215998, 30.209235],\n              [103.233356, 30.213456],\n              [103.242651, 30.243081],\n              [103.282295, 30.263598],\n              [103.313875, 30.260372],\n              [103.320259, 30.23489],\n              [103.350047, 30.236048],\n              [103.370317, 30.22827],\n              [103.36091, 30.168008],\n              [103.372109, 30.148382],\n              [103.360574, 30.136787],\n              [103.395178, 30.094866],\n              [103.439637, 30.119474],\n              [103.439637, 30.119557],\n              [103.443893, 30.120054],\n              [103.443893, 30.117486],\n              [103.4505, 30.096524],\n              [103.462483, 30.096027],\n              [103.468082, 30.114255],\n              [103.450948, 30.132231],\n              [103.474577, 30.131237],\n              [103.486224, 30.104147],\n              [103.504142, 30.128503],\n              [103.533819, 30.146643],\n              [103.544233, 30.161218],\n              [103.533819, 30.178109],\n              [103.597204, 30.203524],\n              [103.617473, 30.195412],\n              [103.628, 30.214863],\n              [103.649502, 30.199799],\n              [103.648046, 30.229263],\n              [103.693065, 30.245894],\n              [103.681754, 30.269885],\n              [103.705271, 30.268975],\n              [103.718374, 30.283201],\n              [103.736516, 30.285848],\n              [103.727893, 30.30462],\n              [103.75141, 30.307927],\n              [103.769776, 30.332068],\n              [103.794749, 30.345872],\n              [103.845368, 30.34331],\n              [103.87426, 30.348104],\n              [103.887699, 30.328761],\n              [103.910432, 30.330663],\n              [103.913904, 30.353972],\n              [103.942237, 30.357773],\n              [103.93563, 30.346203],\n              [103.959259, 30.320742]\n            ]\n          ],\n          [\n            [\n              [104.107194, 31.032017],\n              [104.10697, 31.032263],\n              [104.10641, 31.031771],\n              [104.106522, 31.031607],\n              [104.107194, 31.032017]\n            ]\n          ],\n          [\n            [\n              [103.443893, 30.120054],\n              [103.439637, 30.119557],\n              [103.439637, 30.119474],\n              [103.443893, 30.117486],\n              [103.443893, 30.120054]\n            ]\n          ],\n          [\n            [\n              [104.232732, 30.281878],\n              [104.2315, 30.282209],\n              [104.231836, 30.280472],\n              [104.23318, 30.281051],\n              [104.232732, 30.281878]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510300,\n        \"name\": \"自贡市\",\n        \"center\": [104.773447, 29.352765],\n        \"centroid\": [104.685446, 29.28421],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 1,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.17685, 29.195745],\n              [104.195888, 29.220657],\n              [104.191409, 29.235869],\n              [104.23262, 29.205861],\n              [104.256026, 29.212298],\n              [104.265433, 29.231857],\n              [104.249082, 29.261356],\n              [104.284582, 29.259601],\n              [104.298805, 29.245647],\n              [104.323218, 29.2408],\n              [104.368685, 29.247652],\n              [104.380332, 29.238376],\n              [104.411688, 29.245479],\n              [104.417735, 29.236454],\n              [104.442597, 29.238543],\n              [104.434646, 29.220908],\n              [104.460963, 29.221827],\n              [104.46589, 29.207366],\n              [104.509453, 29.155522],\n              [104.540922, 29.143394],\n              [104.580117, 29.164639],\n              [104.596355, 29.190394],\n              [104.62424, 29.207282],\n              [104.649325, 29.198588],\n              [104.691993, 29.19934],\n              [104.692329, 29.177099],\n              [104.680346, 29.15569],\n              [104.697816, 29.118212],\n              [104.714614, 29.122396],\n              [104.73018, 29.106498],\n              [104.737236, 29.078796],\n              [104.713718, 29.06105],\n              [104.705207, 29.045477],\n              [104.720214, 28.996651],\n              [104.744067, 28.990369],\n              [104.76512, 28.998746],\n              [104.796701, 29.000086],\n              [104.811931, 28.990704],\n              [104.819546, 29.001761],\n              [104.85751, 29.003436],\n              [104.861542, 29.019685],\n              [104.879684, 29.024291],\n              [104.881475, 29.050836],\n              [104.902529, 29.047738],\n              [104.941837, 29.058873],\n              [104.944636, 29.021277],\n              [104.969722, 29.015749],\n              [104.986296, 28.991541],\n              [105.00511, 28.989866],\n              [105.017316, 28.972104],\n              [105.073758, 28.936404],\n              [105.111162, 28.933722],\n              [105.126952, 28.945288],\n              [105.145094, 28.942271],\n              [105.162116, 28.947467],\n              [105.167715, 28.92995],\n              [105.201871, 28.929279],\n              [105.205007, 28.951825],\n              [105.217214, 28.95568],\n              [105.225837, 28.934644],\n              [105.244763, 28.937745],\n              [105.254282, 28.9271],\n              [105.267608, 28.939086],\n              [105.239723, 28.956937],\n              [105.267384, 28.979561],\n              [105.269288, 29.009719],\n              [105.234348, 29.026636],\n              [105.214974, 29.016168],\n              [105.187873, 29.027306],\n              [105.188769, 29.056613],\n              [105.207359, 29.070258],\n              [105.250138, 29.119969],\n              [105.244987, 29.135196],\n              [105.271752, 29.160123],\n              [105.256521, 29.17526],\n              [105.266936, 29.188638],\n              [105.23558, 29.215475],\n              [105.217998, 29.20561],\n              [105.195488, 29.222078],\n              [105.203999, 29.23963],\n              [105.160548, 29.262776],\n              [105.134903, 29.257429],\n              [105.113961, 29.284999],\n              [105.120121, 29.302205],\n              [105.108922, 29.315568],\n              [105.072526, 29.336359],\n              [105.063679, 29.364659],\n              [105.035346, 29.382937],\n              [105.046881, 29.408721],\n              [105.079469, 29.406886],\n              [105.084285, 29.42232],\n              [105.063119, 29.442923],\n              [105.067823, 29.454349],\n              [105.044305, 29.480865],\n              [105.030643, 29.472527],\n              [105.04061, 29.461938],\n              [105.020564, 29.454432],\n              [105.026947, 29.439587],\n              [104.993127, 29.438669],\n              [104.961882, 29.416647],\n              [104.937133, 29.445425],\n              [104.917647, 29.434332],\n              [104.871957, 29.459019],\n              [104.873972, 29.47086],\n              [104.848775, 29.467858],\n              [104.833657, 29.430495],\n              [104.808796, 29.457018],\n              [104.786398, 29.457518],\n              [104.777327, 29.448177],\n              [104.750786, 29.453598],\n              [104.741155, 29.432414],\n              [104.751458, 29.402631],\n              [104.766128, 29.406469],\n              [104.759969, 29.374759],\n              [104.738132, 29.381936],\n              [104.745411, 29.36324],\n              [104.710919, 29.361404],\n              [104.704423, 29.372255],\n              [104.674299, 29.38227],\n              [104.673403, 29.398709],\n              [104.652461, 29.411141],\n              [104.619761, 29.444758],\n              [104.587956, 29.422987],\n              [104.569814, 29.441172],\n              [104.558728, 29.431913],\n              [104.543945, 29.441005],\n              [104.535658, 29.418566],\n              [104.510013, 29.456767],\n              [104.53465, 29.456601],\n              [104.529611, 29.518876],\n              [104.501726, 29.549958],\n              [104.482912, 29.562872],\n              [104.493551, 29.582613],\n              [104.488847, 29.601435],\n              [104.474065, 29.609262],\n              [104.442933, 29.600102],\n              [104.421767, 29.616423],\n              [104.39489, 29.621002],\n              [104.381787, 29.607264],\n              [104.383579, 29.584196],\n              [104.340688, 29.565704],\n              [104.334193, 29.583113],\n              [104.309332, 29.607347],\n              [104.280551, 29.613925],\n              [104.269576, 29.632491],\n              [104.249754, 29.636154],\n              [104.251098, 29.623084],\n              [104.212239, 29.61251],\n              [104.182226, 29.633407],\n              [104.16722, 29.597854],\n              [104.139895, 29.589693],\n              [104.166884, 29.55729],\n              [104.160948, 29.541876],\n              [104.135079, 29.52096],\n              [104.151093, 29.52221],\n              [104.165988, 29.496538],\n              [104.16666, 29.496455],\n              [104.16666, 29.496371],\n              [104.166324, 29.495955],\n              [104.150309, 29.472027],\n              [104.149526, 29.47061],\n              [104.14919, 29.470776],\n              [104.14919, 29.472277],\n              [104.128472, 29.498289],\n              [104.08838, 29.461687],\n              [104.064191, 29.472361],\n              [104.052656, 29.456684],\n              [104.058256, 29.425907],\n              [104.098347, 29.437168],\n              [104.105962, 29.414895],\n              [104.0923, 29.416397],\n              [104.090172, 29.391616],\n              [104.100811, 29.382186],\n              [104.131272, 29.400378],\n              [104.134967, 29.399043],\n              [104.141126, 29.374508],\n              [104.160836, 29.379933],\n              [104.163412, 29.364158],\n              [104.142022, 29.355644],\n              [104.135415, 29.338781],\n              [104.105626, 29.338864],\n              [104.083229, 29.348298],\n              [104.07651, 29.323584],\n              [104.09174, 29.315317],\n              [104.139447, 29.307467],\n              [104.14639, 29.283829],\n              [104.116377, 29.263946],\n              [104.109658, 29.241886],\n              [104.118393, 29.236454],\n              [104.14359, 29.256844],\n              [104.150981, 29.22726],\n              [104.150645, 29.194157],\n              [104.17685, 29.195745]\n            ]\n          ],\n          [\n            [\n              [104.150309, 29.472027],\n              [104.14919, 29.472277],\n              [104.14919, 29.470776],\n              [104.149526, 29.47061],\n              [104.150309, 29.472027]\n            ]\n          ],\n          [\n            [\n              [104.16666, 29.496455],\n              [104.165988, 29.496538],\n              [104.166324, 29.495955],\n              [104.16666, 29.496371],\n              [104.16666, 29.496455]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510400,\n        \"name\": \"攀枝花市\",\n        \"center\": [101.716007, 26.580446],\n        \"centroid\": [101.625394, 26.755869],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 2,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [101.839897, 26.082429],\n              [101.832282, 26.117176],\n              [101.844712, 26.141683],\n              [101.840681, 26.16008],\n              [101.872261, 26.181483],\n              [101.906753, 26.191367],\n              [101.90205, 26.243521],\n              [101.921759, 26.27032],\n              [101.926015, 26.306213],\n              [101.935198, 26.322954],\n              [101.927583, 26.362263],\n              [101.939118, 26.410824],\n              [101.929039, 26.419487],\n              [101.942701, 26.448989],\n              [101.982121, 26.454906],\n              [101.994999, 26.431409],\n              [102.020196, 26.422832],\n              [102.029491, 26.434068],\n              [102.033411, 26.470768],\n              [102.050769, 26.49417],\n              [102.034083, 26.541133],\n              [102.038562, 26.571717],\n              [102.030611, 26.596898],\n              [102.011125, 26.598525],\n              [102.001383, 26.633632],\n              [101.984024, 26.638854],\n              [101.995559, 26.653577],\n              [101.997463, 26.698849],\n              [101.977081, 26.711084],\n              [101.981897, 26.735892],\n              [101.971706, 26.735464],\n              [101.960171, 26.710143],\n              [101.946509, 26.707662],\n              [101.938782, 26.639367],\n              [101.920528, 26.635515],\n              [101.913024, 26.680537],\n              [101.91672, 26.703127],\n              [101.912688, 26.723318],\n              [101.861398, 26.724173],\n              [101.838889, 26.744958],\n              [101.834297, 26.763516],\n              [101.819963, 26.765227],\n              [101.81358, 26.793272],\n              [101.772704, 26.82413],\n              [101.731157, 26.835924],\n              [101.707528, 26.873691],\n              [101.70148, 26.902051],\n              [101.704952, 26.933477],\n              [101.698904, 26.944406],\n              [101.744931, 26.970614],\n              [101.773488, 26.99289],\n              [101.77248, 27.006544],\n              [101.805852, 27.056366],\n              [101.809212, 27.088858],\n              [101.817387, 27.101732],\n              [101.803725, 27.114691],\n              [101.761729, 27.133444],\n              [101.744483, 27.124835],\n              [101.708759, 27.129012],\n              [101.681994, 27.150404],\n              [101.65075, 27.208169],\n              [101.643135, 27.24513],\n              [101.664748, 27.288888],\n              [101.659261, 27.313569],\n              [101.633728, 27.327949],\n              [101.635408, 27.33952],\n              [101.598452, 27.340456],\n              [101.584229, 27.334671],\n              [101.55836, 27.295357],\n              [101.530475, 27.277823],\n              [101.514685, 27.229802],\n              [101.495759, 27.228014],\n              [101.470674, 27.238829],\n              [101.419048, 27.215835],\n              [101.426999, 27.190792],\n              [101.41412, 27.162164],\n              [101.394299, 27.145206],\n              [101.355215, 27.184658],\n              [101.334721, 27.179546],\n              [101.315571, 27.197522],\n              [101.293174, 27.189599],\n              [101.283095, 27.197607],\n              [101.246027, 27.179205],\n              [101.197425, 27.18321],\n              [101.168084, 27.165232],\n              [101.145351, 27.103779],\n              [101.157221, 27.094826],\n              [101.137399, 27.022329],\n              [101.227213, 26.984441],\n              [101.227101, 26.958919],\n              [101.264505, 26.955504],\n              [101.255546, 26.923913],\n              [101.267753, 26.90299],\n              [101.293958, 26.896157],\n              [101.31154, 26.902905],\n              [101.323299, 26.888299],\n              [101.365406, 26.883686],\n              [101.374701, 26.865318],\n              [101.399674, 26.840453],\n              [101.372013, 26.800367],\n              [101.379852, 26.786432],\n              [101.357791, 26.770614],\n              [101.390267, 26.750004],\n              [101.389707, 26.723146],\n              [101.421624, 26.726312],\n              [101.43607, 26.740596],\n              [101.457124, 26.729733],\n              [101.459139, 26.747353],\n              [101.445925, 26.774205],\n              [101.465747, 26.786688],\n              [101.513341, 26.768562],\n              [101.510654, 26.754452],\n              [101.492176, 26.746412],\n              [101.498895, 26.732214],\n              [101.472802, 26.721436],\n              [101.454548, 26.703641],\n              [101.4541, 26.691148],\n              [101.481201, 26.673177],\n              [101.461043, 26.640737],\n              [101.461939, 26.606746],\n              [101.452084, 26.601009],\n              [101.400234, 26.605119],\n              [101.39609, 26.592017],\n              [101.406617, 26.556383],\n              [101.422967, 26.531708],\n              [101.438422, 26.538477],\n              [101.439766, 26.512684],\n              [101.458691, 26.495456],\n              [101.506958, 26.499656],\n              [101.530027, 26.467252],\n              [101.565639, 26.454563],\n              [101.588149, 26.425834],\n              [101.635632, 26.396069],\n              [101.631488, 26.359517],\n              [101.660605, 26.346816],\n              [101.640335, 26.318833],\n              [101.660381, 26.310849],\n              [101.646942, 26.305183],\n              [101.621073, 26.312824],\n              [101.597444, 26.303466],\n              [101.585797, 26.283888],\n              [101.59442, 26.261559],\n              [101.616706, 26.249792],\n              [101.630368, 26.224879],\n              [101.649966, 26.234244],\n              [101.67158, 26.231838],\n              [101.690057, 26.241717],\n              [101.705064, 26.224449],\n              [101.735748, 26.219982],\n              [101.773152, 26.168247],\n              [101.807644, 26.156298],\n              [101.797229, 26.142198],\n              [101.796558, 26.114769],\n              [101.819515, 26.087074],\n              [101.839897, 26.082429]\n            ]\n          ],\n          [\n            [\n              [102.18213, 26.812591],\n              [102.156261, 26.847717],\n              [102.159845, 26.855151],\n              [102.204976, 26.85216],\n              [102.214159, 26.889153],\n              [102.205312, 26.91042],\n              [102.225917, 26.923999],\n              [102.229165, 26.945174],\n              [102.214495, 26.957297],\n              [102.230173, 27.000485],\n              [102.217518, 27.04596],\n              [102.238684, 27.064298],\n              [102.2407, 27.106592],\n              [102.210351, 27.11776],\n              [102.203296, 27.131398],\n              [102.176419, 27.137535],\n              [102.161077, 27.182187],\n              [102.122665, 27.171878],\n              [102.114826, 27.159437],\n              [102.086269, 27.146484],\n              [102.081566, 27.129268],\n              [102.049761, 27.082718],\n              [102.034083, 27.076152],\n              [102.025908, 27.093462],\n              [102.000263, 27.096873],\n              [101.993879, 27.115202],\n              [101.97305, 27.122619],\n              [101.938782, 27.104034],\n              [101.927247, 27.137109],\n              [101.941021, 27.143842],\n              [101.922095, 27.180654],\n              [101.908433, 27.192666],\n              [101.914368, 27.213195],\n              [101.903618, 27.218561],\n              [101.912241, 27.243683],\n              [101.896786, 27.267096],\n              [101.886259, 27.255603],\n              [101.878084, 27.222734],\n              [101.878196, 27.189855],\n              [101.862966, 27.182784],\n              [101.879204, 27.168129],\n              [101.870357, 27.129694],\n              [101.833065, 27.122619],\n              [101.817387, 27.101732],\n              [101.809212, 27.088858],\n              [101.805852, 27.056366],\n              [101.77248, 27.006544],\n              [101.773488, 26.99289],\n              [101.744931, 26.970614],\n              [101.698904, 26.944406],\n              [101.704952, 26.933477],\n              [101.70148, 26.902051],\n              [101.707528, 26.873691],\n              [101.731157, 26.835924],\n              [101.772704, 26.82413],\n              [101.81358, 26.793272],\n              [101.819963, 26.765227],\n              [101.834297, 26.763516],\n              [101.838889, 26.744958],\n              [101.861398, 26.724173],\n              [101.912688, 26.723318],\n              [101.91672, 26.703127],\n              [101.946509, 26.707662],\n              [101.960171, 26.710143],\n              [101.971706, 26.735464],\n              [101.981897, 26.735892],\n              [101.977081, 26.711084],\n              [101.997463, 26.698849],\n              [102.006534, 26.716388],\n              [102.033187, 26.712367],\n              [102.04573, 26.737517],\n              [102.063088, 26.718613],\n              [102.054801, 26.692688],\n              [102.073502, 26.670867],\n              [102.068351, 26.656659],\n              [102.084477, 26.654519],\n              [102.114714, 26.63406],\n              [102.132296, 26.637741],\n              [102.135543, 26.674718],\n              [102.157045, 26.680708],\n              [102.157605, 26.692346],\n              [102.178883, 26.708346],\n              [102.175859, 26.726568],\n              [102.195681, 26.744616],\n              [102.192993, 26.763602],\n              [102.175075, 26.774975],\n              [102.189857, 26.791904],\n              [102.174179, 26.802419],\n              [102.18213, 26.812591]\n            ]\n          ],\n          [\n            [\n              [102.204976, 26.85216],\n              [102.159845, 26.855151],\n              [102.156261, 26.847717],\n              [102.18213, 26.812591],\n              [102.192657, 26.820455],\n              [102.215615, 26.813617],\n              [102.202288, 26.840795],\n              [102.204976, 26.85216]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510500,\n        \"name\": \"泸州市\",\n        \"center\": [105.443348, 28.889138],\n        \"childrenNum\": 7,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 3,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.420135, 29.314399],\n              [105.395274, 29.308553],\n              [105.389002, 29.286502],\n              [105.386203, 29.284832],\n              [105.384747, 29.283579],\n              [105.384747, 29.283328],\n              [105.383403, 29.281991],\n              [105.368621, 29.285918],\n              [105.366493, 29.287839],\n              [105.365149, 29.292684],\n              [105.364141, 29.291932],\n              [105.339392, 29.281741],\n              [105.318226, 29.263612],\n              [105.287542, 29.218233],\n              [105.281495, 29.188471],\n              [105.266936, 29.188638],\n              [105.256521, 29.17526],\n              [105.271752, 29.160123],\n              [105.244987, 29.135196],\n              [105.250138, 29.119969],\n              [105.207359, 29.070258],\n              [105.188769, 29.056613],\n              [105.187873, 29.027306],\n              [105.214974, 29.016168],\n              [105.234348, 29.026636],\n              [105.269288, 29.009719],\n              [105.267384, 28.979561],\n              [105.239723, 28.956937],\n              [105.267608, 28.939086],\n              [105.254282, 28.9271],\n              [105.244763, 28.937745],\n              [105.225837, 28.934644],\n              [105.217214, 28.95568],\n              [105.205007, 28.951825],\n              [105.201871, 28.929279],\n              [105.167715, 28.92995],\n              [105.162116, 28.947467],\n              [105.145094, 28.942271],\n              [105.166483, 28.9271],\n              [105.177682, 28.907148],\n              [105.203999, 28.896751],\n              [105.202879, 28.869748],\n              [105.21531, 28.818405],\n              [105.225725, 28.807748],\n              [105.2311, 28.777448],\n              [105.240507, 28.774846],\n              [105.204111, 28.746635],\n              [105.216878, 28.739078],\n              [105.219342, 28.715813],\n              [105.203887, 28.709514],\n              [105.21139, 28.696325],\n              [105.201312, 28.673555],\n              [105.167939, 28.65036],\n              [105.172083, 28.607908],\n              [105.207807, 28.569055],\n              [105.203439, 28.548192],\n              [105.226285, 28.540536],\n              [105.237483, 28.523455],\n              [105.234012, 28.49341],\n              [105.206687, 28.457041],\n              [105.191121, 28.445757],\n              [105.228748, 28.449631],\n              [105.229532, 28.451483],\n              [105.230652, 28.450978],\n              [105.2311, 28.449378],\n              [105.295269, 28.449041],\n              [105.293813, 28.435651],\n              [105.32013, 28.427987],\n              [105.32293, 28.386371],\n              [105.3077, 28.371541],\n              [105.287654, 28.369181],\n              [105.306692, 28.359321],\n              [105.310611, 28.339597],\n              [105.336928, 28.313378],\n              [105.331553, 28.292634],\n              [105.339168, 28.280236],\n              [105.333121, 28.256533],\n              [105.348463, 28.205314],\n              [105.344767, 28.185646],\n              [105.358094, 28.153478],\n              [105.350255, 28.140811],\n              [105.275335, 28.134392],\n              [105.224493, 28.099843],\n              [105.225613, 28.098999],\n              [105.225725, 28.09883],\n              [105.226957, 28.094859],\n              [105.226061, 28.094183],\n              [105.220237, 28.091901],\n              [105.204111, 28.073396],\n              [105.17701, 28.066889],\n              [105.18373, 28.040349],\n              [105.167603, 28.023611],\n              [105.184401, 27.996468],\n              [105.215534, 27.990548],\n              [105.246219, 28.009237],\n              [105.270856, 27.995792],\n              [105.269848, 27.978961],\n              [105.283398, 27.959929],\n              [105.280935, 27.929132],\n              [105.264137, 27.91153],\n              [105.248906, 27.912969],\n              [105.234908, 27.898919],\n              [105.250138, 27.844818],\n              [105.244763, 27.822544],\n              [105.27052, 27.818139],\n              [105.314195, 27.81941],\n              [105.313187, 27.81077],\n              [105.287766, 27.807042],\n              [105.273879, 27.795266],\n              [105.292917, 27.771287],\n              [105.287878, 27.742386],\n              [105.290566, 27.712459],\n              [105.309603, 27.705676],\n              [105.327073, 27.727042],\n              [105.339952, 27.729077],\n              [105.353838, 27.748828],\n              [105.368957, 27.749421],\n              [105.440181, 27.77527],\n              [105.458211, 27.767897],\n              [105.477137, 27.774846],\n              [105.517788, 27.764931],\n              [105.537498, 27.753744],\n              [105.550488, 27.72611],\n              [105.60413, 27.71619],\n              [105.604018, 27.700758],\n              [105.619025, 27.687614],\n              [105.623392, 27.667088],\n              [105.643102, 27.659963],\n              [105.66438, 27.683882],\n              [105.702007, 27.676927],\n              [105.721045, 27.684815],\n              [105.722837, 27.705846],\n              [105.784206, 27.719158],\n              [105.842888, 27.705337],\n              [105.868309, 27.732552],\n              [105.921279, 27.747048],\n              [105.929902, 27.728144],\n              [105.985448, 27.74976],\n              [106.023075, 27.746963],\n              [106.062383, 27.763321],\n              [106.063727, 27.777134],\n              [106.12756, 27.778659],\n              [106.19352, 27.754422],\n              [106.224653, 27.760948],\n              [106.268552, 27.782133],\n              [106.295989, 27.803145],\n              [106.341792, 27.820172],\n              [106.317154, 27.838721],\n              [106.34, 27.86531],\n              [106.325889, 27.879364],\n              [106.325777, 27.897988],\n              [106.304836, 27.899342],\n              [106.308083, 27.936748],\n              [106.328353, 27.957983],\n              [106.294309, 28.003656],\n              [106.268888, 28.003318],\n              [106.246266, 28.012027],\n              [106.244139, 28.030543],\n              [106.265528, 28.049816],\n              [106.266648, 28.066551],\n              [106.25153, 28.090296],\n              [106.231484, 28.097985],\n              [106.226221, 28.115894],\n              [106.207071, 28.134223],\n              [106.145254, 28.162851],\n              [106.122072, 28.167073],\n              [106.093515, 28.162682],\n              [106.060927, 28.143007],\n              [106.027219, 28.131267],\n              [106.036514, 28.110741],\n              [106.01322, 28.119949],\n              [105.976153, 28.108038],\n              [105.970777, 28.131267],\n              [105.945244, 28.143513],\n              [105.936957, 28.132281],\n              [105.903697, 28.129156],\n              [105.895186, 28.11978],\n              [105.876036, 28.128227],\n              [105.8785, 28.139037],\n              [105.860918, 28.159558],\n              [105.870996, 28.201937],\n              [105.889026, 28.238479],\n              [105.874244, 28.254593],\n              [105.862709, 28.248941],\n              [105.845687, 28.259908],\n              [105.823402, 28.306885],\n              [105.797645, 28.312366],\n              [105.785662, 28.336478],\n              [105.771328, 28.319449],\n              [105.78667, 28.308825],\n              [105.740643, 28.304862],\n              [105.738627, 28.277284],\n              [105.730004, 28.272139],\n              [105.688569, 28.284369],\n              [105.670091, 28.310427],\n              [105.639518, 28.32417],\n              [105.654861, 28.362355],\n              [105.643326, 28.431524],\n              [105.612529, 28.438936],\n              [105.619361, 28.463608],\n              [105.609842, 28.473964],\n              [105.627984, 28.507802],\n              [105.684649, 28.534563],\n              [105.683417, 28.557867],\n              [105.69316, 28.588567],\n              [105.720709, 28.590585],\n              [105.747474, 28.615895],\n              [105.757665, 28.590333],\n              [105.78499, 28.611103],\n              [105.798429, 28.603199],\n              [105.884995, 28.595463],\n              [105.905937, 28.611019],\n              [105.890258, 28.62136],\n              [105.895634, 28.64372],\n              [105.889474, 28.67053],\n              [105.904817, 28.669606],\n              [105.935613, 28.681874],\n              [105.934269, 28.703633],\n              [105.955883, 28.713881],\n              [105.967754, 28.761665],\n              [105.979288, 28.746551],\n              [106.008965, 28.738238],\n              [106.030802, 28.695064],\n              [106.080413, 28.686327],\n              [106.10337, 28.636071],\n              [106.144582, 28.644729],\n              [106.165747, 28.636239],\n              [106.192064, 28.577802],\n              [106.236187, 28.560138],\n              [106.254889, 28.539443],\n              [106.292629, 28.537339],\n              [106.305396, 28.50452],\n              [106.330705, 28.48213],\n              [106.378859, 28.479689],\n              [106.373036, 28.526906],\n              [106.350191, 28.5402],\n              [106.34224, 28.532627],\n              [106.332049, 28.55324],\n              [106.346607, 28.583773],\n              [106.324546, 28.616736],\n              [106.329809, 28.634054],\n              [106.304052, 28.649856],\n              [106.321522, 28.664648],\n              [106.308531, 28.672547],\n              [106.305172, 28.704221],\n              [106.287702, 28.732359],\n              [106.273143, 28.739833],\n              [106.267656, 28.779295],\n              [106.252426, 28.785842],\n              [106.244363, 28.814629],\n              [106.264856, 28.846093],\n              [106.206959, 28.904548],\n              [106.173474, 28.920813],\n              [106.149173, 28.901949],\n              [106.101243, 28.898931],\n              [106.070558, 28.919807],\n              [106.04928, 28.906393],\n              [106.039426, 28.917711],\n              [106.043793, 28.954172],\n              [106.017476, 28.952915],\n              [106.000902, 28.974031],\n              [105.970217, 28.966071],\n              [105.944012, 28.939589],\n              [105.909744, 28.920477],\n              [105.90952, 28.900188],\n              [105.889362, 28.909495],\n              [105.888019, 28.926848],\n              [105.875028, 28.933973],\n              [105.852742, 28.927351],\n              [105.830457, 28.944283],\n              [105.797533, 28.935901],\n              [105.803804, 28.947635],\n              [105.788238, 28.978221],\n              [105.761921, 28.993049],\n              [105.765952, 29.013906],\n              [105.744563, 29.046649],\n              [105.757777, 29.06624],\n              [105.729892, 29.098799],\n              [105.735156, 29.122396],\n              [105.752066, 29.129758],\n              [105.728884, 29.134443],\n              [105.721381, 29.169573],\n              [105.704471, 29.175678],\n              [105.711974, 29.218902],\n              [105.693944, 29.267539],\n              [105.695176, 29.287338],\n              [105.715894, 29.290846],\n              [105.705031, 29.299199],\n              [105.678042, 29.27347],\n              [105.665164, 29.276561],\n              [105.666507, 29.252917],\n              [105.647581, 29.253251],\n              [105.631791, 29.280404],\n              [105.607938, 29.255758],\n              [105.609506, 29.272719],\n              [105.583301, 29.270379],\n              [105.558328, 29.278483],\n              [105.51846, 29.264447],\n              [105.509165, 29.285416],\n              [105.476241, 29.279235],\n              [105.465378, 29.29235],\n              [105.466498, 29.32158],\n              [105.420135, 29.314399]\n            ]\n          ],\n          [\n            [\n              [105.225613, 28.098999],\n              [105.224493, 28.099843],\n              [105.220237, 28.091901],\n              [105.226061, 28.094183],\n              [105.226957, 28.094859],\n              [105.225725, 28.09883],\n              [105.225613, 28.098999]\n            ]\n          ],\n          [\n            [\n              [105.384747, 29.283579],\n              [105.384747, 29.283328],\n              [105.383403, 29.281991],\n              [105.386203, 29.284832],\n              [105.384747, 29.283579]\n            ]\n          ],\n          [\n            [\n              [105.230652, 28.450978],\n              [105.229532, 28.451483],\n              [105.228748, 28.449631],\n              [105.2311, 28.449378],\n              [105.230652, 28.450978]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510600,\n        \"name\": \"德阳市\",\n        \"center\": [104.398651, 31.127991],\n        \"centroid\": [104.436756, 31.128701],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 4,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.168723, 30.706395],\n              [105.157972, 30.706313],\n              [105.156517, 30.732496],\n              [105.118329, 30.750276],\n              [105.115865, 30.759247],\n              [105.081149, 30.755873],\n              [105.07051, 30.771756],\n              [105.025267, 30.781878],\n              [104.998502, 30.805901],\n              [104.987192, 30.843076],\n              [104.992007, 30.870125],\n              [104.960427, 30.865029],\n              [104.967482, 30.894949],\n              [104.945308, 30.897496],\n              [104.947436, 30.912124],\n              [104.931646, 30.945808],\n              [104.904769, 30.943425],\n              [104.906785, 30.940879],\n              [104.906449, 30.939975],\n              [104.906113, 30.939647],\n              [104.906001, 30.939647],\n              [104.903649, 30.943015],\n              [104.894578, 30.936936],\n              [104.893682, 30.936361],\n              [104.893682, 30.936197],\n              [104.89357, 30.934964],\n              [104.893458, 30.934964],\n              [104.891554, 30.936607],\n              [104.876772, 30.937347],\n              [104.87666, 30.936607],\n              [104.87666, 30.936279],\n              [104.875652, 30.934554],\n              [104.875316, 30.934718],\n              [104.875204, 30.935786],\n              [104.875204, 30.936114],\n              [104.875652, 30.937757],\n              [104.870165, 30.946465],\n              [104.841496, 30.946465],\n              [104.85471, 30.959442],\n              [104.846311, 30.981368],\n              [104.82593, 30.997625],\n              [104.83836, 31.013878],\n              [104.82593, 31.023564],\n              [104.819882, 31.064182],\n              [104.80678, 31.067135],\n              [104.774751, 31.099616],\n              [104.791885, 31.118394],\n              [104.788974, 31.130283],\n              [104.762321, 31.132004],\n              [104.757393, 31.144219],\n              [104.756385, 31.144383],\n              [104.75605, 31.14512],\n              [104.756721, 31.146104],\n              [104.743507, 31.167168],\n              [104.719654, 31.16266],\n              [104.713942, 31.216079],\n              [104.741939, 31.232623],\n              [104.74877, 31.275117],\n              [104.731524, 31.281174],\n              [104.724917, 31.271351],\n              [104.697256, 31.274298],\n              [104.677434, 31.266849],\n              [104.670827, 31.299998],\n              [104.658172, 31.311127],\n              [104.656829, 31.33109],\n              [104.586165, 31.357674],\n              [104.590532, 31.375665],\n              [104.585045, 31.402482],\n              [104.523676, 31.44261],\n              [104.496911, 31.407795],\n              [104.477313, 31.405588],\n              [104.478545, 31.385068],\n              [104.418295, 31.374847],\n              [104.387051, 31.382861],\n              [104.37574, 31.373784],\n              [104.358158, 31.386376],\n              [104.347407, 31.381798],\n              [104.326914, 31.399294],\n              [104.311011, 31.427738],\n              [104.285702, 31.436318],\n              [104.27092, 31.45936],\n              [104.236428, 31.463608],\n              [104.202944, 31.51457],\n              [104.185586, 31.520286],\n              [104.170579, 31.512366],\n              [104.155685, 31.519061],\n              [104.152325, 31.541755],\n              [104.16106, 31.55612],\n              [104.146054, 31.564934],\n              [104.132727, 31.605319],\n              [104.102715, 31.630602],\n              [104.098459, 31.648622],\n              [104.116937, 31.677724],\n              [104.09398, 31.693535],\n              [104.085917, 31.688075],\n              [104.040786, 31.697691],\n              [104.016037, 31.678539],\n              [103.989384, 31.68237],\n              [103.962842, 31.656612],\n              [103.928238, 31.639572],\n              [103.917376, 31.612089],\n              [103.923311, 31.60328],\n              [103.907409, 31.564444],\n              [103.915136, 31.538409],\n              [103.898226, 31.512856],\n              [103.857798, 31.53849],\n              [103.84212, 31.510896],\n              [103.795757, 31.471777],\n              [103.802588, 31.430108],\n              [103.816027, 31.431906],\n              [103.828682, 31.412454],\n              [103.868437, 31.420954],\n              [103.897554, 31.416377],\n              [103.894754, 31.408858],\n              [103.92835, 31.355139],\n              [103.894418, 31.326018],\n              [103.891618, 31.308017],\n              [103.914128, 31.278964],\n              [103.928014, 31.272497],\n              [103.929134, 31.234425],\n              [103.949404, 31.215997],\n              [103.983, 31.200925],\n              [104.014693, 31.167577],\n              [104.009429, 31.153235],\n              [104.022868, 31.142661],\n              [104.019844, 31.103963],\n              [104.057584, 31.07821],\n              [104.060608, 31.0641],\n              [104.094876, 31.032756],\n              [104.10641, 31.031771],\n              [104.10697, 31.032263],\n              [104.117385, 31.017572],\n              [104.143478, 31.01158],\n              [104.166884, 30.993438],\n              [104.166324, 30.951311],\n              [104.142582, 30.925845],\n              [104.149974, 30.91311],\n              [104.168787, 30.918533],\n              [104.202384, 30.91311],\n              [104.21571, 30.8984],\n              [104.244491, 30.896921],\n              [104.288726, 30.90292],\n              [104.322322, 30.891743],\n              [104.351887, 30.902345],\n              [104.367117, 30.93365],\n              [104.389739, 30.925681],\n              [104.39601, 30.942358],\n              [104.44506, 30.940468],\n              [104.465218, 30.9509],\n              [104.495791, 30.935457],\n              [104.511917, 30.935868],\n              [104.533083, 30.917875],\n              [104.520764, 30.882456],\n              [104.585269, 30.862891],\n              [104.596355, 30.864535],\n              [104.613937, 30.847763],\n              [104.629952, 30.852449],\n              [104.640366, 30.837895],\n              [104.698376, 30.825559],\n              [104.718086, 30.771756],\n              [104.732084, 30.778257],\n              [104.750786, 30.726898],\n              [104.768032, 30.71817],\n              [104.788526, 30.721299],\n              [104.78875, 30.694043],\n              [104.800956, 30.690995],\n              [104.818315, 30.664307],\n              [104.821226, 30.643874],\n              [104.842728, 30.649395],\n              [104.847319, 30.631101],\n              [104.819994, 30.598296],\n              [104.819098, 30.580076],\n              [104.858854, 30.582385],\n              [104.859078, 30.611321],\n              [104.878788, 30.617997],\n              [104.886403, 30.609343],\n              [104.910928, 30.625662],\n              [104.932206, 30.617091],\n              [104.93019, 30.601429],\n              [104.953371, 30.612475],\n              [104.970393, 30.586425],\n              [104.963226, 30.56746],\n              [104.983944, 30.529271],\n              [105.025043, 30.530178],\n              [105.022916, 30.546099],\n              [105.048449, 30.545192],\n              [105.066927, 30.53587],\n              [105.079021, 30.543129],\n              [105.094812, 30.584198],\n              [105.117657, 30.602913],\n              [105.130088, 30.624756],\n              [105.153829, 30.640249],\n              [105.142742, 30.653185],\n              [105.146998, 30.669168],\n              [105.161108, 30.672545],\n              [105.174547, 30.697666],\n              [105.168723, 30.706395]\n            ]\n          ],\n          [\n            [\n              [104.876772, 30.937347],\n              [104.875652, 30.937757],\n              [104.875204, 30.936114],\n              [104.875204, 30.935786],\n              [104.875316, 30.934718],\n              [104.875652, 30.934554],\n              [104.87666, 30.936279],\n              [104.87666, 30.936607],\n              [104.876772, 30.937347]\n            ]\n          ],\n          [\n            [\n              [104.894578, 30.936936],\n              [104.891554, 30.936607],\n              [104.893458, 30.934964],\n              [104.89357, 30.934964],\n              [104.893682, 30.936197],\n              [104.893682, 30.936361],\n              [104.894578, 30.936936]\n            ]\n          ],\n          [\n            [\n              [104.904769, 30.943425],\n              [104.903649, 30.943015],\n              [104.906001, 30.939647],\n              [104.906113, 30.939647],\n              [104.906449, 30.939975],\n              [104.906785, 30.940879],\n              [104.904769, 30.943425]\n            ]\n          ],\n          [\n            [\n              [104.756721, 31.146104],\n              [104.75605, 31.14512],\n              [104.756385, 31.144383],\n              [104.757393, 31.144219],\n              [104.756721, 31.146104]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510700,\n        \"name\": \"绵阳市\",\n        \"center\": [104.741722, 31.46402],\n        \"centroid\": [104.704392, 31.850919],\n        \"childrenNum\": 9,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 5,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.459219, 31.52698],\n              [105.416215, 31.558487],\n              [105.395834, 31.561588],\n              [105.393258, 31.618369],\n              [105.366269, 31.615596],\n              [105.333009, 31.630276],\n              [105.345103, 31.677235],\n              [105.317555, 31.702988],\n              [105.315315, 31.71855],\n              [105.284518, 31.700951],\n              [105.25361, 31.707306],\n              [105.284406, 31.72914],\n              [105.283062, 31.740218],\n              [105.311395, 31.744128],\n              [105.3077, 31.771327],\n              [105.288774, 31.793716],\n              [105.264137, 31.790541],\n              [105.262233, 31.77841],\n              [105.243755, 31.795181],\n              [105.251482, 31.816587],\n              [105.243195, 31.830014],\n              [105.205231, 31.837094],\n              [105.223261, 31.882078],\n              [105.203327, 31.90509],\n              [105.18317, 31.91135],\n              [105.205343, 31.945652],\n              [105.185185, 31.965399],\n              [105.187761, 31.983029],\n              [105.174211, 31.999518],\n              [105.194144, 31.996025],\n              [105.208591, 32.0117],\n              [105.215198, 32.004229],\n              [105.235692, 32.016492],\n              [105.25193, 31.982866],\n              [105.26436, 32.031514],\n              [105.250026, 32.033138],\n              [105.252602, 32.082651],\n              [105.286198, 32.108777],\n              [105.262569, 32.126623],\n              [105.28575, 32.139762],\n              [105.275111, 32.15598],\n              [105.251706, 32.16725],\n              [105.273096, 32.193189],\n              [105.240395, 32.204292],\n              [105.262233, 32.225198],\n              [105.252826, 32.236297],\n              [105.27052, 32.263027],\n              [105.268504, 32.27809],\n              [105.254394, 32.271611],\n              [105.238043, 32.287401],\n              [105.254954, 32.300679],\n              [105.247562, 32.32051],\n              [105.218894, 32.316059],\n              [105.208815, 32.306831],\n              [105.176674, 32.302621],\n              [105.112729, 32.310797],\n              [105.08742, 32.30335],\n              [105.082605, 32.283596],\n              [105.044865, 32.287563],\n              [105.032994, 32.265133],\n              [104.995255, 32.247557],\n              [105.00007, 32.266429],\n              [104.976553, 32.293069],\n              [104.964458, 32.297359],\n              [104.974649, 32.334592],\n              [104.940381, 32.333621],\n              [104.911712, 32.326175],\n              [104.884611, 32.355144],\n              [104.856278, 32.357329],\n              [104.840712, 32.35118],\n              [104.822458, 32.370434],\n              [104.804316, 32.374155],\n              [104.773856, 32.400116],\n              [104.775423, 32.414913],\n              [104.755938, 32.436336],\n              [104.761649, 32.445955],\n              [104.749218, 32.464623],\n              [104.759745, 32.493871],\n              [104.750002, 32.505341],\n              [104.754818, 32.52642],\n              [104.745971, 32.536351],\n              [104.709687, 32.553952],\n              [104.655933, 32.56049],\n              [104.651117, 32.579619],\n              [104.634207, 32.597211],\n              [104.618977, 32.600842],\n              [104.617745, 32.627464],\n              [104.635775, 32.668511],\n              [104.596355, 32.693259],\n              [104.582805, 32.72219],\n              [104.555144, 32.733792],\n              [104.526699, 32.728394],\n              [104.510237, 32.754495],\n              [104.458947, 32.748534],\n              [104.447524, 32.761743],\n              [104.422103, 32.768831],\n              [104.421655, 32.780588],\n              [104.371709, 32.805949],\n              [104.365325, 32.821564],\n              [104.330161, 32.824622],\n              [104.294325, 32.835728],\n              [104.28895, 32.870325],\n              [104.277079, 32.891317],\n              [104.247851, 32.877564],\n              [104.220302, 32.896143],\n              [104.217278, 32.908767],\n              [104.195664, 32.916888],\n              [104.158821, 32.956998],\n              [104.113466, 32.99982],\n              [104.069231, 33.003114],\n              [104.013461, 33.041258],\n              [103.986472, 33.034674],\n              [103.973705, 33.005122],\n              [103.978521, 32.985602],\n              [103.959371, 32.939879],\n              [103.965082, 32.922114],\n              [103.952988, 32.917451],\n              [103.958027, 32.888422],\n              [103.993975, 32.879334],\n              [103.994535, 32.861154],\n              [103.971466, 32.839671],\n              [104.004614, 32.814159],\n              [104.032387, 32.820357],\n              [104.035522, 32.833073],\n              [104.068895, 32.845224],\n              [104.079309, 32.856971],\n              [104.101035, 32.848201],\n              [104.108314, 32.800635],\n              [104.121305, 32.799911],\n              [104.146502, 32.756589],\n              [104.130152, 32.730327],\n              [104.155909, 32.711473],\n              [104.182786, 32.663431],\n              [104.177634, 32.607054],\n              [104.168451, 32.579377],\n              [104.174835, 32.531345],\n              [104.162292, 32.521332],\n              [104.144486, 32.473754],\n              [104.0951, 32.467694],\n              [104.132279, 32.492094],\n              [104.129368, 32.530457],\n              [104.084237, 32.569127],\n              [104.068335, 32.608426],\n              [104.065871, 32.631013],\n              [104.035634, 32.651578],\n              [104.007973, 32.641578],\n              [103.993303, 32.647788],\n              [103.922415, 32.635771],\n              [103.890387, 32.638997],\n              [103.877508, 32.621333],\n              [103.853095, 32.61367],\n              [103.84492, 32.584058],\n              [103.906961, 32.51051],\n              [103.902817, 32.496617],\n              [103.914576, 32.432699],\n              [103.889155, 32.364852],\n              [103.904497, 32.347053],\n              [103.898002, 32.341227],\n              [103.921295, 32.315411],\n              [103.960155, 32.304564],\n              [103.981768, 32.305617],\n              [104.022756, 32.265214],\n              [104.033507, 32.248691],\n              [104.066655, 32.249258],\n              [104.075838, 32.237513],\n              [104.131048, 32.223011],\n              [104.135751, 32.234677],\n              [104.162292, 32.250473],\n              [104.159828, 32.25995],\n              [104.182114, 32.308936],\n              [104.211455, 32.298412],\n              [104.209439, 32.285053],\n              [104.247515, 32.24942],\n              [104.257481, 32.214746],\n              [104.221757, 32.215394],\n              [104.18189, 32.196593],\n              [104.158821, 32.176491],\n              [104.156581, 32.158899],\n              [104.142134, 32.149655],\n              [104.152885, 32.125893],\n              [104.129032, 32.140248],\n              [104.100587, 32.125001],\n              [104.048961, 32.131408],\n              [103.994983, 32.118917],\n              [103.974713, 32.140897],\n              [103.938877, 32.146817],\n              [103.922527, 32.143087],\n              [103.897442, 32.155736],\n              [103.850743, 32.161331],\n              [103.855111, 32.126704],\n              [103.826778, 32.130354],\n              [103.82689, 32.114375],\n              [103.811995, 32.097987],\n              [103.824874, 32.07056],\n              [103.817147, 32.054732],\n              [103.795869, 32.045965],\n              [103.758241, 31.997894],\n              [103.754882, 31.964342],\n              [103.763617, 31.946384],\n              [103.817931, 31.939801],\n              [103.845704, 31.921187],\n              [103.876836, 31.917854],\n              [103.886131, 31.929234],\n              [103.920623, 31.942239],\n              [103.957691, 31.903545],\n              [103.975497, 31.85605],\n              [104.01738, 31.862232],\n              [104.030707, 31.846938],\n              [104.046497, 31.849297],\n              [104.061055, 31.829038],\n              [104.080093, 31.838639],\n              [104.127576, 31.828712],\n              [104.132951, 31.815936],\n              [104.152213, 31.815855],\n              [104.169795, 31.779876],\n              [104.171027, 31.732317],\n              [104.147734, 31.727104],\n              [104.142694, 31.715454],\n              [104.103163, 31.710321],\n              [104.09398, 31.693535],\n              [104.116937, 31.677724],\n              [104.098459, 31.648622],\n              [104.102715, 31.630602],\n              [104.132727, 31.605319],\n              [104.146054, 31.564934],\n              [104.16106, 31.55612],\n              [104.152325, 31.541755],\n              [104.155685, 31.519061],\n              [104.170579, 31.512366],\n              [104.185586, 31.520286],\n              [104.202944, 31.51457],\n              [104.236428, 31.463608],\n              [104.27092, 31.45936],\n              [104.285702, 31.436318],\n              [104.311011, 31.427738],\n              [104.326914, 31.399294],\n              [104.347407, 31.381798],\n              [104.358158, 31.386376],\n              [104.37574, 31.373784],\n              [104.387051, 31.382861],\n              [104.418295, 31.374847],\n              [104.478545, 31.385068],\n              [104.477313, 31.405588],\n              [104.496911, 31.407795],\n              [104.523676, 31.44261],\n              [104.585045, 31.402482],\n              [104.590532, 31.375665],\n              [104.586165, 31.357674],\n              [104.656829, 31.33109],\n              [104.658172, 31.311127],\n              [104.670827, 31.299998],\n              [104.677434, 31.266849],\n              [104.697256, 31.274298],\n              [104.724917, 31.271351],\n              [104.731524, 31.281174],\n              [104.74877, 31.275117],\n              [104.741939, 31.232623],\n              [104.713942, 31.216079],\n              [104.719654, 31.16266],\n              [104.743507, 31.167168],\n              [104.756721, 31.146104],\n              [104.757393, 31.144219],\n              [104.762321, 31.132004],\n              [104.788974, 31.130283],\n              [104.791885, 31.118394],\n              [104.774751, 31.099616],\n              [104.80678, 31.067135],\n              [104.819882, 31.064182],\n              [104.82593, 31.023564],\n              [104.83836, 31.013878],\n              [104.82593, 30.997625],\n              [104.846311, 30.981368],\n              [104.85471, 30.959442],\n              [104.841496, 30.946465],\n              [104.870165, 30.946465],\n              [104.875652, 30.937757],\n              [104.876772, 30.937347],\n              [104.891554, 30.936607],\n              [104.894578, 30.936936],\n              [104.903649, 30.943015],\n              [104.904769, 30.943425],\n              [104.931646, 30.945808],\n              [104.947436, 30.912124],\n              [104.945308, 30.897496],\n              [104.967482, 30.894949],\n              [104.960427, 30.865029],\n              [104.992007, 30.870125],\n              [104.987192, 30.843076],\n              [104.998502, 30.805901],\n              [105.025267, 30.781878],\n              [105.07051, 30.771756],\n              [105.081149, 30.755873],\n              [105.115865, 30.759247],\n              [105.118329, 30.750276],\n              [105.156517, 30.732496],\n              [105.157972, 30.706313],\n              [105.168723, 30.706395],\n              [105.215198, 30.734718],\n              [105.243979, 30.726074],\n              [105.248682, 30.739164],\n              [105.271976, 30.751428],\n              [105.260441, 30.822845],\n              [105.232332, 30.846283],\n              [105.228636, 30.877359],\n              [105.200192, 30.886154],\n              [105.194256, 30.897003],\n              [105.208815, 30.906207],\n              [105.177346, 30.960181],\n              [105.193808, 30.964698],\n              [105.194704, 30.992042],\n              [105.174771, 31.045967],\n              [105.189889, 31.054993],\n              [105.199968, 31.075995],\n              [105.193248, 31.08592],\n              [105.223933, 31.107653],\n              [105.241179, 31.101831],\n              [105.296837, 31.106341],\n              [105.344431, 31.125938],\n              [105.35395, 31.160611],\n              [105.381275, 31.152907],\n              [105.389338, 31.112081],\n              [105.410728, 31.07255],\n              [105.42831, 31.075749],\n              [105.453955, 31.060162],\n              [105.474225, 31.06369],\n              [105.489903, 31.035874],\n              [105.504462, 31.026518],\n              [105.534362, 31.027011],\n              [105.546009, 31.013632],\n              [105.565831, 31.011252],\n              [105.573334, 30.98884],\n              [105.595843, 30.972582],\n              [105.618689, 30.977591],\n              [105.613873, 30.991303],\n              [105.633807, 31.003289],\n              [105.65822, 30.999923],\n              [105.663372, 31.01749],\n              [105.686665, 31.016341],\n              [105.714102, 31.039321],\n              [105.708727, 31.071237],\n              [105.721717, 31.084197],\n              [105.712198, 31.09691],\n              [105.726197, 31.110769],\n              [105.716678, 31.130365],\n              [105.721381, 31.150366],\n              [105.707047, 31.169216],\n              [105.674346, 31.171757],\n              [105.674682, 31.249492],\n              [105.647805, 31.257598],\n              [105.637615, 31.283548],\n              [105.616673, 31.295579],\n              [105.599091, 31.288704],\n              [105.594163, 31.299834],\n              [105.609058, 31.325527],\n              [105.606482, 31.339598],\n              [105.629775, 31.345896],\n              [105.64243, 31.371168],\n              [105.641646, 31.394797],\n              [105.620928, 31.406651],\n              [105.612193, 31.39635],\n              [105.591252, 31.39725],\n              [105.57255, 31.382043],\n              [105.56863, 31.403136],\n              [105.551048, 31.392753],\n              [105.533018, 31.401582],\n              [105.524059, 31.391364],\n              [105.49875, 31.402482],\n              [105.481168, 31.424224],\n              [105.486992, 31.443918],\n              [105.501662, 31.454866],\n              [105.471313, 31.485826],\n              [105.458211, 31.474717],\n              [105.441973, 31.480517],\n              [105.462802, 31.498974],\n              [105.459219, 31.52698]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510800,\n        \"name\": \"广元市\",\n        \"center\": [105.829757, 32.433668],\n        \"centroid\": [105.78583, 32.26157],\n        \"childrenNum\": 7,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 6,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.459219, 31.52698],\n              [105.494719, 31.550326],\n              [105.493711, 31.551468],\n              [105.498414, 31.574155],\n              [105.529771, 31.574644],\n              [105.53537, 31.564771],\n              [105.579493, 31.565668],\n              [105.599203, 31.581009],\n              [105.60805, 31.551631],\n              [105.618353, 31.55359],\n              [105.622496, 31.58419],\n              [105.639518, 31.587617],\n              [105.633247, 31.60067],\n              [105.653517, 31.61372],\n              [105.657884, 31.601975],\n              [105.684649, 31.608908],\n              [105.69932, 31.649845],\n              [105.723845, 31.663623],\n              [105.726085, 31.726615],\n              [105.749378, 31.718794],\n              [105.76864, 31.735412],\n              [105.780735, 31.712684],\n              [105.816011, 31.677643],\n              [105.817914, 31.66778],\n              [105.847143, 31.667047],\n              [105.838072, 31.65115],\n              [105.845799, 31.632559],\n              [105.865285, 31.614781],\n              [105.885779, 31.630521],\n              [105.881635, 31.648052],\n              [105.910528, 31.625791],\n              [105.929902, 31.649193],\n              [105.925086, 31.664764],\n              [105.958235, 31.672426],\n              [105.977496, 31.662482],\n              [106.007173, 31.684734],\n              [106.032482, 31.687586],\n              [106.048385, 31.698098],\n              [106.078061, 31.697202],\n              [106.068318, 31.708447],\n              [106.10225, 31.73248],\n              [106.111993, 31.758543],\n              [106.128568, 31.767174],\n              [106.12364, 31.792006],\n              [106.110538, 31.790785],\n              [106.130359, 31.829282],\n              [106.138646, 31.811297],\n              [106.153765, 31.806576],\n              [106.188481, 31.821796],\n              [106.199232, 31.818622],\n              [106.194528, 31.785901],\n              [106.211326, 31.770757],\n              [106.24817, 31.7824],\n              [106.262057, 31.773851],\n              [106.275271, 31.79689],\n              [106.270456, 31.810972],\n              [106.292293, 31.80739],\n              [106.310435, 31.825539],\n              [106.327345, 31.829689],\n              [106.33552, 31.848484],\n              [106.361277, 31.846287],\n              [106.384235, 31.801693],\n              [106.39577, 31.805681],\n              [106.406296, 31.808286],\n              [106.416039, 31.83156],\n              [106.406408, 31.874189],\n              [106.424662, 31.889803],\n              [106.408984, 31.902081],\n              [106.427462, 31.915009],\n              [106.419847, 31.917529],\n              [106.426678, 31.923219],\n              [106.428694, 31.922813],\n              [106.446052, 31.943295],\n              [106.463522, 31.94167],\n              [106.464754, 31.954591],\n              [106.445492, 31.977179],\n              [106.482112, 31.977098],\n              [106.493087, 32.006016],\n              [106.508765, 32.024775],\n              [106.501038, 32.048969],\n              [106.519628, 32.050186],\n              [106.517836, 32.068531],\n              [106.533514, 32.08184],\n              [106.559159, 32.082733],\n              [106.535194, 32.098474],\n              [106.567558, 32.128407],\n              [106.556919, 32.1756],\n              [106.564647, 32.227548],\n              [106.594547, 32.23727],\n              [106.666219, 32.249663],\n              [106.674842, 32.272664],\n              [106.688393, 32.266267],\n              [106.718405, 32.269263],\n              [106.71695, 32.294607],\n              [106.755361, 32.285296],\n              [106.776191, 32.296874],\n              [106.745058, 32.322938],\n              [106.737779, 32.31533],\n              [106.725909, 32.336939],\n              [106.688953, 32.348024],\n              [106.691528, 32.404159],\n              [106.684697, 32.418066],\n              [106.689849, 32.453633],\n              [106.674842, 32.486196],\n              [106.649421, 32.50421],\n              [106.65838, 32.566221],\n              [106.652109, 32.590756],\n              [106.658044, 32.622463],\n              [106.645278, 32.63682],\n              [106.64035, 32.687294],\n              [106.629375, 32.681248],\n              [106.588612, 32.688584],\n              [106.566774, 32.675847],\n              [106.517276, 32.668027],\n              [106.498126, 32.64932],\n              [106.472929, 32.650368],\n              [106.451651, 32.660125],\n              [106.450979, 32.640207],\n              [106.420519, 32.616655],\n              [106.38905, 32.626738],\n              [106.383227, 32.646578],\n              [106.351199, 32.671897],\n              [106.305508, 32.679636],\n              [106.278855, 32.670687],\n              [106.256457, 32.693259],\n              [106.17437, 32.697611],\n              [106.171795, 32.709136],\n              [106.153653, 32.705751],\n              [106.145366, 32.720417],\n              [106.119944, 32.719611],\n              [106.062047, 32.7673],\n              [106.065519, 32.783486],\n              [106.094747, 32.795966],\n              [106.093627, 32.823737],\n              [106.069998, 32.824059],\n              [106.046705, 32.852224],\n              [106.021732, 32.857534],\n              [106.011541, 32.829693],\n              [105.99519, 32.828003],\n              [105.969321, 32.849005],\n              [105.927214, 32.825991],\n              [105.89317, 32.838464],\n              [105.857782, 32.827439],\n              [105.850727, 32.818103],\n              [105.831129, 32.826071],\n              [105.816906, 32.790411],\n              [105.82273, 32.771649],\n              [105.779615, 32.750225],\n              [105.768752, 32.767542],\n              [105.750722, 32.767945],\n              [105.73594, 32.75385],\n              [105.719253, 32.75973],\n              [105.678042, 32.726541],\n              [105.649261, 32.718725],\n              [105.625408, 32.702044],\n              [105.596403, 32.699303],\n              [105.585204, 32.729119],\n              [105.556312, 32.732019],\n              [105.55788, 32.752964],\n              [105.56807, 32.758763],\n              [105.554744, 32.773985],\n              [105.556312, 32.792021],\n              [105.535818, 32.789847],\n              [105.524507, 32.847718],\n              [105.495503, 32.873221],\n              [105.486768, 32.92139],\n              [105.456307, 32.932645],\n              [105.42551, 32.931117],\n              [105.41308, 32.918898],\n              [105.407816, 32.885768],\n              [105.380827, 32.878771],\n              [105.399753, 32.829049],\n              [105.427526, 32.784292],\n              [105.425174, 32.774951],\n              [105.453283, 32.767623],\n              [105.459443, 32.7524],\n              [105.448916, 32.732744],\n              [105.425398, 32.733953],\n              [105.394266, 32.714293],\n              [105.365597, 32.710425],\n              [105.346895, 32.682699],\n              [105.308708, 32.67109],\n              [105.297733, 32.657061],\n              [105.261785, 32.653191],\n              [105.241179, 32.668914],\n              [105.219677, 32.666334],\n              [105.215086, 32.63682],\n              [105.186865, 32.62585],\n              [105.184737, 32.617381],\n              [105.143862, 32.601245],\n              [105.110826, 32.594145],\n              [105.095931, 32.6077],\n              [105.079357, 32.637223],\n              [105.030195, 32.650449],\n              [105.014852, 32.640127],\n              [104.971961, 32.632948],\n              [104.927726, 32.60891],\n              [104.881811, 32.601164],\n              [104.873636, 32.623027],\n              [104.845751, 32.653916],\n              [104.820666, 32.662947],\n              [104.795917, 32.643514],\n              [104.766016, 32.645449],\n              [104.739587, 32.635449],\n              [104.696808, 32.673509],\n              [104.668027, 32.662544],\n              [104.635775, 32.668511],\n              [104.617745, 32.627464],\n              [104.618977, 32.600842],\n              [104.634207, 32.597211],\n              [104.651117, 32.579619],\n              [104.655933, 32.56049],\n              [104.709687, 32.553952],\n              [104.745971, 32.536351],\n              [104.754818, 32.52642],\n              [104.750002, 32.505341],\n              [104.759745, 32.493871],\n              [104.749218, 32.464623],\n              [104.761649, 32.445955],\n              [104.755938, 32.436336],\n              [104.775423, 32.414913],\n              [104.773856, 32.400116],\n              [104.804316, 32.374155],\n              [104.822458, 32.370434],\n              [104.840712, 32.35118],\n              [104.856278, 32.357329],\n              [104.884611, 32.355144],\n              [104.911712, 32.326175],\n              [104.940381, 32.333621],\n              [104.974649, 32.334592],\n              [104.964458, 32.297359],\n              [104.976553, 32.293069],\n              [105.00007, 32.266429],\n              [104.995255, 32.247557],\n              [105.032994, 32.265133],\n              [105.044865, 32.287563],\n              [105.082605, 32.283596],\n              [105.08742, 32.30335],\n              [105.112729, 32.310797],\n              [105.176674, 32.302621],\n              [105.208815, 32.306831],\n              [105.218894, 32.316059],\n              [105.247562, 32.32051],\n              [105.254954, 32.300679],\n              [105.238043, 32.287401],\n              [105.254394, 32.271611],\n              [105.268504, 32.27809],\n              [105.27052, 32.263027],\n              [105.252826, 32.236297],\n              [105.262233, 32.225198],\n              [105.240395, 32.204292],\n              [105.273096, 32.193189],\n              [105.251706, 32.16725],\n              [105.275111, 32.15598],\n              [105.28575, 32.139762],\n              [105.262569, 32.126623],\n              [105.286198, 32.108777],\n              [105.252602, 32.082651],\n              [105.250026, 32.033138],\n              [105.26436, 32.031514],\n              [105.25193, 31.982866],\n              [105.235692, 32.016492],\n              [105.215198, 32.004229],\n              [105.208591, 32.0117],\n              [105.194144, 31.996025],\n              [105.174211, 31.999518],\n              [105.187761, 31.983029],\n              [105.185185, 31.965399],\n              [105.205343, 31.945652],\n              [105.18317, 31.91135],\n              [105.203327, 31.90509],\n              [105.223261, 31.882078],\n              [105.205231, 31.837094],\n              [105.243195, 31.830014],\n              [105.251482, 31.816587],\n              [105.243755, 31.795181],\n              [105.262233, 31.77841],\n              [105.264137, 31.790541],\n              [105.288774, 31.793716],\n              [105.3077, 31.771327],\n              [105.311395, 31.744128],\n              [105.283062, 31.740218],\n              [105.284406, 31.72914],\n              [105.25361, 31.707306],\n              [105.284518, 31.700951],\n              [105.315315, 31.71855],\n              [105.317555, 31.702988],\n              [105.345103, 31.677235],\n              [105.333009, 31.630276],\n              [105.366269, 31.615596],\n              [105.393258, 31.618369],\n              [105.395834, 31.561588],\n              [105.416215, 31.558487],\n              [105.459219, 31.52698]\n            ]\n          ],\n          [\n            [\n              [106.419847, 31.917529],\n              [106.427462, 31.915009],\n              [106.428694, 31.922813],\n              [106.426678, 31.923219],\n              [106.419847, 31.917529]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510900,\n        \"name\": \"遂宁市\",\n        \"center\": [105.571331, 30.513311],\n        \"centroid\": [105.475016, 30.630107],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 7,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.066927, 30.53587],\n              [105.059983, 30.522753],\n              [105.084173, 30.494616],\n              [105.076558, 30.481741],\n              [105.090444, 30.459536],\n              [105.090108, 30.442363],\n              [105.075214, 30.44228],\n              [105.075102, 30.442115],\n              [105.074766, 30.44195],\n              [105.074206, 30.441785],\n              [105.073758, 30.44195],\n              [105.073646, 30.442115],\n              [105.068942, 30.432949],\n              [105.090444, 30.425682],\n              [105.080141, 30.412385],\n              [105.079917, 30.411724],\n              [105.07387, 30.403133],\n              [105.093692, 30.395947],\n              [105.097275, 30.396194],\n              [105.100635, 30.38562],\n              [105.101419, 30.385455],\n              [105.126056, 30.341491],\n              [105.151365, 30.341987],\n              [105.157412, 30.323388],\n              [105.197056, 30.310738],\n              [105.198064, 30.311813],\n              [105.198176, 30.311813],\n              [105.19784, 30.309994],\n              [105.218894, 30.30586],\n              [105.221805, 30.287171],\n              [105.258313, 30.280307],\n              [105.263913, 30.287915],\n              [105.328305, 30.303297],\n              [105.343088, 30.298087],\n              [105.35843, 30.308093],\n              [105.368845, 30.278404],\n              [105.380379, 30.276916],\n              [105.411064, 30.295606],\n              [105.425958, 30.259876],\n              [105.444996, 30.265997],\n              [105.480944, 30.238696],\n              [105.4824, 30.223222],\n              [105.521036, 30.202613],\n              [105.529323, 30.21958],\n              [105.547129, 30.212711],\n              [105.557544, 30.195826],\n              [105.558887, 30.185561],\n              [105.561463, 30.183656],\n              [105.579941, 30.173473],\n              [105.595171, 30.183656],\n              [105.64243, 30.186388],\n              [105.655421, 30.220822],\n              [105.636271, 30.219746],\n              [105.619473, 30.234641],\n              [105.625072, 30.27584],\n              [105.667179, 30.265666],\n              [105.670651, 30.254085],\n              [105.723845, 30.254747],\n              [105.734932, 30.276998],\n              [105.71175, 30.282209],\n              [105.714774, 30.322809],\n              [105.741875, 30.319833],\n              [105.735044, 30.336697],\n              [105.756209, 30.347112],\n              [105.751842, 30.357112],\n              [105.769536, 30.375292],\n              [105.760241, 30.384546],\n              [105.77032, 30.403959],\n              [105.78275, 30.403133],\n              [105.791709, 30.425434],\n              [105.818026, 30.437243],\n              [105.846695, 30.410733],\n              [105.846247, 30.392394],\n              [105.873796, 30.408668],\n              [105.899441, 30.405612],\n              [105.901569, 30.386363],\n              [105.917023, 30.395947],\n              [105.940877, 30.372317],\n              [105.967978, 30.379258],\n              [105.992055, 30.369177],\n              [106.00079, 30.376283],\n              [105.987239, 30.394047],\n              [105.989815, 30.41255],\n              [105.9794, 30.427581],\n              [105.963834, 30.424691],\n              [105.948268, 30.441619],\n              [105.950172, 30.452931],\n              [105.971225, 30.456151],\n              [105.970665, 30.477119],\n              [105.954203, 30.514255],\n              [105.945692, 30.501383],\n              [105.934045, 30.516731],\n              [105.915791, 30.508974],\n              [105.927102, 30.494038],\n              [105.948828, 30.494368],\n              [105.917807, 30.466966],\n              [105.885331, 30.458875],\n              [105.884099, 30.496266],\n              [105.867413, 30.497092],\n              [105.860246, 30.48496],\n              [105.846807, 30.491645],\n              [105.862821, 30.51244],\n              [105.877492, 30.547419],\n              [105.871332, 30.562182],\n              [105.85431, 30.565728],\n              [105.82385, 30.602995],\n              [105.82329, 30.621953],\n              [105.809067, 30.625333],\n              [105.813771, 30.651372],\n              [105.792717, 30.711418],\n              [105.792941, 30.759906],\n              [105.782302, 30.785086],\n              [105.796749, 30.800883],\n              [105.784318, 30.823832],\n              [105.755761, 30.841267],\n              [105.730564, 30.876784],\n              [105.744899, 30.879086],\n              [105.73202, 30.905714],\n              [105.705927, 30.910152],\n              [105.691705, 30.933896],\n              [105.65934, 30.918697],\n              [105.6599, 30.942275],\n              [105.643438, 30.948025],\n              [105.618689, 30.977591],\n              [105.595843, 30.972582],\n              [105.573334, 30.98884],\n              [105.565831, 31.011252],\n              [105.546009, 31.013632],\n              [105.534362, 31.027011],\n              [105.504462, 31.026518],\n              [105.489903, 31.035874],\n              [105.474225, 31.06369],\n              [105.453955, 31.060162],\n              [105.42831, 31.075749],\n              [105.410728, 31.07255],\n              [105.389338, 31.112081],\n              [105.381275, 31.152907],\n              [105.35395, 31.160611],\n              [105.344431, 31.125938],\n              [105.296837, 31.106341],\n              [105.241179, 31.101831],\n              [105.223933, 31.107653],\n              [105.193248, 31.08592],\n              [105.199968, 31.075995],\n              [105.189889, 31.054993],\n              [105.174771, 31.045967],\n              [105.194704, 30.992042],\n              [105.193808, 30.964698],\n              [105.177346, 30.960181],\n              [105.208815, 30.906207],\n              [105.194256, 30.897003],\n              [105.200192, 30.886154],\n              [105.228636, 30.877359],\n              [105.232332, 30.846283],\n              [105.260441, 30.822845],\n              [105.271976, 30.751428],\n              [105.248682, 30.739164],\n              [105.243979, 30.726074],\n              [105.215198, 30.734718],\n              [105.168723, 30.706395],\n              [105.174547, 30.697666],\n              [105.161108, 30.672545],\n              [105.146998, 30.669168],\n              [105.142742, 30.653185],\n              [105.153829, 30.640249],\n              [105.130088, 30.624756],\n              [105.117657, 30.602913],\n              [105.094812, 30.584198],\n              [105.079021, 30.543129],\n              [105.066927, 30.53587]\n            ]\n          ],\n          [\n            [\n              [105.093916, 30.395616],\n              [105.094364, 30.396277],\n              [105.094364, 30.396277],\n              [105.093804, 30.395864],\n              [105.093916, 30.395616]\n            ]\n          ],\n          [\n            [\n              [105.075102, 30.442115],\n              [105.075214, 30.44228],\n              [105.073646, 30.442115],\n              [105.073758, 30.44195],\n              [105.074206, 30.441785],\n              [105.074766, 30.44195],\n              [105.075102, 30.442115]\n            ]\n          ],\n          [\n            [\n              [105.198176, 30.311813],\n              [105.198064, 30.311813],\n              [105.197056, 30.310738],\n              [105.19784, 30.309994],\n              [105.198176, 30.311813]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511000,\n        \"name\": \"内江市\",\n        \"center\": [105.066138, 29.58708],\n        \"centroid\": [104.913978, 29.638381],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 8,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.467234, 30.034689],\n              [104.455363, 30.000606],\n              [104.479217, 29.98891],\n              [104.461859, 29.950579],\n              [104.481792, 29.942363],\n              [104.473281, 29.93481],\n              [104.488512, 29.92153],\n              [104.490079, 29.904761],\n              [104.503294, 29.897454],\n              [104.483584, 29.854104],\n              [104.483248, 29.852194],\n              [104.477425, 29.811317],\n              [104.50307, 29.807411],\n              [104.486608, 29.786965],\n              [104.470146, 29.785386],\n              [104.457155, 29.748223],\n              [104.442373, 29.733837],\n              [104.41572, 29.732257],\n              [104.39769, 29.74839],\n              [104.372157, 29.734586],\n              [104.360286, 29.737746],\n              [104.336769, 29.722276],\n              [104.350319, 29.70173],\n              [104.321314, 29.709966],\n              [104.3081, 29.695075],\n              [104.269576, 29.632491],\n              [104.280551, 29.613925],\n              [104.309332, 29.607347],\n              [104.334193, 29.583113],\n              [104.340688, 29.565704],\n              [104.383579, 29.584196],\n              [104.381787, 29.607264],\n              [104.39489, 29.621002],\n              [104.421767, 29.616423],\n              [104.442933, 29.600102],\n              [104.474065, 29.609262],\n              [104.488847, 29.601435],\n              [104.493551, 29.582613],\n              [104.482912, 29.562872],\n              [104.501726, 29.549958],\n              [104.529611, 29.518876],\n              [104.53465, 29.456601],\n              [104.510013, 29.456767],\n              [104.535658, 29.418566],\n              [104.543945, 29.441005],\n              [104.558728, 29.431913],\n              [104.569814, 29.441172],\n              [104.587956, 29.422987],\n              [104.619761, 29.444758],\n              [104.652461, 29.411141],\n              [104.673403, 29.398709],\n              [104.674299, 29.38227],\n              [104.704423, 29.372255],\n              [104.710919, 29.361404],\n              [104.745411, 29.36324],\n              [104.738132, 29.381936],\n              [104.759969, 29.374759],\n              [104.766128, 29.406469],\n              [104.751458, 29.402631],\n              [104.741155, 29.432414],\n              [104.750786, 29.453598],\n              [104.777327, 29.448177],\n              [104.786398, 29.457518],\n              [104.808796, 29.457018],\n              [104.833657, 29.430495],\n              [104.848775, 29.467858],\n              [104.873972, 29.47086],\n              [104.871957, 29.459019],\n              [104.917647, 29.434332],\n              [104.937133, 29.445425],\n              [104.961882, 29.416647],\n              [104.993127, 29.438669],\n              [105.026947, 29.439587],\n              [105.020564, 29.454432],\n              [105.04061, 29.461938],\n              [105.030643, 29.472527],\n              [105.044305, 29.480865],\n              [105.067823, 29.454349],\n              [105.063119, 29.442923],\n              [105.084285, 29.42232],\n              [105.079469, 29.406886],\n              [105.046881, 29.408721],\n              [105.035346, 29.382937],\n              [105.063679, 29.364659],\n              [105.072526, 29.336359],\n              [105.108922, 29.315568],\n              [105.120121, 29.302205],\n              [105.113961, 29.284999],\n              [105.134903, 29.257429],\n              [105.160548, 29.262776],\n              [105.203999, 29.23963],\n              [105.195488, 29.222078],\n              [105.217998, 29.20561],\n              [105.23558, 29.215475],\n              [105.266936, 29.188638],\n              [105.281495, 29.188471],\n              [105.287542, 29.218233],\n              [105.318226, 29.263612],\n              [105.339392, 29.281741],\n              [105.364141, 29.291932],\n              [105.364141, 29.292934],\n              [105.364813, 29.293519],\n              [105.365149, 29.292684],\n              [105.366493, 29.287839],\n              [105.368957, 29.287839],\n              [105.368845, 29.286586],\n              [105.368621, 29.285918],\n              [105.383403, 29.281991],\n              [105.386203, 29.284832],\n              [105.387771, 29.287254],\n              [105.387659, 29.287588],\n              [105.387883, 29.287588],\n              [105.389002, 29.286502],\n              [105.395274, 29.308553],\n              [105.420135, 29.314399],\n              [105.418567, 29.352305],\n              [105.437045, 29.364743],\n              [105.432006, 29.378848],\n              [105.443092, 29.399126],\n              [105.427302, 29.4189],\n              [105.372988, 29.420902],\n              [105.399193, 29.439003],\n              [105.387995, 29.455099],\n              [105.362014, 29.454683],\n              [105.360446, 29.444258],\n              [105.324498, 29.448594],\n              [105.337824, 29.458852],\n              [105.32125, 29.476029],\n              [105.318898, 29.512375],\n              [105.294373, 29.53396],\n              [105.289782, 29.552624],\n              [105.296725, 29.571202],\n              [105.317667, 29.578115],\n              [105.311283, 29.593357],\n              [105.322258, 29.610095],\n              [105.335473, 29.595189],\n              [105.346783, 29.620253],\n              [105.380827, 29.628246],\n              [105.37758, 29.643313],\n              [105.393146, 29.650721],\n              [105.389674, 29.67652],\n              [105.400537, 29.671611],\n              [105.423943, 29.687587],\n              [105.416775, 29.721112],\n              [105.393482, 29.747226],\n              [105.405017, 29.78896],\n              [105.383179, 29.796856],\n              [105.373548, 29.824612],\n              [105.360446, 29.83425],\n              [105.35395, 29.811566],\n              [105.332225, 29.81115],\n              [105.319122, 29.821953],\n              [105.297733, 29.82054],\n              [105.288662, 29.798269],\n              [105.252714, 29.796025],\n              [105.233564, 29.804087],\n              [105.238491, 29.817549],\n              [105.217326, 29.8448],\n              [105.175554, 29.846711],\n              [105.125608, 29.830677],\n              [105.0947, 29.848954],\n              [105.080589, 29.88284],\n              [105.100747, 29.885498],\n              [105.097051, 29.904927],\n              [105.064015, 29.922526],\n              [105.074654, 29.944023],\n              [105.049345, 29.947508],\n              [105.0209, 29.976798],\n              [104.993687, 29.977047],\n              [104.976441, 29.993223],\n              [104.95158, 29.99256],\n              [104.932766, 29.977296],\n              [104.924367, 29.946844],\n              [104.903649, 29.941367],\n              [104.927166, 29.936221],\n              [104.902417, 29.907168],\n              [104.905441, 29.904678],\n              [104.905217, 29.900692],\n              [104.899505, 29.902353],\n              [104.8789, 29.912897],\n              [104.863333, 29.890895],\n              [104.828057, 29.885498],\n              [104.839144, 29.866812],\n              [104.805436, 29.8752],\n              [104.793341, 29.866895],\n              [104.809132, 29.853024],\n              [104.791997, 29.849037],\n              [104.780575, 29.861413],\n              [104.798493, 29.880183],\n              [104.748322, 29.909244],\n              [104.743619, 29.933233],\n              [104.730628, 29.948504],\n              [104.691769, 29.954645],\n              [104.685049, 29.964436],\n              [104.672955, 29.944189],\n              [104.709127, 29.933233],\n              [104.689865, 29.920036],\n              [104.687289, 29.90227],\n              [104.673739, 29.905674],\n              [104.64395, 29.957383],\n              [104.631184, 29.940952],\n              [104.60677, 29.932901],\n              [104.592548, 29.950164],\n              [104.577989, 29.951076],\n              [104.568471, 29.995546],\n              [104.546297, 30.008485],\n              [104.533195, 29.999278],\n              [104.5239, 30.027227],\n              [104.498142, 30.035933],\n              [104.499486, 30.022666],\n              [104.468578, 30.026563],\n              [104.467234, 30.034689]\n            ]\n          ],\n          [\n            [\n              [105.387883, 29.287588],\n              [105.387659, 29.287588],\n              [105.387771, 29.287254],\n              [105.386203, 29.284832],\n              [105.389002, 29.286502],\n              [105.387883, 29.287588]\n            ]\n          ],\n          [\n            [\n              [105.364813, 29.293519],\n              [105.364141, 29.292934],\n              [105.364141, 29.291932],\n              [105.365149, 29.292684],\n              [105.364813, 29.293519]\n            ]\n          ],\n          [\n            [\n              [105.368957, 29.287839],\n              [105.366493, 29.287839],\n              [105.368621, 29.285918],\n              [105.368845, 29.286586],\n              [105.368957, 29.287839]\n            ]\n          ],\n          [\n            [\n              [104.905441, 29.904678],\n              [104.902417, 29.907168],\n              [104.899505, 29.902353],\n              [104.905217, 29.900692],\n              [104.905441, 29.904678]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511100,\n        \"name\": \"乐山市\",\n        \"center\": [103.761263, 29.582024],\n        \"centroid\": [103.571823, 29.214311],\n        \"childrenNum\": 11,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 9,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.17685, 29.195745],\n              [104.150645, 29.194157],\n              [104.150981, 29.22726],\n              [104.14359, 29.256844],\n              [104.118393, 29.236454],\n              [104.109658, 29.241886],\n              [104.116377, 29.263946],\n              [104.14639, 29.283829],\n              [104.139447, 29.307467],\n              [104.09174, 29.315317],\n              [104.07651, 29.323584],\n              [104.083229, 29.348298],\n              [104.105626, 29.338864],\n              [104.135415, 29.338781],\n              [104.142022, 29.355644],\n              [104.163412, 29.364158],\n              [104.160836, 29.379933],\n              [104.141126, 29.374508],\n              [104.134967, 29.399043],\n              [104.133175, 29.39946],\n              [104.132503, 29.399627],\n              [104.131272, 29.400378],\n              [104.100811, 29.382186],\n              [104.090172, 29.391616],\n              [104.0923, 29.416397],\n              [104.105962, 29.414895],\n              [104.098347, 29.437168],\n              [104.058256, 29.425907],\n              [104.052656, 29.456684],\n              [104.064191, 29.472361],\n              [104.08838, 29.461687],\n              [104.128472, 29.498289],\n              [104.14919, 29.472277],\n              [104.150309, 29.472027],\n              [104.166324, 29.495955],\n              [104.165988, 29.496538],\n              [104.151093, 29.52221],\n              [104.135079, 29.52096],\n              [104.160948, 29.541876],\n              [104.166884, 29.55729],\n              [104.139895, 29.589693],\n              [104.16722, 29.597854],\n              [104.182226, 29.633407],\n              [104.212239, 29.61251],\n              [104.251098, 29.623084],\n              [104.249754, 29.636154],\n              [104.240347, 29.64323],\n              [104.228477, 29.676187],\n              [104.203727, 29.665702],\n              [104.187489, 29.686339],\n              [104.191297, 29.705058],\n              [104.157477, 29.716371],\n              [104.152885, 29.707304],\n              [104.12612, 29.717452],\n              [104.116937, 29.733421],\n              [104.089388, 29.743733],\n              [104.062623, 29.777821],\n              [104.088716, 29.813643],\n              [104.069231, 29.828517],\n              [104.043809, 29.830677],\n              [104.05624, 29.84696],\n              [104.050081, 29.868473],\n              [104.003606, 29.869968],\n              [103.982888, 29.8502],\n              [103.967658, 29.85643],\n              [103.951084, 29.841727],\n              [103.962395, 29.827603],\n              [103.927678, 29.825526],\n              [103.934622, 29.804668],\n              [103.903265, 29.783391],\n              [103.912784, 29.775826],\n              [103.893522, 29.742486],\n              [103.85623, 29.746976],\n              [103.842344, 29.731093],\n              [103.822522, 29.73076],\n              [103.799229, 29.714042],\n              [103.765073, 29.706555],\n              [103.755442, 29.720197],\n              [103.7317, 29.721944],\n              [103.704711, 29.714375],\n              [103.705607, 29.737247],\n              [103.688025, 29.759365],\n              [103.703368, 29.771587],\n              [103.747267, 29.789957],\n              [103.741107, 29.811067],\n              [103.728789, 29.816053],\n              [103.729125, 29.849286],\n              [103.692729, 29.898866],\n              [103.676715, 29.90393],\n              [103.677834, 29.919621],\n              [103.648158, 29.92817],\n              [103.64211, 29.91796],\n              [103.607954, 29.909244],\n              [103.590484, 29.91904],\n              [103.590484, 29.902021],\n              [103.571782, 29.895462],\n              [103.584661, 29.880847],\n              [103.558008, 29.868058],\n              [103.513885, 29.87902],\n              [103.533595, 29.860666],\n              [103.533371, 29.84156],\n              [103.518028, 29.843388],\n              [103.485776, 29.814807],\n              [103.464386, 29.82162],\n              [103.432918, 29.820623],\n              [103.430566, 29.787879],\n              [103.439413, 29.770922],\n              [103.416904, 29.774829],\n              [103.394058, 29.805416],\n              [103.38062, 29.792617],\n              [103.359118, 29.799516],\n              [103.333473, 29.794196],\n              [103.315667, 29.771753],\n              [103.315779, 29.741488],\n              [103.299429, 29.727516],\n              [103.304356, 29.706389],\n              [103.295957, 29.694409],\n              [103.303684, 29.677935],\n              [103.321826, 29.683094],\n              [103.337057, 29.672776],\n              [103.352959, 29.698735],\n              [103.361694, 29.661791],\n              [103.337281, 29.651803],\n              [103.338737, 29.63424],\n              [103.298869, 29.599853],\n              [103.267848, 29.596105],\n              [103.2702, 29.573701],\n              [103.256426, 29.55679],\n              [103.27132, 29.53221],\n              [103.259673, 29.511375],\n              [103.294166, 29.506874],\n              [103.277703, 29.485617],\n              [103.258889, 29.478447],\n              [103.204464, 29.483867],\n              [103.186434, 29.474278],\n              [103.18005, 29.430161],\n              [103.157541, 29.425573],\n              [103.126968, 29.440421],\n              [103.090012, 29.425573],\n              [103.054736, 29.446009],\n              [103.014869, 29.448011],\n              [102.983512, 29.418483],\n              [102.975449, 29.397791],\n              [102.998519, 29.368332],\n              [102.980377, 29.340367],\n              [102.979817, 29.320578],\n              [103.003894, 29.287171],\n              [103.031779, 29.27982],\n              [103.02002, 29.250744],\n              [102.962795, 29.250828],\n              [102.974553, 29.222162],\n              [102.944877, 29.19006],\n              [102.928639, 29.127332],\n              [102.931326, 29.112941],\n              [102.970074, 29.065068],\n              [102.957755, 29.052008],\n              [102.922143, 29.037941],\n              [102.909041, 29.021612],\n              [102.913632, 28.999918],\n              [102.942413, 28.944115],\n              [102.946221, 28.920058],\n              [102.928079, 28.896415],\n              [102.941741, 28.860521],\n              [102.926287, 28.820168],\n              [102.925279, 28.801873],\n              [102.944205, 28.76645],\n              [102.938157, 28.740001],\n              [102.962571, 28.681118],\n              [102.990904, 28.672379],\n              [102.996503, 28.679941],\n              [103.032451, 28.665824],\n              [103.051265, 28.66969],\n              [103.066047, 28.688511],\n              [103.070527, 28.73681],\n              [103.107482, 28.771907],\n              [103.112522, 28.812364],\n              [103.153957, 28.82923],\n              [103.189905, 28.827887],\n              [103.225069, 28.803971],\n              [103.23862, 28.813538],\n              [103.270984, 28.805986],\n              [103.3085, 28.761749],\n              [103.334817, 28.743108],\n              [103.333585, 28.721861],\n              [103.31074, 28.702037],\n              [103.30626, 28.681958],\n              [103.287334, 28.655319],\n              [103.272776, 28.613121],\n              [103.242875, 28.59336],\n              [103.246571, 28.549791],\n              [103.253962, 28.541209],\n              [103.287782, 28.533048],\n              [103.299541, 28.521604],\n              [103.313875, 28.485581],\n              [103.339968, 28.443483],\n              [103.35699, 28.440872],\n              [103.370205, 28.423354],\n              [103.388347, 28.420659],\n              [103.43303, 28.452915],\n              [103.441541, 28.477331],\n              [103.438629, 28.500059],\n              [103.421831, 28.511506],\n              [103.42967, 28.531786],\n              [103.479057, 28.547099],\n              [103.504142, 28.560306],\n              [103.531803, 28.597649],\n              [103.530571, 28.612196],\n              [103.560696, 28.606899],\n              [103.585893, 28.614886],\n              [103.61389, 28.597313],\n              [103.614562, 28.613373],\n              [103.636623, 28.624134],\n              [103.685674, 28.63481],\n              [103.722853, 28.687923],\n              [103.724869, 28.717577],\n              [103.71591, 28.73849],\n              [103.7018, 28.746719],\n              [103.712775, 28.757299],\n              [103.746483, 28.764016],\n              [103.76944, 28.799355],\n              [103.761041, 28.815888],\n              [103.788478, 28.822433],\n              [103.803708, 28.83611],\n              [103.830473, 28.845338],\n              [103.851079, 28.832166],\n              [103.914912, 28.776273],\n              [103.938317, 28.764268],\n              [103.956459, 28.787521],\n              [103.979977, 28.792137],\n              [104.003494, 28.853475],\n              [104.024996, 28.84408],\n              [104.034402, 28.855908],\n              [104.030483, 28.884843],\n              [104.084685, 28.914441],\n              [104.076174, 28.920897],\n              [104.061839, 28.965401],\n              [104.072478, 28.967496],\n              [104.107082, 28.95082],\n              [104.122985, 28.963976],\n              [104.121641, 28.998243],\n              [104.139671, 29.024543],\n              [104.142358, 29.070593],\n              [104.161732, 29.117041],\n              [104.175395, 29.129591],\n              [104.167891, 29.15042],\n              [104.194097, 29.163719],\n              [104.174835, 29.183789],\n              [104.17685, 29.195745]\n            ]\n          ],\n          [\n            [\n              [104.131272, 29.400378],\n              [104.132503, 29.399627],\n              [104.133175, 29.39946],\n              [104.134967, 29.399043],\n              [104.131272, 29.400378]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511300,\n        \"name\": \"南充市\",\n        \"center\": [106.082974, 30.795281],\n        \"centroid\": [106.207711, 31.195136],\n        \"childrenNum\": 9,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 10,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [106.964778, 31.250802],\n              [106.947532, 31.263656],\n              [106.94574, 31.264802],\n              [106.964442, 31.291077],\n              [106.944172, 31.288949],\n              [106.934317, 31.309081],\n              [106.946748, 31.328963],\n              [106.917855, 31.377464],\n              [106.864549, 31.400683],\n              [106.883251, 31.420873],\n              [106.871268, 31.426512],\n              [106.846071, 31.456909],\n              [106.842151, 31.503139],\n              [106.815498, 31.515142],\n              [106.821098, 31.547877],\n              [106.787166, 31.531307],\n              [106.766224, 31.537592],\n              [106.7688, 31.5673],\n              [106.722101, 31.563383],\n              [106.718965, 31.571952],\n              [106.693656, 31.56118],\n              [106.673386, 31.569177],\n              [106.647517, 31.591125],\n              [106.632175, 31.567056],\n              [106.644942, 31.544694],\n              [106.626464, 31.510814],\n              [106.607874, 31.50665],\n              [106.566886, 31.518244],\n              [106.566438, 31.545755],\n              [106.536986, 31.572033],\n              [106.516604, 31.575052],\n              [106.492079, 31.567382],\n              [106.484016, 31.584517],\n              [106.460722, 31.586312],\n              [106.456803, 31.633049],\n              [106.438661, 31.655715],\n              [106.412568, 31.65702],\n              [106.400025, 31.681229],\n              [106.366429, 31.696632],\n              [106.382667, 31.720423],\n              [106.378747, 31.732969],\n              [106.405288, 31.725637],\n              [106.40764, 31.755204],\n              [106.42455, 31.755448],\n              [106.406632, 31.777026],\n              [106.39577, 31.805681],\n              [106.384235, 31.801693],\n              [106.361277, 31.846287],\n              [106.33552, 31.848484],\n              [106.327345, 31.829689],\n              [106.310435, 31.825539],\n              [106.292293, 31.80739],\n              [106.270456, 31.810972],\n              [106.275271, 31.79689],\n              [106.262057, 31.773851],\n              [106.24817, 31.7824],\n              [106.211326, 31.770757],\n              [106.194528, 31.785901],\n              [106.199232, 31.818622],\n              [106.188481, 31.821796],\n              [106.153765, 31.806576],\n              [106.138646, 31.811297],\n              [106.130359, 31.829282],\n              [106.110538, 31.790785],\n              [106.12364, 31.792006],\n              [106.128568, 31.767174],\n              [106.111993, 31.758543],\n              [106.10225, 31.73248],\n              [106.068318, 31.708447],\n              [106.078061, 31.697202],\n              [106.048385, 31.698098],\n              [106.032482, 31.687586],\n              [106.007173, 31.684734],\n              [105.977496, 31.662482],\n              [105.958235, 31.672426],\n              [105.925086, 31.664764],\n              [105.929902, 31.649193],\n              [105.910528, 31.625791],\n              [105.881635, 31.648052],\n              [105.885779, 31.630521],\n              [105.865285, 31.614781],\n              [105.845799, 31.632559],\n              [105.838072, 31.65115],\n              [105.847143, 31.667047],\n              [105.817914, 31.66778],\n              [105.816011, 31.677643],\n              [105.780735, 31.712684],\n              [105.76864, 31.735412],\n              [105.749378, 31.718794],\n              [105.726085, 31.726615],\n              [105.723845, 31.663623],\n              [105.69932, 31.649845],\n              [105.684649, 31.608908],\n              [105.657884, 31.601975],\n              [105.653517, 31.61372],\n              [105.633247, 31.60067],\n              [105.639518, 31.587617],\n              [105.622496, 31.58419],\n              [105.618353, 31.55359],\n              [105.60805, 31.551631],\n              [105.599203, 31.581009],\n              [105.579493, 31.565668],\n              [105.53537, 31.564771],\n              [105.529771, 31.574644],\n              [105.498414, 31.574155],\n              [105.493711, 31.551468],\n              [105.494047, 31.551631],\n              [105.495055, 31.550652],\n              [105.494719, 31.550326],\n              [105.459219, 31.52698],\n              [105.462802, 31.498974],\n              [105.441973, 31.480517],\n              [105.458211, 31.474717],\n              [105.471313, 31.485826],\n              [105.501662, 31.454866],\n              [105.486992, 31.443918],\n              [105.481168, 31.424224],\n              [105.49875, 31.402482],\n              [105.524059, 31.391364],\n              [105.533018, 31.401582],\n              [105.551048, 31.392753],\n              [105.56863, 31.403136],\n              [105.57255, 31.382043],\n              [105.591252, 31.39725],\n              [105.612193, 31.39635],\n              [105.620928, 31.406651],\n              [105.641646, 31.394797],\n              [105.64243, 31.371168],\n              [105.629775, 31.345896],\n              [105.606482, 31.339598],\n              [105.609058, 31.325527],\n              [105.594163, 31.299834],\n              [105.599091, 31.288704],\n              [105.616673, 31.295579],\n              [105.637615, 31.283548],\n              [105.647805, 31.257598],\n              [105.674682, 31.249492],\n              [105.674346, 31.171757],\n              [105.707047, 31.169216],\n              [105.721381, 31.150366],\n              [105.716678, 31.130365],\n              [105.726197, 31.110769],\n              [105.712198, 31.09691],\n              [105.721717, 31.084197],\n              [105.708727, 31.071237],\n              [105.714102, 31.039321],\n              [105.686665, 31.016341],\n              [105.663372, 31.01749],\n              [105.65822, 30.999923],\n              [105.633807, 31.003289],\n              [105.613873, 30.991303],\n              [105.618689, 30.977591],\n              [105.643438, 30.948025],\n              [105.6599, 30.942275],\n              [105.65934, 30.918697],\n              [105.691705, 30.933896],\n              [105.705927, 30.910152],\n              [105.73202, 30.905714],\n              [105.744899, 30.879086],\n              [105.730564, 30.876784],\n              [105.755761, 30.841267],\n              [105.784318, 30.823832],\n              [105.796749, 30.800883],\n              [105.782302, 30.785086],\n              [105.792941, 30.759906],\n              [105.792717, 30.711418],\n              [105.813771, 30.651372],\n              [105.809067, 30.625333],\n              [105.82329, 30.621953],\n              [105.82385, 30.602995],\n              [105.85431, 30.565728],\n              [105.871332, 30.562182],\n              [105.877492, 30.547419],\n              [105.862821, 30.51244],\n              [105.846807, 30.491645],\n              [105.860246, 30.48496],\n              [105.867413, 30.497092],\n              [105.884099, 30.496266],\n              [105.885331, 30.458875],\n              [105.917807, 30.466966],\n              [105.916351, 30.469442],\n              [105.910528, 30.480668],\n              [105.917023, 30.490407],\n              [105.923966, 30.49313],\n              [105.927102, 30.494038],\n              [105.915791, 30.508974],\n              [105.934045, 30.516731],\n              [105.945692, 30.501383],\n              [105.954203, 30.514255],\n              [105.970665, 30.477119],\n              [105.980856, 30.488344],\n              [106.024755, 30.482071],\n              [106.028003, 30.505261],\n              [106.039426, 30.518216],\n              [106.066638, 30.491727],\n              [106.093851, 30.504189],\n              [106.112777, 30.503198],\n              [106.123192, 30.544449],\n              [106.157796, 30.598049],\n              [106.180194, 30.595658],\n              [106.192176, 30.612969],\n              [106.178962, 30.620058],\n              [106.166643, 30.648324],\n              [106.217822, 30.677652],\n              [106.225773, 30.695196],\n              [106.237531, 30.687454],\n              [106.238091, 30.706807],\n              [106.217486, 30.704666],\n              [106.207631, 30.722863],\n              [106.250746, 30.719323],\n              [106.286806, 30.70516],\n              [106.300468, 30.686218],\n              [106.354558, 30.722122],\n              [106.366877, 30.712736],\n              [106.364301, 30.697337],\n              [106.38905, 30.679876],\n              [106.403609, 30.695525],\n              [106.423094, 30.693219],\n              [106.420855, 30.708207],\n              [106.441124, 30.727144],\n              [106.448068, 30.753321],\n              [106.466546, 30.760893],\n              [106.487599, 30.787966],\n              [106.507757, 30.784511],\n              [106.506301, 30.762869],\n              [106.528923, 30.732496],\n              [106.542809, 30.743033],\n              [106.587604, 30.73974],\n              [106.584244, 30.756861],\n              [106.618401, 30.766572],\n              [106.626464, 30.789365],\n              [106.616497, 30.801705],\n              [106.617281, 30.82778],\n              [106.629599, 30.821036],\n              [106.675178, 30.838882],\n              [106.675514, 30.867084],\n              [106.689177, 30.883606],\n              [106.666443, 30.909987],\n              [106.678986, 30.922887],\n              [106.707207, 30.915903],\n              [106.723221, 30.946629],\n              [106.740467, 30.951147],\n              [106.73162, 30.973649],\n              [106.771487, 30.96864],\n              [106.784814, 30.972336],\n              [106.78739, 30.995901],\n              [106.803292, 30.993684],\n              [106.819754, 31.011662],\n              [106.830505, 31.05286],\n              [106.86914, 31.081163],\n              [106.894786, 31.08756],\n              [106.909008, 31.107653],\n              [106.935325, 31.116591],\n              [106.931965, 31.133726],\n              [106.951003, 31.161267],\n              [106.938349, 31.1761],\n              [106.939917, 31.207151],\n              [106.958282, 31.228283],\n              [106.964778, 31.250802]\n            ]\n          ],\n          [\n            [\n              [105.927102, 30.494038],\n              [105.923966, 30.49313],\n              [105.917023, 30.490407],\n              [105.910528, 30.480668],\n              [105.916351, 30.469442],\n              [105.917807, 30.466966],\n              [105.948828, 30.494368],\n              [105.927102, 30.494038]\n            ]\n          ],\n          [\n            [\n              [105.494047, 31.551631],\n              [105.493711, 31.551468],\n              [105.494719, 31.550326],\n              [105.495055, 31.550652],\n              [105.494047, 31.551631]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511400,\n        \"name\": \"眉山市\",\n        \"center\": [103.831788, 30.048318],\n        \"centroid\": [103.754827, 29.924767],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 11,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [102.975449, 29.397791],\n              [102.983512, 29.418483],\n              [103.014869, 29.448011],\n              [103.054736, 29.446009],\n              [103.090012, 29.425573],\n              [103.126968, 29.440421],\n              [103.157541, 29.425573],\n              [103.18005, 29.430161],\n              [103.186434, 29.474278],\n              [103.204464, 29.483867],\n              [103.258889, 29.478447],\n              [103.277703, 29.485617],\n              [103.294166, 29.506874],\n              [103.259673, 29.511375],\n              [103.27132, 29.53221],\n              [103.256426, 29.55679],\n              [103.2702, 29.573701],\n              [103.267848, 29.596105],\n              [103.298869, 29.599853],\n              [103.338737, 29.63424],\n              [103.337281, 29.651803],\n              [103.361694, 29.661791],\n              [103.352959, 29.698735],\n              [103.337057, 29.672776],\n              [103.321826, 29.683094],\n              [103.303684, 29.677935],\n              [103.295957, 29.694409],\n              [103.304356, 29.706389],\n              [103.299429, 29.727516],\n              [103.315779, 29.741488],\n              [103.315667, 29.771753],\n              [103.333473, 29.794196],\n              [103.359118, 29.799516],\n              [103.38062, 29.792617],\n              [103.394058, 29.805416],\n              [103.416904, 29.774829],\n              [103.439413, 29.770922],\n              [103.430566, 29.787879],\n              [103.432918, 29.820623],\n              [103.464386, 29.82162],\n              [103.485776, 29.814807],\n              [103.518028, 29.843388],\n              [103.517916, 29.8502],\n              [103.517021, 29.85834],\n              [103.533595, 29.860666],\n              [103.513885, 29.87902],\n              [103.558008, 29.868058],\n              [103.584661, 29.880847],\n              [103.571782, 29.895462],\n              [103.590484, 29.902021],\n              [103.590484, 29.91904],\n              [103.607954, 29.909244],\n              [103.64211, 29.91796],\n              [103.648158, 29.92817],\n              [103.677834, 29.919621],\n              [103.676715, 29.90393],\n              [103.692729, 29.898866],\n              [103.729125, 29.849286],\n              [103.728789, 29.816053],\n              [103.741107, 29.811067],\n              [103.747267, 29.789957],\n              [103.703368, 29.771587],\n              [103.688025, 29.759365],\n              [103.705607, 29.737247],\n              [103.704711, 29.714375],\n              [103.7317, 29.721944],\n              [103.755442, 29.720197],\n              [103.765073, 29.706555],\n              [103.799229, 29.714042],\n              [103.822522, 29.73076],\n              [103.842344, 29.731093],\n              [103.85623, 29.746976],\n              [103.893522, 29.742486],\n              [103.912784, 29.775826],\n              [103.903265, 29.783391],\n              [103.934622, 29.804668],\n              [103.927678, 29.825526],\n              [103.962395, 29.827603],\n              [103.951084, 29.841727],\n              [103.967658, 29.85643],\n              [103.982888, 29.8502],\n              [104.003606, 29.869968],\n              [104.050081, 29.868473],\n              [104.05624, 29.84696],\n              [104.043809, 29.830677],\n              [104.069231, 29.828517],\n              [104.088716, 29.813643],\n              [104.062623, 29.777821],\n              [104.089388, 29.743733],\n              [104.116937, 29.733421],\n              [104.12612, 29.717452],\n              [104.152885, 29.707304],\n              [104.157477, 29.716371],\n              [104.191297, 29.705058],\n              [104.187489, 29.686339],\n              [104.203727, 29.665702],\n              [104.228477, 29.676187],\n              [104.240347, 29.64323],\n              [104.249754, 29.636154],\n              [104.269576, 29.632491],\n              [104.3081, 29.695075],\n              [104.321314, 29.709966],\n              [104.350319, 29.70173],\n              [104.336769, 29.722276],\n              [104.360286, 29.737746],\n              [104.372157, 29.734586],\n              [104.39769, 29.74839],\n              [104.41572, 29.732257],\n              [104.442373, 29.733837],\n              [104.457155, 29.748223],\n              [104.470146, 29.785386],\n              [104.486608, 29.786965],\n              [104.50307, 29.807411],\n              [104.477425, 29.811317],\n              [104.483248, 29.852194],\n              [104.482688, 29.852609],\n              [104.483136, 29.854104],\n              [104.483584, 29.854104],\n              [104.503294, 29.897454],\n              [104.490079, 29.904761],\n              [104.488512, 29.92153],\n              [104.473281, 29.93481],\n              [104.481792, 29.942363],\n              [104.461859, 29.950579],\n              [104.479217, 29.98891],\n              [104.455363, 30.000606],\n              [104.467234, 30.034689],\n              [104.464322, 30.049944],\n              [104.479888, 30.047374],\n              [104.467234, 30.066937],\n              [104.481904, 30.086663],\n              [104.461411, 30.086663],\n              [104.450212, 30.101081],\n              [104.428374, 30.089729],\n              [104.41012, 30.125521],\n              [104.39881, 30.124776],\n              [104.386379, 30.161798],\n              [104.358158, 30.173638],\n              [104.364541, 30.185974],\n              [104.327138, 30.204269],\n              [104.315379, 30.200792],\n              [104.282231, 30.220904],\n              [104.2726, 30.217842],\n              [104.264537, 30.241592],\n              [104.243259, 30.244239],\n              [104.23094, 30.256153],\n              [104.243371, 30.267403],\n              [104.231836, 30.280472],\n              [104.2315, 30.282209],\n              [104.232284, 30.313798],\n              [104.2016, 30.316526],\n              [104.192977, 30.329836],\n              [104.17853, 30.318262],\n              [104.174051, 30.298666],\n              [104.152213, 30.265335],\n              [104.150533, 30.245646],\n              [104.116601, 30.227194],\n              [104.091628, 30.24879],\n              [104.047393, 30.270381],\n              [104.030035, 30.266245],\n              [104.030035, 30.266245],\n              [103.998343, 30.264508],\n              [103.974713, 30.290727],\n              [103.965866, 30.316774],\n              [103.959819, 30.311565],\n              [103.954331, 30.313302],\n              [103.959259, 30.320742],\n              [103.93563, 30.346203],\n              [103.942237, 30.357773],\n              [103.913904, 30.353972],\n              [103.910432, 30.330663],\n              [103.887699, 30.328761],\n              [103.87426, 30.348104],\n              [103.845368, 30.34331],\n              [103.794749, 30.345872],\n              [103.769776, 30.332068],\n              [103.75141, 30.307927],\n              [103.727893, 30.30462],\n              [103.736516, 30.285848],\n              [103.718374, 30.283201],\n              [103.705271, 30.268975],\n              [103.681754, 30.269885],\n              [103.693065, 30.245894],\n              [103.648046, 30.229263],\n              [103.649502, 30.199799],\n              [103.628, 30.214863],\n              [103.617473, 30.195412],\n              [103.597204, 30.203524],\n              [103.533819, 30.178109],\n              [103.544233, 30.161218],\n              [103.533819, 30.146643],\n              [103.504142, 30.128503],\n              [103.486224, 30.104147],\n              [103.474577, 30.131237],\n              [103.450948, 30.132231],\n              [103.468082, 30.114255],\n              [103.462483, 30.096027],\n              [103.4505, 30.096524],\n              [103.443893, 30.117486],\n              [103.439637, 30.119474],\n              [103.395178, 30.094866],\n              [103.37838, 30.095944],\n              [103.372221, 30.082105],\n              [103.349599, 30.097684],\n              [103.339856, 30.074729],\n              [103.312531, 30.071745],\n              [103.302341, 30.087574],\n              [103.252506, 30.040078],\n              [103.225965, 29.970659],\n              [103.191249, 29.966344],\n              [103.1964, 29.944355],\n              [103.176915, 29.945931],\n              [103.159781, 29.930162],\n              [103.109946, 29.915636],\n              [103.093708, 29.886992],\n              [103.125064, 29.864154],\n              [103.165156, 29.77034],\n              [103.143206, 29.760862],\n              [103.162916, 29.737829],\n              [103.143654, 29.730926],\n              [103.153845, 29.713293],\n              [103.141303, 29.703145],\n              [103.150038, 29.672443],\n              [103.1282, 29.671527],\n              [103.099083, 29.693827],\n              [103.092028, 29.683177],\n              [103.052497, 29.675522],\n              [103.044546, 29.700066],\n              [103.007702, 29.72552],\n              [102.996055, 29.708302],\n              [102.962011, 29.721944],\n              [102.928751, 29.711047],\n              [102.938493, 29.67677],\n              [102.929646, 29.668115],\n              [102.931998, 29.61634],\n              [102.914416, 29.553208],\n              [102.869957, 29.530044],\n              [102.823146, 29.46569],\n              [102.879364, 29.415896],\n              [102.93211, 29.400545],\n              [102.975449, 29.397791]\n            ]\n          ],\n          [\n            [\n              [103.533595, 29.860666],\n              [103.517021, 29.85834],\n              [103.517916, 29.8502],\n              [103.518028, 29.843388],\n              [103.533371, 29.84156],\n              [103.533595, 29.860666]\n            ]\n          ],\n          [\n            [\n              [103.959259, 30.320742],\n              [103.954331, 30.313302],\n              [103.959819, 30.311565],\n              [103.965866, 30.316774],\n              [103.959259, 30.320742]\n            ]\n          ],\n          [\n            [\n              [104.483584, 29.854104],\n              [104.483136, 29.854104],\n              [104.482688, 29.852609],\n              [104.483248, 29.852194],\n              [104.483584, 29.854104]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511500,\n        \"name\": \"宜宾市\",\n        \"center\": [104.630825, 28.760189],\n        \"centroid\": [104.637629, 28.572053],\n        \"childrenNum\": 10,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 12,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.781983, 28.524549],\n              [103.800685, 28.533805],\n              [103.801357, 28.561821],\n              [103.837305, 28.58453],\n              [103.834841, 28.622285],\n              [103.851079, 28.667085],\n              [103.8737, 28.652798],\n              [103.874708, 28.626488],\n              [103.896322, 28.619678],\n              [103.909984, 28.631196],\n              [103.936749, 28.622621],\n              [103.942461, 28.603031],\n              [104.0596, 28.627665],\n              [104.096108, 28.603451],\n              [104.125224, 28.637248],\n              [104.170355, 28.643048],\n              [104.192529, 28.633634],\n              [104.231052, 28.635819],\n              [104.241467, 28.660782],\n              [104.252666, 28.660698],\n              [104.269688, 28.635147],\n              [104.296341, 28.63439],\n              [104.314819, 28.615643],\n              [104.343936, 28.640947],\n              [104.37406, 28.649352],\n              [104.404857, 28.64061],\n              [104.425239, 28.62674],\n              [104.417288, 28.59807],\n              [104.387723, 28.59891],\n              [104.368461, 28.58596],\n              [104.356814, 28.55568],\n              [104.329601, 28.558624],\n              [104.319299, 28.538685],\n              [104.287046, 28.532543],\n              [104.261961, 28.536918],\n              [104.248298, 28.528336],\n              [104.248634, 28.509654],\n              [104.265433, 28.502753],\n              [104.261401, 28.482046],\n              [104.27036, 28.465881],\n              [104.258377, 28.453251],\n              [104.267672, 28.42049],\n              [104.254346, 28.40895],\n              [104.278423, 28.346594],\n              [104.301828, 28.32847],\n              [104.29007, 28.314727],\n              [104.313923, 28.306632],\n              [104.33856, 28.33083],\n              [104.35827, 28.338923],\n              [104.384811, 28.330156],\n              [104.392874, 28.291538],\n              [104.408217, 28.269862],\n              [104.449316, 28.269946],\n              [104.444053, 28.259233],\n              [104.462306, 28.2416],\n              [104.445956, 28.21426],\n              [104.402281, 28.202866],\n              [104.404409, 28.17712],\n              [104.434982, 28.168255],\n              [104.451668, 28.17408],\n              [104.444836, 28.138193],\n              [104.450996, 28.116317],\n              [104.399034, 28.087761],\n              [104.395338, 28.063847],\n              [104.376524, 28.052268],\n              [104.341472, 28.057846],\n              [104.304068, 28.050746],\n              [104.298805, 28.0439],\n              [104.326578, 28.025471],\n              [104.356142, 28.018453],\n              [104.378764, 27.993677],\n              [104.383467, 27.968727],\n              [104.401161, 27.952315],\n              [104.449652, 27.927609],\n              [104.47037, 27.905098],\n              [104.497694, 27.895787],\n              [104.503294, 27.881989],\n              [104.53745, 27.886983],\n              [104.558392, 27.86658],\n              [104.558952, 27.852186],\n              [104.580901, 27.842024],\n              [104.608002, 27.858198],\n              [104.633647, 27.850916],\n              [104.679114, 27.882243],\n              [104.743731, 27.902051],\n              [104.759633, 27.884867],\n              [104.795245, 27.900527],\n              [104.829513, 27.89985],\n              [104.872964, 27.905944],\n              [104.887971, 27.914492],\n              [104.891442, 27.933025],\n              [104.921119, 27.94174],\n              [104.903089, 27.960437],\n              [104.929182, 27.985051],\n              [104.9471, 27.980568],\n              [104.946876, 27.994861],\n              [104.974985, 28.019891],\n              [104.980808, 28.062832],\n              [105.011045, 28.06672],\n              [105.059199, 28.098154],\n              [105.076782, 28.084212],\n              [105.108138, 28.081086],\n              [105.144198, 28.066636],\n              [105.17701, 28.066889],\n              [105.204111, 28.073396],\n              [105.220237, 28.091901],\n              [105.224493, 28.099843],\n              [105.275335, 28.134392],\n              [105.350255, 28.140811],\n              [105.358094, 28.153478],\n              [105.344767, 28.185646],\n              [105.348463, 28.205314],\n              [105.333121, 28.256533],\n              [105.339168, 28.280236],\n              [105.331553, 28.292634],\n              [105.336928, 28.313378],\n              [105.310611, 28.339597],\n              [105.306692, 28.359321],\n              [105.287654, 28.369181],\n              [105.3077, 28.371541],\n              [105.32293, 28.386371],\n              [105.32013, 28.427987],\n              [105.293813, 28.435651],\n              [105.295269, 28.449041],\n              [105.2311, 28.449378],\n              [105.228748, 28.449631],\n              [105.191121, 28.445757],\n              [105.206687, 28.457041],\n              [105.234012, 28.49341],\n              [105.237483, 28.523455],\n              [105.226285, 28.540536],\n              [105.203439, 28.548192],\n              [105.207807, 28.569055],\n              [105.172083, 28.607908],\n              [105.167939, 28.65036],\n              [105.201312, 28.673555],\n              [105.21139, 28.696325],\n              [105.203887, 28.709514],\n              [105.219342, 28.715813],\n              [105.216878, 28.739078],\n              [105.204111, 28.746635],\n              [105.240507, 28.774846],\n              [105.2311, 28.777448],\n              [105.225725, 28.807748],\n              [105.21531, 28.818405],\n              [105.202879, 28.869748],\n              [105.203999, 28.896751],\n              [105.177682, 28.907148],\n              [105.166483, 28.9271],\n              [105.145094, 28.942271],\n              [105.126952, 28.945288],\n              [105.111162, 28.933722],\n              [105.073758, 28.936404],\n              [105.017316, 28.972104],\n              [105.00511, 28.989866],\n              [104.986296, 28.991541],\n              [104.969722, 29.015749],\n              [104.944636, 29.021277],\n              [104.941837, 29.058873],\n              [104.902529, 29.047738],\n              [104.881475, 29.050836],\n              [104.879684, 29.024291],\n              [104.861542, 29.019685],\n              [104.85751, 29.003436],\n              [104.819546, 29.001761],\n              [104.811931, 28.990704],\n              [104.796701, 29.000086],\n              [104.76512, 28.998746],\n              [104.744067, 28.990369],\n              [104.720214, 28.996651],\n              [104.705207, 29.045477],\n              [104.713718, 29.06105],\n              [104.737236, 29.078796],\n              [104.73018, 29.106498],\n              [104.714614, 29.122396],\n              [104.697816, 29.118212],\n              [104.680346, 29.15569],\n              [104.692329, 29.177099],\n              [104.691993, 29.19934],\n              [104.649325, 29.198588],\n              [104.62424, 29.207282],\n              [104.596355, 29.190394],\n              [104.580117, 29.164639],\n              [104.540922, 29.143394],\n              [104.509453, 29.155522],\n              [104.46589, 29.207366],\n              [104.460963, 29.221827],\n              [104.434646, 29.220908],\n              [104.442597, 29.238543],\n              [104.417735, 29.236454],\n              [104.411688, 29.245479],\n              [104.380332, 29.238376],\n              [104.368685, 29.247652],\n              [104.323218, 29.2408],\n              [104.298805, 29.245647],\n              [104.284582, 29.259601],\n              [104.249082, 29.261356],\n              [104.265433, 29.231857],\n              [104.256026, 29.212298],\n              [104.23262, 29.205861],\n              [104.191409, 29.235869],\n              [104.195888, 29.220657],\n              [104.17685, 29.195745],\n              [104.174835, 29.183789],\n              [104.194097, 29.163719],\n              [104.167891, 29.15042],\n              [104.175395, 29.129591],\n              [104.161732, 29.117041],\n              [104.142358, 29.070593],\n              [104.139671, 29.024543],\n              [104.121641, 28.998243],\n              [104.122985, 28.963976],\n              [104.107082, 28.95082],\n              [104.072478, 28.967496],\n              [104.061839, 28.965401],\n              [104.076174, 28.920897],\n              [104.084685, 28.914441],\n              [104.030483, 28.884843],\n              [104.034402, 28.855908],\n              [104.024996, 28.84408],\n              [104.003494, 28.853475],\n              [103.979977, 28.792137],\n              [103.956459, 28.787521],\n              [103.938317, 28.764268],\n              [103.914912, 28.776273],\n              [103.851079, 28.832166],\n              [103.830473, 28.845338],\n              [103.803708, 28.83611],\n              [103.788478, 28.822433],\n              [103.761041, 28.815888],\n              [103.76944, 28.799355],\n              [103.746483, 28.764016],\n              [103.712775, 28.757299],\n              [103.7018, 28.746719],\n              [103.71591, 28.73849],\n              [103.724869, 28.717577],\n              [103.722853, 28.687923],\n              [103.685674, 28.63481],\n              [103.636623, 28.624134],\n              [103.614562, 28.613373],\n              [103.61389, 28.597313],\n              [103.639983, 28.604881],\n              [103.665404, 28.594874],\n              [103.689257, 28.562578],\n              [103.712551, 28.552904],\n              [103.712999, 28.541294],\n              [103.689929, 28.519332],\n              [103.685002, 28.497955],\n              [103.724533, 28.471522],\n              [103.739987, 28.51201],\n              [103.75701, 28.522782],\n              [103.781983, 28.524549]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511600,\n        \"name\": \"广安市\",\n        \"center\": [106.633369, 30.456398],\n        \"centroid\": [106.666151, 30.42449],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 13,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [106.976088, 30.083596],\n              [106.975864, 30.087906],\n              [106.976648, 30.088071],\n              [106.97732, 30.087491],\n              [106.978552, 30.087408],\n              [106.979784, 30.088071],\n              [106.980456, 30.087657],\n              [106.981912, 30.085171],\n              [107.020659, 30.036845],\n              [107.042721, 30.035021],\n              [107.042497, 30.055084],\n              [107.059295, 30.043146],\n              [107.084492, 30.063871],\n              [107.073853, 30.080944],\n              [107.080125, 30.094204],\n              [107.103082, 30.090143],\n              [107.106554, 30.11384],\n              [107.131303, 30.121545],\n              [107.136454, 30.134385],\n              [107.173298, 30.164861],\n              [107.220221, 30.212794],\n              [107.256057, 30.263764],\n              [107.272743, 30.305447],\n              [107.255385, 30.322809],\n              [107.252809, 30.324876],\n              [107.253257, 30.325951],\n              [107.253593, 30.327356],\n              [107.260425, 30.328927],\n              [107.251802, 30.344302],\n              [107.242843, 30.338598],\n              [107.241611, 30.338516],\n              [107.240939, 30.339425],\n              [107.240267, 30.339921],\n              [107.239931, 30.340499],\n              [107.238587, 30.341739],\n              [107.237691, 30.342235],\n              [107.235563, 30.343723],\n              [107.234779, 30.34455],\n              [107.221341, 30.34612],\n              [107.22918, 30.369838],\n              [107.226828, 30.372069],\n              [107.223021, 30.377771],\n              [107.225932, 30.380084],\n              [107.208798, 30.391155],\n              [107.217533, 30.406438],\n              [107.206895, 30.410072],\n              [107.225372, 30.424113],\n              [107.219661, 30.436995],\n              [107.191776, 30.432123],\n              [107.186177, 30.450454],\n              [107.164115, 30.458793],\n              [107.195696, 30.492058],\n              [107.21395, 30.501218],\n              [107.204207, 30.524321],\n              [107.184945, 30.535705],\n              [107.189201, 30.516483],\n              [107.174418, 30.502868],\n              [107.140822, 30.520938],\n              [107.111593, 30.525971],\n              [107.095355, 30.506251],\n              [107.131303, 30.486363],\n              [107.142614, 30.47002],\n              [107.122792, 30.471671],\n              [107.118201, 30.48562],\n              [107.082365, 30.486198],\n              [107.076429, 30.51409],\n              [107.039361, 30.51541],\n              [107.038689, 30.514998],\n              [107.036898, 30.51574],\n              [107.03757, 30.517143],\n              [107.010917, 30.520691],\n              [107.00207, 30.505921],\n              [106.98348, 30.499485],\n              [106.974633, 30.533726],\n              [106.984599, 30.546511],\n              [107.017748, 30.548656],\n              [107.032082, 30.613217],\n              [107.043281, 30.642803],\n              [107.026819, 30.645193],\n              [106.998038, 30.635634],\n              [106.968585, 30.645522],\n              [106.949323, 30.635716],\n              [106.904305, 30.664225],\n              [106.890306, 30.697666],\n              [106.904528, 30.70236],\n              [106.924126, 30.684818],\n              [106.949547, 30.707137],\n              [106.883587, 30.715618],\n              [106.880451, 30.733978],\n              [106.840472, 30.738341],\n              [106.831177, 30.757107],\n              [106.809899, 30.763198],\n              [106.739123, 30.807875],\n              [106.730164, 30.832632],\n              [106.685257, 30.829342],\n              [106.675178, 30.838882],\n              [106.629599, 30.821036],\n              [106.617281, 30.82778],\n              [106.616497, 30.801705],\n              [106.626464, 30.789365],\n              [106.618401, 30.766572],\n              [106.584244, 30.756861],\n              [106.587604, 30.73974],\n              [106.542809, 30.743033],\n              [106.528923, 30.732496],\n              [106.506301, 30.762869],\n              [106.507757, 30.784511],\n              [106.487599, 30.787966],\n              [106.466546, 30.760893],\n              [106.448068, 30.753321],\n              [106.441124, 30.727144],\n              [106.420855, 30.708207],\n              [106.423094, 30.693219],\n              [106.403609, 30.695525],\n              [106.38905, 30.679876],\n              [106.364301, 30.697337],\n              [106.366877, 30.712736],\n              [106.354558, 30.722122],\n              [106.300468, 30.686218],\n              [106.286806, 30.70516],\n              [106.250746, 30.719323],\n              [106.207631, 30.722863],\n              [106.217486, 30.704666],\n              [106.238091, 30.706807],\n              [106.237531, 30.687454],\n              [106.225773, 30.695196],\n              [106.217822, 30.677652],\n              [106.166643, 30.648324],\n              [106.178962, 30.620058],\n              [106.192176, 30.612969],\n              [106.180194, 30.595658],\n              [106.157796, 30.598049],\n              [106.123192, 30.544449],\n              [106.112777, 30.503198],\n              [106.093851, 30.504189],\n              [106.066638, 30.491727],\n              [106.039426, 30.518216],\n              [106.028003, 30.505261],\n              [106.024755, 30.482071],\n              [105.980856, 30.488344],\n              [105.970665, 30.477119],\n              [105.971225, 30.456151],\n              [105.950172, 30.452931],\n              [105.948268, 30.441619],\n              [105.963834, 30.424691],\n              [105.9794, 30.427581],\n              [105.989815, 30.41255],\n              [105.987239, 30.394047],\n              [106.00079, 30.376283],\n              [106.032146, 30.371821],\n              [106.033714, 30.361823],\n              [106.07347, 30.334135],\n              [106.08926, 30.345541],\n              [106.088364, 30.32314],\n              [106.114793, 30.317353],\n              [106.131815, 30.301808],\n              [106.131815, 30.324132],\n              [106.149733, 30.30925],\n              [106.171235, 30.305033],\n              [106.180418, 30.277825],\n              [106.180418, 30.232821],\n              [106.201023, 30.228021],\n              [106.192288, 30.21627],\n              [106.212558, 30.20311],\n              [106.232268, 30.212546],\n              [106.24593, 30.196488],\n              [106.260601, 30.196985],\n              [106.260377, 30.20402],\n              [106.260265, 30.207911],\n              [106.264296, 30.209732],\n              [106.278407, 30.195743],\n              [106.296437, 30.205841],\n              [106.30058, 30.23853],\n              [106.335072, 30.226366],\n              [106.349295, 30.245232],\n              [106.372588, 30.248211],\n              [106.402713, 30.242088],\n              [106.427798, 30.253754],\n              [106.407976, 30.276171],\n              [106.434741, 30.276998],\n              [106.428582, 30.291554],\n              [106.449747, 30.297839],\n              [106.544825, 30.296764],\n              [106.560279, 30.31512],\n              [106.611009, 30.292712],\n              [106.634863, 30.265666],\n              [106.642142, 30.246556],\n              [106.611457, 30.228021],\n              [106.624448, 30.227111],\n              [106.631839, 30.186554],\n              [106.677642, 30.157409],\n              [106.673274, 30.122042],\n              [106.703175, 30.118148],\n              [106.700263, 30.073651],\n              [106.725797, 30.057073],\n              [106.732404, 30.026812],\n              [106.785486, 30.017276],\n              [106.800044, 30.030543],\n              [106.830169, 30.033943],\n              [106.842039, 30.049115],\n              [106.861413, 30.028139],\n              [106.884259, 30.034357],\n              [106.913599, 30.025568],\n              [106.914831, 30.033943],\n              [106.94854, 30.040161],\n              [106.956715, 30.067518],\n              [106.976088, 30.083596]\n            ]\n          ],\n          [\n            [\n              [107.225932, 30.380084],\n              [107.223021, 30.377771],\n              [107.226828, 30.372069],\n              [107.22918, 30.369838],\n              [107.225932, 30.380084]\n            ]\n          ],\n          [\n            [\n              [107.255385, 30.322809],\n              [107.272743, 30.305447],\n              [107.286742, 30.334796],\n              [107.304772, 30.354881],\n              [107.287749, 30.363062],\n              [107.276327, 30.357195],\n              [107.276663, 30.352401],\n              [107.27879, 30.346203],\n              [107.272295, 30.322148],\n              [107.261432, 30.326281],\n              [107.254153, 30.325951],\n              [107.253257, 30.325951],\n              [107.252809, 30.324876],\n              [107.255385, 30.322809]\n            ]\n          ],\n          [\n            [\n              [107.241611, 30.347856],\n              [107.238811, 30.346616],\n              [107.234779, 30.34455],\n              [107.235563, 30.343723],\n              [107.237691, 30.342235],\n              [107.238587, 30.341739],\n              [107.239931, 30.340499],\n              [107.240267, 30.339921],\n              [107.240939, 30.339425],\n              [107.241611, 30.338516],\n              [107.242843, 30.338598],\n              [107.251802, 30.344302],\n              [107.241611, 30.347856]\n            ]\n          ],\n          [\n            [\n              [106.264296, 30.209732],\n              [106.260265, 30.207911],\n              [106.260377, 30.20402],\n              [106.260601, 30.196985],\n              [106.264296, 30.209732]\n            ]\n          ],\n          [\n            [\n              [106.976648, 30.088071],\n              [106.975864, 30.087906],\n              [106.976088, 30.083596],\n              [106.981912, 30.085171],\n              [106.980456, 30.087657],\n              [106.979784, 30.088071],\n              [106.978552, 30.087408],\n              [106.97732, 30.087491],\n              [106.976648, 30.088071]\n            ]\n          ],\n          [\n            [\n              [107.260425, 30.328927],\n              [107.253593, 30.327356],\n              [107.254153, 30.325951],\n              [107.261432, 30.326281],\n              [107.260425, 30.328927]\n            ]\n          ],\n          [\n            [\n              [107.03757, 30.517143],\n              [107.036898, 30.51574],\n              [107.038689, 30.514998],\n              [107.039361, 30.51541],\n              [107.03757, 30.517143]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511700,\n        \"name\": \"达州市\",\n        \"center\": [107.502262, 31.209484],\n        \"centroid\": [107.650611, 31.367469],\n        \"childrenNum\": 7,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 14,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [107.304772, 30.354881],\n              [107.33904, 30.387107],\n              [107.345535, 30.425517],\n              [107.359981, 30.456233],\n              [107.408696, 30.521598],\n              [107.419895, 30.516483],\n              [107.442852, 30.535293],\n              [107.42751, 30.547666],\n              [107.46021, 30.571335],\n              [107.485295, 30.598296],\n              [107.493694, 30.618986],\n              [107.51542, 30.642061],\n              [107.499182, 30.660188],\n              [107.478576, 30.664472],\n              [107.456627, 30.682347],\n              [107.458642, 30.704831],\n              [107.436133, 30.721958],\n              [107.424374, 30.740645],\n              [107.439045, 30.747066],\n              [107.447892, 30.778751],\n              [107.466369, 30.77406],\n              [107.477792, 30.799813],\n              [107.497726, 30.809273],\n              [107.492127, 30.833125],\n              [107.481152, 30.836826],\n              [107.513852, 30.855081],\n              [107.527515, 30.839046],\n              [107.535466, 30.847681],\n              [107.577573, 30.848092],\n              [107.616209, 30.837731],\n              [107.631103, 30.817828],\n              [107.643646, 30.820624],\n              [107.691912, 30.874811],\n              [107.704119, 30.872263],\n              [107.717333, 30.888291],\n              [107.737715, 30.885004],\n              [107.760336, 30.862233],\n              [107.752273, 30.846036],\n              [107.763808, 30.817088],\n              [107.787885, 30.819473],\n              [107.818906, 30.797428],\n              [107.852278, 30.793479],\n              [107.891586, 30.830247],\n              [107.929437, 30.859356],\n              [107.955307, 30.873249],\n              [107.955979, 30.882949],\n              [107.992262, 30.902591],\n              [107.945004, 30.92338],\n              [107.936269, 30.952789],\n              [107.943548, 30.989415],\n              [107.981176, 30.983339],\n              [108.003797, 31.025369],\n              [108.053296, 31.040716],\n              [108.058895, 31.053926],\n              [108.028994, 31.061721],\n              [108.024739, 31.089283],\n              [108.009397, 31.108309],\n              [108.025747, 31.116345],\n              [108.036274, 31.139956],\n              [108.08566, 31.188063],\n              [108.089356, 31.205922],\n              [108.076141, 31.231804],\n              [108.040081, 31.218618],\n              [108.019475, 31.244988],\n              [108.066398, 31.261773],\n              [108.092379, 31.265784],\n              [108.095291, 31.275526],\n              [108.144341, 31.301225],\n              [108.185553, 31.338044],\n              [108.176034, 31.35473],\n              [108.154084, 31.370759],\n              [108.182865, 31.392999],\n              [108.206494, 31.397413],\n              [108.216349, 31.411146],\n              [108.210526, 31.435746],\n              [108.223852, 31.449229],\n              [108.223181, 31.46516],\n              [108.19328, 31.468183],\n              [108.19048, 31.491461],\n              [108.212206, 31.493748],\n              [108.226764, 31.505834],\n              [108.254761, 31.498811],\n              [108.28175, 31.507303],\n              [108.323297, 31.502404],\n              [108.344015, 31.512447],\n              [108.339535, 31.53898],\n              [108.350286, 31.546],\n              [108.381195, 31.542572],\n              [108.39161, 31.561425],\n              [108.377947, 31.570401],\n              [108.402584, 31.603851],\n              [108.442676, 31.633701],\n              [108.468321, 31.622284],\n              [108.472017, 31.639001],\n              [108.490159, 31.641284],\n              [108.504493, 31.656286],\n              [108.532826, 31.669084],\n              [108.546488, 31.66672],\n              [108.514796, 31.694106],\n              [108.525435, 31.702499],\n              [108.518603, 31.726207],\n              [108.505501, 31.732643],\n              [108.53529, 31.757728],\n              [108.515692, 31.761067],\n              [108.488591, 31.780283],\n              [108.462498, 31.780527],\n              [108.454435, 31.791111],\n              [108.465185, 31.808367],\n              [108.441444, 31.807635],\n              [108.391946, 31.828712],\n              [108.385898, 31.854097],\n              [108.340991, 31.863533],\n              [108.308403, 31.905984],\n              [108.282646, 31.917773],\n              [108.280182, 31.953047],\n              [108.259352, 31.966861],\n              [108.269879, 31.985141],\n              [108.282198, 31.97921],\n              [108.307059, 31.997244],\n              [108.35051, 31.97198],\n              [108.369436, 31.986847],\n              [108.329233, 32.019253],\n              [108.362493, 32.036304],\n              [108.364061, 32.048319],\n              [108.343567, 32.063904],\n              [108.373804, 32.077133],\n              [108.394521, 32.066177],\n              [108.412887, 32.070073],\n              [108.430021, 32.061388],\n              [108.450403, 32.074374],\n              [108.452531, 32.090279],\n              [108.431589, 32.101719],\n              [108.406616, 32.141303],\n              [108.369436, 32.17333],\n              [108.406392, 32.196188],\n              [108.45925, 32.181436],\n              [108.479296, 32.182085],\n              [108.509756, 32.201213],\n              [108.51446, 32.21823],\n              [108.507069, 32.245694],\n              [108.484447, 32.250716],\n              [108.471793, 32.27064],\n              [108.450739, 32.259302],\n              [108.421846, 32.260679],\n              [108.415015, 32.252498],\n              [108.390602, 32.263594],\n              [108.370668, 32.253632],\n              [108.347935, 32.253956],\n              [108.331808, 32.233381],\n              [108.312099, 32.232166],\n              [108.264504, 32.257439],\n              [108.248602, 32.274446],\n              [108.212206, 32.256953],\n              [108.213326, 32.248205],\n              [108.179729, 32.221714],\n              [108.15666, 32.238971],\n              [108.141654, 32.218878],\n              [108.123064, 32.218392],\n              [108.089915, 32.233705],\n              [108.066062, 32.229654],\n              [108.043329, 32.215232],\n              [108.018579, 32.211829],\n              [108.023171, 32.175924],\n              [107.995734, 32.147141],\n              [107.979384, 32.146006],\n              [107.954299, 32.163926],\n              [107.924734, 32.196998],\n              [107.890466, 32.214422],\n              [107.867508, 32.202428],\n              [107.835816, 32.223011],\n              [107.788669, 32.279871],\n              [107.754625, 32.338233],\n              [107.716773, 32.328846],\n              [107.703559, 32.318001],\n              [107.705239, 32.281814],\n              [107.679034, 32.251445],\n              [107.690456, 32.218797],\n              [107.630991, 32.199673],\n              [107.627855, 32.151763],\n              [107.641294, 32.138707],\n              [107.680601, 32.141059],\n              [107.708262, 32.115024],\n              [107.715765, 32.118998],\n              [107.74253, 32.102368],\n              [107.76392, 32.069667],\n              [107.7329, 32.039552],\n              [107.702439, 32.029809],\n              [107.67601, 32.006097],\n              [107.622368, 32.01438],\n              [107.584964, 32.000168],\n              [107.569174, 31.981241],\n              [107.58418, 31.962961],\n              [107.569622, 31.948659],\n              [107.541177, 31.943864],\n              [107.53233, 31.929803],\n              [107.515084, 31.926471],\n              [107.550696, 31.897122],\n              [107.533338, 31.877035],\n              [107.496046, 31.866462],\n              [107.57175, 31.834246],\n              [107.554504, 31.768721],\n              [107.533562, 31.760578],\n              [107.539049, 31.738426],\n              [107.492351, 31.729384],\n              [107.501645, 31.69818],\n              [107.516988, 31.683511],\n              [107.53289, 31.684571],\n              [107.518108, 31.637452],\n              [107.499966, 31.626525],\n              [107.489887, 31.596999],\n              [107.471633, 31.596265],\n              [107.454051, 31.583048],\n              [107.445428, 31.591615],\n              [107.429862, 31.572768],\n              [107.388986, 31.563955],\n              [107.361437, 31.541266],\n              [107.354494, 31.549101],\n              [107.331201, 31.53147],\n              [107.322914, 31.492931],\n              [107.285846, 31.491298],\n              [107.273191, 31.453723],\n              [107.258633, 31.445225],\n              [107.237691, 31.466304],\n              [107.225037, 31.434602],\n              [107.21003, 31.42643],\n              [107.17397, 31.427901],\n              [107.145413, 31.379672],\n              [107.149893, 31.356529],\n              [107.120328, 31.334035],\n              [107.101962, 31.335426],\n              [107.074861, 31.373376],\n              [107.046081, 31.34696],\n              [107.054592, 31.326836],\n              [107.035778, 31.321682],\n              [107.038689, 31.294678],\n              [107.019092, 31.304499],\n              [107.003525, 31.269223],\n              [106.983256, 31.248755],\n              [106.964778, 31.250802],\n              [106.958282, 31.228283],\n              [106.939917, 31.207151],\n              [106.938349, 31.1761],\n              [106.951003, 31.161267],\n              [106.931965, 31.133726],\n              [106.935325, 31.116591],\n              [106.909008, 31.107653],\n              [106.894786, 31.08756],\n              [106.86914, 31.081163],\n              [106.830505, 31.05286],\n              [106.819754, 31.011662],\n              [106.803292, 30.993684],\n              [106.78739, 30.995901],\n              [106.784814, 30.972336],\n              [106.771487, 30.96864],\n              [106.73162, 30.973649],\n              [106.740467, 30.951147],\n              [106.723221, 30.946629],\n              [106.707207, 30.915903],\n              [106.678986, 30.922887],\n              [106.666443, 30.909987],\n              [106.689177, 30.883606],\n              [106.675514, 30.867084],\n              [106.675178, 30.838882],\n              [106.685257, 30.829342],\n              [106.730164, 30.832632],\n              [106.739123, 30.807875],\n              [106.809899, 30.763198],\n              [106.831177, 30.757107],\n              [106.840472, 30.738341],\n              [106.880451, 30.733978],\n              [106.883587, 30.715618],\n              [106.949547, 30.707137],\n              [106.924126, 30.684818],\n              [106.904528, 30.70236],\n              [106.890306, 30.697666],\n              [106.904305, 30.664225],\n              [106.949323, 30.635716],\n              [106.968585, 30.645522],\n              [106.998038, 30.635634],\n              [107.026819, 30.645193],\n              [107.043281, 30.642803],\n              [107.032082, 30.613217],\n              [107.017748, 30.548656],\n              [106.984599, 30.546511],\n              [106.974633, 30.533726],\n              [106.98348, 30.499485],\n              [107.00207, 30.505921],\n              [107.010917, 30.520691],\n              [107.03757, 30.517143],\n              [107.039361, 30.51541],\n              [107.076429, 30.51409],\n              [107.082365, 30.486198],\n              [107.118201, 30.48562],\n              [107.122792, 30.471671],\n              [107.142614, 30.47002],\n              [107.131303, 30.486363],\n              [107.095355, 30.506251],\n              [107.111593, 30.525971],\n              [107.140822, 30.520938],\n              [107.174418, 30.502868],\n              [107.189201, 30.516483],\n              [107.184945, 30.535705],\n              [107.204207, 30.524321],\n              [107.21395, 30.501218],\n              [107.195696, 30.492058],\n              [107.164115, 30.458793],\n              [107.186177, 30.450454],\n              [107.191776, 30.432123],\n              [107.219661, 30.436995],\n              [107.225372, 30.424113],\n              [107.227388, 30.420561],\n              [107.227724, 30.414202],\n              [107.217533, 30.406438],\n              [107.208798, 30.391155],\n              [107.225932, 30.380084],\n              [107.22918, 30.369838],\n              [107.221341, 30.34612],\n              [107.234779, 30.34455],\n              [107.238811, 30.346616],\n              [107.238587, 30.349426],\n              [107.240379, 30.3505],\n              [107.241611, 30.347856],\n              [107.251802, 30.344302],\n              [107.260425, 30.328927],\n              [107.261432, 30.326281],\n              [107.272295, 30.322148],\n              [107.27879, 30.346203],\n              [107.271399, 30.345046],\n              [107.265576, 30.349343],\n              [107.276663, 30.352401],\n              [107.276327, 30.357195],\n              [107.274311, 30.37083],\n              [107.277447, 30.371574],\n              [107.287749, 30.363062],\n              [107.304772, 30.354881]\n            ]\n          ],\n          [\n            [\n              [107.227388, 30.420561],\n              [107.225372, 30.424113],\n              [107.206895, 30.410072],\n              [107.217533, 30.406438],\n              [107.227724, 30.414202],\n              [107.227388, 30.420561]\n            ]\n          ],\n          [\n            [\n              [107.254153, 30.325951],\n              [107.253593, 30.327356],\n              [107.253257, 30.325951],\n              [107.254153, 30.325951]\n            ]\n          ],\n          [\n            [\n              [107.277447, 30.371574],\n              [107.274311, 30.37083],\n              [107.276327, 30.357195],\n              [107.287749, 30.363062],\n              [107.277447, 30.371574]\n            ]\n          ],\n          [\n            [\n              [107.276663, 30.352401],\n              [107.265576, 30.349343],\n              [107.271399, 30.345046],\n              [107.27879, 30.346203],\n              [107.276663, 30.352401]\n            ]\n          ],\n          [\n            [\n              [107.240379, 30.3505],\n              [107.238587, 30.349426],\n              [107.238811, 30.346616],\n              [107.241611, 30.347856],\n              [107.240379, 30.3505]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511800,\n        \"name\": \"雅安市\",\n        \"center\": [103.001033, 29.987722],\n        \"centroid\": [102.665156, 29.914326],\n        \"childrenNum\": 8,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 15,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.395178, 30.094866],\n              [103.360574, 30.136787],\n              [103.372109, 30.148382],\n              [103.36091, 30.168008],\n              [103.370317, 30.22827],\n              [103.350047, 30.236048],\n              [103.320259, 30.23489],\n              [103.313875, 30.260372],\n              [103.282295, 30.263598],\n              [103.242651, 30.243081],\n              [103.233356, 30.213456],\n              [103.215998, 30.209235],\n              [103.211631, 30.232407],\n              [103.183634, 30.248128],\n              [103.147238, 30.207],\n              [103.076798, 30.220242],\n              [103.071534, 30.260951],\n              [103.061456, 30.270464],\n              [103.068623, 30.294283],\n              [103.062128, 30.302553],\n              [103.079038, 30.324545],\n              [103.091132, 30.326529],\n              [103.127976, 30.367111],\n              [103.116329, 30.380002],\n              [103.115993, 30.413954],\n              [103.12596, 30.451115],\n              [103.141751, 30.470845],\n              [103.162244, 30.472579],\n              [103.185874, 30.511945],\n              [103.180834, 30.525228],\n              [103.157765, 30.530013],\n              [103.166276, 30.555749],\n              [103.147798, 30.585847],\n              [103.126856, 30.593927],\n              [103.135591, 30.624096],\n              [103.13156, 30.65475],\n              [103.119017, 30.670898],\n              [103.103115, 30.672957],\n              [103.068735, 30.716194],\n              [103.031331, 30.703678],\n              [103.033907, 30.719076],\n              [103.005126, 30.74649],\n              [102.992919, 30.778339],\n              [102.962683, 30.769699],\n              [102.897954, 30.765255],\n              [102.863574, 30.798332],\n              [102.889443, 30.865851],\n              [102.889555, 30.900784],\n              [102.875221, 30.923298],\n              [102.852375, 30.936772],\n              [102.828298, 30.928721],\n              [102.801869, 30.93595],\n              [102.75405, 30.916396],\n              [102.708247, 30.915493],\n              [102.686634, 30.888045],\n              [102.679802, 30.857629],\n              [102.667148, 30.850723],\n              [102.590996, 30.847845],\n              [102.56132, 30.821036],\n              [102.532091, 30.811659],\n              [102.52134, 30.794548],\n              [102.493791, 30.790352],\n              [102.469042, 30.768712],\n              [102.4864, 30.744761],\n              [102.494463, 30.713642],\n              [102.486512, 30.685807],\n              [102.473298, 30.670898],\n              [102.47173, 30.640001],\n              [102.443397, 30.618245],\n              [102.43119, 30.596895],\n              [102.417976, 30.524156],\n              [102.419656, 30.452766],\n              [102.434438, 30.421387],\n              [102.425255, 30.384546],\n              [102.432758, 30.355129],\n              [102.414168, 30.303958],\n              [102.402298, 30.234228],\n              [102.341824, 30.200296],\n              [102.328946, 30.187961],\n              [102.29367, 30.128835],\n              [102.295126, 30.101164],\n              [102.268137, 30.077381],\n              [102.276872, 30.039995],\n              [102.274968, 30.017193],\n              [102.292214, 29.993721],\n              [102.303189, 29.954562],\n              [102.299381, 29.934063],\n              [102.284487, 29.917877],\n              [102.282583, 29.896956],\n              [102.270824, 29.881595],\n              [102.291094, 29.854519],\n              [102.291094, 29.838237],\n              [102.323346, 29.824778],\n              [102.326258, 29.799599],\n              [102.344064, 29.789209],\n              [102.353247, 29.76319],\n              [102.32861, 29.736748],\n              [102.336001, 29.720114],\n              [102.305764, 29.699567],\n              [102.296133, 29.683593],\n              [102.277208, 29.603767],\n              [102.284375, 29.590192],\n              [102.31002, 29.575283],\n              [102.318755, 29.551958],\n              [102.314051, 29.53346],\n              [102.203296, 29.456851],\n              [102.175859, 29.466524],\n              [102.178547, 29.512709],\n              [102.16578, 29.532877],\n              [102.145174, 29.53221],\n              [102.145622, 29.504207],\n              [102.13308, 29.510458],\n              [102.090637, 29.496121],\n              [102.033747, 29.500039],\n              [102.012021, 29.49112],\n              [101.97417, 29.489702],\n              [101.94942, 29.503874],\n              [101.935982, 29.50104],\n              [101.950764, 29.462688],\n              [101.95222, 29.437585],\n              [101.984136, 29.422403],\n              [101.972154, 29.38277],\n              [101.9567, 29.367414],\n              [101.949532, 29.344124],\n              [101.960171, 29.314816],\n              [101.983801, 29.299032],\n              [102.046066, 29.297779],\n              [102.096348, 29.2718],\n              [102.123337, 29.238627],\n              [102.119529, 29.221911],\n              [102.093996, 29.208453],\n              [102.056032, 29.177852],\n              [102.088509, 29.173336],\n              [102.109562, 29.185043],\n              [102.129608, 29.176096],\n              [102.131736, 29.159872],\n              [102.160741, 29.130344],\n              [102.15167, 29.102648],\n              [102.168468, 29.07302],\n              [102.156485, 29.045393],\n              [102.16522, 29.036518],\n              [102.188961, 29.024626],\n              [102.180898, 29.013404],\n              [102.22155, 28.962217],\n              [102.253802, 28.898763],\n              [102.29087, 28.899685],\n              [102.319763, 28.883082],\n              [102.352351, 28.854566],\n              [102.381804, 28.855572],\n              [102.429846, 28.845422],\n              [102.454148, 28.873606],\n              [102.481473, 28.920142],\n              [102.482929, 28.932716],\n              [102.46613, 28.969339],\n              [102.471506, 28.983834],\n              [102.497823, 29.003269],\n              [102.507006, 29.025883],\n              [102.525484, 29.036267],\n              [102.517757, 29.058454],\n              [102.524476, 29.077457],\n              [102.514845, 29.09361],\n              [102.522236, 29.111602],\n              [102.547657, 29.116957],\n              [102.559864, 29.133606],\n              [102.552697, 29.150671],\n              [102.563, 29.159955],\n              [102.594692, 29.160039],\n              [102.600515, 29.169991],\n              [102.590884, 29.191983],\n              [102.618993, 29.209707],\n              [102.635791, 29.210793],\n              [102.653373, 29.188053],\n              [102.649006, 29.177601],\n              [102.673419, 29.161544],\n              [102.69828, 29.167064],\n              [102.740388, 29.153348],\n              [102.772192, 29.159621],\n              [102.778575, 29.173336],\n              [102.766817, 29.18705],\n              [102.781487, 29.236705],\n              [102.804556, 29.249908],\n              [102.833113, 29.241886],\n              [102.836585, 29.208035],\n              [102.879812, 29.206112],\n              [102.905457, 29.222245],\n              [102.9124, 29.264531],\n              [102.940397, 29.302874],\n              [102.962347, 29.301871],\n              [103.003894, 29.287171],\n              [102.979817, 29.320578],\n              [102.980377, 29.340367],\n              [102.998519, 29.368332],\n              [102.975449, 29.397791],\n              [102.93211, 29.400545],\n              [102.879364, 29.415896],\n              [102.823146, 29.46569],\n              [102.869957, 29.530044],\n              [102.914416, 29.553208],\n              [102.931998, 29.61634],\n              [102.929646, 29.668115],\n              [102.938493, 29.67677],\n              [102.928751, 29.711047],\n              [102.962011, 29.721944],\n              [102.996055, 29.708302],\n              [103.007702, 29.72552],\n              [103.044546, 29.700066],\n              [103.052497, 29.675522],\n              [103.092028, 29.683177],\n              [103.099083, 29.693827],\n              [103.1282, 29.671527],\n              [103.150038, 29.672443],\n              [103.141303, 29.703145],\n              [103.153845, 29.713293],\n              [103.143654, 29.730926],\n              [103.162916, 29.737829],\n              [103.143206, 29.760862],\n              [103.165156, 29.77034],\n              [103.125064, 29.864154],\n              [103.093708, 29.886992],\n              [103.109946, 29.915636],\n              [103.159781, 29.930162],\n              [103.176915, 29.945931],\n              [103.1964, 29.944355],\n              [103.191249, 29.966344],\n              [103.225965, 29.970659],\n              [103.252506, 30.040078],\n              [103.302341, 30.087574],\n              [103.312531, 30.071745],\n              [103.339856, 30.074729],\n              [103.349599, 30.097684],\n              [103.372221, 30.082105],\n              [103.37838, 30.095944],\n              [103.395178, 30.094866]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511900,\n        \"name\": \"巴中市\",\n        \"center\": [106.753669, 31.858809],\n        \"centroid\": [107.041958, 32.016794],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 16,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [106.964778, 31.250802],\n              [106.983256, 31.248755],\n              [107.003525, 31.269223],\n              [107.019092, 31.304499],\n              [107.038689, 31.294678],\n              [107.035778, 31.321682],\n              [107.054592, 31.326836],\n              [107.046081, 31.34696],\n              [107.074861, 31.373376],\n              [107.101962, 31.335426],\n              [107.120328, 31.334035],\n              [107.149893, 31.356529],\n              [107.145413, 31.379672],\n              [107.17397, 31.427901],\n              [107.21003, 31.42643],\n              [107.225037, 31.434602],\n              [107.237691, 31.466304],\n              [107.258633, 31.445225],\n              [107.273191, 31.453723],\n              [107.285846, 31.491298],\n              [107.322914, 31.492931],\n              [107.331201, 31.53147],\n              [107.354494, 31.549101],\n              [107.361437, 31.541266],\n              [107.388986, 31.563955],\n              [107.429862, 31.572768],\n              [107.445428, 31.591615],\n              [107.454051, 31.583048],\n              [107.471633, 31.596265],\n              [107.489887, 31.596999],\n              [107.499966, 31.626525],\n              [107.518108, 31.637452],\n              [107.53289, 31.684571],\n              [107.516988, 31.683511],\n              [107.501645, 31.69818],\n              [107.492351, 31.729384],\n              [107.539049, 31.738426],\n              [107.533562, 31.760578],\n              [107.554504, 31.768721],\n              [107.57175, 31.834246],\n              [107.496046, 31.866462],\n              [107.533338, 31.877035],\n              [107.550696, 31.897122],\n              [107.515084, 31.926471],\n              [107.53233, 31.929803],\n              [107.541177, 31.943864],\n              [107.569622, 31.948659],\n              [107.58418, 31.962961],\n              [107.569174, 31.981241],\n              [107.584964, 32.000168],\n              [107.622368, 32.01438],\n              [107.67601, 32.006097],\n              [107.702439, 32.029809],\n              [107.7329, 32.039552],\n              [107.76392, 32.069667],\n              [107.74253, 32.102368],\n              [107.715765, 32.118998],\n              [107.708262, 32.115024],\n              [107.680601, 32.141059],\n              [107.641294, 32.138707],\n              [107.627855, 32.151763],\n              [107.630991, 32.199673],\n              [107.690456, 32.218797],\n              [107.679034, 32.251445],\n              [107.705239, 32.281814],\n              [107.703559, 32.318001],\n              [107.716773, 32.328846],\n              [107.707926, 32.332083],\n              [107.693592, 32.362911],\n              [107.695272, 32.374721],\n              [107.680377, 32.397609],\n              [107.648013, 32.413701],\n              [107.636366, 32.406019],\n              [107.602882, 32.411275],\n              [107.573317, 32.403513],\n              [107.566262, 32.394294],\n              [107.533114, 32.383618],\n              [107.512396, 32.386368],\n              [107.489775, 32.425262],\n              [107.456963, 32.417743],\n              [107.450691, 32.432214],\n              [107.462002, 32.441348],\n              [107.458194, 32.458401],\n              [107.438709, 32.465835],\n              [107.429302, 32.501141],\n              [107.436357, 32.52973],\n              [107.40612, 32.539177],\n              [107.377899, 32.538935],\n              [107.356846, 32.506391],\n              [107.313955, 32.490236],\n              [107.28607, 32.454522],\n              [107.283718, 32.434154],\n              [107.263896, 32.40327],\n              [107.230636, 32.416126],\n              [107.21003, 32.431971],\n              [107.189648, 32.468017],\n              [107.127048, 32.48248],\n              [107.10465, 32.516648],\n              [107.080125, 32.542407],\n              [107.091995, 32.552579],\n              [107.107786, 32.600761],\n              [107.097595, 32.62706],\n              [107.099051, 32.649481],\n              [107.08774, 32.667946],\n              [107.068366, 32.669962],\n              [107.059743, 32.686165],\n              [107.066798, 32.708894],\n              [107.03029, 32.712359],\n              [107.012596, 32.721545],\n              [106.988407, 32.711795],\n              [106.949099, 32.716549],\n              [106.91304, 32.704381],\n              [106.903409, 32.721303],\n              [106.872612, 32.725654],\n              [106.845959, 32.721062],\n              [106.821098, 32.706073],\n              [106.793213, 32.712601],\n              [106.78179, 32.700915],\n              [106.779439, 32.737498],\n              [106.7333, 32.739351],\n              [106.684473, 32.709297],\n              [106.66342, 32.69076],\n              [106.64035, 32.687294],\n              [106.645278, 32.63682],\n              [106.658044, 32.622463],\n              [106.652109, 32.590756],\n              [106.65838, 32.566221],\n              [106.649421, 32.50421],\n              [106.674842, 32.486196],\n              [106.689849, 32.453633],\n              [106.684697, 32.418066],\n              [106.691528, 32.404159],\n              [106.688953, 32.348024],\n              [106.725909, 32.336939],\n              [106.737779, 32.31533],\n              [106.745058, 32.322938],\n              [106.776191, 32.296874],\n              [106.755361, 32.285296],\n              [106.71695, 32.294607],\n              [106.718405, 32.269263],\n              [106.688393, 32.266267],\n              [106.674842, 32.272664],\n              [106.666219, 32.249663],\n              [106.594547, 32.23727],\n              [106.564647, 32.227548],\n              [106.556919, 32.1756],\n              [106.567558, 32.128407],\n              [106.535194, 32.098474],\n              [106.559159, 32.082733],\n              [106.533514, 32.08184],\n              [106.517836, 32.068531],\n              [106.519628, 32.050186],\n              [106.501038, 32.048969],\n              [106.508765, 32.024775],\n              [106.493087, 32.006016],\n              [106.482112, 31.977098],\n              [106.445492, 31.977179],\n              [106.464754, 31.954591],\n              [106.463522, 31.94167],\n              [106.446052, 31.943295],\n              [106.428694, 31.922813],\n              [106.427462, 31.915009],\n              [106.408984, 31.902081],\n              [106.424662, 31.889803],\n              [106.406408, 31.874189],\n              [106.416039, 31.83156],\n              [106.406296, 31.808286],\n              [106.39577, 31.805681],\n              [106.406632, 31.777026],\n              [106.42455, 31.755448],\n              [106.40764, 31.755204],\n              [106.405288, 31.725637],\n              [106.378747, 31.732969],\n              [106.382667, 31.720423],\n              [106.366429, 31.696632],\n              [106.400025, 31.681229],\n              [106.412568, 31.65702],\n              [106.438661, 31.655715],\n              [106.456803, 31.633049],\n              [106.460722, 31.586312],\n              [106.484016, 31.584517],\n              [106.492079, 31.567382],\n              [106.516604, 31.575052],\n              [106.536986, 31.572033],\n              [106.566438, 31.545755],\n              [106.566886, 31.518244],\n              [106.607874, 31.50665],\n              [106.626464, 31.510814],\n              [106.644942, 31.544694],\n              [106.632175, 31.567056],\n              [106.647517, 31.591125],\n              [106.673386, 31.569177],\n              [106.693656, 31.56118],\n              [106.718965, 31.571952],\n              [106.722101, 31.563383],\n              [106.7688, 31.5673],\n              [106.766224, 31.537592],\n              [106.787166, 31.531307],\n              [106.821098, 31.547877],\n              [106.815498, 31.515142],\n              [106.842151, 31.503139],\n              [106.846071, 31.456909],\n              [106.871268, 31.426512],\n              [106.883251, 31.420873],\n              [106.864549, 31.400683],\n              [106.917855, 31.377464],\n              [106.946748, 31.328963],\n              [106.934317, 31.309081],\n              [106.944172, 31.288949],\n              [106.964442, 31.291077],\n              [106.94574, 31.264802],\n              [106.946748, 31.265539],\n              [106.948092, 31.264638],\n              [106.947532, 31.263656],\n              [106.964778, 31.250802]\n            ]\n          ],\n          [\n            [\n              [106.946748, 31.265539],\n              [106.94574, 31.264802],\n              [106.947532, 31.263656],\n              [106.948092, 31.264638],\n              [106.946748, 31.265539]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 512000,\n        \"name\": \"资阳市\",\n        \"center\": [104.641917, 30.122211],\n        \"centroid\": [105.118328, 30.098408],\n        \"childrenNum\": 3,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 17,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.899505, 29.902353],\n              [104.902417, 29.907168],\n              [104.927166, 29.936221],\n              [104.903649, 29.941367],\n              [104.924367, 29.946844],\n              [104.932766, 29.977296],\n              [104.95158, 29.99256],\n              [104.976441, 29.993223],\n              [104.993687, 29.977047],\n              [105.0209, 29.976798],\n              [105.049345, 29.947508],\n              [105.074654, 29.944023],\n              [105.064015, 29.922526],\n              [105.097051, 29.904927],\n              [105.100747, 29.885498],\n              [105.080589, 29.88284],\n              [105.0947, 29.848954],\n              [105.125608, 29.830677],\n              [105.175554, 29.846711],\n              [105.217326, 29.8448],\n              [105.238491, 29.817549],\n              [105.233564, 29.804087],\n              [105.252714, 29.796025],\n              [105.288662, 29.798269],\n              [105.297733, 29.82054],\n              [105.319122, 29.821953],\n              [105.332225, 29.81115],\n              [105.35395, 29.811566],\n              [105.360446, 29.83425],\n              [105.373548, 29.824612],\n              [105.383179, 29.796856],\n              [105.405017, 29.78896],\n              [105.393482, 29.747226],\n              [105.416775, 29.721112],\n              [105.423943, 29.687587],\n              [105.436373, 29.676936],\n              [105.475681, 29.67469],\n              [105.479712, 29.716288],\n              [105.538842, 29.694908],\n              [105.529659, 29.707637],\n              [105.550488, 29.722443],\n              [105.549145, 29.737663],\n              [105.567398, 29.728015],\n              [105.575014, 29.744482],\n              [105.572326, 29.768677],\n              [105.583301, 29.819294],\n              [105.604914, 29.817216],\n              [105.610626, 29.836908],\n              [105.661804, 29.840813],\n              [105.677818, 29.85427],\n              [105.708951, 29.840564],\n              [105.719365, 29.856513],\n              [105.735716, 29.860915],\n              [105.738963, 29.891227],\n              [105.717462, 29.893552],\n              [105.702679, 29.924767],\n              [105.714998, 29.930743],\n              [105.731012, 29.956636],\n              [105.723397, 29.975969],\n              [105.73258, 29.998781],\n              [105.753634, 30.018602],\n              [105.746242, 30.034275],\n              [105.727988, 30.027227],\n              [105.722389, 30.041073],\n              [105.687001, 30.039001],\n              [105.674682, 30.071247],\n              [105.66046, 30.066274],\n              [105.639294, 30.076386],\n              [105.642206, 30.100915],\n              [105.598083, 30.109201],\n              [105.569974, 30.134302],\n              [105.593156, 30.144738],\n              [105.596851, 30.15716],\n              [105.570758, 30.161466],\n              [105.558216, 30.151943],\n              [105.536826, 30.15244],\n              [105.551048, 30.179186],\n              [105.556536, 30.187465],\n              [105.557544, 30.195826],\n              [105.547129, 30.212711],\n              [105.529323, 30.21958],\n              [105.521036, 30.202613],\n              [105.4824, 30.223222],\n              [105.480944, 30.238696],\n              [105.444996, 30.265997],\n              [105.425958, 30.259876],\n              [105.411064, 30.295606],\n              [105.380379, 30.276916],\n              [105.368845, 30.278404],\n              [105.35843, 30.308093],\n              [105.343088, 30.298087],\n              [105.328305, 30.303297],\n              [105.263913, 30.287915],\n              [105.258313, 30.280307],\n              [105.221805, 30.287171],\n              [105.218894, 30.30586],\n              [105.19784, 30.309994],\n              [105.197056, 30.310738],\n              [105.157412, 30.323388],\n              [105.151365, 30.341987],\n              [105.126056, 30.341491],\n              [105.101419, 30.385455],\n              [105.101083, 30.385372],\n              [105.100971, 30.385372],\n              [105.100859, 30.385372],\n              [105.100635, 30.385455],\n              [105.100635, 30.38562],\n              [105.097275, 30.396194],\n              [105.095259, 30.394873],\n              [105.094923, 30.395121],\n              [105.093916, 30.395616],\n              [105.093804, 30.395864],\n              [105.093692, 30.395947],\n              [105.07387, 30.403133],\n              [105.079917, 30.411724],\n              [105.079469, 30.411807],\n              [105.079693, 30.412467],\n              [105.080141, 30.412385],\n              [105.090444, 30.425682],\n              [105.068942, 30.432949],\n              [105.073646, 30.442115],\n              [105.075214, 30.44228],\n              [105.090108, 30.442363],\n              [105.090444, 30.459536],\n              [105.076558, 30.481741],\n              [105.084173, 30.494616],\n              [105.059983, 30.522753],\n              [105.066927, 30.53587],\n              [105.048449, 30.545192],\n              [105.022916, 30.546099],\n              [105.025043, 30.530178],\n              [104.983944, 30.529271],\n              [104.963226, 30.56746],\n              [104.970393, 30.586425],\n              [104.953371, 30.612475],\n              [104.93019, 30.601429],\n              [104.932206, 30.617091],\n              [104.910928, 30.625662],\n              [104.886403, 30.609343],\n              [104.878788, 30.617997],\n              [104.859078, 30.611321],\n              [104.858854, 30.582385],\n              [104.879124, 30.550635],\n              [104.892786, 30.541645],\n              [104.8761, 30.5131],\n              [104.875092, 30.437078],\n              [104.881699, 30.393551],\n              [104.895922, 30.382315],\n              [104.881027, 30.360831],\n              [104.860982, 30.364384],\n              [104.855494, 30.347194],\n              [104.837016, 30.361988],\n              [104.850455, 30.338929],\n              [104.848775, 30.306852],\n              [104.823354, 30.293787],\n              [104.807228, 30.296847],\n              [104.795133, 30.279397],\n              [104.774863, 30.30156],\n              [104.738579, 30.290314],\n              [104.723797, 30.308341],\n              [104.703975, 30.301643],\n              [104.691993, 30.275427],\n              [104.643614, 30.283036],\n              [104.638239, 30.268148],\n              [104.653133, 30.240185],\n              [104.599603, 30.244488],\n              [104.600163, 30.220408],\n              [104.569254, 30.196985],\n              [104.541594, 30.184236],\n              [104.533754, 30.193673],\n              [104.484368, 30.181504],\n              [104.485264, 30.156001],\n              [104.468354, 30.157077],\n              [104.471937, 30.150287],\n              [104.471601, 30.149873],\n              [104.471041, 30.149873],\n              [104.469474, 30.150452],\n              [104.464994, 30.151529],\n              [104.449428, 30.132894],\n              [104.457715, 30.120634],\n              [104.437109, 30.107544],\n              [104.450212, 30.101081],\n              [104.461411, 30.086663],\n              [104.481904, 30.086663],\n              [104.467234, 30.066937],\n              [104.479888, 30.047374],\n              [104.464322, 30.049944],\n              [104.467234, 30.034689],\n              [104.468578, 30.026563],\n              [104.499486, 30.022666],\n              [104.498142, 30.035933],\n              [104.5239, 30.027227],\n              [104.533195, 29.999278],\n              [104.546297, 30.008485],\n              [104.568471, 29.995546],\n              [104.577989, 29.951076],\n              [104.592548, 29.950164],\n              [104.60677, 29.932901],\n              [104.631184, 29.940952],\n              [104.64395, 29.957383],\n              [104.673739, 29.905674],\n              [104.687289, 29.90227],\n              [104.689865, 29.920036],\n              [104.709127, 29.933233],\n              [104.672955, 29.944189],\n              [104.685049, 29.964436],\n              [104.691769, 29.954645],\n              [104.730628, 29.948504],\n              [104.743619, 29.933233],\n              [104.748322, 29.909244],\n              [104.798493, 29.880183],\n              [104.780575, 29.861413],\n              [104.791997, 29.849037],\n              [104.809132, 29.853024],\n              [104.793341, 29.866895],\n              [104.805436, 29.8752],\n              [104.839144, 29.866812],\n              [104.828057, 29.885498],\n              [104.863333, 29.890895],\n              [104.8789, 29.912897],\n              [104.899505, 29.902353]\n            ]\n          ],\n          [\n            [\n              [105.097275, 30.396194],\n              [105.093692, 30.395947],\n              [105.093804, 30.395864],\n              [105.094364, 30.396277],\n              [105.094364, 30.396277],\n              [105.093916, 30.395616],\n              [105.094923, 30.395121],\n              [105.095259, 30.394873],\n              [105.097275, 30.396194]\n            ]\n          ],\n          [\n            [\n              [104.471937, 30.150287],\n              [104.468354, 30.157077],\n              [104.464994, 30.151529],\n              [104.469474, 30.150452],\n              [104.471041, 30.149873],\n              [104.471601, 30.149873],\n              [104.471937, 30.150287]\n            ]\n          ],\n          [\n            [\n              [105.100635, 30.38562],\n              [105.100635, 30.385455],\n              [105.100859, 30.385372],\n              [105.100971, 30.385372],\n              [105.101083, 30.385372],\n              [105.101419, 30.385455],\n              [105.100635, 30.38562]\n            ]\n          ],\n          [\n            [\n              [105.561463, 30.183656],\n              [105.558887, 30.185561],\n              [105.556536, 30.187465],\n              [105.551048, 30.179186],\n              [105.561463, 30.183656]\n            ]\n          ],\n          [\n            [\n              [105.080141, 30.412385],\n              [105.079693, 30.412467],\n              [105.079469, 30.411807],\n              [105.079917, 30.411724],\n              [105.080141, 30.412385]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 513200,\n        \"name\": \"阿坝藏族羌族自治州\",\n        \"center\": [102.221374, 31.899792],\n        \"centroid\": [102.612554, 32.409135],\n        \"childrenNum\": 13,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 18,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [100.667948, 32.523674],\n              [100.659885, 32.514871],\n              [100.622481, 32.503645],\n              [100.634128, 32.479329],\n              [100.612962, 32.443207],\n              [100.594596, 32.427768],\n              [100.562344, 32.419441],\n              [100.537147, 32.39397],\n              [100.530428, 32.378199],\n              [100.537707, 32.364529],\n              [100.52718, 32.34592],\n              [100.531659, 32.327066],\n              [100.553833, 32.303998],\n              [100.552377, 32.282219],\n              [100.573543, 32.280438],\n              [100.588773, 32.269101],\n              [100.58015, 32.26076],\n              [100.599076, 32.231518],\n              [100.629536, 32.226819],\n              [100.638719, 32.233057],\n              [100.666492, 32.218554],\n              [100.682283, 32.187516],\n              [100.72047, 32.18322],\n              [100.726966, 32.162547],\n              [100.692473, 32.15598],\n              [100.698633, 32.133436],\n              [100.717335, 32.120377],\n              [100.730549, 32.099772],\n              [100.762913, 32.086628],\n              [100.766385, 32.069017],\n              [100.785423, 32.049131],\n              [100.799757, 32.050105],\n              [100.785199, 32.009751],\n              [100.803789, 31.991883],\n              [100.828986, 31.989608],\n              [100.834809, 31.976529],\n              [100.869302, 31.958167],\n              [100.880164, 31.967024],\n              [100.950044, 31.987496],\n              [100.962027, 31.979698],\n              [100.990472, 31.978885],\n              [101.01175, 31.948984],\n              [100.991816, 31.930616],\n              [100.98756, 31.911269],\n              [100.998759, 31.900374],\n              [100.992712, 31.864835],\n              [100.952844, 31.860524],\n              [100.938958, 31.825295],\n              [100.916896, 31.804949],\n              [100.862022, 31.785819],\n              [100.852839, 31.758705],\n              [100.869078, 31.73753],\n              [100.898306, 31.738182],\n              [100.933246, 31.751132],\n              [100.952956, 31.721808],\n              [100.964379, 31.718224],\n              [100.968858, 31.682044],\n              [101.016341, 31.653351],\n              [101.024516, 31.640877],\n              [101.063488, 31.628319],\n              [101.050497, 31.60638],\n              [101.053969, 31.593246],\n              [101.074798, 31.575705],\n              [101.061136, 31.567545],\n              [101.05968, 31.548693],\n              [101.07883, 31.493503],\n              [101.0991, 31.487132],\n              [101.107499, 31.468999],\n              [101.144231, 31.494973],\n              [101.185778, 31.509508],\n              [101.202576, 31.506405],\n              [101.221614, 31.535143],\n              [101.241548, 31.518244],\n              [101.264169, 31.46418],\n              [101.263385, 31.443509],\n              [101.245243, 31.398967],\n              [101.257114, 31.378609],\n              [101.285223, 31.375665],\n              [101.301013, 31.358655],\n              [101.32845, 31.384823],\n              [101.336737, 31.368878],\n              [101.354991, 31.371004],\n              [101.390155, 31.398803],\n              [101.405721, 31.397495],\n              [101.415688, 31.43689],\n              [101.449844, 31.435011],\n              [101.464403, 31.410492],\n              [101.456452, 31.389728],\n              [101.429799, 31.372149],\n              [101.426999, 31.345651],\n              [101.43831, 31.307035],\n              [101.452756, 31.294351],\n              [101.46933, 31.330681],\n              [101.447381, 31.347778],\n              [101.475602, 31.354239],\n              [101.481985, 31.368469],\n              [101.54593, 31.378691],\n              [101.563512, 31.366997],\n              [101.573031, 31.341397],\n              [101.610098, 31.382206],\n              [101.628016, 31.385313],\n              [101.685466, 31.353012],\n              [101.691849, 31.326918],\n              [101.708983, 31.315709],\n              [101.715479, 31.289195],\n              [101.765089, 31.309572],\n              [101.763745, 31.28232],\n              [101.78995, 31.276999],\n              [101.814811, 31.284939],\n              [101.836761, 31.281747],\n              [101.858263, 31.26603],\n              [101.863526, 31.201171],\n              [101.87898, 31.190193],\n              [101.884692, 31.160939],\n              [101.910673, 31.146104],\n              [101.929935, 31.168888],\n              [101.97417, 31.177083],\n              [101.985256, 31.156349],\n              [102.013701, 31.144628],\n              [102.02602, 31.089037],\n              [102.034307, 31.073288],\n              [102.078318, 31.084033],\n              [102.1314, 31.130693],\n              [102.154469, 31.140612],\n              [102.172835, 31.107161],\n              [102.163092, 31.090103],\n              [102.168356, 31.03292],\n              [102.163876, 30.995983],\n              [102.178211, 30.986952],\n              [102.194225, 30.950161],\n              [102.188626, 30.933732],\n              [102.200944, 30.909905],\n              [102.170596, 30.89577],\n              [102.163428, 30.902016],\n              [102.112586, 30.8984],\n              [102.087277, 30.89051],\n              [102.065439, 30.87103],\n              [102.069135, 30.827533],\n              [102.066111, 30.792491],\n              [102.03957, 30.76328],\n              [102.070367, 30.740728],\n              [102.057152, 30.736118],\n              [102.039458, 30.706642],\n              [102.054577, 30.698984],\n              [102.047969, 30.661671],\n              [102.066111, 30.668591],\n              [102.104747, 30.658128],\n              [102.114714, 30.638106],\n              [102.148086, 30.610579],\n              [102.177315, 30.594504],\n              [102.184818, 30.627887],\n              [102.227933, 30.63687],\n              [102.246859, 30.621459],\n              [102.2734, 30.635634],\n              [102.273736, 30.654091],\n              [102.296469, 30.676087],\n              [102.316739, 30.677899],\n              [102.348096, 30.705901],\n              [102.391771, 30.711995],\n              [102.447317, 30.681853],\n              [102.477329, 30.692972],\n              [102.475985, 30.738999],\n              [102.469042, 30.768712],\n              [102.493791, 30.790352],\n              [102.52134, 30.794548],\n              [102.532091, 30.811659],\n              [102.56132, 30.821036],\n              [102.590996, 30.847845],\n              [102.667148, 30.850723],\n              [102.679802, 30.857629],\n              [102.686634, 30.888045],\n              [102.708247, 30.915493],\n              [102.75405, 30.916396],\n              [102.801869, 30.93595],\n              [102.828298, 30.928721],\n              [102.852375, 30.936772],\n              [102.875221, 30.923298],\n              [102.889555, 30.900784],\n              [102.889443, 30.865851],\n              [102.863574, 30.798332],\n              [102.897954, 30.765255],\n              [102.962683, 30.769699],\n              [102.992919, 30.778339],\n              [103.037938, 30.802364],\n              [103.083629, 30.812728],\n              [103.123945, 30.79282],\n              [103.165716, 30.842171],\n              [103.199088, 30.845707],\n              [103.228653, 30.836579],\n              [103.25833, 30.842418],\n              [103.284647, 30.829589],\n              [103.305252, 30.810507],\n              [103.337617, 30.824655],\n              [103.354527, 30.850887],\n              [103.383084, 30.862891],\n              [103.409401, 30.864946],\n              [103.451396, 30.892565],\n              [103.454644, 30.924695],\n              [103.465058, 30.941536],\n              [103.516461, 30.971761],\n              [103.52094, 31.005095],\n              [103.517132, 31.030129],\n              [103.504814, 31.041044],\n              [103.521164, 31.067792],\n              [103.525644, 31.101092],\n              [103.557224, 31.149055],\n              [103.564839, 31.175034],\n              [103.583205, 31.191422],\n              [103.57671, 31.215834],\n              [103.581413, 31.246626],\n              [103.569095, 31.262019],\n              [103.579733, 31.291241],\n              [103.569991, 31.314563],\n              [103.569543, 31.338453],\n              [103.60717, 31.351295],\n              [103.627104, 31.344097],\n              [103.669323, 31.354812],\n              [103.700792, 31.391118],\n              [103.739876, 31.398885],\n              [103.75029, 31.419156],\n              [103.787246, 31.434439],\n              [103.802588, 31.430108],\n              [103.795757, 31.471777],\n              [103.84212, 31.510896],\n              [103.857798, 31.53849],\n              [103.898226, 31.512856],\n              [103.915136, 31.538409],\n              [103.907409, 31.564444],\n              [103.923311, 31.60328],\n              [103.917376, 31.612089],\n              [103.928238, 31.639572],\n              [103.962842, 31.656612],\n              [103.989384, 31.68237],\n              [104.016037, 31.678539],\n              [104.040786, 31.697691],\n              [104.085917, 31.688075],\n              [104.09398, 31.693535],\n              [104.103163, 31.710321],\n              [104.142694, 31.715454],\n              [104.147734, 31.727104],\n              [104.171027, 31.732317],\n              [104.169795, 31.779876],\n              [104.152213, 31.815855],\n              [104.132951, 31.815936],\n              [104.127576, 31.828712],\n              [104.080093, 31.838639],\n              [104.061055, 31.829038],\n              [104.046497, 31.849297],\n              [104.030707, 31.846938],\n              [104.01738, 31.862232],\n              [103.975497, 31.85605],\n              [103.957691, 31.903545],\n              [103.920623, 31.942239],\n              [103.886131, 31.929234],\n              [103.876836, 31.917854],\n              [103.845704, 31.921187],\n              [103.817931, 31.939801],\n              [103.763617, 31.946384],\n              [103.754882, 31.964342],\n              [103.758241, 31.997894],\n              [103.795869, 32.045965],\n              [103.817147, 32.054732],\n              [103.824874, 32.07056],\n              [103.811995, 32.097987],\n              [103.82689, 32.114375],\n              [103.826778, 32.130354],\n              [103.855111, 32.126704],\n              [103.850743, 32.161331],\n              [103.897442, 32.155736],\n              [103.922527, 32.143087],\n              [103.938877, 32.146817],\n              [103.974713, 32.140897],\n              [103.994983, 32.118917],\n              [104.048961, 32.131408],\n              [104.100587, 32.125001],\n              [104.129032, 32.140248],\n              [104.152885, 32.125893],\n              [104.142134, 32.149655],\n              [104.156581, 32.158899],\n              [104.158821, 32.176491],\n              [104.18189, 32.196593],\n              [104.221757, 32.215394],\n              [104.257481, 32.214746],\n              [104.247515, 32.24942],\n              [104.209439, 32.285053],\n              [104.211455, 32.298412],\n              [104.182114, 32.308936],\n              [104.159828, 32.25995],\n              [104.162292, 32.250473],\n              [104.135751, 32.234677],\n              [104.131048, 32.223011],\n              [104.075838, 32.237513],\n              [104.066655, 32.249258],\n              [104.033507, 32.248691],\n              [104.022756, 32.265214],\n              [103.981768, 32.305617],\n              [103.960155, 32.304564],\n              [103.921295, 32.315411],\n              [103.898002, 32.341227],\n              [103.904497, 32.347053],\n              [103.889155, 32.364852],\n              [103.914576, 32.432699],\n              [103.902817, 32.496617],\n              [103.906961, 32.51051],\n              [103.84492, 32.584058],\n              [103.853095, 32.61367],\n              [103.877508, 32.621333],\n              [103.890387, 32.638997],\n              [103.922415, 32.635771],\n              [103.993303, 32.647788],\n              [104.007973, 32.641578],\n              [104.035634, 32.651578],\n              [104.065871, 32.631013],\n              [104.068335, 32.608426],\n              [104.084237, 32.569127],\n              [104.129368, 32.530457],\n              [104.132279, 32.492094],\n              [104.0951, 32.467694],\n              [104.144486, 32.473754],\n              [104.162292, 32.521332],\n              [104.174835, 32.531345],\n              [104.168451, 32.579377],\n              [104.177634, 32.607054],\n              [104.182786, 32.663431],\n              [104.155909, 32.711473],\n              [104.130152, 32.730327],\n              [104.146502, 32.756589],\n              [104.121305, 32.799911],\n              [104.108314, 32.800635],\n              [104.101035, 32.848201],\n              [104.079309, 32.856971],\n              [104.068895, 32.845224],\n              [104.035522, 32.833073],\n              [104.032387, 32.820357],\n              [104.004614, 32.814159],\n              [103.971466, 32.839671],\n              [103.994535, 32.861154],\n              [103.993975, 32.879334],\n              [103.958027, 32.888422],\n              [103.952988, 32.917451],\n              [103.965082, 32.922114],\n              [103.959371, 32.939879],\n              [103.978521, 32.985602],\n              [103.973705, 33.005122],\n              [103.986472, 33.034674],\n              [104.013461, 33.041258],\n              [104.069231, 33.003114],\n              [104.113466, 32.99982],\n              [104.158821, 32.956998],\n              [104.195664, 32.916888],\n              [104.217278, 32.908767],\n              [104.220302, 32.896143],\n              [104.247851, 32.877564],\n              [104.277079, 32.891317],\n              [104.28615, 32.939075],\n              [104.305972, 32.951533],\n              [104.345392, 32.940361],\n              [104.378428, 32.953221],\n              [104.383579, 32.994278],\n              [104.426135, 33.010744],\n              [104.421095, 33.024235],\n              [104.391418, 33.035477],\n              [104.360174, 33.028411],\n              [104.337664, 33.038287],\n              [104.367229, 33.086768],\n              [104.360846, 33.099285],\n              [104.377196, 33.107067],\n              [104.374956, 33.11918],\n              [104.350879, 33.159038],\n              [104.328257, 33.224118],\n              [104.329041, 33.252956],\n              [104.303844, 33.30452],\n              [104.336321, 33.314205],\n              [104.349199, 33.300678],\n              [104.39825, 33.297316],\n              [104.393546, 33.310924],\n              [104.420087, 33.32709],\n              [104.367677, 33.345014],\n              [104.328034, 33.333092],\n              [104.295669, 33.332852],\n              [104.270584, 33.393325],\n              [104.242923, 33.406998],\n              [104.22075, 33.404599],\n              [104.221981, 33.428741],\n              [104.213134, 33.446884],\n              [104.18077, 33.473092],\n              [104.156133, 33.547118],\n              [104.168115, 33.570981],\n              [104.17965, 33.575689],\n              [104.168563, 33.611749],\n              [104.103499, 33.663499],\n              [104.05232, 33.685258],\n              [104.013237, 33.683265],\n              [103.966538, 33.670434],\n              [103.926783, 33.679679],\n              [103.861606, 33.68215],\n              [103.800461, 33.670194],\n              [103.778287, 33.658875],\n              [103.689257, 33.693386],\n              [103.667756, 33.685816],\n              [103.667308, 33.698566],\n              [103.64995, 33.700159],\n              [103.669099, 33.712429],\n              [103.651629, 33.721351],\n              [103.644238, 33.708525],\n              [103.633375, 33.721829],\n              [103.598883, 33.717846],\n              [103.563943, 33.699601],\n              [103.552073, 33.67147],\n              [103.520492, 33.678563],\n              [103.545577, 33.720396],\n              [103.549497, 33.740308],\n              [103.531355, 33.749069],\n              [103.54009, 33.766746],\n              [103.518364, 33.807102],\n              [103.506494, 33.810126],\n              [103.464498, 33.802407],\n              [103.431686, 33.750741],\n              [103.349599, 33.743494],\n              [103.320147, 33.752095],\n              [103.279607, 33.773593],\n              [103.284647, 33.802009],\n              [103.24993, 33.814026],\n              [103.228093, 33.794846],\n              [103.203008, 33.795403],\n              [103.161348, 33.807182],\n              [103.153397, 33.819118],\n              [103.18117, 33.900717],\n              [103.171203, 33.924403],\n              [103.134359, 33.930363],\n              [103.123049, 33.941567],\n              [103.123833, 33.96818],\n              [103.139511, 33.976123],\n              [103.157205, 33.998756],\n              [103.147238, 34.036543],\n              [103.119241, 34.039558],\n              [103.130888, 34.066934],\n              [103.170195, 34.065744],\n              [103.178371, 34.080341],\n              [103.149814, 34.102867],\n              [103.135479, 34.10025],\n              [103.121817, 34.1127],\n              [103.13268, 34.129033],\n              [103.124057, 34.161849],\n              [103.100315, 34.181896],\n              [103.071534, 34.184907],\n              [103.050481, 34.194731],\n              [103.03973, 34.185779],\n              [103.005574, 34.184907],\n              [102.973433, 34.205424],\n              [102.980153, 34.241298],\n              [102.956523, 34.2694],\n              [102.939949, 34.299946],\n              [102.913184, 34.312446],\n              [102.879252, 34.312129],\n              [102.86111, 34.302398],\n              [102.856743, 34.270667],\n              [102.806572, 34.274703],\n              [102.783839, 34.258081],\n              [102.777903, 34.235676],\n              [102.731877, 34.237498],\n              [102.701304, 34.197662],\n              [102.6639, 34.192513],\n              [102.647438, 34.178331],\n              [102.650462, 34.165573],\n              [102.625377, 34.167475],\n              [102.598388, 34.147741],\n              [102.641167, 34.127051],\n              [102.655725, 34.113493],\n              [102.660317, 34.085101],\n              [102.649454, 34.080024],\n              [102.61597, 34.099695],\n              [102.585285, 34.101043],\n              [102.5574, 34.091526],\n              [102.516749, 34.087401],\n              [102.46725, 34.073916],\n              [102.438805, 34.087401],\n              [102.417752, 34.042177],\n              [102.39961, 34.017731],\n              [102.391435, 33.970802],\n              [102.350559, 33.977394],\n              [102.345856, 33.96969],\n              [102.32525, 33.982159],\n              [102.310132, 33.971675],\n              [102.316179, 33.994071],\n              [102.287286, 33.977553],\n              [102.277768, 33.990021],\n              [102.25817, 33.975647],\n              [102.241484, 33.981524],\n              [102.238012, 33.963653],\n              [102.202624, 33.967068],\n              [102.198592, 33.978347],\n              [102.1669, 33.982874],\n              [102.136327, 33.965242],\n              [102.205424, 33.90493],\n              [102.233868, 33.870187],\n              [102.253354, 33.861518],\n              [102.261977, 33.824847],\n              [102.237004, 33.798746],\n              [102.238572, 33.788877],\n              [102.300277, 33.782349],\n              [102.324354, 33.754563],\n              [102.322898, 33.746043],\n              [102.295238, 33.739034],\n              [102.284375, 33.723423],\n              [102.301285, 33.70988],\n              [102.325474, 33.735291],\n              [102.3416, 33.720873],\n              [102.328386, 33.706294],\n              [102.313939, 33.668839],\n              [102.333649, 33.642053],\n              [102.344512, 33.606883],\n              [102.386619, 33.598747],\n              [102.410137, 33.579439],\n              [102.440261, 33.574811],\n              [102.454596, 33.555179],\n              [102.477889, 33.543446],\n              [102.474529, 33.529635],\n              [102.445973, 33.531152],\n              [102.461987, 33.504323],\n              [102.4537, 33.483636],\n              [102.462435, 33.449681],\n              [102.442277, 33.453117],\n              [102.434214, 33.439451],\n              [102.403641, 33.424585],\n              [102.396138, 33.405319],\n              [102.367134, 33.408996],\n              [102.370157, 33.394125],\n              [102.347424, 33.409716],\n              [102.31058, 33.397963],\n              [102.300949, 33.410915],\n              [102.277096, 33.407637],\n              [102.263433, 33.417151],\n              [102.261081, 33.396363],\n              [102.238124, 33.388607],\n              [102.219758, 33.351494],\n              [102.186946, 33.332772],\n              [102.205536, 33.320128],\n              [102.202288, 33.300998],\n              [102.217518, 33.248151],\n              [102.203408, 33.223317],\n              [102.174963, 33.233652],\n              [102.15279, 33.253117],\n              [102.144167, 33.274418],\n              [102.111466, 33.285628],\n              [102.108667, 33.257762],\n              [102.089517, 33.227563],\n              [102.089517, 33.204968],\n              [102.055025, 33.189981],\n              [102.010566, 33.191745],\n              [101.993767, 33.199999],\n              [101.957371, 33.186695],\n              [101.935646, 33.186855],\n              [101.923215, 33.155831],\n              [101.884132, 33.132495],\n              [101.86599, 33.103056],\n              [101.825562, 33.119501],\n              [101.840681, 33.160401],\n              [101.841352, 33.1891],\n              [101.82825, 33.214984],\n              [101.797565, 33.233011],\n              [101.788382, 33.229006],\n              [101.767553, 33.263368],\n              [101.8091, 33.28835],\n              [101.823882, 33.271215],\n              [101.832282, 33.291712],\n              [101.858039, 33.312044],\n              [101.876069, 33.314125],\n              [101.875509, 33.349334],\n              [101.886371, 33.382369],\n              [101.914144, 33.405878],\n              [101.915936, 33.425784],\n              [101.946285, 33.442808],\n              [101.924447, 33.45],\n              [101.927359, 33.472932],\n              [101.907425, 33.480201],\n              [101.897906, 33.519096],\n              [101.907201, 33.542009],\n              [101.885252, 33.56324],\n              [101.882004, 33.57928],\n              [101.844376, 33.602416],\n              [101.830826, 33.578801],\n              [101.830266, 33.554541],\n              [101.805964, 33.548155],\n              [101.782335, 33.556297],\n              [101.770016, 33.545042],\n              [101.777856, 33.533946],\n              [101.77584, 33.492023],\n              [101.768785, 33.465102],\n              [101.775952, 33.453516],\n              [101.75949, 33.444726],\n              [101.734516, 33.445126],\n              [101.695769, 33.433937],\n              [101.692969, 33.422427],\n              [101.662733, 33.38165],\n              [101.649294, 33.324609],\n              [101.678187, 33.297476],\n              [101.706744, 33.298517],\n              [101.730933, 33.283866],\n              [101.740452, 33.269133],\n              [101.727573, 33.2564],\n              [101.727461, 33.240461],\n              [101.711111, 33.213462],\n              [101.680651, 33.202003],\n              [101.686698, 33.185413],\n              [101.65411, 33.162726],\n              [101.661165, 33.136505],\n              [101.634176, 33.102414],\n              [101.567095, 33.154628],\n              [101.557576, 33.167136],\n              [101.515469, 33.193027],\n              [101.486464, 33.227163],\n              [101.475937, 33.223237],\n              [101.428231, 33.230287],\n              [101.40337, 33.22524],\n              [101.386795, 33.207372],\n              [101.396202, 33.187176],\n              [101.393851, 33.157835],\n              [101.381196, 33.154388],\n              [101.374477, 33.171385],\n              [101.328898, 33.223477],\n              [101.328674, 33.237337],\n              [101.310532, 33.244466],\n              [101.296982, 33.262247],\n              [101.246251, 33.262327],\n              [101.222734, 33.270335],\n              [101.206944, 33.255279],\n              [101.203248, 33.269614],\n              [101.183538, 33.270094],\n              [101.156997, 33.237017],\n              [101.127881, 33.223798],\n              [101.120377, 33.186615],\n              [101.13348, 33.1891],\n              [101.130568, 33.168899],\n              [101.158677, 33.144204],\n              [101.151174, 33.132415],\n              [101.169652, 33.101692],\n              [101.143223, 33.08412],\n              [101.146582, 33.056832],\n              [101.162149, 33.056591],\n              [101.184434, 33.041258],\n              [101.171332, 33.013555],\n              [101.184098, 32.984236],\n              [101.129112, 32.989539],\n              [101.133704, 32.947997],\n              [101.123961, 32.910054],\n              [101.176259, 32.894132],\n              [101.223854, 32.855522],\n              [101.222622, 32.838303],\n              [101.23774, 32.827681],\n              [101.224414, 32.771569],\n              [101.22307, 32.725816],\n              [101.190146, 32.686568],\n              [101.157445, 32.661577],\n              [101.130232, 32.660609],\n              [101.111866, 32.637223],\n              [101.112874, 32.671897],\n              [101.083981, 32.671897],\n              [101.076702, 32.683022],\n              [101.030563, 32.660528],\n              [100.997191, 32.627867],\n              [100.956876, 32.62093],\n              [100.932126, 32.60068],\n              [100.914768, 32.616574],\n              [100.89797, 32.615686],\n              [100.887555, 32.632545],\n              [100.860679, 32.635529],\n              [100.834026, 32.648917],\n              [100.807037, 32.646901],\n              [100.799645, 32.654884],\n              [100.773552, 32.640933],\n              [100.765825, 32.663673],\n              [100.752051, 32.65053],\n              [100.692025, 32.677701],\n              [100.684746, 32.67109],\n              [100.709271, 32.649804],\n              [100.717559, 32.617058],\n              [100.70412, 32.611249],\n              [100.676347, 32.627867],\n              [100.666156, 32.624318],\n              [100.658653, 32.599712],\n              [100.658093, 32.546686],\n              [100.667948, 32.523674]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 513300,\n        \"name\": \"甘孜藏族自治州\",\n        \"center\": [101.963815, 30.050663],\n        \"centroid\": [99.98712, 30.97906],\n        \"childrenNum\": 18,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 19,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [100.061536, 28.082776],\n              [100.072063, 28.08548],\n              [100.100284, 28.047957],\n              [100.201744, 27.984205],\n              [100.225822, 27.987165],\n              [100.234445, 27.971011],\n              [100.25617, 27.961283],\n              [100.270505, 27.966358],\n              [100.302981, 28.009829],\n              [100.337025, 28.010167],\n              [100.349008, 28.017354],\n              [100.380812, 28.015494],\n              [100.396715, 28.005516],\n              [100.418104, 28.005601],\n              [100.426839, 28.019468],\n              [100.404666, 28.073143],\n              [100.401754, 28.096464],\n              [100.38742, 28.133463],\n              [100.380252, 28.187925],\n              [100.367822, 28.206242],\n              [100.372861, 28.250459],\n              [100.413849, 28.290779],\n              [100.416424, 28.306464],\n              [100.390331, 28.324929],\n              [100.398618, 28.359405],\n              [100.420792, 28.38654],\n              [100.423928, 28.420153],\n              [100.4162, 28.433209],\n              [100.439606, 28.448199],\n              [100.449909, 28.474722],\n              [100.49112, 28.500312],\n              [100.506014, 28.524213],\n              [100.514973, 28.559633],\n              [100.530428, 28.574101],\n              [100.520125, 28.616568],\n              [100.526284, 28.643048],\n              [100.523708, 28.671118],\n              [100.49112, 28.694812],\n              [100.472418, 28.696493],\n              [100.472082, 28.70859],\n              [100.508814, 28.708674],\n              [100.539946, 28.736726],\n              [100.562792, 28.749574],\n              [100.594708, 28.743948],\n              [100.579926, 28.797929],\n              [100.586533, 28.821426],\n              [100.5638, 28.833425],\n              [100.558536, 28.86136],\n              [100.541738, 28.889791],\n              [100.543082, 28.91704],\n              [100.530316, 28.924417],\n              [100.521357, 28.949646],\n              [100.544762, 28.955261],\n              [100.577014, 28.945456],\n              [100.609155, 28.954591],\n              [100.63424, 28.990117],\n              [100.658093, 29.005447],\n              [100.65003, 29.01935],\n              [100.680155, 29.014158],\n              [100.704792, 28.997322],\n              [100.714199, 29.005195],\n              [100.779264, 29.010389],\n              [100.797518, 28.989279],\n              [100.820475, 28.993049],\n              [100.845784, 29.02069],\n              [100.832458, 29.055357],\n              [100.786431, 29.057868],\n              [100.77288, 29.063812],\n              [100.772432, 29.087668],\n              [100.802557, 29.107837],\n              [100.837497, 29.112941],\n              [100.883412, 29.146405],\n              [100.916336, 29.139881],\n              [100.924735, 29.119802],\n              [100.922384, 29.099468],\n              [100.936382, 29.087919],\n              [100.929103, 29.061217],\n              [100.959563, 29.074109],\n              [101.010182, 29.12683],\n              [101.050273, 29.145652],\n              [101.056881, 29.166395],\n              [101.09742, 29.146573],\n              [101.118362, 29.111937],\n              [101.116346, 29.070593],\n              [101.138855, 29.053515],\n              [101.142327, 29.031326],\n              [101.155877, 29.017759],\n              [101.145351, 28.999751],\n              [101.160357, 28.946965],\n              [101.183986, 28.941265],\n              [101.180851, 28.905471],\n              [101.192609, 28.891133],\n              [101.171668, 28.836445],\n              [101.173123, 28.788696],\n              [101.189922, 28.762085],\n              [101.20504, 28.754948],\n              [101.200224, 28.717409],\n              [101.209183, 28.700609],\n              [101.202576, 28.652714],\n              [101.229677, 28.66658],\n              [101.277048, 28.66574],\n              [101.297542, 28.673135],\n              [101.356223, 28.66616],\n              [101.369213, 28.647755],\n              [101.367646, 28.629262],\n              [101.427223, 28.646326],\n              [101.445813, 28.625479],\n              [101.472914, 28.631532],\n              [101.489824, 28.626824],\n              [101.516925, 28.58924],\n              [101.550745, 28.599415],\n              [101.575382, 28.58226],\n              [101.591844, 28.555427],\n              [101.620177, 28.537676],\n              [101.617714, 28.509402],\n              [101.62992, 28.491558],\n              [101.594532, 28.475227],\n              [101.569895, 28.474216],\n              [101.515357, 28.494083],\n              [101.473698, 28.499049],\n              [101.469218, 28.50553],\n              [101.427559, 28.505025],\n              [101.413001, 28.521099],\n              [101.383996, 28.482888],\n              [101.36787, 28.472449],\n              [101.373021, 28.461756],\n              [101.425543, 28.489538],\n              [101.439654, 28.471691],\n              [101.454436, 28.411056],\n              [101.46821, 28.404317],\n              [101.482097, 28.318521],\n              [101.509758, 28.314727],\n              [101.56228, 28.333106],\n              [101.591621, 28.358056],\n              [101.620177, 28.374911],\n              [101.631712, 28.354854],\n              [101.667548, 28.351819],\n              [101.715479, 28.380894],\n              [101.730709, 28.410635],\n              [101.731829, 28.434556],\n              [101.745827, 28.453672],\n              [101.757138, 28.49341],\n              [101.753554, 28.533889],\n              [101.832393, 28.594033],\n              [101.874165, 28.613121],\n              [101.904289, 28.606562],\n              [101.918736, 28.612616],\n              [101.928031, 28.640947],\n              [101.946621, 28.67137],\n              [101.985032, 28.702877],\n              [102.018069, 28.713965],\n              [102.022772, 28.723373],\n              [101.997799, 28.750162],\n              [101.989288, 28.80372],\n              [101.962747, 28.824027],\n              [101.98548, 28.857585],\n              [101.988392, 28.88803],\n              [102.00631, 28.907567],\n              [102.050993, 28.920477],\n              [102.058384, 28.954088],\n              [102.099708, 28.98065],\n              [102.14999, 29.031158],\n              [102.16522, 29.036518],\n              [102.156485, 29.045393],\n              [102.168468, 29.07302],\n              [102.15167, 29.102648],\n              [102.160741, 29.130344],\n              [102.131736, 29.159872],\n              [102.129608, 29.176096],\n              [102.109562, 29.185043],\n              [102.088509, 29.173336],\n              [102.056032, 29.177852],\n              [102.093996, 29.208453],\n              [102.119529, 29.221911],\n              [102.123337, 29.238627],\n              [102.096348, 29.2718],\n              [102.046066, 29.297779],\n              [101.983801, 29.299032],\n              [101.960171, 29.314816],\n              [101.949532, 29.344124],\n              [101.9567, 29.367414],\n              [101.972154, 29.38277],\n              [101.984136, 29.422403],\n              [101.95222, 29.437585],\n              [101.950764, 29.462688],\n              [101.935982, 29.50104],\n              [101.94942, 29.503874],\n              [101.97417, 29.489702],\n              [102.012021, 29.49112],\n              [102.033747, 29.500039],\n              [102.090637, 29.496121],\n              [102.13308, 29.510458],\n              [102.145622, 29.504207],\n              [102.145174, 29.53221],\n              [102.16578, 29.532877],\n              [102.178547, 29.512709],\n              [102.175859, 29.466524],\n              [102.203296, 29.456851],\n              [102.314051, 29.53346],\n              [102.318755, 29.551958],\n              [102.31002, 29.575283],\n              [102.284375, 29.590192],\n              [102.277208, 29.603767],\n              [102.296133, 29.683593],\n              [102.305764, 29.699567],\n              [102.336001, 29.720114],\n              [102.32861, 29.736748],\n              [102.353247, 29.76319],\n              [102.344064, 29.789209],\n              [102.326258, 29.799599],\n              [102.323346, 29.824778],\n              [102.291094, 29.838237],\n              [102.291094, 29.854519],\n              [102.270824, 29.881595],\n              [102.282583, 29.896956],\n              [102.284487, 29.917877],\n              [102.299381, 29.934063],\n              [102.303189, 29.954562],\n              [102.292214, 29.993721],\n              [102.274968, 30.017193],\n              [102.276872, 30.039995],\n              [102.268137, 30.077381],\n              [102.295126, 30.101164],\n              [102.29367, 30.128835],\n              [102.328946, 30.187961],\n              [102.341824, 30.200296],\n              [102.402298, 30.234228],\n              [102.414168, 30.303958],\n              [102.432758, 30.355129],\n              [102.425255, 30.384546],\n              [102.434438, 30.421387],\n              [102.419656, 30.452766],\n              [102.417976, 30.524156],\n              [102.43119, 30.596895],\n              [102.443397, 30.618245],\n              [102.47173, 30.640001],\n              [102.473298, 30.670898],\n              [102.486512, 30.685807],\n              [102.494463, 30.713642],\n              [102.4864, 30.744761],\n              [102.469042, 30.768712],\n              [102.475985, 30.738999],\n              [102.477329, 30.692972],\n              [102.447317, 30.681853],\n              [102.391771, 30.711995],\n              [102.348096, 30.705901],\n              [102.316739, 30.677899],\n              [102.296469, 30.676087],\n              [102.273736, 30.654091],\n              [102.2734, 30.635634],\n              [102.246859, 30.621459],\n              [102.227933, 30.63687],\n              [102.184818, 30.627887],\n              [102.177315, 30.594504],\n              [102.148086, 30.610579],\n              [102.114714, 30.638106],\n              [102.104747, 30.658128],\n              [102.066111, 30.668591],\n              [102.047969, 30.661671],\n              [102.054577, 30.698984],\n              [102.039458, 30.706642],\n              [102.057152, 30.736118],\n              [102.070367, 30.740728],\n              [102.03957, 30.76328],\n              [102.066111, 30.792491],\n              [102.069135, 30.827533],\n              [102.065439, 30.87103],\n              [102.087277, 30.89051],\n              [102.112586, 30.8984],\n              [102.163428, 30.902016],\n              [102.170596, 30.89577],\n              [102.200944, 30.909905],\n              [102.188626, 30.933732],\n              [102.194225, 30.950161],\n              [102.178211, 30.986952],\n              [102.163876, 30.995983],\n              [102.168356, 31.03292],\n              [102.163092, 31.090103],\n              [102.172835, 31.107161],\n              [102.154469, 31.140612],\n              [102.1314, 31.130693],\n              [102.078318, 31.084033],\n              [102.034307, 31.073288],\n              [102.02602, 31.089037],\n              [102.013701, 31.144628],\n              [101.985256, 31.156349],\n              [101.97417, 31.177083],\n              [101.929935, 31.168888],\n              [101.910673, 31.146104],\n              [101.884692, 31.160939],\n              [101.87898, 31.190193],\n              [101.863526, 31.201171],\n              [101.858263, 31.26603],\n              [101.836761, 31.281747],\n              [101.814811, 31.284939],\n              [101.78995, 31.276999],\n              [101.763745, 31.28232],\n              [101.765089, 31.309572],\n              [101.715479, 31.289195],\n              [101.708983, 31.315709],\n              [101.691849, 31.326918],\n              [101.685466, 31.353012],\n              [101.628016, 31.385313],\n              [101.610098, 31.382206],\n              [101.573031, 31.341397],\n              [101.563512, 31.366997],\n              [101.54593, 31.378691],\n              [101.481985, 31.368469],\n              [101.475602, 31.354239],\n              [101.447381, 31.347778],\n              [101.46933, 31.330681],\n              [101.452756, 31.294351],\n              [101.43831, 31.307035],\n              [101.426999, 31.345651],\n              [101.429799, 31.372149],\n              [101.456452, 31.389728],\n              [101.464403, 31.410492],\n              [101.449844, 31.435011],\n              [101.415688, 31.43689],\n              [101.405721, 31.397495],\n              [101.390155, 31.398803],\n              [101.354991, 31.371004],\n              [101.336737, 31.368878],\n              [101.32845, 31.384823],\n              [101.301013, 31.358655],\n              [101.285223, 31.375665],\n              [101.257114, 31.378609],\n              [101.245243, 31.398967],\n              [101.263385, 31.443509],\n              [101.264169, 31.46418],\n              [101.241548, 31.518244],\n              [101.221614, 31.535143],\n              [101.202576, 31.506405],\n              [101.185778, 31.509508],\n              [101.144231, 31.494973],\n              [101.107499, 31.468999],\n              [101.0991, 31.487132],\n              [101.07883, 31.493503],\n              [101.05968, 31.548693],\n              [101.061136, 31.567545],\n              [101.074798, 31.575705],\n              [101.053969, 31.593246],\n              [101.050497, 31.60638],\n              [101.063488, 31.628319],\n              [101.024516, 31.640877],\n              [101.016341, 31.653351],\n              [100.968858, 31.682044],\n              [100.964379, 31.718224],\n              [100.952956, 31.721808],\n              [100.933246, 31.751132],\n              [100.898306, 31.738182],\n              [100.869078, 31.73753],\n              [100.852839, 31.758705],\n              [100.862022, 31.785819],\n              [100.916896, 31.804949],\n              [100.938958, 31.825295],\n              [100.952844, 31.860524],\n              [100.992712, 31.864835],\n              [100.998759, 31.900374],\n              [100.98756, 31.911269],\n              [100.991816, 31.930616],\n              [101.01175, 31.948984],\n              [100.990472, 31.978885],\n              [100.962027, 31.979698],\n              [100.950044, 31.987496],\n              [100.880164, 31.967024],\n              [100.869302, 31.958167],\n              [100.834809, 31.976529],\n              [100.828986, 31.989608],\n              [100.803789, 31.991883],\n              [100.785199, 32.009751],\n              [100.799757, 32.050105],\n              [100.785423, 32.049131],\n              [100.766385, 32.069017],\n              [100.762913, 32.086628],\n              [100.730549, 32.099772],\n              [100.717335, 32.120377],\n              [100.698633, 32.133436],\n              [100.692473, 32.15598],\n              [100.726966, 32.162547],\n              [100.72047, 32.18322],\n              [100.682283, 32.187516],\n              [100.666492, 32.218554],\n              [100.638719, 32.233057],\n              [100.629536, 32.226819],\n              [100.599076, 32.231518],\n              [100.58015, 32.26076],\n              [100.588773, 32.269101],\n              [100.573543, 32.280438],\n              [100.552377, 32.282219],\n              [100.553833, 32.303998],\n              [100.531659, 32.327066],\n              [100.52718, 32.34592],\n              [100.537707, 32.364529],\n              [100.530428, 32.378199],\n              [100.537147, 32.39397],\n              [100.562344, 32.419441],\n              [100.594596, 32.427768],\n              [100.612962, 32.443207],\n              [100.634128, 32.479329],\n              [100.622481, 32.503645],\n              [100.659885, 32.514871],\n              [100.667948, 32.523674],\n              [100.645439, 32.52642],\n              [100.602883, 32.553629],\n              [100.572311, 32.556777],\n              [100.56492, 32.569611],\n              [100.544762, 32.570096],\n              [100.54465, 32.581475],\n              [100.52438, 32.594952],\n              [100.525052, 32.611249],\n              [100.508702, 32.61012],\n              [100.516541, 32.630045],\n              [100.48888, 32.667221],\n              [100.476338, 32.672461],\n              [100.470178, 32.694548],\n              [100.449909, 32.694065],\n              [100.434902, 32.720095],\n              [100.420344, 32.731778],\n              [100.390107, 32.695596],\n              [100.378685, 32.698417],\n              [100.398842, 32.739109],\n              [100.400634, 32.756186],\n              [100.33445, 32.718241],\n              [100.264345, 32.742734],\n              [100.262106, 32.729119],\n              [100.240268, 32.722673],\n              [100.230861, 32.696241],\n              [100.229741, 32.65053],\n              [100.20992, 32.605844],\n              [100.188082, 32.630771],\n              [100.131864, 32.632465],\n              [100.110139, 32.639239],\n              [100.105435, 32.656739],\n              [100.087853, 32.669075],\n              [100.125257, 32.714857],\n              [100.138696, 32.720981],\n              [100.136344, 32.740881],\n              [100.121785, 32.7764],\n              [100.117082, 32.802487],\n              [100.123129, 32.837257],\n              [100.109691, 32.846591],\n              [100.109243, 32.86228],\n              [100.088637, 32.864211],\n              [100.082366, 32.885125],\n              [100.066016, 32.895982],\n              [100.02962, 32.895821],\n              [100.038355, 32.929108],\n              [100.002519, 32.941647],\n              [99.970826, 32.939075],\n              [99.956604, 32.948077],\n              [99.947421, 32.986887],\n              [99.908897, 33.020622],\n              [99.903074, 33.047038],\n              [99.877317, 33.045513],\n              [99.882692, 33.025199],\n              [99.877765, 32.993716],\n              [99.863654, 32.980219],\n              [99.850888, 32.941888],\n              [99.828714, 32.95097],\n              [99.802845, 32.941969],\n              [99.788287, 32.956596],\n              [99.775296, 32.952337],\n              [99.763986, 32.924445],\n              [99.7744, 32.922516],\n              [99.791982, 32.883114],\n              [99.786495, 32.861798],\n              [99.766897, 32.826232],\n              [99.769809, 32.802326],\n              [99.76029, 32.769877],\n              [99.737109, 32.745312],\n              [99.73946, 32.732503],\n              [99.717735, 32.732181],\n              [99.7062, 32.764079],\n              [99.651326, 32.772132],\n              [99.640127, 32.790733],\n              [99.607427, 32.780829],\n              [99.586485, 32.792665],\n              [99.581782, 32.813515],\n              [99.557145, 32.840074],\n              [99.532396, 32.84804],\n              [99.490176, 32.850936],\n              [99.452772, 32.862441],\n              [99.435302, 32.877242],\n              [99.376173, 32.899842],\n              [99.354112, 32.885446],\n              [99.343473, 32.895258],\n              [99.327235, 32.881505],\n              [99.282888, 32.885044],\n              [99.269113, 32.878529],\n              [99.259482, 32.907963],\n              [99.245596, 32.928384],\n              [99.248955, 32.951533],\n              [99.233277, 32.954426],\n              [99.234733, 32.983353],\n              [99.215135, 32.990181],\n              [99.20864, 33.018694],\n              [99.179411, 33.04487],\n              [99.147607, 33.05041],\n              [99.124649, 33.045994],\n              [99.092733, 33.078101],\n              [99.075039, 33.075934],\n              [99.025764, 33.095033],\n              [99.014566, 33.081311],\n              [98.969883, 33.099526],\n              [98.957004, 33.118298],\n              [98.935502, 33.115651],\n              [98.902802, 33.125838],\n              [98.895635, 33.135061],\n              [98.860695, 33.150058],\n              [98.829674, 33.181325],\n              [98.830906, 33.196874],\n              [98.804701, 33.219311],\n              [98.813548, 33.248311],\n              [98.807501, 33.26529],\n              [98.785663, 33.276821],\n              [98.758786, 33.278102],\n              [98.774017, 33.301799],\n              [98.764274, 33.321088],\n              [98.783424, 33.344054],\n              [98.779168, 33.371652],\n              [98.762818, 33.37901],\n              [98.74658, 33.405159],\n              [98.734037, 33.410275],\n              [98.744228, 33.454315],\n              [98.742212, 33.477725],\n              [98.722838, 33.486113],\n              [98.72463, 33.505601],\n              [98.680059, 33.521571],\n              [98.668748, 33.544324],\n              [98.648031, 33.548794],\n              [98.657774, 33.576806],\n              [98.65251, 33.594997],\n              [98.622722, 33.610233],\n              [98.61757, 33.637269],\n              [98.656654, 33.647315],\n              [98.594501, 33.70239],\n              [98.596181, 33.717129],\n              [98.581734, 33.732185],\n              [98.538059, 33.747556],\n              [98.516893, 33.77415],\n              [98.497968, 33.768497],\n              [98.486769, 33.782111],\n              [98.492928, 33.793254],\n              [98.463475, 33.848395],\n              [98.435143, 33.843145],\n              [98.406922, 33.867244],\n              [98.42708, 33.908189],\n              [98.411849, 33.924721],\n              [98.415433, 33.95698],\n              [98.431111, 33.961826],\n              [98.44063, 33.981365],\n              [98.428199, 34.029002],\n              [98.391915, 34.058842],\n              [98.401882, 34.087718],\n              [98.338721, 34.094777],\n              [98.308821, 34.087718],\n              [98.209936, 34.078517],\n              [98.157302, 34.107387],\n              [98.14196, 34.104374],\n              [98.098172, 34.122928],\n              [98.050354, 34.114682],\n              [98.027844, 34.123325],\n              [98.012614, 34.14576],\n              [97.995592, 34.153765],\n              [97.944526, 34.198612],\n              [97.88898, 34.204474],\n              [97.810701, 34.207484],\n              [97.796478, 34.199167],\n              [97.790879, 34.178093],\n              [97.773409, 34.162007],\n              [97.667021, 34.127685],\n              [97.662989, 34.117458],\n              [97.683371, 34.080738],\n              [97.703193, 34.058127],\n              [97.702297, 34.036781],\n              [97.687403, 34.016619],\n              [97.65851, 34.012174],\n              [97.652798, 33.998359],\n              [97.659854, 33.956345],\n              [97.644399, 33.943315],\n              [97.633985, 33.919078],\n              [97.601844, 33.930045],\n              [97.546746, 33.914151],\n              [97.522109, 33.903261],\n              [97.503631, 33.912005],\n              [97.482801, 33.896981],\n              [97.468467, 33.902069],\n              [97.460628, 33.887361],\n              [97.395339, 33.88927],\n              [97.389628, 33.879967],\n              [97.398027, 33.848315],\n              [97.371822, 33.841952],\n              [97.368798, 33.824131],\n              [97.406426, 33.795165],\n              [97.409898, 33.767621],\n              [97.423224, 33.754961],\n              [97.417849, 33.728521],\n              [97.435319, 33.682468],\n              [97.40553, 33.626663],\n              [97.415721, 33.605527],\n              [97.437111, 33.600183],\n              [97.448645, 33.583668],\n              [97.472835, 33.587418],\n              [97.525245, 33.575769],\n              [97.51203, 33.519415],\n              [97.542155, 33.492662],\n              [97.55257, 33.465662],\n              [97.582358, 33.468777],\n              [97.604644, 33.451838],\n              [97.625585, 33.461507],\n              [97.645183, 33.449041],\n              [97.665005, 33.447683],\n              [97.67486, 33.433058],\n              [97.703641, 33.428981],\n              [97.741268, 33.411635],\n              [97.750003, 33.397403],\n              [97.719991, 33.386288],\n              [97.702297, 33.359734],\n              [97.676316, 33.357574],\n              [97.676092, 33.341013],\n              [97.636784, 33.344614],\n              [97.622002, 33.335972],\n              [97.615395, 33.301799],\n              [97.606548, 33.287469],\n              [97.60666, 33.262567],\n              [97.577655, 33.234453],\n              [97.575191, 33.220834],\n              [97.546746, 33.203686],\n              [97.532972, 33.20625],\n              [97.518078, 33.182607],\n              [97.487953, 33.168178],\n              [97.486273, 33.145246],\n              [97.498032, 33.137949],\n              [97.487729, 33.106746],\n              [97.516958, 33.09752],\n              [97.537339, 33.058196],\n              [97.542379, 33.036199],\n              [97.517966, 33.022148],\n              [97.497696, 33.021826],\n              [97.523789, 32.988575],\n              [97.464995, 32.972024],\n              [97.447413, 32.976283],\n              [97.410122, 32.9619],\n              [97.375741, 32.956676],\n              [97.361967, 32.941969],\n              [97.369582, 32.926535],\n              [97.361743, 32.906998],\n              [97.350096, 32.903943],\n              [97.355472, 32.886894],\n              [97.379101, 32.88239],\n              [97.3931, 32.828727],\n              [97.380221, 32.826313],\n              [97.38582, 32.780266],\n              [97.424792, 32.727749],\n              [97.423784, 32.704945],\n              [97.480786, 32.664076],\n              [97.484705, 32.652788],\n              [97.513262, 32.648836],\n              [97.543723, 32.621737],\n              [97.606324, 32.615283],\n              [97.610579, 32.596],\n              [97.629729, 32.575907],\n              [97.662989, 32.560006],\n              [97.698601, 32.536836],\n              [97.736229, 32.52642],\n              [97.757507, 32.530942],\n              [97.768817, 32.518344],\n              [97.797262, 32.520202],\n              [97.804541, 32.501706],\n              [97.836906, 32.504129],\n              [97.862775, 32.499364],\n              [97.880245, 32.486358],\n              [97.90645, 32.489347],\n              [97.940158, 32.482399],\n              [97.947101, 32.470765],\n              [97.970283, 32.470765],\n              [98.008582, 32.451128],\n              [98.023589, 32.452502],\n              [98.036803, 32.42898],\n              [98.051362, 32.428576],\n              [98.086526, 32.398499],\n              [98.112171, 32.391787],\n              [98.124154, 32.400682],\n              [98.139384, 32.379089],\n              [98.163125, 32.375611],\n              [98.197505, 32.36016],\n              [98.218895, 32.34236],\n              [98.208928, 32.319458],\n              [98.230542, 32.262865],\n              [98.219791, 32.25671],\n              [98.219119, 32.234191],\n              [98.258202, 32.210613],\n              [98.295494, 32.149898],\n              [98.301654, 32.12419],\n              [98.328867, 32.108291],\n              [98.345665, 32.087277],\n              [98.362687, 32.078918],\n              [98.405578, 32.04353],\n              [98.402666, 32.026642],\n              [98.434807, 32.007802],\n              [98.427863, 31.996432],\n              [98.434023, 31.959873],\n              [98.421592, 31.94232],\n              [98.432567, 31.922569],\n              [98.40345, 31.910456],\n              [98.399307, 31.895902],\n              [98.426296, 31.856782],\n              [98.415657, 31.830259],\n              [98.44119, 31.829445],\n              [98.445221, 31.807472],\n              [98.461124, 31.800228],\n              [98.460116, 31.78183],\n              [98.476802, 31.782318],\n              [98.493488, 31.768233],\n              [98.520477, 31.730118],\n              [98.518573, 31.716268],\n              [98.548138, 31.713498],\n              [98.556985, 31.690031],\n              [98.553961, 31.656612],\n              [98.587893, 31.631989],\n              [98.62093, 31.590309],\n              [98.650942, 31.578806],\n              [98.696633, 31.538572],\n              [98.695849, 31.530899],\n              [98.74042, 31.493176],\n              [98.771217, 31.476024],\n              [98.787231, 31.474227],\n              [98.79507, 31.458951],\n              [98.837625, 31.436564],\n              [98.843225, 31.41695],\n              [98.887012, 31.374602],\n              [98.810636, 31.30679],\n              [98.805933, 31.279291],\n              [98.780064, 31.251129],\n              [98.747812, 31.262837],\n              [98.733813, 31.289277],\n              [98.714439, 31.304253],\n              [98.692714, 31.332644],\n              [98.646127, 31.339025],\n              [98.632912, 31.332235],\n              [98.616114, 31.303762],\n              [98.60346, 31.256615],\n              [98.607715, 31.228037],\n              [98.623282, 31.221321],\n              [98.621042, 31.203547],\n              [98.604804, 31.18413],\n              [98.638736, 31.179213],\n              [98.643663, 31.169544],\n              [98.67502, 31.154055],\n              [98.709848, 31.11864],\n              [98.712424, 31.083213],\n              [98.734261, 31.066807],\n              [98.736949, 31.04925],\n              [98.774801, 31.031114],\n              [98.806045, 30.995654],\n              [98.796862, 30.948354],\n              [98.774465, 30.908426],\n              [98.782192, 30.891497],\n              [98.848712, 30.850312],\n              [98.856999, 30.829918],\n              [98.878725, 30.822352],\n              [98.883204, 30.799731],\n              [98.901794, 30.785086],\n              [98.952301, 30.769699],\n              [98.963947, 30.732166],\n              [98.936958, 30.716277],\n              [98.930799, 30.703266],\n              [98.907506, 30.698325],\n              [98.905938, 30.683006],\n              [98.923632, 30.639589],\n              [98.922064, 30.609095],\n              [98.942558, 30.590629],\n              [98.926767, 30.569439],\n              [98.937966, 30.549563],\n              [98.931583, 30.527703],\n              [98.945917, 30.499155],\n              [98.944349, 30.482731],\n              [98.965403, 30.450041],\n              [98.962715, 30.426838],\n              [98.974026, 30.397929],\n              [98.967307, 30.375375],\n              [98.973242, 30.353558],\n              [98.967419, 30.334961],\n              [98.981529, 30.321321],\n              [98.985001, 30.274848],\n              [98.970331, 30.260041],\n              [98.974362, 30.231331],\n              [98.991832, 30.216435],\n              [98.981529, 30.182911],\n              [98.989144, 30.15186],\n              [99.014678, 30.135461],\n              [99.009862, 30.121296],\n              [99.044802, 30.080033],\n              [99.034387, 30.022832],\n              [99.043234, 30.015037],\n              [99.054993, 29.958379],\n              [99.051297, 29.942529],\n              [99.06832, 29.931407],\n              [99.058017, 29.921364],\n              [99.052977, 29.892888],\n              [99.041667, 29.881927],\n              [99.034051, 29.855433],\n              [99.01367, 29.817881],\n              [99.018933, 29.791952],\n              [99.000679, 29.737164],\n              [98.997768, 29.68767],\n              [98.992056, 29.663205],\n              [99.011318, 29.628495],\n              [99.014678, 29.607347],\n              [99.052081, 29.563955],\n              [99.044802, 29.51996],\n              [99.049394, 29.49112],\n              [99.061376, 29.478948],\n              [99.056897, 29.456851],\n              [99.066864, 29.420818],\n              [99.058689, 29.417398],\n              [99.069775, 29.327091],\n              [99.068544, 29.297445],\n              [99.084782, 29.291264],\n              [99.094189, 29.267539],\n              [99.115242, 29.242053],\n              [99.111211, 29.216645],\n              [99.119162, 29.198922],\n              [99.104939, 29.162632],\n              [99.11793, 29.102397],\n              [99.113786, 29.074527],\n              [99.118602, 29.033754],\n              [99.127561, 29.016586],\n              [99.122969, 28.998411],\n              [99.131816, 28.949479],\n              [99.123529, 28.890126],\n              [99.104044, 28.841982],\n              [99.104268, 28.81421],\n              [99.11737, 28.780554],\n              [99.114346, 28.765863],\n              [99.133832, 28.734795],\n              [99.126889, 28.699517],\n              [99.140887, 28.68221],\n              [99.147383, 28.641031],\n              [99.162277, 28.635735],\n              [99.159253, 28.621108],\n              [99.172804, 28.613793],\n              [99.167093, 28.59521],\n              [99.183779, 28.588903],\n              [99.170116, 28.565185],\n              [99.172132, 28.545164],\n              [99.191618, 28.493073],\n              [99.183443, 28.472701],\n              [99.18725, 28.439862],\n              [99.165525, 28.424449],\n              [99.175828, 28.400863],\n              [99.201137, 28.377439],\n              [99.200913, 28.364377],\n              [99.230365, 28.349965],\n              [99.238429, 28.317004],\n              [99.280648, 28.298031],\n              [99.289495, 28.286056],\n              [99.281544, 28.259908],\n              [99.299574, 28.259064],\n              [99.306741, 28.227593],\n              [99.3456, 28.20447],\n              [99.361055, 28.181087],\n              [99.375949, 28.180834],\n              [99.402378, 28.150691],\n              [99.389164, 28.181425],\n              [99.386924, 28.210293],\n              [99.405962, 28.262523],\n              [99.417608, 28.266741],\n              [99.413801, 28.292803],\n              [99.393083, 28.317762],\n              [99.408985, 28.331673],\n              [99.40697, 28.357804],\n              [99.420856, 28.36876],\n              [99.437318, 28.398504],\n              [99.430935, 28.416195],\n              [99.417832, 28.4167],\n              [99.404506, 28.444241],\n              [99.426455, 28.452578],\n              [99.414025, 28.476826],\n              [99.395659, 28.493157],\n              [99.402826, 28.514199],\n              [99.394539, 28.524213],\n              [99.402938, 28.545753],\n              [99.426791, 28.555259],\n              [99.463411, 28.549202],\n              [99.466099, 28.579736],\n              [99.497007, 28.602863],\n              [99.496672, 28.616231],\n              [99.518173, 28.613793],\n              [99.540795, 28.623546],\n              [99.542586, 28.670614],\n              [99.531724, 28.680025],\n              [99.553785, 28.710438],\n              [99.601044, 28.726396],\n              [99.615826, 28.742185],\n              [99.605859, 28.771572],\n              [99.622545, 28.795243],\n              [99.625569, 28.814713],\n              [99.678427, 28.810266],\n              [99.700601, 28.835019],\n              [99.719527, 28.844751],\n              [99.72367, 28.810769],\n              [99.722774, 28.755956],\n              [99.736437, 28.734711],\n              [99.733189, 28.719509],\n              [99.756482, 28.700357],\n              [99.794446, 28.699097],\n              [99.841705, 28.653218],\n              [99.834538, 28.628085],\n              [99.873285, 28.631784],\n              [99.875973, 28.611439],\n              [99.91864, 28.599079],\n              [99.961531, 28.561568],\n              [99.964443, 28.539611],\n              [99.987065, 28.524465],\n              [99.990312, 28.476658],\n              [100.000839, 28.464955],\n              [100.045186, 28.446178],\n              [100.060864, 28.447694],\n              [100.074639, 28.424365],\n              [100.060976, 28.405833],\n              [100.054257, 28.376597],\n              [100.099948, 28.359405],\n              [100.134552, 28.351651],\n              [100.172628, 28.321135],\n              [100.168708, 28.296345],\n              [100.147543, 28.288755],\n              [100.188418, 28.252737],\n              [100.163445, 28.2335],\n              [100.168148, 28.220758],\n              [100.153366, 28.208268],\n              [100.10286, 28.201769],\n              [100.091997, 28.182354],\n              [100.061984, 28.193834],\n              [100.050337, 28.181763],\n              [100.033315, 28.184633],\n              [100.021109, 28.147398],\n              [100.039699, 28.130592],\n              [100.061536, 28.082776]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 513400,\n        \"name\": \"凉山彝族自治州\",\n        \"center\": [102.258746, 27.886762],\n        \"centroid\": [102.08054, 27.889541],\n        \"childrenNum\": 17,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 20,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.61389, 28.597313],\n              [103.585893, 28.614886],\n              [103.560696, 28.606899],\n              [103.530571, 28.612196],\n              [103.531803, 28.597649],\n              [103.504142, 28.560306],\n              [103.479057, 28.547099],\n              [103.42967, 28.531786],\n              [103.421831, 28.511506],\n              [103.438629, 28.500059],\n              [103.441541, 28.477331],\n              [103.43303, 28.452915],\n              [103.388347, 28.420659],\n              [103.370205, 28.423354],\n              [103.35699, 28.440872],\n              [103.339968, 28.443483],\n              [103.313875, 28.485581],\n              [103.299541, 28.521604],\n              [103.287782, 28.533048],\n              [103.253962, 28.541209],\n              [103.246571, 28.549791],\n              [103.242875, 28.59336],\n              [103.272776, 28.613121],\n              [103.287334, 28.655319],\n              [103.30626, 28.681958],\n              [103.31074, 28.702037],\n              [103.333585, 28.721861],\n              [103.334817, 28.743108],\n              [103.3085, 28.761749],\n              [103.270984, 28.805986],\n              [103.23862, 28.813538],\n              [103.225069, 28.803971],\n              [103.189905, 28.827887],\n              [103.153957, 28.82923],\n              [103.112522, 28.812364],\n              [103.107482, 28.771907],\n              [103.070527, 28.73681],\n              [103.066047, 28.688511],\n              [103.051265, 28.66969],\n              [103.032451, 28.665824],\n              [102.996503, 28.679941],\n              [102.990904, 28.672379],\n              [102.962571, 28.681118],\n              [102.938157, 28.740001],\n              [102.944205, 28.76645],\n              [102.925279, 28.801873],\n              [102.926287, 28.820168],\n              [102.941741, 28.860521],\n              [102.928079, 28.896415],\n              [102.946221, 28.920058],\n              [102.942413, 28.944115],\n              [102.913632, 28.999918],\n              [102.909041, 29.021612],\n              [102.922143, 29.037941],\n              [102.957755, 29.052008],\n              [102.970074, 29.065068],\n              [102.931326, 29.112941],\n              [102.928639, 29.127332],\n              [102.944877, 29.19006],\n              [102.974553, 29.222162],\n              [102.962795, 29.250828],\n              [103.02002, 29.250744],\n              [103.031779, 29.27982],\n              [103.003894, 29.287171],\n              [102.962347, 29.301871],\n              [102.940397, 29.302874],\n              [102.9124, 29.264531],\n              [102.905457, 29.222245],\n              [102.879812, 29.206112],\n              [102.836585, 29.208035],\n              [102.833113, 29.241886],\n              [102.804556, 29.249908],\n              [102.781487, 29.236705],\n              [102.766817, 29.18705],\n              [102.778575, 29.173336],\n              [102.772192, 29.159621],\n              [102.740388, 29.153348],\n              [102.69828, 29.167064],\n              [102.673419, 29.161544],\n              [102.649006, 29.177601],\n              [102.653373, 29.188053],\n              [102.635791, 29.210793],\n              [102.618993, 29.209707],\n              [102.590884, 29.191983],\n              [102.600515, 29.169991],\n              [102.594692, 29.160039],\n              [102.563, 29.159955],\n              [102.552697, 29.150671],\n              [102.559864, 29.133606],\n              [102.547657, 29.116957],\n              [102.522236, 29.111602],\n              [102.514845, 29.09361],\n              [102.524476, 29.077457],\n              [102.517757, 29.058454],\n              [102.525484, 29.036267],\n              [102.507006, 29.025883],\n              [102.497823, 29.003269],\n              [102.471506, 28.983834],\n              [102.46613, 28.969339],\n              [102.482929, 28.932716],\n              [102.481473, 28.920142],\n              [102.454148, 28.873606],\n              [102.429846, 28.845422],\n              [102.381804, 28.855572],\n              [102.352351, 28.854566],\n              [102.319763, 28.883082],\n              [102.29087, 28.899685],\n              [102.253802, 28.898763],\n              [102.22155, 28.962217],\n              [102.180898, 29.013404],\n              [102.188961, 29.024626],\n              [102.16522, 29.036518],\n              [102.14999, 29.031158],\n              [102.099708, 28.98065],\n              [102.058384, 28.954088],\n              [102.050993, 28.920477],\n              [102.00631, 28.907567],\n              [101.988392, 28.88803],\n              [101.98548, 28.857585],\n              [101.962747, 28.824027],\n              [101.989288, 28.80372],\n              [101.997799, 28.750162],\n              [102.022772, 28.723373],\n              [102.018069, 28.713965],\n              [101.985032, 28.702877],\n              [101.946621, 28.67137],\n              [101.928031, 28.640947],\n              [101.918736, 28.612616],\n              [101.904289, 28.606562],\n              [101.874165, 28.613121],\n              [101.832393, 28.594033],\n              [101.753554, 28.533889],\n              [101.757138, 28.49341],\n              [101.745827, 28.453672],\n              [101.731829, 28.434556],\n              [101.730709, 28.410635],\n              [101.715479, 28.380894],\n              [101.667548, 28.351819],\n              [101.631712, 28.354854],\n              [101.620177, 28.374911],\n              [101.591621, 28.358056],\n              [101.56228, 28.333106],\n              [101.509758, 28.314727],\n              [101.482097, 28.318521],\n              [101.46821, 28.404317],\n              [101.454436, 28.411056],\n              [101.439654, 28.471691],\n              [101.425543, 28.489538],\n              [101.373021, 28.461756],\n              [101.36787, 28.472449],\n              [101.383996, 28.482888],\n              [101.413001, 28.521099],\n              [101.427559, 28.505025],\n              [101.469218, 28.50553],\n              [101.473698, 28.499049],\n              [101.515357, 28.494083],\n              [101.569895, 28.474216],\n              [101.594532, 28.475227],\n              [101.62992, 28.491558],\n              [101.617714, 28.509402],\n              [101.620177, 28.537676],\n              [101.591844, 28.555427],\n              [101.575382, 28.58226],\n              [101.550745, 28.599415],\n              [101.516925, 28.58924],\n              [101.489824, 28.626824],\n              [101.472914, 28.631532],\n              [101.445813, 28.625479],\n              [101.427223, 28.646326],\n              [101.367646, 28.629262],\n              [101.369213, 28.647755],\n              [101.356223, 28.66616],\n              [101.297542, 28.673135],\n              [101.277048, 28.66574],\n              [101.229677, 28.66658],\n              [101.202576, 28.652714],\n              [101.209183, 28.700609],\n              [101.200224, 28.717409],\n              [101.20504, 28.754948],\n              [101.189922, 28.762085],\n              [101.173123, 28.788696],\n              [101.171668, 28.836445],\n              [101.192609, 28.891133],\n              [101.180851, 28.905471],\n              [101.183986, 28.941265],\n              [101.160357, 28.946965],\n              [101.145351, 28.999751],\n              [101.155877, 29.017759],\n              [101.142327, 29.031326],\n              [101.138855, 29.053515],\n              [101.116346, 29.070593],\n              [101.118362, 29.111937],\n              [101.09742, 29.146573],\n              [101.056881, 29.166395],\n              [101.050273, 29.145652],\n              [101.010182, 29.12683],\n              [100.959563, 29.074109],\n              [100.929103, 29.061217],\n              [100.936382, 29.087919],\n              [100.922384, 29.099468],\n              [100.924735, 29.119802],\n              [100.916336, 29.139881],\n              [100.883412, 29.146405],\n              [100.837497, 29.112941],\n              [100.802557, 29.107837],\n              [100.772432, 29.087668],\n              [100.77288, 29.063812],\n              [100.786431, 29.057868],\n              [100.832458, 29.055357],\n              [100.845784, 29.02069],\n              [100.820475, 28.993049],\n              [100.797518, 28.989279],\n              [100.779264, 29.010389],\n              [100.714199, 29.005195],\n              [100.704792, 28.997322],\n              [100.680155, 29.014158],\n              [100.65003, 29.01935],\n              [100.658093, 29.005447],\n              [100.63424, 28.990117],\n              [100.609155, 28.954591],\n              [100.577014, 28.945456],\n              [100.544762, 28.955261],\n              [100.521357, 28.949646],\n              [100.530316, 28.924417],\n              [100.543082, 28.91704],\n              [100.541738, 28.889791],\n              [100.558536, 28.86136],\n              [100.5638, 28.833425],\n              [100.586533, 28.821426],\n              [100.579926, 28.797929],\n              [100.594708, 28.743948],\n              [100.562792, 28.749574],\n              [100.539946, 28.736726],\n              [100.508814, 28.708674],\n              [100.472082, 28.70859],\n              [100.472418, 28.696493],\n              [100.49112, 28.694812],\n              [100.523708, 28.671118],\n              [100.526284, 28.643048],\n              [100.520125, 28.616568],\n              [100.530428, 28.574101],\n              [100.514973, 28.559633],\n              [100.506014, 28.524213],\n              [100.49112, 28.500312],\n              [100.449909, 28.474722],\n              [100.439606, 28.448199],\n              [100.4162, 28.433209],\n              [100.423928, 28.420153],\n              [100.420792, 28.38654],\n              [100.398618, 28.359405],\n              [100.390331, 28.324929],\n              [100.416424, 28.306464],\n              [100.413849, 28.290779],\n              [100.372861, 28.250459],\n              [100.367822, 28.206242],\n              [100.380252, 28.187925],\n              [100.38742, 28.133463],\n              [100.401754, 28.096464],\n              [100.404666, 28.073143],\n              [100.426839, 28.019468],\n              [100.418104, 28.005601],\n              [100.396715, 28.005516],\n              [100.380812, 28.015494],\n              [100.349008, 28.017354],\n              [100.337025, 28.010167],\n              [100.302981, 28.009829],\n              [100.270505, 27.966358],\n              [100.25617, 27.961283],\n              [100.234445, 27.971011],\n              [100.225822, 27.987165],\n              [100.201744, 27.984205],\n              [100.100284, 28.047957],\n              [100.072063, 28.08548],\n              [100.061536, 28.082776],\n              [100.086733, 28.030374],\n              [100.12089, 28.018707],\n              [100.142615, 27.991817],\n              [100.196145, 27.93734],\n              [100.16994, 27.907637],\n              [100.210479, 27.877248],\n              [100.25785, 27.864972],\n              [100.294918, 27.869544],\n              [100.30914, 27.859129],\n              [100.30858, 27.830421],\n              [100.286071, 27.805856],\n              [100.302869, 27.792386],\n              [100.307125, 27.748658],\n              [100.299509, 27.736113],\n              [100.32773, 27.720429],\n              [100.344416, 27.734333],\n              [100.3508, 27.755947],\n              [100.374765, 27.754591],\n              [100.377005, 27.775608],\n              [100.392795, 27.787556],\n              [100.411609, 27.815683],\n              [100.415192, 27.840923],\n              [100.443189, 27.866242],\n              [100.478017, 27.857859],\n              [100.495599, 27.844649],\n              [100.504334, 27.852016],\n              [100.511166, 27.827626],\n              [100.536587, 27.824661],\n              [100.546442, 27.808567],\n              [100.55988, 27.824153],\n              [100.607027, 27.855996],\n              [100.609043, 27.876232],\n              [100.634688, 27.915338],\n              [100.654958, 27.910853],\n              [100.679819, 27.924224],\n              [100.704456, 27.886814],\n              [100.699865, 27.86912],\n              [100.719462, 27.858283],\n              [100.708152, 27.842278],\n              [100.707032, 27.801366],\n              [100.73962, 27.774507],\n              [100.749923, 27.772897],\n              [100.775456, 27.743064],\n              [100.781503, 27.693635],\n              [100.789007, 27.684391],\n              [100.836489, 27.681677],\n              [100.848472, 27.670905],\n              [100.832346, 27.650207],\n              [100.850488, 27.640705],\n              [100.828202, 27.615758],\n              [100.855303, 27.62365],\n              [100.854071, 27.596662],\n              [100.86807, 27.591824],\n              [100.912081, 27.521689],\n              [100.901554, 27.486265],\n              [100.90133, 27.453379],\n              [100.921264, 27.47131],\n              [100.93683, 27.469101],\n              [100.957212, 27.43825],\n              [100.951836, 27.427199],\n              [101.001783, 27.349303],\n              [101.020261, 27.344454],\n              [101.010182, 27.312292],\n              [101.030004, 27.294591],\n              [101.0281, 27.266586],\n              [101.042546, 27.247003],\n              [101.038963, 27.233464],\n              [101.059568, 27.198629],\n              [101.082526, 27.195051],\n              [101.118698, 27.20868],\n              [101.170436, 27.195648],\n              [101.168084, 27.165232],\n              [101.197425, 27.18321],\n              [101.246027, 27.179205],\n              [101.283095, 27.197607],\n              [101.293174, 27.189599],\n              [101.315571, 27.197522],\n              [101.334721, 27.179546],\n              [101.355215, 27.184658],\n              [101.394299, 27.145206],\n              [101.41412, 27.162164],\n              [101.426999, 27.190792],\n              [101.419048, 27.215835],\n              [101.470674, 27.238829],\n              [101.495759, 27.228014],\n              [101.514685, 27.229802],\n              [101.530475, 27.277823],\n              [101.55836, 27.295357],\n              [101.584229, 27.334671],\n              [101.598452, 27.340456],\n              [101.635408, 27.33952],\n              [101.633728, 27.327949],\n              [101.659261, 27.313569],\n              [101.664748, 27.288888],\n              [101.643135, 27.24513],\n              [101.65075, 27.208169],\n              [101.681994, 27.150404],\n              [101.708759, 27.129012],\n              [101.744483, 27.124835],\n              [101.761729, 27.133444],\n              [101.803725, 27.114691],\n              [101.817387, 27.101732],\n              [101.833065, 27.122619],\n              [101.870357, 27.129694],\n              [101.879204, 27.168129],\n              [101.862966, 27.182784],\n              [101.878196, 27.189855],\n              [101.878084, 27.222734],\n              [101.886259, 27.255603],\n              [101.896786, 27.267096],\n              [101.912241, 27.243683],\n              [101.903618, 27.218561],\n              [101.914368, 27.213195],\n              [101.908433, 27.192666],\n              [101.922095, 27.180654],\n              [101.941021, 27.143842],\n              [101.927247, 27.137109],\n              [101.938782, 27.104034],\n              [101.97305, 27.122619],\n              [101.993879, 27.115202],\n              [102.000263, 27.096873],\n              [102.025908, 27.093462],\n              [102.034083, 27.076152],\n              [102.049761, 27.082718],\n              [102.081566, 27.129268],\n              [102.086269, 27.146484],\n              [102.114826, 27.159437],\n              [102.122665, 27.171878],\n              [102.161077, 27.182187],\n              [102.176419, 27.137535],\n              [102.203296, 27.131398],\n              [102.210351, 27.11776],\n              [102.2407, 27.106592],\n              [102.238684, 27.064298],\n              [102.217518, 27.04596],\n              [102.230173, 27.000485],\n              [102.214495, 26.957297],\n              [102.229165, 26.945174],\n              [102.225917, 26.923999],\n              [102.205312, 26.91042],\n              [102.214159, 26.889153],\n              [102.204976, 26.85216],\n              [102.202288, 26.840795],\n              [102.215615, 26.813617],\n              [102.192657, 26.820455],\n              [102.18213, 26.812591],\n              [102.174179, 26.802419],\n              [102.189857, 26.791904],\n              [102.175075, 26.774975],\n              [102.192993, 26.763602],\n              [102.195681, 26.744616],\n              [102.175859, 26.726568],\n              [102.178883, 26.708346],\n              [102.157605, 26.692346],\n              [102.157045, 26.680708],\n              [102.135543, 26.674718],\n              [102.132296, 26.637741],\n              [102.114714, 26.63406],\n              [102.084477, 26.654519],\n              [102.068351, 26.656659],\n              [102.073502, 26.670867],\n              [102.054801, 26.692688],\n              [102.063088, 26.718613],\n              [102.04573, 26.737517],\n              [102.033187, 26.712367],\n              [102.006534, 26.716388],\n              [101.997463, 26.698849],\n              [101.995559, 26.653577],\n              [101.984024, 26.638854],\n              [102.001383, 26.633632],\n              [102.011125, 26.598525],\n              [102.030611, 26.596898],\n              [102.038562, 26.571717],\n              [102.034083, 26.541133],\n              [102.050769, 26.49417],\n              [102.033411, 26.470768],\n              [102.029491, 26.434068],\n              [102.020196, 26.422832],\n              [101.994999, 26.431409],\n              [101.982121, 26.454906],\n              [101.942701, 26.448989],\n              [101.929039, 26.419487],\n              [101.939118, 26.410824],\n              [101.927583, 26.362263],\n              [101.935198, 26.322954],\n              [101.926015, 26.306213],\n              [101.921759, 26.27032],\n              [101.90205, 26.243521],\n              [101.906753, 26.191367],\n              [101.872261, 26.181483],\n              [101.840681, 26.16008],\n              [101.844712, 26.141683],\n              [101.832282, 26.117176],\n              [101.839897, 26.082429],\n              [101.835417, 26.045865],\n              [101.858039, 26.049392],\n              [101.881668, 26.072364],\n              [101.899698, 26.099202],\n              [101.922879, 26.107975],\n              [101.954684, 26.084494],\n              [102.020756, 26.096278],\n              [102.052561, 26.075547],\n              [102.084253, 26.065138],\n              [102.107771, 26.068235],\n              [102.117066, 26.086128],\n              [102.130056, 26.086386],\n              [102.136999, 26.108319],\n              [102.152342, 26.109609],\n              [102.175075, 26.147013],\n              [102.1996, 26.158447],\n              [102.241708, 26.188617],\n              [102.244955, 26.210874],\n              [102.257386, 26.220068],\n              [102.282807, 26.220154],\n              [102.351007, 26.245927],\n              [102.396138, 26.297627],\n              [102.440149, 26.300632],\n              [102.542954, 26.340121],\n              [102.551577, 26.362178],\n              [102.571063, 26.362607],\n              [102.629408, 26.33686],\n              [102.638591, 26.307673],\n              [102.611266, 26.282343],\n              [102.601299, 26.249019],\n              [102.620113, 26.245755],\n              [102.659197, 26.221442],\n              [102.674539, 26.205374],\n              [102.719782, 26.218177],\n              [102.721686, 26.239999],\n              [102.73994, 26.268602],\n              [102.761889, 26.275301],\n              [102.785183, 26.298915],\n              [102.833449, 26.306642],\n              [102.867493, 26.339005],\n              [102.88026, 26.366125],\n              [102.89325, 26.338834],\n              [102.926847, 26.334628],\n              [102.975561, 26.340894],\n              [102.998183, 26.371874],\n              [102.988328, 26.409023],\n              [102.997735, 26.459622],\n              [102.990344, 26.483027],\n              [103.031891, 26.486884],\n              [103.057088, 26.528109],\n              [103.053505, 26.554242],\n              [103.036706, 26.555355],\n              [103.019348, 26.590047],\n              [103.029651, 26.601694],\n              [103.024164, 26.639795],\n              [103.028195, 26.659569],\n              [103.00591, 26.677456],\n              [103.009605, 26.70732],\n              [102.996727, 26.724943],\n              [102.98396, 26.764799],\n              [102.991799, 26.774633],\n              [102.964474, 26.839428],\n              [102.947452, 26.844299],\n              [102.896498, 26.912556],\n              [102.888883, 26.954565],\n              [102.895266, 26.999802],\n              [102.871301, 27.02796],\n              [102.898962, 27.076323],\n              [102.913744, 27.134637],\n              [102.902209, 27.195903],\n              [102.90165, 27.235763],\n              [102.883284, 27.258242],\n              [102.882164, 27.293314],\n              [102.900082, 27.317653],\n              [102.911392, 27.349133],\n              [102.941405, 27.40552],\n              [102.955292, 27.411386],\n              [102.97097, 27.377628],\n              [102.985304, 27.367337],\n              [103.033347, 27.388003],\n              [103.055632, 27.409516],\n              [103.079598, 27.397272],\n              [103.111514, 27.401013],\n              [103.14455, 27.425584],\n              [103.14455, 27.450574],\n              [103.190353, 27.523472],\n              [103.204464, 27.529163],\n              [103.218126, 27.562111],\n              [103.236156, 27.570431],\n              [103.278711, 27.561856],\n              [103.293606, 27.564743],\n              [103.299205, 27.597171],\n              [103.280391, 27.617964],\n              [103.314547, 27.655297],\n              [103.349711, 27.678454],\n              [103.370093, 27.708644],\n              [103.39305, 27.709407],\n              [103.420935, 27.742979],\n              [103.448148, 27.7551],\n              [103.464722, 27.782472],\n              [103.489584, 27.797384],\n              [103.509181, 27.84033],\n              [103.499998, 27.877502],\n              [103.502574, 27.91043],\n              [103.526315, 27.940555],\n              [103.563943, 27.964159],\n              [103.563271, 27.977693],\n              [103.54065, 27.965766],\n              [103.516685, 27.965259],\n              [103.498879, 27.984121],\n              [103.496527, 28.016593],\n              [103.48824, 28.032403],\n              [103.459459, 28.021412],\n              [103.43247, 28.041279],\n              [103.432918, 28.072213],\n              [103.453636, 28.087677],\n              [103.454979, 28.12375],\n              [103.47021, 28.122145],\n              [103.533147, 28.168508],\n              [103.552633, 28.191302],\n              [103.573238, 28.230884],\n              [103.608178, 28.239069],\n              [103.632368, 28.259992],\n              [103.649502, 28.25704],\n              [103.694745, 28.227256],\n              [103.702024, 28.198983],\n              [103.721286, 28.202022],\n              [103.739987, 28.236032],\n              [103.770336, 28.2335],\n              [103.78579, 28.254087],\n              [103.813003, 28.265138],\n              [103.828906, 28.28496],\n              [103.870229, 28.301067],\n              [103.875604, 28.322147],\n              [103.853431, 28.356708],\n              [103.859814, 28.383506],\n              [103.851303, 28.40676],\n              [103.829801, 28.436325],\n              [103.830249, 28.458388],\n              [103.810428, 28.49543],\n              [103.781983, 28.524549],\n              [103.75701, 28.522782],\n              [103.739987, 28.51201],\n              [103.724533, 28.471522],\n              [103.685002, 28.497955],\n              [103.689929, 28.519332],\n              [103.712999, 28.541294],\n              [103.712551, 28.552904],\n              [103.689257, 28.562578],\n              [103.665404, 28.594874],\n              [103.639983, 28.604881],\n              [103.61389, 28.597313]\n            ]\n          ],\n          [\n            [\n              [101.91672, 26.703127],\n              [101.913024, 26.680537],\n              [101.920528, 26.635515],\n              [101.938782, 26.639367],\n              [101.946509, 26.707662],\n              [101.91672, 26.703127]\n            ]\n          ]\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/lego-map/example/DrillMapDemo/demo1.tsx",
    "content": "import React from 'react';\nimport { DrillMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <DrillMap style={{ width: '100%', height: 900 }} />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/DrillMapDemo/demo2.tsx",
    "content": "import React from 'react';\nimport { DrillMap } from '@td-design/lego-map';\n\nexport default () => {\n  return (\n    <DrillMap enableDrill={false} style={{ width: '100%', height: 900 }} />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/DrillMapDemo/demo3.tsx",
    "content": "import React from 'react';\nimport { DrillMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <DrillMap adcode=\"510000\" style={{ width: '100%', height: 900 }} />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/DrillMapDemo/demo4.tsx",
    "content": "import React from 'react';\nimport { DrillMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <DrillMap adcode=\"510000\" style={{ width: '100%', height: 900 }} simple />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/DrillMapDemo/demo5.tsx",
    "content": "import React from 'react';\nimport { DrillMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <DrillMap style={{ width: '100%', height: 900 }} />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/SimpleMapDemo/demo1.tsx",
    "content": "import { SimpleMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <SimpleMap style={{ width: '100%', height: 900 }} />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/SimpleMapDemo/demo2.tsx",
    "content": "import { SimpleMap } from '@td-design/lego-map';\nimport sichuan from './sichuan.json';\n\nexport default () => {\n  return (\n    <SimpleMap\n      mapName=\"sichuan\"\n      mapJson={sichuan}\n      style={{ width: '100%', height: 400 }}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/SimpleMapDemo/demo3.tsx",
    "content": "import { SimpleMap } from '@td-design/lego-map';\nimport sichuan from './sichuan.json';\n\nexport default () => {\n  return (\n    <SimpleMap\n      mapName=\"sichuan\"\n      mapJson={sichuan}\n      showLabel={false}\n      style={{ width: '100%', height: 400 }}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/SimpleMapDemo/demo4.tsx",
    "content": "import { SimpleMap } from '@td-design/lego-map';\nimport sichuan from './sichuan.json';\n\nexport default () => {\n  return (\n    <SimpleMap\n      mapName=\"sichuan\"\n      mapJson={sichuan}\n      silent\n      style={{ width: '100%', height: 400 }}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/SimpleMapDemo/demo5.tsx",
    "content": "import { SimpleMap } from '@td-design/lego-map';\n\nexport default () => {\n  const data = [\n    [104.075045, 30.663774, 10],\n    [104.689584, 31.476866, 10],\n    [106.55408, 29.578697, 10],\n    [108.94113, 34.352069, 10],\n    [116.382836, 39.926047, 10],\n    [103.799085, 36.114321, 10],\n    [114.285544, 30.65433, 10],\n    [106.669064, 26.696559, 10],\n    [113.218501, 23.2084522, 10],\n    [118.802027, 32.095359, 10],\n    [121.423696, 31.320051, 10],\n  ];\n\n  return (\n    <SimpleMap\n      config={{\n        tooltip: {},\n        series: [\n          {\n            type: 'effectScatter',\n            coordinateSystem: 'geo',\n            zlevel: 2,\n            rippleEffect: {\n              //涟漪特效\n              period: 2, //动画时间，值越小速度越快\n              brushType: 'stroke', //波纹绘制方式 stroke, fill\n              scale: 2, //波纹圆环最大限制，值越大波纹越大\n            },\n            symbol: 'circle',\n            symbolSize: 20,\n            itemStyle: {\n              color: '#f00',\n            },\n            data,\n          },\n        ],\n      }}\n      style={{ width: '100%', height: 900 }}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-map/example/SimpleMapDemo/demo6.tsx",
    "content": "import { SimpleMap } from '@td-design/lego-map';\n\nexport default () => {\n  return <SimpleMap style={{ width: '100%', height: 900 }} top={80} zoom={1.2} />;\n};\n"
  },
  {
    "path": "packages/lego-map/example/SimpleMapDemo/sichuan.json",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510100,\n        \"name\": \"成都市\",\n        \"center\": [104.065735, 30.659462],\n        \"centroid\": [103.931804, 30.652329],\n        \"childrenNum\": 20,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 0,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.959259, 30.320742],\n              [103.965866, 30.316774],\n              [103.974713, 30.290727],\n              [103.998343, 30.264508],\n              [104.030035, 30.266245],\n              [104.030035, 30.266245],\n              [104.047393, 30.270381],\n              [104.091628, 30.24879],\n              [104.116601, 30.227194],\n              [104.150533, 30.245646],\n              [104.152213, 30.265335],\n              [104.174051, 30.298666],\n              [104.17853, 30.318262],\n              [104.192977, 30.329836],\n              [104.2016, 30.316526],\n              [104.232284, 30.313798],\n              [104.2315, 30.282209],\n              [104.232732, 30.281878],\n              [104.23318, 30.281051],\n              [104.231836, 30.280472],\n              [104.243371, 30.267403],\n              [104.23094, 30.256153],\n              [104.243259, 30.244239],\n              [104.264537, 30.241592],\n              [104.2726, 30.217842],\n              [104.282231, 30.220904],\n              [104.315379, 30.200792],\n              [104.327138, 30.204269],\n              [104.364541, 30.185974],\n              [104.358158, 30.173638],\n              [104.386379, 30.161798],\n              [104.39881, 30.124776],\n              [104.41012, 30.125521],\n              [104.428374, 30.089729],\n              [104.450212, 30.101081],\n              [104.437109, 30.107544],\n              [104.457715, 30.120634],\n              [104.449428, 30.132894],\n              [104.464994, 30.151529],\n              [104.468354, 30.157077],\n              [104.485264, 30.156001],\n              [104.484368, 30.181504],\n              [104.533754, 30.193673],\n              [104.541594, 30.184236],\n              [104.569254, 30.196985],\n              [104.600163, 30.220408],\n              [104.599603, 30.244488],\n              [104.653133, 30.240185],\n              [104.638239, 30.268148],\n              [104.643614, 30.283036],\n              [104.691993, 30.275427],\n              [104.703975, 30.301643],\n              [104.723797, 30.308341],\n              [104.738579, 30.290314],\n              [104.774863, 30.30156],\n              [104.795133, 30.279397],\n              [104.807228, 30.296847],\n              [104.823354, 30.293787],\n              [104.848775, 30.306852],\n              [104.850455, 30.338929],\n              [104.837016, 30.361988],\n              [104.855494, 30.347194],\n              [104.860982, 30.364384],\n              [104.881027, 30.360831],\n              [104.895922, 30.382315],\n              [104.881699, 30.393551],\n              [104.875092, 30.437078],\n              [104.8761, 30.5131],\n              [104.892786, 30.541645],\n              [104.879124, 30.550635],\n              [104.858854, 30.582385],\n              [104.819098, 30.580076],\n              [104.819994, 30.598296],\n              [104.847319, 30.631101],\n              [104.842728, 30.649395],\n              [104.821226, 30.643874],\n              [104.818315, 30.664307],\n              [104.800956, 30.690995],\n              [104.78875, 30.694043],\n              [104.788526, 30.721299],\n              [104.768032, 30.71817],\n              [104.750786, 30.726898],\n              [104.732084, 30.778257],\n              [104.718086, 30.771756],\n              [104.698376, 30.825559],\n              [104.640366, 30.837895],\n              [104.629952, 30.852449],\n              [104.613937, 30.847763],\n              [104.596355, 30.864535],\n              [104.585269, 30.862891],\n              [104.520764, 30.882456],\n              [104.533083, 30.917875],\n              [104.511917, 30.935868],\n              [104.495791, 30.935457],\n              [104.465218, 30.9509],\n              [104.44506, 30.940468],\n              [104.39601, 30.942358],\n              [104.389739, 30.925681],\n              [104.367117, 30.93365],\n              [104.351887, 30.902345],\n              [104.322322, 30.891743],\n              [104.288726, 30.90292],\n              [104.244491, 30.896921],\n              [104.21571, 30.8984],\n              [104.202384, 30.91311],\n              [104.168787, 30.918533],\n              [104.149974, 30.91311],\n              [104.142582, 30.925845],\n              [104.166324, 30.951311],\n              [104.166884, 30.993438],\n              [104.143478, 31.01158],\n              [104.117385, 31.017572],\n              [104.10697, 31.032263],\n              [104.107194, 31.032017],\n              [104.106522, 31.031607],\n              [104.10641, 31.031771],\n              [104.094876, 31.032756],\n              [104.060608, 31.0641],\n              [104.057584, 31.07821],\n              [104.019844, 31.103963],\n              [104.022868, 31.142661],\n              [104.009429, 31.153235],\n              [104.014693, 31.167577],\n              [103.983, 31.200925],\n              [103.949404, 31.215997],\n              [103.929134, 31.234425],\n              [103.928014, 31.272497],\n              [103.914128, 31.278964],\n              [103.891618, 31.308017],\n              [103.894418, 31.326018],\n              [103.92835, 31.355139],\n              [103.894754, 31.408858],\n              [103.897554, 31.416377],\n              [103.868437, 31.420954],\n              [103.828682, 31.412454],\n              [103.816027, 31.431906],\n              [103.802588, 31.430108],\n              [103.787246, 31.434439],\n              [103.75029, 31.419156],\n              [103.739876, 31.398885],\n              [103.700792, 31.391118],\n              [103.669323, 31.354812],\n              [103.627104, 31.344097],\n              [103.60717, 31.351295],\n              [103.569543, 31.338453],\n              [103.569991, 31.314563],\n              [103.579733, 31.291241],\n              [103.569095, 31.262019],\n              [103.581413, 31.246626],\n              [103.57671, 31.215834],\n              [103.583205, 31.191422],\n              [103.564839, 31.175034],\n              [103.557224, 31.149055],\n              [103.525644, 31.101092],\n              [103.521164, 31.067792],\n              [103.504814, 31.041044],\n              [103.517132, 31.030129],\n              [103.52094, 31.005095],\n              [103.516461, 30.971761],\n              [103.465058, 30.941536],\n              [103.454644, 30.924695],\n              [103.451396, 30.892565],\n              [103.409401, 30.864946],\n              [103.383084, 30.862891],\n              [103.354527, 30.850887],\n              [103.337617, 30.824655],\n              [103.305252, 30.810507],\n              [103.284647, 30.829589],\n              [103.25833, 30.842418],\n              [103.228653, 30.836579],\n              [103.199088, 30.845707],\n              [103.165716, 30.842171],\n              [103.123945, 30.79282],\n              [103.083629, 30.812728],\n              [103.037938, 30.802364],\n              [102.992919, 30.778339],\n              [103.005126, 30.74649],\n              [103.033907, 30.719076],\n              [103.031331, 30.703678],\n              [103.068735, 30.716194],\n              [103.103115, 30.672957],\n              [103.119017, 30.670898],\n              [103.13156, 30.65475],\n              [103.135591, 30.624096],\n              [103.126856, 30.593927],\n              [103.147798, 30.585847],\n              [103.166276, 30.555749],\n              [103.157765, 30.530013],\n              [103.180834, 30.525228],\n              [103.185874, 30.511945],\n              [103.162244, 30.472579],\n              [103.141751, 30.470845],\n              [103.12596, 30.451115],\n              [103.115993, 30.413954],\n              [103.116329, 30.380002],\n              [103.127976, 30.367111],\n              [103.091132, 30.326529],\n              [103.079038, 30.324545],\n              [103.062128, 30.302553],\n              [103.068623, 30.294283],\n              [103.061456, 30.270464],\n              [103.071534, 30.260951],\n              [103.076798, 30.220242],\n              [103.147238, 30.207],\n              [103.183634, 30.248128],\n              [103.211631, 30.232407],\n              [103.215998, 30.209235],\n              [103.233356, 30.213456],\n              [103.242651, 30.243081],\n              [103.282295, 30.263598],\n              [103.313875, 30.260372],\n              [103.320259, 30.23489],\n              [103.350047, 30.236048],\n              [103.370317, 30.22827],\n              [103.36091, 30.168008],\n              [103.372109, 30.148382],\n              [103.360574, 30.136787],\n              [103.395178, 30.094866],\n              [103.439637, 30.119474],\n              [103.439637, 30.119557],\n              [103.443893, 30.120054],\n              [103.443893, 30.117486],\n              [103.4505, 30.096524],\n              [103.462483, 30.096027],\n              [103.468082, 30.114255],\n              [103.450948, 30.132231],\n              [103.474577, 30.131237],\n              [103.486224, 30.104147],\n              [103.504142, 30.128503],\n              [103.533819, 30.146643],\n              [103.544233, 30.161218],\n              [103.533819, 30.178109],\n              [103.597204, 30.203524],\n              [103.617473, 30.195412],\n              [103.628, 30.214863],\n              [103.649502, 30.199799],\n              [103.648046, 30.229263],\n              [103.693065, 30.245894],\n              [103.681754, 30.269885],\n              [103.705271, 30.268975],\n              [103.718374, 30.283201],\n              [103.736516, 30.285848],\n              [103.727893, 30.30462],\n              [103.75141, 30.307927],\n              [103.769776, 30.332068],\n              [103.794749, 30.345872],\n              [103.845368, 30.34331],\n              [103.87426, 30.348104],\n              [103.887699, 30.328761],\n              [103.910432, 30.330663],\n              [103.913904, 30.353972],\n              [103.942237, 30.357773],\n              [103.93563, 30.346203],\n              [103.959259, 30.320742]\n            ]\n          ],\n          [\n            [\n              [104.107194, 31.032017],\n              [104.10697, 31.032263],\n              [104.10641, 31.031771],\n              [104.106522, 31.031607],\n              [104.107194, 31.032017]\n            ]\n          ],\n          [\n            [\n              [103.443893, 30.120054],\n              [103.439637, 30.119557],\n              [103.439637, 30.119474],\n              [103.443893, 30.117486],\n              [103.443893, 30.120054]\n            ]\n          ],\n          [\n            [\n              [104.232732, 30.281878],\n              [104.2315, 30.282209],\n              [104.231836, 30.280472],\n              [104.23318, 30.281051],\n              [104.232732, 30.281878]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510300,\n        \"name\": \"自贡市\",\n        \"center\": [104.773447, 29.352765],\n        \"centroid\": [104.685446, 29.28421],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 1,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.17685, 29.195745],\n              [104.195888, 29.220657],\n              [104.191409, 29.235869],\n              [104.23262, 29.205861],\n              [104.256026, 29.212298],\n              [104.265433, 29.231857],\n              [104.249082, 29.261356],\n              [104.284582, 29.259601],\n              [104.298805, 29.245647],\n              [104.323218, 29.2408],\n              [104.368685, 29.247652],\n              [104.380332, 29.238376],\n              [104.411688, 29.245479],\n              [104.417735, 29.236454],\n              [104.442597, 29.238543],\n              [104.434646, 29.220908],\n              [104.460963, 29.221827],\n              [104.46589, 29.207366],\n              [104.509453, 29.155522],\n              [104.540922, 29.143394],\n              [104.580117, 29.164639],\n              [104.596355, 29.190394],\n              [104.62424, 29.207282],\n              [104.649325, 29.198588],\n              [104.691993, 29.19934],\n              [104.692329, 29.177099],\n              [104.680346, 29.15569],\n              [104.697816, 29.118212],\n              [104.714614, 29.122396],\n              [104.73018, 29.106498],\n              [104.737236, 29.078796],\n              [104.713718, 29.06105],\n              [104.705207, 29.045477],\n              [104.720214, 28.996651],\n              [104.744067, 28.990369],\n              [104.76512, 28.998746],\n              [104.796701, 29.000086],\n              [104.811931, 28.990704],\n              [104.819546, 29.001761],\n              [104.85751, 29.003436],\n              [104.861542, 29.019685],\n              [104.879684, 29.024291],\n              [104.881475, 29.050836],\n              [104.902529, 29.047738],\n              [104.941837, 29.058873],\n              [104.944636, 29.021277],\n              [104.969722, 29.015749],\n              [104.986296, 28.991541],\n              [105.00511, 28.989866],\n              [105.017316, 28.972104],\n              [105.073758, 28.936404],\n              [105.111162, 28.933722],\n              [105.126952, 28.945288],\n              [105.145094, 28.942271],\n              [105.162116, 28.947467],\n              [105.167715, 28.92995],\n              [105.201871, 28.929279],\n              [105.205007, 28.951825],\n              [105.217214, 28.95568],\n              [105.225837, 28.934644],\n              [105.244763, 28.937745],\n              [105.254282, 28.9271],\n              [105.267608, 28.939086],\n              [105.239723, 28.956937],\n              [105.267384, 28.979561],\n              [105.269288, 29.009719],\n              [105.234348, 29.026636],\n              [105.214974, 29.016168],\n              [105.187873, 29.027306],\n              [105.188769, 29.056613],\n              [105.207359, 29.070258],\n              [105.250138, 29.119969],\n              [105.244987, 29.135196],\n              [105.271752, 29.160123],\n              [105.256521, 29.17526],\n              [105.266936, 29.188638],\n              [105.23558, 29.215475],\n              [105.217998, 29.20561],\n              [105.195488, 29.222078],\n              [105.203999, 29.23963],\n              [105.160548, 29.262776],\n              [105.134903, 29.257429],\n              [105.113961, 29.284999],\n              [105.120121, 29.302205],\n              [105.108922, 29.315568],\n              [105.072526, 29.336359],\n              [105.063679, 29.364659],\n              [105.035346, 29.382937],\n              [105.046881, 29.408721],\n              [105.079469, 29.406886],\n              [105.084285, 29.42232],\n              [105.063119, 29.442923],\n              [105.067823, 29.454349],\n              [105.044305, 29.480865],\n              [105.030643, 29.472527],\n              [105.04061, 29.461938],\n              [105.020564, 29.454432],\n              [105.026947, 29.439587],\n              [104.993127, 29.438669],\n              [104.961882, 29.416647],\n              [104.937133, 29.445425],\n              [104.917647, 29.434332],\n              [104.871957, 29.459019],\n              [104.873972, 29.47086],\n              [104.848775, 29.467858],\n              [104.833657, 29.430495],\n              [104.808796, 29.457018],\n              [104.786398, 29.457518],\n              [104.777327, 29.448177],\n              [104.750786, 29.453598],\n              [104.741155, 29.432414],\n              [104.751458, 29.402631],\n              [104.766128, 29.406469],\n              [104.759969, 29.374759],\n              [104.738132, 29.381936],\n              [104.745411, 29.36324],\n              [104.710919, 29.361404],\n              [104.704423, 29.372255],\n              [104.674299, 29.38227],\n              [104.673403, 29.398709],\n              [104.652461, 29.411141],\n              [104.619761, 29.444758],\n              [104.587956, 29.422987],\n              [104.569814, 29.441172],\n              [104.558728, 29.431913],\n              [104.543945, 29.441005],\n              [104.535658, 29.418566],\n              [104.510013, 29.456767],\n              [104.53465, 29.456601],\n              [104.529611, 29.518876],\n              [104.501726, 29.549958],\n              [104.482912, 29.562872],\n              [104.493551, 29.582613],\n              [104.488847, 29.601435],\n              [104.474065, 29.609262],\n              [104.442933, 29.600102],\n              [104.421767, 29.616423],\n              [104.39489, 29.621002],\n              [104.381787, 29.607264],\n              [104.383579, 29.584196],\n              [104.340688, 29.565704],\n              [104.334193, 29.583113],\n              [104.309332, 29.607347],\n              [104.280551, 29.613925],\n              [104.269576, 29.632491],\n              [104.249754, 29.636154],\n              [104.251098, 29.623084],\n              [104.212239, 29.61251],\n              [104.182226, 29.633407],\n              [104.16722, 29.597854],\n              [104.139895, 29.589693],\n              [104.166884, 29.55729],\n              [104.160948, 29.541876],\n              [104.135079, 29.52096],\n              [104.151093, 29.52221],\n              [104.165988, 29.496538],\n              [104.16666, 29.496455],\n              [104.16666, 29.496371],\n              [104.166324, 29.495955],\n              [104.150309, 29.472027],\n              [104.149526, 29.47061],\n              [104.14919, 29.470776],\n              [104.14919, 29.472277],\n              [104.128472, 29.498289],\n              [104.08838, 29.461687],\n              [104.064191, 29.472361],\n              [104.052656, 29.456684],\n              [104.058256, 29.425907],\n              [104.098347, 29.437168],\n              [104.105962, 29.414895],\n              [104.0923, 29.416397],\n              [104.090172, 29.391616],\n              [104.100811, 29.382186],\n              [104.131272, 29.400378],\n              [104.134967, 29.399043],\n              [104.141126, 29.374508],\n              [104.160836, 29.379933],\n              [104.163412, 29.364158],\n              [104.142022, 29.355644],\n              [104.135415, 29.338781],\n              [104.105626, 29.338864],\n              [104.083229, 29.348298],\n              [104.07651, 29.323584],\n              [104.09174, 29.315317],\n              [104.139447, 29.307467],\n              [104.14639, 29.283829],\n              [104.116377, 29.263946],\n              [104.109658, 29.241886],\n              [104.118393, 29.236454],\n              [104.14359, 29.256844],\n              [104.150981, 29.22726],\n              [104.150645, 29.194157],\n              [104.17685, 29.195745]\n            ]\n          ],\n          [\n            [\n              [104.150309, 29.472027],\n              [104.14919, 29.472277],\n              [104.14919, 29.470776],\n              [104.149526, 29.47061],\n              [104.150309, 29.472027]\n            ]\n          ],\n          [\n            [\n              [104.16666, 29.496455],\n              [104.165988, 29.496538],\n              [104.166324, 29.495955],\n              [104.16666, 29.496371],\n              [104.16666, 29.496455]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510400,\n        \"name\": \"攀枝花市\",\n        \"center\": [101.716007, 26.580446],\n        \"centroid\": [101.625394, 26.755869],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 2,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [101.839897, 26.082429],\n              [101.832282, 26.117176],\n              [101.844712, 26.141683],\n              [101.840681, 26.16008],\n              [101.872261, 26.181483],\n              [101.906753, 26.191367],\n              [101.90205, 26.243521],\n              [101.921759, 26.27032],\n              [101.926015, 26.306213],\n              [101.935198, 26.322954],\n              [101.927583, 26.362263],\n              [101.939118, 26.410824],\n              [101.929039, 26.419487],\n              [101.942701, 26.448989],\n              [101.982121, 26.454906],\n              [101.994999, 26.431409],\n              [102.020196, 26.422832],\n              [102.029491, 26.434068],\n              [102.033411, 26.470768],\n              [102.050769, 26.49417],\n              [102.034083, 26.541133],\n              [102.038562, 26.571717],\n              [102.030611, 26.596898],\n              [102.011125, 26.598525],\n              [102.001383, 26.633632],\n              [101.984024, 26.638854],\n              [101.995559, 26.653577],\n              [101.997463, 26.698849],\n              [101.977081, 26.711084],\n              [101.981897, 26.735892],\n              [101.971706, 26.735464],\n              [101.960171, 26.710143],\n              [101.946509, 26.707662],\n              [101.938782, 26.639367],\n              [101.920528, 26.635515],\n              [101.913024, 26.680537],\n              [101.91672, 26.703127],\n              [101.912688, 26.723318],\n              [101.861398, 26.724173],\n              [101.838889, 26.744958],\n              [101.834297, 26.763516],\n              [101.819963, 26.765227],\n              [101.81358, 26.793272],\n              [101.772704, 26.82413],\n              [101.731157, 26.835924],\n              [101.707528, 26.873691],\n              [101.70148, 26.902051],\n              [101.704952, 26.933477],\n              [101.698904, 26.944406],\n              [101.744931, 26.970614],\n              [101.773488, 26.99289],\n              [101.77248, 27.006544],\n              [101.805852, 27.056366],\n              [101.809212, 27.088858],\n              [101.817387, 27.101732],\n              [101.803725, 27.114691],\n              [101.761729, 27.133444],\n              [101.744483, 27.124835],\n              [101.708759, 27.129012],\n              [101.681994, 27.150404],\n              [101.65075, 27.208169],\n              [101.643135, 27.24513],\n              [101.664748, 27.288888],\n              [101.659261, 27.313569],\n              [101.633728, 27.327949],\n              [101.635408, 27.33952],\n              [101.598452, 27.340456],\n              [101.584229, 27.334671],\n              [101.55836, 27.295357],\n              [101.530475, 27.277823],\n              [101.514685, 27.229802],\n              [101.495759, 27.228014],\n              [101.470674, 27.238829],\n              [101.419048, 27.215835],\n              [101.426999, 27.190792],\n              [101.41412, 27.162164],\n              [101.394299, 27.145206],\n              [101.355215, 27.184658],\n              [101.334721, 27.179546],\n              [101.315571, 27.197522],\n              [101.293174, 27.189599],\n              [101.283095, 27.197607],\n              [101.246027, 27.179205],\n              [101.197425, 27.18321],\n              [101.168084, 27.165232],\n              [101.145351, 27.103779],\n              [101.157221, 27.094826],\n              [101.137399, 27.022329],\n              [101.227213, 26.984441],\n              [101.227101, 26.958919],\n              [101.264505, 26.955504],\n              [101.255546, 26.923913],\n              [101.267753, 26.90299],\n              [101.293958, 26.896157],\n              [101.31154, 26.902905],\n              [101.323299, 26.888299],\n              [101.365406, 26.883686],\n              [101.374701, 26.865318],\n              [101.399674, 26.840453],\n              [101.372013, 26.800367],\n              [101.379852, 26.786432],\n              [101.357791, 26.770614],\n              [101.390267, 26.750004],\n              [101.389707, 26.723146],\n              [101.421624, 26.726312],\n              [101.43607, 26.740596],\n              [101.457124, 26.729733],\n              [101.459139, 26.747353],\n              [101.445925, 26.774205],\n              [101.465747, 26.786688],\n              [101.513341, 26.768562],\n              [101.510654, 26.754452],\n              [101.492176, 26.746412],\n              [101.498895, 26.732214],\n              [101.472802, 26.721436],\n              [101.454548, 26.703641],\n              [101.4541, 26.691148],\n              [101.481201, 26.673177],\n              [101.461043, 26.640737],\n              [101.461939, 26.606746],\n              [101.452084, 26.601009],\n              [101.400234, 26.605119],\n              [101.39609, 26.592017],\n              [101.406617, 26.556383],\n              [101.422967, 26.531708],\n              [101.438422, 26.538477],\n              [101.439766, 26.512684],\n              [101.458691, 26.495456],\n              [101.506958, 26.499656],\n              [101.530027, 26.467252],\n              [101.565639, 26.454563],\n              [101.588149, 26.425834],\n              [101.635632, 26.396069],\n              [101.631488, 26.359517],\n              [101.660605, 26.346816],\n              [101.640335, 26.318833],\n              [101.660381, 26.310849],\n              [101.646942, 26.305183],\n              [101.621073, 26.312824],\n              [101.597444, 26.303466],\n              [101.585797, 26.283888],\n              [101.59442, 26.261559],\n              [101.616706, 26.249792],\n              [101.630368, 26.224879],\n              [101.649966, 26.234244],\n              [101.67158, 26.231838],\n              [101.690057, 26.241717],\n              [101.705064, 26.224449],\n              [101.735748, 26.219982],\n              [101.773152, 26.168247],\n              [101.807644, 26.156298],\n              [101.797229, 26.142198],\n              [101.796558, 26.114769],\n              [101.819515, 26.087074],\n              [101.839897, 26.082429]\n            ]\n          ],\n          [\n            [\n              [102.18213, 26.812591],\n              [102.156261, 26.847717],\n              [102.159845, 26.855151],\n              [102.204976, 26.85216],\n              [102.214159, 26.889153],\n              [102.205312, 26.91042],\n              [102.225917, 26.923999],\n              [102.229165, 26.945174],\n              [102.214495, 26.957297],\n              [102.230173, 27.000485],\n              [102.217518, 27.04596],\n              [102.238684, 27.064298],\n              [102.2407, 27.106592],\n              [102.210351, 27.11776],\n              [102.203296, 27.131398],\n              [102.176419, 27.137535],\n              [102.161077, 27.182187],\n              [102.122665, 27.171878],\n              [102.114826, 27.159437],\n              [102.086269, 27.146484],\n              [102.081566, 27.129268],\n              [102.049761, 27.082718],\n              [102.034083, 27.076152],\n              [102.025908, 27.093462],\n              [102.000263, 27.096873],\n              [101.993879, 27.115202],\n              [101.97305, 27.122619],\n              [101.938782, 27.104034],\n              [101.927247, 27.137109],\n              [101.941021, 27.143842],\n              [101.922095, 27.180654],\n              [101.908433, 27.192666],\n              [101.914368, 27.213195],\n              [101.903618, 27.218561],\n              [101.912241, 27.243683],\n              [101.896786, 27.267096],\n              [101.886259, 27.255603],\n              [101.878084, 27.222734],\n              [101.878196, 27.189855],\n              [101.862966, 27.182784],\n              [101.879204, 27.168129],\n              [101.870357, 27.129694],\n              [101.833065, 27.122619],\n              [101.817387, 27.101732],\n              [101.809212, 27.088858],\n              [101.805852, 27.056366],\n              [101.77248, 27.006544],\n              [101.773488, 26.99289],\n              [101.744931, 26.970614],\n              [101.698904, 26.944406],\n              [101.704952, 26.933477],\n              [101.70148, 26.902051],\n              [101.707528, 26.873691],\n              [101.731157, 26.835924],\n              [101.772704, 26.82413],\n              [101.81358, 26.793272],\n              [101.819963, 26.765227],\n              [101.834297, 26.763516],\n              [101.838889, 26.744958],\n              [101.861398, 26.724173],\n              [101.912688, 26.723318],\n              [101.91672, 26.703127],\n              [101.946509, 26.707662],\n              [101.960171, 26.710143],\n              [101.971706, 26.735464],\n              [101.981897, 26.735892],\n              [101.977081, 26.711084],\n              [101.997463, 26.698849],\n              [102.006534, 26.716388],\n              [102.033187, 26.712367],\n              [102.04573, 26.737517],\n              [102.063088, 26.718613],\n              [102.054801, 26.692688],\n              [102.073502, 26.670867],\n              [102.068351, 26.656659],\n              [102.084477, 26.654519],\n              [102.114714, 26.63406],\n              [102.132296, 26.637741],\n              [102.135543, 26.674718],\n              [102.157045, 26.680708],\n              [102.157605, 26.692346],\n              [102.178883, 26.708346],\n              [102.175859, 26.726568],\n              [102.195681, 26.744616],\n              [102.192993, 26.763602],\n              [102.175075, 26.774975],\n              [102.189857, 26.791904],\n              [102.174179, 26.802419],\n              [102.18213, 26.812591]\n            ]\n          ],\n          [\n            [\n              [102.204976, 26.85216],\n              [102.159845, 26.855151],\n              [102.156261, 26.847717],\n              [102.18213, 26.812591],\n              [102.192657, 26.820455],\n              [102.215615, 26.813617],\n              [102.202288, 26.840795],\n              [102.204976, 26.85216]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510500,\n        \"name\": \"泸州市\",\n        \"center\": [105.443348, 28.889138],\n        \"childrenNum\": 7,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 3,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.420135, 29.314399],\n              [105.395274, 29.308553],\n              [105.389002, 29.286502],\n              [105.386203, 29.284832],\n              [105.384747, 29.283579],\n              [105.384747, 29.283328],\n              [105.383403, 29.281991],\n              [105.368621, 29.285918],\n              [105.366493, 29.287839],\n              [105.365149, 29.292684],\n              [105.364141, 29.291932],\n              [105.339392, 29.281741],\n              [105.318226, 29.263612],\n              [105.287542, 29.218233],\n              [105.281495, 29.188471],\n              [105.266936, 29.188638],\n              [105.256521, 29.17526],\n              [105.271752, 29.160123],\n              [105.244987, 29.135196],\n              [105.250138, 29.119969],\n              [105.207359, 29.070258],\n              [105.188769, 29.056613],\n              [105.187873, 29.027306],\n              [105.214974, 29.016168],\n              [105.234348, 29.026636],\n              [105.269288, 29.009719],\n              [105.267384, 28.979561],\n              [105.239723, 28.956937],\n              [105.267608, 28.939086],\n              [105.254282, 28.9271],\n              [105.244763, 28.937745],\n              [105.225837, 28.934644],\n              [105.217214, 28.95568],\n              [105.205007, 28.951825],\n              [105.201871, 28.929279],\n              [105.167715, 28.92995],\n              [105.162116, 28.947467],\n              [105.145094, 28.942271],\n              [105.166483, 28.9271],\n              [105.177682, 28.907148],\n              [105.203999, 28.896751],\n              [105.202879, 28.869748],\n              [105.21531, 28.818405],\n              [105.225725, 28.807748],\n              [105.2311, 28.777448],\n              [105.240507, 28.774846],\n              [105.204111, 28.746635],\n              [105.216878, 28.739078],\n              [105.219342, 28.715813],\n              [105.203887, 28.709514],\n              [105.21139, 28.696325],\n              [105.201312, 28.673555],\n              [105.167939, 28.65036],\n              [105.172083, 28.607908],\n              [105.207807, 28.569055],\n              [105.203439, 28.548192],\n              [105.226285, 28.540536],\n              [105.237483, 28.523455],\n              [105.234012, 28.49341],\n              [105.206687, 28.457041],\n              [105.191121, 28.445757],\n              [105.228748, 28.449631],\n              [105.229532, 28.451483],\n              [105.230652, 28.450978],\n              [105.2311, 28.449378],\n              [105.295269, 28.449041],\n              [105.293813, 28.435651],\n              [105.32013, 28.427987],\n              [105.32293, 28.386371],\n              [105.3077, 28.371541],\n              [105.287654, 28.369181],\n              [105.306692, 28.359321],\n              [105.310611, 28.339597],\n              [105.336928, 28.313378],\n              [105.331553, 28.292634],\n              [105.339168, 28.280236],\n              [105.333121, 28.256533],\n              [105.348463, 28.205314],\n              [105.344767, 28.185646],\n              [105.358094, 28.153478],\n              [105.350255, 28.140811],\n              [105.275335, 28.134392],\n              [105.224493, 28.099843],\n              [105.225613, 28.098999],\n              [105.225725, 28.09883],\n              [105.226957, 28.094859],\n              [105.226061, 28.094183],\n              [105.220237, 28.091901],\n              [105.204111, 28.073396],\n              [105.17701, 28.066889],\n              [105.18373, 28.040349],\n              [105.167603, 28.023611],\n              [105.184401, 27.996468],\n              [105.215534, 27.990548],\n              [105.246219, 28.009237],\n              [105.270856, 27.995792],\n              [105.269848, 27.978961],\n              [105.283398, 27.959929],\n              [105.280935, 27.929132],\n              [105.264137, 27.91153],\n              [105.248906, 27.912969],\n              [105.234908, 27.898919],\n              [105.250138, 27.844818],\n              [105.244763, 27.822544],\n              [105.27052, 27.818139],\n              [105.314195, 27.81941],\n              [105.313187, 27.81077],\n              [105.287766, 27.807042],\n              [105.273879, 27.795266],\n              [105.292917, 27.771287],\n              [105.287878, 27.742386],\n              [105.290566, 27.712459],\n              [105.309603, 27.705676],\n              [105.327073, 27.727042],\n              [105.339952, 27.729077],\n              [105.353838, 27.748828],\n              [105.368957, 27.749421],\n              [105.440181, 27.77527],\n              [105.458211, 27.767897],\n              [105.477137, 27.774846],\n              [105.517788, 27.764931],\n              [105.537498, 27.753744],\n              [105.550488, 27.72611],\n              [105.60413, 27.71619],\n              [105.604018, 27.700758],\n              [105.619025, 27.687614],\n              [105.623392, 27.667088],\n              [105.643102, 27.659963],\n              [105.66438, 27.683882],\n              [105.702007, 27.676927],\n              [105.721045, 27.684815],\n              [105.722837, 27.705846],\n              [105.784206, 27.719158],\n              [105.842888, 27.705337],\n              [105.868309, 27.732552],\n              [105.921279, 27.747048],\n              [105.929902, 27.728144],\n              [105.985448, 27.74976],\n              [106.023075, 27.746963],\n              [106.062383, 27.763321],\n              [106.063727, 27.777134],\n              [106.12756, 27.778659],\n              [106.19352, 27.754422],\n              [106.224653, 27.760948],\n              [106.268552, 27.782133],\n              [106.295989, 27.803145],\n              [106.341792, 27.820172],\n              [106.317154, 27.838721],\n              [106.34, 27.86531],\n              [106.325889, 27.879364],\n              [106.325777, 27.897988],\n              [106.304836, 27.899342],\n              [106.308083, 27.936748],\n              [106.328353, 27.957983],\n              [106.294309, 28.003656],\n              [106.268888, 28.003318],\n              [106.246266, 28.012027],\n              [106.244139, 28.030543],\n              [106.265528, 28.049816],\n              [106.266648, 28.066551],\n              [106.25153, 28.090296],\n              [106.231484, 28.097985],\n              [106.226221, 28.115894],\n              [106.207071, 28.134223],\n              [106.145254, 28.162851],\n              [106.122072, 28.167073],\n              [106.093515, 28.162682],\n              [106.060927, 28.143007],\n              [106.027219, 28.131267],\n              [106.036514, 28.110741],\n              [106.01322, 28.119949],\n              [105.976153, 28.108038],\n              [105.970777, 28.131267],\n              [105.945244, 28.143513],\n              [105.936957, 28.132281],\n              [105.903697, 28.129156],\n              [105.895186, 28.11978],\n              [105.876036, 28.128227],\n              [105.8785, 28.139037],\n              [105.860918, 28.159558],\n              [105.870996, 28.201937],\n              [105.889026, 28.238479],\n              [105.874244, 28.254593],\n              [105.862709, 28.248941],\n              [105.845687, 28.259908],\n              [105.823402, 28.306885],\n              [105.797645, 28.312366],\n              [105.785662, 28.336478],\n              [105.771328, 28.319449],\n              [105.78667, 28.308825],\n              [105.740643, 28.304862],\n              [105.738627, 28.277284],\n              [105.730004, 28.272139],\n              [105.688569, 28.284369],\n              [105.670091, 28.310427],\n              [105.639518, 28.32417],\n              [105.654861, 28.362355],\n              [105.643326, 28.431524],\n              [105.612529, 28.438936],\n              [105.619361, 28.463608],\n              [105.609842, 28.473964],\n              [105.627984, 28.507802],\n              [105.684649, 28.534563],\n              [105.683417, 28.557867],\n              [105.69316, 28.588567],\n              [105.720709, 28.590585],\n              [105.747474, 28.615895],\n              [105.757665, 28.590333],\n              [105.78499, 28.611103],\n              [105.798429, 28.603199],\n              [105.884995, 28.595463],\n              [105.905937, 28.611019],\n              [105.890258, 28.62136],\n              [105.895634, 28.64372],\n              [105.889474, 28.67053],\n              [105.904817, 28.669606],\n              [105.935613, 28.681874],\n              [105.934269, 28.703633],\n              [105.955883, 28.713881],\n              [105.967754, 28.761665],\n              [105.979288, 28.746551],\n              [106.008965, 28.738238],\n              [106.030802, 28.695064],\n              [106.080413, 28.686327],\n              [106.10337, 28.636071],\n              [106.144582, 28.644729],\n              [106.165747, 28.636239],\n              [106.192064, 28.577802],\n              [106.236187, 28.560138],\n              [106.254889, 28.539443],\n              [106.292629, 28.537339],\n              [106.305396, 28.50452],\n              [106.330705, 28.48213],\n              [106.378859, 28.479689],\n              [106.373036, 28.526906],\n              [106.350191, 28.5402],\n              [106.34224, 28.532627],\n              [106.332049, 28.55324],\n              [106.346607, 28.583773],\n              [106.324546, 28.616736],\n              [106.329809, 28.634054],\n              [106.304052, 28.649856],\n              [106.321522, 28.664648],\n              [106.308531, 28.672547],\n              [106.305172, 28.704221],\n              [106.287702, 28.732359],\n              [106.273143, 28.739833],\n              [106.267656, 28.779295],\n              [106.252426, 28.785842],\n              [106.244363, 28.814629],\n              [106.264856, 28.846093],\n              [106.206959, 28.904548],\n              [106.173474, 28.920813],\n              [106.149173, 28.901949],\n              [106.101243, 28.898931],\n              [106.070558, 28.919807],\n              [106.04928, 28.906393],\n              [106.039426, 28.917711],\n              [106.043793, 28.954172],\n              [106.017476, 28.952915],\n              [106.000902, 28.974031],\n              [105.970217, 28.966071],\n              [105.944012, 28.939589],\n              [105.909744, 28.920477],\n              [105.90952, 28.900188],\n              [105.889362, 28.909495],\n              [105.888019, 28.926848],\n              [105.875028, 28.933973],\n              [105.852742, 28.927351],\n              [105.830457, 28.944283],\n              [105.797533, 28.935901],\n              [105.803804, 28.947635],\n              [105.788238, 28.978221],\n              [105.761921, 28.993049],\n              [105.765952, 29.013906],\n              [105.744563, 29.046649],\n              [105.757777, 29.06624],\n              [105.729892, 29.098799],\n              [105.735156, 29.122396],\n              [105.752066, 29.129758],\n              [105.728884, 29.134443],\n              [105.721381, 29.169573],\n              [105.704471, 29.175678],\n              [105.711974, 29.218902],\n              [105.693944, 29.267539],\n              [105.695176, 29.287338],\n              [105.715894, 29.290846],\n              [105.705031, 29.299199],\n              [105.678042, 29.27347],\n              [105.665164, 29.276561],\n              [105.666507, 29.252917],\n              [105.647581, 29.253251],\n              [105.631791, 29.280404],\n              [105.607938, 29.255758],\n              [105.609506, 29.272719],\n              [105.583301, 29.270379],\n              [105.558328, 29.278483],\n              [105.51846, 29.264447],\n              [105.509165, 29.285416],\n              [105.476241, 29.279235],\n              [105.465378, 29.29235],\n              [105.466498, 29.32158],\n              [105.420135, 29.314399]\n            ]\n          ],\n          [\n            [\n              [105.225613, 28.098999],\n              [105.224493, 28.099843],\n              [105.220237, 28.091901],\n              [105.226061, 28.094183],\n              [105.226957, 28.094859],\n              [105.225725, 28.09883],\n              [105.225613, 28.098999]\n            ]\n          ],\n          [\n            [\n              [105.384747, 29.283579],\n              [105.384747, 29.283328],\n              [105.383403, 29.281991],\n              [105.386203, 29.284832],\n              [105.384747, 29.283579]\n            ]\n          ],\n          [\n            [\n              [105.230652, 28.450978],\n              [105.229532, 28.451483],\n              [105.228748, 28.449631],\n              [105.2311, 28.449378],\n              [105.230652, 28.450978]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510600,\n        \"name\": \"德阳市\",\n        \"center\": [104.398651, 31.127991],\n        \"centroid\": [104.436756, 31.128701],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 4,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.168723, 30.706395],\n              [105.157972, 30.706313],\n              [105.156517, 30.732496],\n              [105.118329, 30.750276],\n              [105.115865, 30.759247],\n              [105.081149, 30.755873],\n              [105.07051, 30.771756],\n              [105.025267, 30.781878],\n              [104.998502, 30.805901],\n              [104.987192, 30.843076],\n              [104.992007, 30.870125],\n              [104.960427, 30.865029],\n              [104.967482, 30.894949],\n              [104.945308, 30.897496],\n              [104.947436, 30.912124],\n              [104.931646, 30.945808],\n              [104.904769, 30.943425],\n              [104.906785, 30.940879],\n              [104.906449, 30.939975],\n              [104.906113, 30.939647],\n              [104.906001, 30.939647],\n              [104.903649, 30.943015],\n              [104.894578, 30.936936],\n              [104.893682, 30.936361],\n              [104.893682, 30.936197],\n              [104.89357, 30.934964],\n              [104.893458, 30.934964],\n              [104.891554, 30.936607],\n              [104.876772, 30.937347],\n              [104.87666, 30.936607],\n              [104.87666, 30.936279],\n              [104.875652, 30.934554],\n              [104.875316, 30.934718],\n              [104.875204, 30.935786],\n              [104.875204, 30.936114],\n              [104.875652, 30.937757],\n              [104.870165, 30.946465],\n              [104.841496, 30.946465],\n              [104.85471, 30.959442],\n              [104.846311, 30.981368],\n              [104.82593, 30.997625],\n              [104.83836, 31.013878],\n              [104.82593, 31.023564],\n              [104.819882, 31.064182],\n              [104.80678, 31.067135],\n              [104.774751, 31.099616],\n              [104.791885, 31.118394],\n              [104.788974, 31.130283],\n              [104.762321, 31.132004],\n              [104.757393, 31.144219],\n              [104.756385, 31.144383],\n              [104.75605, 31.14512],\n              [104.756721, 31.146104],\n              [104.743507, 31.167168],\n              [104.719654, 31.16266],\n              [104.713942, 31.216079],\n              [104.741939, 31.232623],\n              [104.74877, 31.275117],\n              [104.731524, 31.281174],\n              [104.724917, 31.271351],\n              [104.697256, 31.274298],\n              [104.677434, 31.266849],\n              [104.670827, 31.299998],\n              [104.658172, 31.311127],\n              [104.656829, 31.33109],\n              [104.586165, 31.357674],\n              [104.590532, 31.375665],\n              [104.585045, 31.402482],\n              [104.523676, 31.44261],\n              [104.496911, 31.407795],\n              [104.477313, 31.405588],\n              [104.478545, 31.385068],\n              [104.418295, 31.374847],\n              [104.387051, 31.382861],\n              [104.37574, 31.373784],\n              [104.358158, 31.386376],\n              [104.347407, 31.381798],\n              [104.326914, 31.399294],\n              [104.311011, 31.427738],\n              [104.285702, 31.436318],\n              [104.27092, 31.45936],\n              [104.236428, 31.463608],\n              [104.202944, 31.51457],\n              [104.185586, 31.520286],\n              [104.170579, 31.512366],\n              [104.155685, 31.519061],\n              [104.152325, 31.541755],\n              [104.16106, 31.55612],\n              [104.146054, 31.564934],\n              [104.132727, 31.605319],\n              [104.102715, 31.630602],\n              [104.098459, 31.648622],\n              [104.116937, 31.677724],\n              [104.09398, 31.693535],\n              [104.085917, 31.688075],\n              [104.040786, 31.697691],\n              [104.016037, 31.678539],\n              [103.989384, 31.68237],\n              [103.962842, 31.656612],\n              [103.928238, 31.639572],\n              [103.917376, 31.612089],\n              [103.923311, 31.60328],\n              [103.907409, 31.564444],\n              [103.915136, 31.538409],\n              [103.898226, 31.512856],\n              [103.857798, 31.53849],\n              [103.84212, 31.510896],\n              [103.795757, 31.471777],\n              [103.802588, 31.430108],\n              [103.816027, 31.431906],\n              [103.828682, 31.412454],\n              [103.868437, 31.420954],\n              [103.897554, 31.416377],\n              [103.894754, 31.408858],\n              [103.92835, 31.355139],\n              [103.894418, 31.326018],\n              [103.891618, 31.308017],\n              [103.914128, 31.278964],\n              [103.928014, 31.272497],\n              [103.929134, 31.234425],\n              [103.949404, 31.215997],\n              [103.983, 31.200925],\n              [104.014693, 31.167577],\n              [104.009429, 31.153235],\n              [104.022868, 31.142661],\n              [104.019844, 31.103963],\n              [104.057584, 31.07821],\n              [104.060608, 31.0641],\n              [104.094876, 31.032756],\n              [104.10641, 31.031771],\n              [104.10697, 31.032263],\n              [104.117385, 31.017572],\n              [104.143478, 31.01158],\n              [104.166884, 30.993438],\n              [104.166324, 30.951311],\n              [104.142582, 30.925845],\n              [104.149974, 30.91311],\n              [104.168787, 30.918533],\n              [104.202384, 30.91311],\n              [104.21571, 30.8984],\n              [104.244491, 30.896921],\n              [104.288726, 30.90292],\n              [104.322322, 30.891743],\n              [104.351887, 30.902345],\n              [104.367117, 30.93365],\n              [104.389739, 30.925681],\n              [104.39601, 30.942358],\n              [104.44506, 30.940468],\n              [104.465218, 30.9509],\n              [104.495791, 30.935457],\n              [104.511917, 30.935868],\n              [104.533083, 30.917875],\n              [104.520764, 30.882456],\n              [104.585269, 30.862891],\n              [104.596355, 30.864535],\n              [104.613937, 30.847763],\n              [104.629952, 30.852449],\n              [104.640366, 30.837895],\n              [104.698376, 30.825559],\n              [104.718086, 30.771756],\n              [104.732084, 30.778257],\n              [104.750786, 30.726898],\n              [104.768032, 30.71817],\n              [104.788526, 30.721299],\n              [104.78875, 30.694043],\n              [104.800956, 30.690995],\n              [104.818315, 30.664307],\n              [104.821226, 30.643874],\n              [104.842728, 30.649395],\n              [104.847319, 30.631101],\n              [104.819994, 30.598296],\n              [104.819098, 30.580076],\n              [104.858854, 30.582385],\n              [104.859078, 30.611321],\n              [104.878788, 30.617997],\n              [104.886403, 30.609343],\n              [104.910928, 30.625662],\n              [104.932206, 30.617091],\n              [104.93019, 30.601429],\n              [104.953371, 30.612475],\n              [104.970393, 30.586425],\n              [104.963226, 30.56746],\n              [104.983944, 30.529271],\n              [105.025043, 30.530178],\n              [105.022916, 30.546099],\n              [105.048449, 30.545192],\n              [105.066927, 30.53587],\n              [105.079021, 30.543129],\n              [105.094812, 30.584198],\n              [105.117657, 30.602913],\n              [105.130088, 30.624756],\n              [105.153829, 30.640249],\n              [105.142742, 30.653185],\n              [105.146998, 30.669168],\n              [105.161108, 30.672545],\n              [105.174547, 30.697666],\n              [105.168723, 30.706395]\n            ]\n          ],\n          [\n            [\n              [104.876772, 30.937347],\n              [104.875652, 30.937757],\n              [104.875204, 30.936114],\n              [104.875204, 30.935786],\n              [104.875316, 30.934718],\n              [104.875652, 30.934554],\n              [104.87666, 30.936279],\n              [104.87666, 30.936607],\n              [104.876772, 30.937347]\n            ]\n          ],\n          [\n            [\n              [104.894578, 30.936936],\n              [104.891554, 30.936607],\n              [104.893458, 30.934964],\n              [104.89357, 30.934964],\n              [104.893682, 30.936197],\n              [104.893682, 30.936361],\n              [104.894578, 30.936936]\n            ]\n          ],\n          [\n            [\n              [104.904769, 30.943425],\n              [104.903649, 30.943015],\n              [104.906001, 30.939647],\n              [104.906113, 30.939647],\n              [104.906449, 30.939975],\n              [104.906785, 30.940879],\n              [104.904769, 30.943425]\n            ]\n          ],\n          [\n            [\n              [104.756721, 31.146104],\n              [104.75605, 31.14512],\n              [104.756385, 31.144383],\n              [104.757393, 31.144219],\n              [104.756721, 31.146104]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510700,\n        \"name\": \"绵阳市\",\n        \"center\": [104.741722, 31.46402],\n        \"centroid\": [104.704392, 31.850919],\n        \"childrenNum\": 9,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 5,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.459219, 31.52698],\n              [105.416215, 31.558487],\n              [105.395834, 31.561588],\n              [105.393258, 31.618369],\n              [105.366269, 31.615596],\n              [105.333009, 31.630276],\n              [105.345103, 31.677235],\n              [105.317555, 31.702988],\n              [105.315315, 31.71855],\n              [105.284518, 31.700951],\n              [105.25361, 31.707306],\n              [105.284406, 31.72914],\n              [105.283062, 31.740218],\n              [105.311395, 31.744128],\n              [105.3077, 31.771327],\n              [105.288774, 31.793716],\n              [105.264137, 31.790541],\n              [105.262233, 31.77841],\n              [105.243755, 31.795181],\n              [105.251482, 31.816587],\n              [105.243195, 31.830014],\n              [105.205231, 31.837094],\n              [105.223261, 31.882078],\n              [105.203327, 31.90509],\n              [105.18317, 31.91135],\n              [105.205343, 31.945652],\n              [105.185185, 31.965399],\n              [105.187761, 31.983029],\n              [105.174211, 31.999518],\n              [105.194144, 31.996025],\n              [105.208591, 32.0117],\n              [105.215198, 32.004229],\n              [105.235692, 32.016492],\n              [105.25193, 31.982866],\n              [105.26436, 32.031514],\n              [105.250026, 32.033138],\n              [105.252602, 32.082651],\n              [105.286198, 32.108777],\n              [105.262569, 32.126623],\n              [105.28575, 32.139762],\n              [105.275111, 32.15598],\n              [105.251706, 32.16725],\n              [105.273096, 32.193189],\n              [105.240395, 32.204292],\n              [105.262233, 32.225198],\n              [105.252826, 32.236297],\n              [105.27052, 32.263027],\n              [105.268504, 32.27809],\n              [105.254394, 32.271611],\n              [105.238043, 32.287401],\n              [105.254954, 32.300679],\n              [105.247562, 32.32051],\n              [105.218894, 32.316059],\n              [105.208815, 32.306831],\n              [105.176674, 32.302621],\n              [105.112729, 32.310797],\n              [105.08742, 32.30335],\n              [105.082605, 32.283596],\n              [105.044865, 32.287563],\n              [105.032994, 32.265133],\n              [104.995255, 32.247557],\n              [105.00007, 32.266429],\n              [104.976553, 32.293069],\n              [104.964458, 32.297359],\n              [104.974649, 32.334592],\n              [104.940381, 32.333621],\n              [104.911712, 32.326175],\n              [104.884611, 32.355144],\n              [104.856278, 32.357329],\n              [104.840712, 32.35118],\n              [104.822458, 32.370434],\n              [104.804316, 32.374155],\n              [104.773856, 32.400116],\n              [104.775423, 32.414913],\n              [104.755938, 32.436336],\n              [104.761649, 32.445955],\n              [104.749218, 32.464623],\n              [104.759745, 32.493871],\n              [104.750002, 32.505341],\n              [104.754818, 32.52642],\n              [104.745971, 32.536351],\n              [104.709687, 32.553952],\n              [104.655933, 32.56049],\n              [104.651117, 32.579619],\n              [104.634207, 32.597211],\n              [104.618977, 32.600842],\n              [104.617745, 32.627464],\n              [104.635775, 32.668511],\n              [104.596355, 32.693259],\n              [104.582805, 32.72219],\n              [104.555144, 32.733792],\n              [104.526699, 32.728394],\n              [104.510237, 32.754495],\n              [104.458947, 32.748534],\n              [104.447524, 32.761743],\n              [104.422103, 32.768831],\n              [104.421655, 32.780588],\n              [104.371709, 32.805949],\n              [104.365325, 32.821564],\n              [104.330161, 32.824622],\n              [104.294325, 32.835728],\n              [104.28895, 32.870325],\n              [104.277079, 32.891317],\n              [104.247851, 32.877564],\n              [104.220302, 32.896143],\n              [104.217278, 32.908767],\n              [104.195664, 32.916888],\n              [104.158821, 32.956998],\n              [104.113466, 32.99982],\n              [104.069231, 33.003114],\n              [104.013461, 33.041258],\n              [103.986472, 33.034674],\n              [103.973705, 33.005122],\n              [103.978521, 32.985602],\n              [103.959371, 32.939879],\n              [103.965082, 32.922114],\n              [103.952988, 32.917451],\n              [103.958027, 32.888422],\n              [103.993975, 32.879334],\n              [103.994535, 32.861154],\n              [103.971466, 32.839671],\n              [104.004614, 32.814159],\n              [104.032387, 32.820357],\n              [104.035522, 32.833073],\n              [104.068895, 32.845224],\n              [104.079309, 32.856971],\n              [104.101035, 32.848201],\n              [104.108314, 32.800635],\n              [104.121305, 32.799911],\n              [104.146502, 32.756589],\n              [104.130152, 32.730327],\n              [104.155909, 32.711473],\n              [104.182786, 32.663431],\n              [104.177634, 32.607054],\n              [104.168451, 32.579377],\n              [104.174835, 32.531345],\n              [104.162292, 32.521332],\n              [104.144486, 32.473754],\n              [104.0951, 32.467694],\n              [104.132279, 32.492094],\n              [104.129368, 32.530457],\n              [104.084237, 32.569127],\n              [104.068335, 32.608426],\n              [104.065871, 32.631013],\n              [104.035634, 32.651578],\n              [104.007973, 32.641578],\n              [103.993303, 32.647788],\n              [103.922415, 32.635771],\n              [103.890387, 32.638997],\n              [103.877508, 32.621333],\n              [103.853095, 32.61367],\n              [103.84492, 32.584058],\n              [103.906961, 32.51051],\n              [103.902817, 32.496617],\n              [103.914576, 32.432699],\n              [103.889155, 32.364852],\n              [103.904497, 32.347053],\n              [103.898002, 32.341227],\n              [103.921295, 32.315411],\n              [103.960155, 32.304564],\n              [103.981768, 32.305617],\n              [104.022756, 32.265214],\n              [104.033507, 32.248691],\n              [104.066655, 32.249258],\n              [104.075838, 32.237513],\n              [104.131048, 32.223011],\n              [104.135751, 32.234677],\n              [104.162292, 32.250473],\n              [104.159828, 32.25995],\n              [104.182114, 32.308936],\n              [104.211455, 32.298412],\n              [104.209439, 32.285053],\n              [104.247515, 32.24942],\n              [104.257481, 32.214746],\n              [104.221757, 32.215394],\n              [104.18189, 32.196593],\n              [104.158821, 32.176491],\n              [104.156581, 32.158899],\n              [104.142134, 32.149655],\n              [104.152885, 32.125893],\n              [104.129032, 32.140248],\n              [104.100587, 32.125001],\n              [104.048961, 32.131408],\n              [103.994983, 32.118917],\n              [103.974713, 32.140897],\n              [103.938877, 32.146817],\n              [103.922527, 32.143087],\n              [103.897442, 32.155736],\n              [103.850743, 32.161331],\n              [103.855111, 32.126704],\n              [103.826778, 32.130354],\n              [103.82689, 32.114375],\n              [103.811995, 32.097987],\n              [103.824874, 32.07056],\n              [103.817147, 32.054732],\n              [103.795869, 32.045965],\n              [103.758241, 31.997894],\n              [103.754882, 31.964342],\n              [103.763617, 31.946384],\n              [103.817931, 31.939801],\n              [103.845704, 31.921187],\n              [103.876836, 31.917854],\n              [103.886131, 31.929234],\n              [103.920623, 31.942239],\n              [103.957691, 31.903545],\n              [103.975497, 31.85605],\n              [104.01738, 31.862232],\n              [104.030707, 31.846938],\n              [104.046497, 31.849297],\n              [104.061055, 31.829038],\n              [104.080093, 31.838639],\n              [104.127576, 31.828712],\n              [104.132951, 31.815936],\n              [104.152213, 31.815855],\n              [104.169795, 31.779876],\n              [104.171027, 31.732317],\n              [104.147734, 31.727104],\n              [104.142694, 31.715454],\n              [104.103163, 31.710321],\n              [104.09398, 31.693535],\n              [104.116937, 31.677724],\n              [104.098459, 31.648622],\n              [104.102715, 31.630602],\n              [104.132727, 31.605319],\n              [104.146054, 31.564934],\n              [104.16106, 31.55612],\n              [104.152325, 31.541755],\n              [104.155685, 31.519061],\n              [104.170579, 31.512366],\n              [104.185586, 31.520286],\n              [104.202944, 31.51457],\n              [104.236428, 31.463608],\n              [104.27092, 31.45936],\n              [104.285702, 31.436318],\n              [104.311011, 31.427738],\n              [104.326914, 31.399294],\n              [104.347407, 31.381798],\n              [104.358158, 31.386376],\n              [104.37574, 31.373784],\n              [104.387051, 31.382861],\n              [104.418295, 31.374847],\n              [104.478545, 31.385068],\n              [104.477313, 31.405588],\n              [104.496911, 31.407795],\n              [104.523676, 31.44261],\n              [104.585045, 31.402482],\n              [104.590532, 31.375665],\n              [104.586165, 31.357674],\n              [104.656829, 31.33109],\n              [104.658172, 31.311127],\n              [104.670827, 31.299998],\n              [104.677434, 31.266849],\n              [104.697256, 31.274298],\n              [104.724917, 31.271351],\n              [104.731524, 31.281174],\n              [104.74877, 31.275117],\n              [104.741939, 31.232623],\n              [104.713942, 31.216079],\n              [104.719654, 31.16266],\n              [104.743507, 31.167168],\n              [104.756721, 31.146104],\n              [104.757393, 31.144219],\n              [104.762321, 31.132004],\n              [104.788974, 31.130283],\n              [104.791885, 31.118394],\n              [104.774751, 31.099616],\n              [104.80678, 31.067135],\n              [104.819882, 31.064182],\n              [104.82593, 31.023564],\n              [104.83836, 31.013878],\n              [104.82593, 30.997625],\n              [104.846311, 30.981368],\n              [104.85471, 30.959442],\n              [104.841496, 30.946465],\n              [104.870165, 30.946465],\n              [104.875652, 30.937757],\n              [104.876772, 30.937347],\n              [104.891554, 30.936607],\n              [104.894578, 30.936936],\n              [104.903649, 30.943015],\n              [104.904769, 30.943425],\n              [104.931646, 30.945808],\n              [104.947436, 30.912124],\n              [104.945308, 30.897496],\n              [104.967482, 30.894949],\n              [104.960427, 30.865029],\n              [104.992007, 30.870125],\n              [104.987192, 30.843076],\n              [104.998502, 30.805901],\n              [105.025267, 30.781878],\n              [105.07051, 30.771756],\n              [105.081149, 30.755873],\n              [105.115865, 30.759247],\n              [105.118329, 30.750276],\n              [105.156517, 30.732496],\n              [105.157972, 30.706313],\n              [105.168723, 30.706395],\n              [105.215198, 30.734718],\n              [105.243979, 30.726074],\n              [105.248682, 30.739164],\n              [105.271976, 30.751428],\n              [105.260441, 30.822845],\n              [105.232332, 30.846283],\n              [105.228636, 30.877359],\n              [105.200192, 30.886154],\n              [105.194256, 30.897003],\n              [105.208815, 30.906207],\n              [105.177346, 30.960181],\n              [105.193808, 30.964698],\n              [105.194704, 30.992042],\n              [105.174771, 31.045967],\n              [105.189889, 31.054993],\n              [105.199968, 31.075995],\n              [105.193248, 31.08592],\n              [105.223933, 31.107653],\n              [105.241179, 31.101831],\n              [105.296837, 31.106341],\n              [105.344431, 31.125938],\n              [105.35395, 31.160611],\n              [105.381275, 31.152907],\n              [105.389338, 31.112081],\n              [105.410728, 31.07255],\n              [105.42831, 31.075749],\n              [105.453955, 31.060162],\n              [105.474225, 31.06369],\n              [105.489903, 31.035874],\n              [105.504462, 31.026518],\n              [105.534362, 31.027011],\n              [105.546009, 31.013632],\n              [105.565831, 31.011252],\n              [105.573334, 30.98884],\n              [105.595843, 30.972582],\n              [105.618689, 30.977591],\n              [105.613873, 30.991303],\n              [105.633807, 31.003289],\n              [105.65822, 30.999923],\n              [105.663372, 31.01749],\n              [105.686665, 31.016341],\n              [105.714102, 31.039321],\n              [105.708727, 31.071237],\n              [105.721717, 31.084197],\n              [105.712198, 31.09691],\n              [105.726197, 31.110769],\n              [105.716678, 31.130365],\n              [105.721381, 31.150366],\n              [105.707047, 31.169216],\n              [105.674346, 31.171757],\n              [105.674682, 31.249492],\n              [105.647805, 31.257598],\n              [105.637615, 31.283548],\n              [105.616673, 31.295579],\n              [105.599091, 31.288704],\n              [105.594163, 31.299834],\n              [105.609058, 31.325527],\n              [105.606482, 31.339598],\n              [105.629775, 31.345896],\n              [105.64243, 31.371168],\n              [105.641646, 31.394797],\n              [105.620928, 31.406651],\n              [105.612193, 31.39635],\n              [105.591252, 31.39725],\n              [105.57255, 31.382043],\n              [105.56863, 31.403136],\n              [105.551048, 31.392753],\n              [105.533018, 31.401582],\n              [105.524059, 31.391364],\n              [105.49875, 31.402482],\n              [105.481168, 31.424224],\n              [105.486992, 31.443918],\n              [105.501662, 31.454866],\n              [105.471313, 31.485826],\n              [105.458211, 31.474717],\n              [105.441973, 31.480517],\n              [105.462802, 31.498974],\n              [105.459219, 31.52698]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510800,\n        \"name\": \"广元市\",\n        \"center\": [105.829757, 32.433668],\n        \"centroid\": [105.78583, 32.26157],\n        \"childrenNum\": 7,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 6,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.459219, 31.52698],\n              [105.494719, 31.550326],\n              [105.493711, 31.551468],\n              [105.498414, 31.574155],\n              [105.529771, 31.574644],\n              [105.53537, 31.564771],\n              [105.579493, 31.565668],\n              [105.599203, 31.581009],\n              [105.60805, 31.551631],\n              [105.618353, 31.55359],\n              [105.622496, 31.58419],\n              [105.639518, 31.587617],\n              [105.633247, 31.60067],\n              [105.653517, 31.61372],\n              [105.657884, 31.601975],\n              [105.684649, 31.608908],\n              [105.69932, 31.649845],\n              [105.723845, 31.663623],\n              [105.726085, 31.726615],\n              [105.749378, 31.718794],\n              [105.76864, 31.735412],\n              [105.780735, 31.712684],\n              [105.816011, 31.677643],\n              [105.817914, 31.66778],\n              [105.847143, 31.667047],\n              [105.838072, 31.65115],\n              [105.845799, 31.632559],\n              [105.865285, 31.614781],\n              [105.885779, 31.630521],\n              [105.881635, 31.648052],\n              [105.910528, 31.625791],\n              [105.929902, 31.649193],\n              [105.925086, 31.664764],\n              [105.958235, 31.672426],\n              [105.977496, 31.662482],\n              [106.007173, 31.684734],\n              [106.032482, 31.687586],\n              [106.048385, 31.698098],\n              [106.078061, 31.697202],\n              [106.068318, 31.708447],\n              [106.10225, 31.73248],\n              [106.111993, 31.758543],\n              [106.128568, 31.767174],\n              [106.12364, 31.792006],\n              [106.110538, 31.790785],\n              [106.130359, 31.829282],\n              [106.138646, 31.811297],\n              [106.153765, 31.806576],\n              [106.188481, 31.821796],\n              [106.199232, 31.818622],\n              [106.194528, 31.785901],\n              [106.211326, 31.770757],\n              [106.24817, 31.7824],\n              [106.262057, 31.773851],\n              [106.275271, 31.79689],\n              [106.270456, 31.810972],\n              [106.292293, 31.80739],\n              [106.310435, 31.825539],\n              [106.327345, 31.829689],\n              [106.33552, 31.848484],\n              [106.361277, 31.846287],\n              [106.384235, 31.801693],\n              [106.39577, 31.805681],\n              [106.406296, 31.808286],\n              [106.416039, 31.83156],\n              [106.406408, 31.874189],\n              [106.424662, 31.889803],\n              [106.408984, 31.902081],\n              [106.427462, 31.915009],\n              [106.419847, 31.917529],\n              [106.426678, 31.923219],\n              [106.428694, 31.922813],\n              [106.446052, 31.943295],\n              [106.463522, 31.94167],\n              [106.464754, 31.954591],\n              [106.445492, 31.977179],\n              [106.482112, 31.977098],\n              [106.493087, 32.006016],\n              [106.508765, 32.024775],\n              [106.501038, 32.048969],\n              [106.519628, 32.050186],\n              [106.517836, 32.068531],\n              [106.533514, 32.08184],\n              [106.559159, 32.082733],\n              [106.535194, 32.098474],\n              [106.567558, 32.128407],\n              [106.556919, 32.1756],\n              [106.564647, 32.227548],\n              [106.594547, 32.23727],\n              [106.666219, 32.249663],\n              [106.674842, 32.272664],\n              [106.688393, 32.266267],\n              [106.718405, 32.269263],\n              [106.71695, 32.294607],\n              [106.755361, 32.285296],\n              [106.776191, 32.296874],\n              [106.745058, 32.322938],\n              [106.737779, 32.31533],\n              [106.725909, 32.336939],\n              [106.688953, 32.348024],\n              [106.691528, 32.404159],\n              [106.684697, 32.418066],\n              [106.689849, 32.453633],\n              [106.674842, 32.486196],\n              [106.649421, 32.50421],\n              [106.65838, 32.566221],\n              [106.652109, 32.590756],\n              [106.658044, 32.622463],\n              [106.645278, 32.63682],\n              [106.64035, 32.687294],\n              [106.629375, 32.681248],\n              [106.588612, 32.688584],\n              [106.566774, 32.675847],\n              [106.517276, 32.668027],\n              [106.498126, 32.64932],\n              [106.472929, 32.650368],\n              [106.451651, 32.660125],\n              [106.450979, 32.640207],\n              [106.420519, 32.616655],\n              [106.38905, 32.626738],\n              [106.383227, 32.646578],\n              [106.351199, 32.671897],\n              [106.305508, 32.679636],\n              [106.278855, 32.670687],\n              [106.256457, 32.693259],\n              [106.17437, 32.697611],\n              [106.171795, 32.709136],\n              [106.153653, 32.705751],\n              [106.145366, 32.720417],\n              [106.119944, 32.719611],\n              [106.062047, 32.7673],\n              [106.065519, 32.783486],\n              [106.094747, 32.795966],\n              [106.093627, 32.823737],\n              [106.069998, 32.824059],\n              [106.046705, 32.852224],\n              [106.021732, 32.857534],\n              [106.011541, 32.829693],\n              [105.99519, 32.828003],\n              [105.969321, 32.849005],\n              [105.927214, 32.825991],\n              [105.89317, 32.838464],\n              [105.857782, 32.827439],\n              [105.850727, 32.818103],\n              [105.831129, 32.826071],\n              [105.816906, 32.790411],\n              [105.82273, 32.771649],\n              [105.779615, 32.750225],\n              [105.768752, 32.767542],\n              [105.750722, 32.767945],\n              [105.73594, 32.75385],\n              [105.719253, 32.75973],\n              [105.678042, 32.726541],\n              [105.649261, 32.718725],\n              [105.625408, 32.702044],\n              [105.596403, 32.699303],\n              [105.585204, 32.729119],\n              [105.556312, 32.732019],\n              [105.55788, 32.752964],\n              [105.56807, 32.758763],\n              [105.554744, 32.773985],\n              [105.556312, 32.792021],\n              [105.535818, 32.789847],\n              [105.524507, 32.847718],\n              [105.495503, 32.873221],\n              [105.486768, 32.92139],\n              [105.456307, 32.932645],\n              [105.42551, 32.931117],\n              [105.41308, 32.918898],\n              [105.407816, 32.885768],\n              [105.380827, 32.878771],\n              [105.399753, 32.829049],\n              [105.427526, 32.784292],\n              [105.425174, 32.774951],\n              [105.453283, 32.767623],\n              [105.459443, 32.7524],\n              [105.448916, 32.732744],\n              [105.425398, 32.733953],\n              [105.394266, 32.714293],\n              [105.365597, 32.710425],\n              [105.346895, 32.682699],\n              [105.308708, 32.67109],\n              [105.297733, 32.657061],\n              [105.261785, 32.653191],\n              [105.241179, 32.668914],\n              [105.219677, 32.666334],\n              [105.215086, 32.63682],\n              [105.186865, 32.62585],\n              [105.184737, 32.617381],\n              [105.143862, 32.601245],\n              [105.110826, 32.594145],\n              [105.095931, 32.6077],\n              [105.079357, 32.637223],\n              [105.030195, 32.650449],\n              [105.014852, 32.640127],\n              [104.971961, 32.632948],\n              [104.927726, 32.60891],\n              [104.881811, 32.601164],\n              [104.873636, 32.623027],\n              [104.845751, 32.653916],\n              [104.820666, 32.662947],\n              [104.795917, 32.643514],\n              [104.766016, 32.645449],\n              [104.739587, 32.635449],\n              [104.696808, 32.673509],\n              [104.668027, 32.662544],\n              [104.635775, 32.668511],\n              [104.617745, 32.627464],\n              [104.618977, 32.600842],\n              [104.634207, 32.597211],\n              [104.651117, 32.579619],\n              [104.655933, 32.56049],\n              [104.709687, 32.553952],\n              [104.745971, 32.536351],\n              [104.754818, 32.52642],\n              [104.750002, 32.505341],\n              [104.759745, 32.493871],\n              [104.749218, 32.464623],\n              [104.761649, 32.445955],\n              [104.755938, 32.436336],\n              [104.775423, 32.414913],\n              [104.773856, 32.400116],\n              [104.804316, 32.374155],\n              [104.822458, 32.370434],\n              [104.840712, 32.35118],\n              [104.856278, 32.357329],\n              [104.884611, 32.355144],\n              [104.911712, 32.326175],\n              [104.940381, 32.333621],\n              [104.974649, 32.334592],\n              [104.964458, 32.297359],\n              [104.976553, 32.293069],\n              [105.00007, 32.266429],\n              [104.995255, 32.247557],\n              [105.032994, 32.265133],\n              [105.044865, 32.287563],\n              [105.082605, 32.283596],\n              [105.08742, 32.30335],\n              [105.112729, 32.310797],\n              [105.176674, 32.302621],\n              [105.208815, 32.306831],\n              [105.218894, 32.316059],\n              [105.247562, 32.32051],\n              [105.254954, 32.300679],\n              [105.238043, 32.287401],\n              [105.254394, 32.271611],\n              [105.268504, 32.27809],\n              [105.27052, 32.263027],\n              [105.252826, 32.236297],\n              [105.262233, 32.225198],\n              [105.240395, 32.204292],\n              [105.273096, 32.193189],\n              [105.251706, 32.16725],\n              [105.275111, 32.15598],\n              [105.28575, 32.139762],\n              [105.262569, 32.126623],\n              [105.286198, 32.108777],\n              [105.252602, 32.082651],\n              [105.250026, 32.033138],\n              [105.26436, 32.031514],\n              [105.25193, 31.982866],\n              [105.235692, 32.016492],\n              [105.215198, 32.004229],\n              [105.208591, 32.0117],\n              [105.194144, 31.996025],\n              [105.174211, 31.999518],\n              [105.187761, 31.983029],\n              [105.185185, 31.965399],\n              [105.205343, 31.945652],\n              [105.18317, 31.91135],\n              [105.203327, 31.90509],\n              [105.223261, 31.882078],\n              [105.205231, 31.837094],\n              [105.243195, 31.830014],\n              [105.251482, 31.816587],\n              [105.243755, 31.795181],\n              [105.262233, 31.77841],\n              [105.264137, 31.790541],\n              [105.288774, 31.793716],\n              [105.3077, 31.771327],\n              [105.311395, 31.744128],\n              [105.283062, 31.740218],\n              [105.284406, 31.72914],\n              [105.25361, 31.707306],\n              [105.284518, 31.700951],\n              [105.315315, 31.71855],\n              [105.317555, 31.702988],\n              [105.345103, 31.677235],\n              [105.333009, 31.630276],\n              [105.366269, 31.615596],\n              [105.393258, 31.618369],\n              [105.395834, 31.561588],\n              [105.416215, 31.558487],\n              [105.459219, 31.52698]\n            ]\n          ],\n          [\n            [\n              [106.419847, 31.917529],\n              [106.427462, 31.915009],\n              [106.428694, 31.922813],\n              [106.426678, 31.923219],\n              [106.419847, 31.917529]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 510900,\n        \"name\": \"遂宁市\",\n        \"center\": [105.571331, 30.513311],\n        \"centroid\": [105.475016, 30.630107],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 7,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [105.066927, 30.53587],\n              [105.059983, 30.522753],\n              [105.084173, 30.494616],\n              [105.076558, 30.481741],\n              [105.090444, 30.459536],\n              [105.090108, 30.442363],\n              [105.075214, 30.44228],\n              [105.075102, 30.442115],\n              [105.074766, 30.44195],\n              [105.074206, 30.441785],\n              [105.073758, 30.44195],\n              [105.073646, 30.442115],\n              [105.068942, 30.432949],\n              [105.090444, 30.425682],\n              [105.080141, 30.412385],\n              [105.079917, 30.411724],\n              [105.07387, 30.403133],\n              [105.093692, 30.395947],\n              [105.097275, 30.396194],\n              [105.100635, 30.38562],\n              [105.101419, 30.385455],\n              [105.126056, 30.341491],\n              [105.151365, 30.341987],\n              [105.157412, 30.323388],\n              [105.197056, 30.310738],\n              [105.198064, 30.311813],\n              [105.198176, 30.311813],\n              [105.19784, 30.309994],\n              [105.218894, 30.30586],\n              [105.221805, 30.287171],\n              [105.258313, 30.280307],\n              [105.263913, 30.287915],\n              [105.328305, 30.303297],\n              [105.343088, 30.298087],\n              [105.35843, 30.308093],\n              [105.368845, 30.278404],\n              [105.380379, 30.276916],\n              [105.411064, 30.295606],\n              [105.425958, 30.259876],\n              [105.444996, 30.265997],\n              [105.480944, 30.238696],\n              [105.4824, 30.223222],\n              [105.521036, 30.202613],\n              [105.529323, 30.21958],\n              [105.547129, 30.212711],\n              [105.557544, 30.195826],\n              [105.558887, 30.185561],\n              [105.561463, 30.183656],\n              [105.579941, 30.173473],\n              [105.595171, 30.183656],\n              [105.64243, 30.186388],\n              [105.655421, 30.220822],\n              [105.636271, 30.219746],\n              [105.619473, 30.234641],\n              [105.625072, 30.27584],\n              [105.667179, 30.265666],\n              [105.670651, 30.254085],\n              [105.723845, 30.254747],\n              [105.734932, 30.276998],\n              [105.71175, 30.282209],\n              [105.714774, 30.322809],\n              [105.741875, 30.319833],\n              [105.735044, 30.336697],\n              [105.756209, 30.347112],\n              [105.751842, 30.357112],\n              [105.769536, 30.375292],\n              [105.760241, 30.384546],\n              [105.77032, 30.403959],\n              [105.78275, 30.403133],\n              [105.791709, 30.425434],\n              [105.818026, 30.437243],\n              [105.846695, 30.410733],\n              [105.846247, 30.392394],\n              [105.873796, 30.408668],\n              [105.899441, 30.405612],\n              [105.901569, 30.386363],\n              [105.917023, 30.395947],\n              [105.940877, 30.372317],\n              [105.967978, 30.379258],\n              [105.992055, 30.369177],\n              [106.00079, 30.376283],\n              [105.987239, 30.394047],\n              [105.989815, 30.41255],\n              [105.9794, 30.427581],\n              [105.963834, 30.424691],\n              [105.948268, 30.441619],\n              [105.950172, 30.452931],\n              [105.971225, 30.456151],\n              [105.970665, 30.477119],\n              [105.954203, 30.514255],\n              [105.945692, 30.501383],\n              [105.934045, 30.516731],\n              [105.915791, 30.508974],\n              [105.927102, 30.494038],\n              [105.948828, 30.494368],\n              [105.917807, 30.466966],\n              [105.885331, 30.458875],\n              [105.884099, 30.496266],\n              [105.867413, 30.497092],\n              [105.860246, 30.48496],\n              [105.846807, 30.491645],\n              [105.862821, 30.51244],\n              [105.877492, 30.547419],\n              [105.871332, 30.562182],\n              [105.85431, 30.565728],\n              [105.82385, 30.602995],\n              [105.82329, 30.621953],\n              [105.809067, 30.625333],\n              [105.813771, 30.651372],\n              [105.792717, 30.711418],\n              [105.792941, 30.759906],\n              [105.782302, 30.785086],\n              [105.796749, 30.800883],\n              [105.784318, 30.823832],\n              [105.755761, 30.841267],\n              [105.730564, 30.876784],\n              [105.744899, 30.879086],\n              [105.73202, 30.905714],\n              [105.705927, 30.910152],\n              [105.691705, 30.933896],\n              [105.65934, 30.918697],\n              [105.6599, 30.942275],\n              [105.643438, 30.948025],\n              [105.618689, 30.977591],\n              [105.595843, 30.972582],\n              [105.573334, 30.98884],\n              [105.565831, 31.011252],\n              [105.546009, 31.013632],\n              [105.534362, 31.027011],\n              [105.504462, 31.026518],\n              [105.489903, 31.035874],\n              [105.474225, 31.06369],\n              [105.453955, 31.060162],\n              [105.42831, 31.075749],\n              [105.410728, 31.07255],\n              [105.389338, 31.112081],\n              [105.381275, 31.152907],\n              [105.35395, 31.160611],\n              [105.344431, 31.125938],\n              [105.296837, 31.106341],\n              [105.241179, 31.101831],\n              [105.223933, 31.107653],\n              [105.193248, 31.08592],\n              [105.199968, 31.075995],\n              [105.189889, 31.054993],\n              [105.174771, 31.045967],\n              [105.194704, 30.992042],\n              [105.193808, 30.964698],\n              [105.177346, 30.960181],\n              [105.208815, 30.906207],\n              [105.194256, 30.897003],\n              [105.200192, 30.886154],\n              [105.228636, 30.877359],\n              [105.232332, 30.846283],\n              [105.260441, 30.822845],\n              [105.271976, 30.751428],\n              [105.248682, 30.739164],\n              [105.243979, 30.726074],\n              [105.215198, 30.734718],\n              [105.168723, 30.706395],\n              [105.174547, 30.697666],\n              [105.161108, 30.672545],\n              [105.146998, 30.669168],\n              [105.142742, 30.653185],\n              [105.153829, 30.640249],\n              [105.130088, 30.624756],\n              [105.117657, 30.602913],\n              [105.094812, 30.584198],\n              [105.079021, 30.543129],\n              [105.066927, 30.53587]\n            ]\n          ],\n          [\n            [\n              [105.093916, 30.395616],\n              [105.094364, 30.396277],\n              [105.094364, 30.396277],\n              [105.093804, 30.395864],\n              [105.093916, 30.395616]\n            ]\n          ],\n          [\n            [\n              [105.075102, 30.442115],\n              [105.075214, 30.44228],\n              [105.073646, 30.442115],\n              [105.073758, 30.44195],\n              [105.074206, 30.441785],\n              [105.074766, 30.44195],\n              [105.075102, 30.442115]\n            ]\n          ],\n          [\n            [\n              [105.198176, 30.311813],\n              [105.198064, 30.311813],\n              [105.197056, 30.310738],\n              [105.19784, 30.309994],\n              [105.198176, 30.311813]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511000,\n        \"name\": \"内江市\",\n        \"center\": [105.066138, 29.58708],\n        \"centroid\": [104.913978, 29.638381],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 8,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.467234, 30.034689],\n              [104.455363, 30.000606],\n              [104.479217, 29.98891],\n              [104.461859, 29.950579],\n              [104.481792, 29.942363],\n              [104.473281, 29.93481],\n              [104.488512, 29.92153],\n              [104.490079, 29.904761],\n              [104.503294, 29.897454],\n              [104.483584, 29.854104],\n              [104.483248, 29.852194],\n              [104.477425, 29.811317],\n              [104.50307, 29.807411],\n              [104.486608, 29.786965],\n              [104.470146, 29.785386],\n              [104.457155, 29.748223],\n              [104.442373, 29.733837],\n              [104.41572, 29.732257],\n              [104.39769, 29.74839],\n              [104.372157, 29.734586],\n              [104.360286, 29.737746],\n              [104.336769, 29.722276],\n              [104.350319, 29.70173],\n              [104.321314, 29.709966],\n              [104.3081, 29.695075],\n              [104.269576, 29.632491],\n              [104.280551, 29.613925],\n              [104.309332, 29.607347],\n              [104.334193, 29.583113],\n              [104.340688, 29.565704],\n              [104.383579, 29.584196],\n              [104.381787, 29.607264],\n              [104.39489, 29.621002],\n              [104.421767, 29.616423],\n              [104.442933, 29.600102],\n              [104.474065, 29.609262],\n              [104.488847, 29.601435],\n              [104.493551, 29.582613],\n              [104.482912, 29.562872],\n              [104.501726, 29.549958],\n              [104.529611, 29.518876],\n              [104.53465, 29.456601],\n              [104.510013, 29.456767],\n              [104.535658, 29.418566],\n              [104.543945, 29.441005],\n              [104.558728, 29.431913],\n              [104.569814, 29.441172],\n              [104.587956, 29.422987],\n              [104.619761, 29.444758],\n              [104.652461, 29.411141],\n              [104.673403, 29.398709],\n              [104.674299, 29.38227],\n              [104.704423, 29.372255],\n              [104.710919, 29.361404],\n              [104.745411, 29.36324],\n              [104.738132, 29.381936],\n              [104.759969, 29.374759],\n              [104.766128, 29.406469],\n              [104.751458, 29.402631],\n              [104.741155, 29.432414],\n              [104.750786, 29.453598],\n              [104.777327, 29.448177],\n              [104.786398, 29.457518],\n              [104.808796, 29.457018],\n              [104.833657, 29.430495],\n              [104.848775, 29.467858],\n              [104.873972, 29.47086],\n              [104.871957, 29.459019],\n              [104.917647, 29.434332],\n              [104.937133, 29.445425],\n              [104.961882, 29.416647],\n              [104.993127, 29.438669],\n              [105.026947, 29.439587],\n              [105.020564, 29.454432],\n              [105.04061, 29.461938],\n              [105.030643, 29.472527],\n              [105.044305, 29.480865],\n              [105.067823, 29.454349],\n              [105.063119, 29.442923],\n              [105.084285, 29.42232],\n              [105.079469, 29.406886],\n              [105.046881, 29.408721],\n              [105.035346, 29.382937],\n              [105.063679, 29.364659],\n              [105.072526, 29.336359],\n              [105.108922, 29.315568],\n              [105.120121, 29.302205],\n              [105.113961, 29.284999],\n              [105.134903, 29.257429],\n              [105.160548, 29.262776],\n              [105.203999, 29.23963],\n              [105.195488, 29.222078],\n              [105.217998, 29.20561],\n              [105.23558, 29.215475],\n              [105.266936, 29.188638],\n              [105.281495, 29.188471],\n              [105.287542, 29.218233],\n              [105.318226, 29.263612],\n              [105.339392, 29.281741],\n              [105.364141, 29.291932],\n              [105.364141, 29.292934],\n              [105.364813, 29.293519],\n              [105.365149, 29.292684],\n              [105.366493, 29.287839],\n              [105.368957, 29.287839],\n              [105.368845, 29.286586],\n              [105.368621, 29.285918],\n              [105.383403, 29.281991],\n              [105.386203, 29.284832],\n              [105.387771, 29.287254],\n              [105.387659, 29.287588],\n              [105.387883, 29.287588],\n              [105.389002, 29.286502],\n              [105.395274, 29.308553],\n              [105.420135, 29.314399],\n              [105.418567, 29.352305],\n              [105.437045, 29.364743],\n              [105.432006, 29.378848],\n              [105.443092, 29.399126],\n              [105.427302, 29.4189],\n              [105.372988, 29.420902],\n              [105.399193, 29.439003],\n              [105.387995, 29.455099],\n              [105.362014, 29.454683],\n              [105.360446, 29.444258],\n              [105.324498, 29.448594],\n              [105.337824, 29.458852],\n              [105.32125, 29.476029],\n              [105.318898, 29.512375],\n              [105.294373, 29.53396],\n              [105.289782, 29.552624],\n              [105.296725, 29.571202],\n              [105.317667, 29.578115],\n              [105.311283, 29.593357],\n              [105.322258, 29.610095],\n              [105.335473, 29.595189],\n              [105.346783, 29.620253],\n              [105.380827, 29.628246],\n              [105.37758, 29.643313],\n              [105.393146, 29.650721],\n              [105.389674, 29.67652],\n              [105.400537, 29.671611],\n              [105.423943, 29.687587],\n              [105.416775, 29.721112],\n              [105.393482, 29.747226],\n              [105.405017, 29.78896],\n              [105.383179, 29.796856],\n              [105.373548, 29.824612],\n              [105.360446, 29.83425],\n              [105.35395, 29.811566],\n              [105.332225, 29.81115],\n              [105.319122, 29.821953],\n              [105.297733, 29.82054],\n              [105.288662, 29.798269],\n              [105.252714, 29.796025],\n              [105.233564, 29.804087],\n              [105.238491, 29.817549],\n              [105.217326, 29.8448],\n              [105.175554, 29.846711],\n              [105.125608, 29.830677],\n              [105.0947, 29.848954],\n              [105.080589, 29.88284],\n              [105.100747, 29.885498],\n              [105.097051, 29.904927],\n              [105.064015, 29.922526],\n              [105.074654, 29.944023],\n              [105.049345, 29.947508],\n              [105.0209, 29.976798],\n              [104.993687, 29.977047],\n              [104.976441, 29.993223],\n              [104.95158, 29.99256],\n              [104.932766, 29.977296],\n              [104.924367, 29.946844],\n              [104.903649, 29.941367],\n              [104.927166, 29.936221],\n              [104.902417, 29.907168],\n              [104.905441, 29.904678],\n              [104.905217, 29.900692],\n              [104.899505, 29.902353],\n              [104.8789, 29.912897],\n              [104.863333, 29.890895],\n              [104.828057, 29.885498],\n              [104.839144, 29.866812],\n              [104.805436, 29.8752],\n              [104.793341, 29.866895],\n              [104.809132, 29.853024],\n              [104.791997, 29.849037],\n              [104.780575, 29.861413],\n              [104.798493, 29.880183],\n              [104.748322, 29.909244],\n              [104.743619, 29.933233],\n              [104.730628, 29.948504],\n              [104.691769, 29.954645],\n              [104.685049, 29.964436],\n              [104.672955, 29.944189],\n              [104.709127, 29.933233],\n              [104.689865, 29.920036],\n              [104.687289, 29.90227],\n              [104.673739, 29.905674],\n              [104.64395, 29.957383],\n              [104.631184, 29.940952],\n              [104.60677, 29.932901],\n              [104.592548, 29.950164],\n              [104.577989, 29.951076],\n              [104.568471, 29.995546],\n              [104.546297, 30.008485],\n              [104.533195, 29.999278],\n              [104.5239, 30.027227],\n              [104.498142, 30.035933],\n              [104.499486, 30.022666],\n              [104.468578, 30.026563],\n              [104.467234, 30.034689]\n            ]\n          ],\n          [\n            [\n              [105.387883, 29.287588],\n              [105.387659, 29.287588],\n              [105.387771, 29.287254],\n              [105.386203, 29.284832],\n              [105.389002, 29.286502],\n              [105.387883, 29.287588]\n            ]\n          ],\n          [\n            [\n              [105.364813, 29.293519],\n              [105.364141, 29.292934],\n              [105.364141, 29.291932],\n              [105.365149, 29.292684],\n              [105.364813, 29.293519]\n            ]\n          ],\n          [\n            [\n              [105.368957, 29.287839],\n              [105.366493, 29.287839],\n              [105.368621, 29.285918],\n              [105.368845, 29.286586],\n              [105.368957, 29.287839]\n            ]\n          ],\n          [\n            [\n              [104.905441, 29.904678],\n              [104.902417, 29.907168],\n              [104.899505, 29.902353],\n              [104.905217, 29.900692],\n              [104.905441, 29.904678]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511100,\n        \"name\": \"乐山市\",\n        \"center\": [103.761263, 29.582024],\n        \"centroid\": [103.571823, 29.214311],\n        \"childrenNum\": 11,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 9,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.17685, 29.195745],\n              [104.150645, 29.194157],\n              [104.150981, 29.22726],\n              [104.14359, 29.256844],\n              [104.118393, 29.236454],\n              [104.109658, 29.241886],\n              [104.116377, 29.263946],\n              [104.14639, 29.283829],\n              [104.139447, 29.307467],\n              [104.09174, 29.315317],\n              [104.07651, 29.323584],\n              [104.083229, 29.348298],\n              [104.105626, 29.338864],\n              [104.135415, 29.338781],\n              [104.142022, 29.355644],\n              [104.163412, 29.364158],\n              [104.160836, 29.379933],\n              [104.141126, 29.374508],\n              [104.134967, 29.399043],\n              [104.133175, 29.39946],\n              [104.132503, 29.399627],\n              [104.131272, 29.400378],\n              [104.100811, 29.382186],\n              [104.090172, 29.391616],\n              [104.0923, 29.416397],\n              [104.105962, 29.414895],\n              [104.098347, 29.437168],\n              [104.058256, 29.425907],\n              [104.052656, 29.456684],\n              [104.064191, 29.472361],\n              [104.08838, 29.461687],\n              [104.128472, 29.498289],\n              [104.14919, 29.472277],\n              [104.150309, 29.472027],\n              [104.166324, 29.495955],\n              [104.165988, 29.496538],\n              [104.151093, 29.52221],\n              [104.135079, 29.52096],\n              [104.160948, 29.541876],\n              [104.166884, 29.55729],\n              [104.139895, 29.589693],\n              [104.16722, 29.597854],\n              [104.182226, 29.633407],\n              [104.212239, 29.61251],\n              [104.251098, 29.623084],\n              [104.249754, 29.636154],\n              [104.240347, 29.64323],\n              [104.228477, 29.676187],\n              [104.203727, 29.665702],\n              [104.187489, 29.686339],\n              [104.191297, 29.705058],\n              [104.157477, 29.716371],\n              [104.152885, 29.707304],\n              [104.12612, 29.717452],\n              [104.116937, 29.733421],\n              [104.089388, 29.743733],\n              [104.062623, 29.777821],\n              [104.088716, 29.813643],\n              [104.069231, 29.828517],\n              [104.043809, 29.830677],\n              [104.05624, 29.84696],\n              [104.050081, 29.868473],\n              [104.003606, 29.869968],\n              [103.982888, 29.8502],\n              [103.967658, 29.85643],\n              [103.951084, 29.841727],\n              [103.962395, 29.827603],\n              [103.927678, 29.825526],\n              [103.934622, 29.804668],\n              [103.903265, 29.783391],\n              [103.912784, 29.775826],\n              [103.893522, 29.742486],\n              [103.85623, 29.746976],\n              [103.842344, 29.731093],\n              [103.822522, 29.73076],\n              [103.799229, 29.714042],\n              [103.765073, 29.706555],\n              [103.755442, 29.720197],\n              [103.7317, 29.721944],\n              [103.704711, 29.714375],\n              [103.705607, 29.737247],\n              [103.688025, 29.759365],\n              [103.703368, 29.771587],\n              [103.747267, 29.789957],\n              [103.741107, 29.811067],\n              [103.728789, 29.816053],\n              [103.729125, 29.849286],\n              [103.692729, 29.898866],\n              [103.676715, 29.90393],\n              [103.677834, 29.919621],\n              [103.648158, 29.92817],\n              [103.64211, 29.91796],\n              [103.607954, 29.909244],\n              [103.590484, 29.91904],\n              [103.590484, 29.902021],\n              [103.571782, 29.895462],\n              [103.584661, 29.880847],\n              [103.558008, 29.868058],\n              [103.513885, 29.87902],\n              [103.533595, 29.860666],\n              [103.533371, 29.84156],\n              [103.518028, 29.843388],\n              [103.485776, 29.814807],\n              [103.464386, 29.82162],\n              [103.432918, 29.820623],\n              [103.430566, 29.787879],\n              [103.439413, 29.770922],\n              [103.416904, 29.774829],\n              [103.394058, 29.805416],\n              [103.38062, 29.792617],\n              [103.359118, 29.799516],\n              [103.333473, 29.794196],\n              [103.315667, 29.771753],\n              [103.315779, 29.741488],\n              [103.299429, 29.727516],\n              [103.304356, 29.706389],\n              [103.295957, 29.694409],\n              [103.303684, 29.677935],\n              [103.321826, 29.683094],\n              [103.337057, 29.672776],\n              [103.352959, 29.698735],\n              [103.361694, 29.661791],\n              [103.337281, 29.651803],\n              [103.338737, 29.63424],\n              [103.298869, 29.599853],\n              [103.267848, 29.596105],\n              [103.2702, 29.573701],\n              [103.256426, 29.55679],\n              [103.27132, 29.53221],\n              [103.259673, 29.511375],\n              [103.294166, 29.506874],\n              [103.277703, 29.485617],\n              [103.258889, 29.478447],\n              [103.204464, 29.483867],\n              [103.186434, 29.474278],\n              [103.18005, 29.430161],\n              [103.157541, 29.425573],\n              [103.126968, 29.440421],\n              [103.090012, 29.425573],\n              [103.054736, 29.446009],\n              [103.014869, 29.448011],\n              [102.983512, 29.418483],\n              [102.975449, 29.397791],\n              [102.998519, 29.368332],\n              [102.980377, 29.340367],\n              [102.979817, 29.320578],\n              [103.003894, 29.287171],\n              [103.031779, 29.27982],\n              [103.02002, 29.250744],\n              [102.962795, 29.250828],\n              [102.974553, 29.222162],\n              [102.944877, 29.19006],\n              [102.928639, 29.127332],\n              [102.931326, 29.112941],\n              [102.970074, 29.065068],\n              [102.957755, 29.052008],\n              [102.922143, 29.037941],\n              [102.909041, 29.021612],\n              [102.913632, 28.999918],\n              [102.942413, 28.944115],\n              [102.946221, 28.920058],\n              [102.928079, 28.896415],\n              [102.941741, 28.860521],\n              [102.926287, 28.820168],\n              [102.925279, 28.801873],\n              [102.944205, 28.76645],\n              [102.938157, 28.740001],\n              [102.962571, 28.681118],\n              [102.990904, 28.672379],\n              [102.996503, 28.679941],\n              [103.032451, 28.665824],\n              [103.051265, 28.66969],\n              [103.066047, 28.688511],\n              [103.070527, 28.73681],\n              [103.107482, 28.771907],\n              [103.112522, 28.812364],\n              [103.153957, 28.82923],\n              [103.189905, 28.827887],\n              [103.225069, 28.803971],\n              [103.23862, 28.813538],\n              [103.270984, 28.805986],\n              [103.3085, 28.761749],\n              [103.334817, 28.743108],\n              [103.333585, 28.721861],\n              [103.31074, 28.702037],\n              [103.30626, 28.681958],\n              [103.287334, 28.655319],\n              [103.272776, 28.613121],\n              [103.242875, 28.59336],\n              [103.246571, 28.549791],\n              [103.253962, 28.541209],\n              [103.287782, 28.533048],\n              [103.299541, 28.521604],\n              [103.313875, 28.485581],\n              [103.339968, 28.443483],\n              [103.35699, 28.440872],\n              [103.370205, 28.423354],\n              [103.388347, 28.420659],\n              [103.43303, 28.452915],\n              [103.441541, 28.477331],\n              [103.438629, 28.500059],\n              [103.421831, 28.511506],\n              [103.42967, 28.531786],\n              [103.479057, 28.547099],\n              [103.504142, 28.560306],\n              [103.531803, 28.597649],\n              [103.530571, 28.612196],\n              [103.560696, 28.606899],\n              [103.585893, 28.614886],\n              [103.61389, 28.597313],\n              [103.614562, 28.613373],\n              [103.636623, 28.624134],\n              [103.685674, 28.63481],\n              [103.722853, 28.687923],\n              [103.724869, 28.717577],\n              [103.71591, 28.73849],\n              [103.7018, 28.746719],\n              [103.712775, 28.757299],\n              [103.746483, 28.764016],\n              [103.76944, 28.799355],\n              [103.761041, 28.815888],\n              [103.788478, 28.822433],\n              [103.803708, 28.83611],\n              [103.830473, 28.845338],\n              [103.851079, 28.832166],\n              [103.914912, 28.776273],\n              [103.938317, 28.764268],\n              [103.956459, 28.787521],\n              [103.979977, 28.792137],\n              [104.003494, 28.853475],\n              [104.024996, 28.84408],\n              [104.034402, 28.855908],\n              [104.030483, 28.884843],\n              [104.084685, 28.914441],\n              [104.076174, 28.920897],\n              [104.061839, 28.965401],\n              [104.072478, 28.967496],\n              [104.107082, 28.95082],\n              [104.122985, 28.963976],\n              [104.121641, 28.998243],\n              [104.139671, 29.024543],\n              [104.142358, 29.070593],\n              [104.161732, 29.117041],\n              [104.175395, 29.129591],\n              [104.167891, 29.15042],\n              [104.194097, 29.163719],\n              [104.174835, 29.183789],\n              [104.17685, 29.195745]\n            ]\n          ],\n          [\n            [\n              [104.131272, 29.400378],\n              [104.132503, 29.399627],\n              [104.133175, 29.39946],\n              [104.134967, 29.399043],\n              [104.131272, 29.400378]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511300,\n        \"name\": \"南充市\",\n        \"center\": [106.082974, 30.795281],\n        \"centroid\": [106.207711, 31.195136],\n        \"childrenNum\": 9,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 10,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [106.964778, 31.250802],\n              [106.947532, 31.263656],\n              [106.94574, 31.264802],\n              [106.964442, 31.291077],\n              [106.944172, 31.288949],\n              [106.934317, 31.309081],\n              [106.946748, 31.328963],\n              [106.917855, 31.377464],\n              [106.864549, 31.400683],\n              [106.883251, 31.420873],\n              [106.871268, 31.426512],\n              [106.846071, 31.456909],\n              [106.842151, 31.503139],\n              [106.815498, 31.515142],\n              [106.821098, 31.547877],\n              [106.787166, 31.531307],\n              [106.766224, 31.537592],\n              [106.7688, 31.5673],\n              [106.722101, 31.563383],\n              [106.718965, 31.571952],\n              [106.693656, 31.56118],\n              [106.673386, 31.569177],\n              [106.647517, 31.591125],\n              [106.632175, 31.567056],\n              [106.644942, 31.544694],\n              [106.626464, 31.510814],\n              [106.607874, 31.50665],\n              [106.566886, 31.518244],\n              [106.566438, 31.545755],\n              [106.536986, 31.572033],\n              [106.516604, 31.575052],\n              [106.492079, 31.567382],\n              [106.484016, 31.584517],\n              [106.460722, 31.586312],\n              [106.456803, 31.633049],\n              [106.438661, 31.655715],\n              [106.412568, 31.65702],\n              [106.400025, 31.681229],\n              [106.366429, 31.696632],\n              [106.382667, 31.720423],\n              [106.378747, 31.732969],\n              [106.405288, 31.725637],\n              [106.40764, 31.755204],\n              [106.42455, 31.755448],\n              [106.406632, 31.777026],\n              [106.39577, 31.805681],\n              [106.384235, 31.801693],\n              [106.361277, 31.846287],\n              [106.33552, 31.848484],\n              [106.327345, 31.829689],\n              [106.310435, 31.825539],\n              [106.292293, 31.80739],\n              [106.270456, 31.810972],\n              [106.275271, 31.79689],\n              [106.262057, 31.773851],\n              [106.24817, 31.7824],\n              [106.211326, 31.770757],\n              [106.194528, 31.785901],\n              [106.199232, 31.818622],\n              [106.188481, 31.821796],\n              [106.153765, 31.806576],\n              [106.138646, 31.811297],\n              [106.130359, 31.829282],\n              [106.110538, 31.790785],\n              [106.12364, 31.792006],\n              [106.128568, 31.767174],\n              [106.111993, 31.758543],\n              [106.10225, 31.73248],\n              [106.068318, 31.708447],\n              [106.078061, 31.697202],\n              [106.048385, 31.698098],\n              [106.032482, 31.687586],\n              [106.007173, 31.684734],\n              [105.977496, 31.662482],\n              [105.958235, 31.672426],\n              [105.925086, 31.664764],\n              [105.929902, 31.649193],\n              [105.910528, 31.625791],\n              [105.881635, 31.648052],\n              [105.885779, 31.630521],\n              [105.865285, 31.614781],\n              [105.845799, 31.632559],\n              [105.838072, 31.65115],\n              [105.847143, 31.667047],\n              [105.817914, 31.66778],\n              [105.816011, 31.677643],\n              [105.780735, 31.712684],\n              [105.76864, 31.735412],\n              [105.749378, 31.718794],\n              [105.726085, 31.726615],\n              [105.723845, 31.663623],\n              [105.69932, 31.649845],\n              [105.684649, 31.608908],\n              [105.657884, 31.601975],\n              [105.653517, 31.61372],\n              [105.633247, 31.60067],\n              [105.639518, 31.587617],\n              [105.622496, 31.58419],\n              [105.618353, 31.55359],\n              [105.60805, 31.551631],\n              [105.599203, 31.581009],\n              [105.579493, 31.565668],\n              [105.53537, 31.564771],\n              [105.529771, 31.574644],\n              [105.498414, 31.574155],\n              [105.493711, 31.551468],\n              [105.494047, 31.551631],\n              [105.495055, 31.550652],\n              [105.494719, 31.550326],\n              [105.459219, 31.52698],\n              [105.462802, 31.498974],\n              [105.441973, 31.480517],\n              [105.458211, 31.474717],\n              [105.471313, 31.485826],\n              [105.501662, 31.454866],\n              [105.486992, 31.443918],\n              [105.481168, 31.424224],\n              [105.49875, 31.402482],\n              [105.524059, 31.391364],\n              [105.533018, 31.401582],\n              [105.551048, 31.392753],\n              [105.56863, 31.403136],\n              [105.57255, 31.382043],\n              [105.591252, 31.39725],\n              [105.612193, 31.39635],\n              [105.620928, 31.406651],\n              [105.641646, 31.394797],\n              [105.64243, 31.371168],\n              [105.629775, 31.345896],\n              [105.606482, 31.339598],\n              [105.609058, 31.325527],\n              [105.594163, 31.299834],\n              [105.599091, 31.288704],\n              [105.616673, 31.295579],\n              [105.637615, 31.283548],\n              [105.647805, 31.257598],\n              [105.674682, 31.249492],\n              [105.674346, 31.171757],\n              [105.707047, 31.169216],\n              [105.721381, 31.150366],\n              [105.716678, 31.130365],\n              [105.726197, 31.110769],\n              [105.712198, 31.09691],\n              [105.721717, 31.084197],\n              [105.708727, 31.071237],\n              [105.714102, 31.039321],\n              [105.686665, 31.016341],\n              [105.663372, 31.01749],\n              [105.65822, 30.999923],\n              [105.633807, 31.003289],\n              [105.613873, 30.991303],\n              [105.618689, 30.977591],\n              [105.643438, 30.948025],\n              [105.6599, 30.942275],\n              [105.65934, 30.918697],\n              [105.691705, 30.933896],\n              [105.705927, 30.910152],\n              [105.73202, 30.905714],\n              [105.744899, 30.879086],\n              [105.730564, 30.876784],\n              [105.755761, 30.841267],\n              [105.784318, 30.823832],\n              [105.796749, 30.800883],\n              [105.782302, 30.785086],\n              [105.792941, 30.759906],\n              [105.792717, 30.711418],\n              [105.813771, 30.651372],\n              [105.809067, 30.625333],\n              [105.82329, 30.621953],\n              [105.82385, 30.602995],\n              [105.85431, 30.565728],\n              [105.871332, 30.562182],\n              [105.877492, 30.547419],\n              [105.862821, 30.51244],\n              [105.846807, 30.491645],\n              [105.860246, 30.48496],\n              [105.867413, 30.497092],\n              [105.884099, 30.496266],\n              [105.885331, 30.458875],\n              [105.917807, 30.466966],\n              [105.916351, 30.469442],\n              [105.910528, 30.480668],\n              [105.917023, 30.490407],\n              [105.923966, 30.49313],\n              [105.927102, 30.494038],\n              [105.915791, 30.508974],\n              [105.934045, 30.516731],\n              [105.945692, 30.501383],\n              [105.954203, 30.514255],\n              [105.970665, 30.477119],\n              [105.980856, 30.488344],\n              [106.024755, 30.482071],\n              [106.028003, 30.505261],\n              [106.039426, 30.518216],\n              [106.066638, 30.491727],\n              [106.093851, 30.504189],\n              [106.112777, 30.503198],\n              [106.123192, 30.544449],\n              [106.157796, 30.598049],\n              [106.180194, 30.595658],\n              [106.192176, 30.612969],\n              [106.178962, 30.620058],\n              [106.166643, 30.648324],\n              [106.217822, 30.677652],\n              [106.225773, 30.695196],\n              [106.237531, 30.687454],\n              [106.238091, 30.706807],\n              [106.217486, 30.704666],\n              [106.207631, 30.722863],\n              [106.250746, 30.719323],\n              [106.286806, 30.70516],\n              [106.300468, 30.686218],\n              [106.354558, 30.722122],\n              [106.366877, 30.712736],\n              [106.364301, 30.697337],\n              [106.38905, 30.679876],\n              [106.403609, 30.695525],\n              [106.423094, 30.693219],\n              [106.420855, 30.708207],\n              [106.441124, 30.727144],\n              [106.448068, 30.753321],\n              [106.466546, 30.760893],\n              [106.487599, 30.787966],\n              [106.507757, 30.784511],\n              [106.506301, 30.762869],\n              [106.528923, 30.732496],\n              [106.542809, 30.743033],\n              [106.587604, 30.73974],\n              [106.584244, 30.756861],\n              [106.618401, 30.766572],\n              [106.626464, 30.789365],\n              [106.616497, 30.801705],\n              [106.617281, 30.82778],\n              [106.629599, 30.821036],\n              [106.675178, 30.838882],\n              [106.675514, 30.867084],\n              [106.689177, 30.883606],\n              [106.666443, 30.909987],\n              [106.678986, 30.922887],\n              [106.707207, 30.915903],\n              [106.723221, 30.946629],\n              [106.740467, 30.951147],\n              [106.73162, 30.973649],\n              [106.771487, 30.96864],\n              [106.784814, 30.972336],\n              [106.78739, 30.995901],\n              [106.803292, 30.993684],\n              [106.819754, 31.011662],\n              [106.830505, 31.05286],\n              [106.86914, 31.081163],\n              [106.894786, 31.08756],\n              [106.909008, 31.107653],\n              [106.935325, 31.116591],\n              [106.931965, 31.133726],\n              [106.951003, 31.161267],\n              [106.938349, 31.1761],\n              [106.939917, 31.207151],\n              [106.958282, 31.228283],\n              [106.964778, 31.250802]\n            ]\n          ],\n          [\n            [\n              [105.927102, 30.494038],\n              [105.923966, 30.49313],\n              [105.917023, 30.490407],\n              [105.910528, 30.480668],\n              [105.916351, 30.469442],\n              [105.917807, 30.466966],\n              [105.948828, 30.494368],\n              [105.927102, 30.494038]\n            ]\n          ],\n          [\n            [\n              [105.494047, 31.551631],\n              [105.493711, 31.551468],\n              [105.494719, 31.550326],\n              [105.495055, 31.550652],\n              [105.494047, 31.551631]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511400,\n        \"name\": \"眉山市\",\n        \"center\": [103.831788, 30.048318],\n        \"centroid\": [103.754827, 29.924767],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 11,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [102.975449, 29.397791],\n              [102.983512, 29.418483],\n              [103.014869, 29.448011],\n              [103.054736, 29.446009],\n              [103.090012, 29.425573],\n              [103.126968, 29.440421],\n              [103.157541, 29.425573],\n              [103.18005, 29.430161],\n              [103.186434, 29.474278],\n              [103.204464, 29.483867],\n              [103.258889, 29.478447],\n              [103.277703, 29.485617],\n              [103.294166, 29.506874],\n              [103.259673, 29.511375],\n              [103.27132, 29.53221],\n              [103.256426, 29.55679],\n              [103.2702, 29.573701],\n              [103.267848, 29.596105],\n              [103.298869, 29.599853],\n              [103.338737, 29.63424],\n              [103.337281, 29.651803],\n              [103.361694, 29.661791],\n              [103.352959, 29.698735],\n              [103.337057, 29.672776],\n              [103.321826, 29.683094],\n              [103.303684, 29.677935],\n              [103.295957, 29.694409],\n              [103.304356, 29.706389],\n              [103.299429, 29.727516],\n              [103.315779, 29.741488],\n              [103.315667, 29.771753],\n              [103.333473, 29.794196],\n              [103.359118, 29.799516],\n              [103.38062, 29.792617],\n              [103.394058, 29.805416],\n              [103.416904, 29.774829],\n              [103.439413, 29.770922],\n              [103.430566, 29.787879],\n              [103.432918, 29.820623],\n              [103.464386, 29.82162],\n              [103.485776, 29.814807],\n              [103.518028, 29.843388],\n              [103.517916, 29.8502],\n              [103.517021, 29.85834],\n              [103.533595, 29.860666],\n              [103.513885, 29.87902],\n              [103.558008, 29.868058],\n              [103.584661, 29.880847],\n              [103.571782, 29.895462],\n              [103.590484, 29.902021],\n              [103.590484, 29.91904],\n              [103.607954, 29.909244],\n              [103.64211, 29.91796],\n              [103.648158, 29.92817],\n              [103.677834, 29.919621],\n              [103.676715, 29.90393],\n              [103.692729, 29.898866],\n              [103.729125, 29.849286],\n              [103.728789, 29.816053],\n              [103.741107, 29.811067],\n              [103.747267, 29.789957],\n              [103.703368, 29.771587],\n              [103.688025, 29.759365],\n              [103.705607, 29.737247],\n              [103.704711, 29.714375],\n              [103.7317, 29.721944],\n              [103.755442, 29.720197],\n              [103.765073, 29.706555],\n              [103.799229, 29.714042],\n              [103.822522, 29.73076],\n              [103.842344, 29.731093],\n              [103.85623, 29.746976],\n              [103.893522, 29.742486],\n              [103.912784, 29.775826],\n              [103.903265, 29.783391],\n              [103.934622, 29.804668],\n              [103.927678, 29.825526],\n              [103.962395, 29.827603],\n              [103.951084, 29.841727],\n              [103.967658, 29.85643],\n              [103.982888, 29.8502],\n              [104.003606, 29.869968],\n              [104.050081, 29.868473],\n              [104.05624, 29.84696],\n              [104.043809, 29.830677],\n              [104.069231, 29.828517],\n              [104.088716, 29.813643],\n              [104.062623, 29.777821],\n              [104.089388, 29.743733],\n              [104.116937, 29.733421],\n              [104.12612, 29.717452],\n              [104.152885, 29.707304],\n              [104.157477, 29.716371],\n              [104.191297, 29.705058],\n              [104.187489, 29.686339],\n              [104.203727, 29.665702],\n              [104.228477, 29.676187],\n              [104.240347, 29.64323],\n              [104.249754, 29.636154],\n              [104.269576, 29.632491],\n              [104.3081, 29.695075],\n              [104.321314, 29.709966],\n              [104.350319, 29.70173],\n              [104.336769, 29.722276],\n              [104.360286, 29.737746],\n              [104.372157, 29.734586],\n              [104.39769, 29.74839],\n              [104.41572, 29.732257],\n              [104.442373, 29.733837],\n              [104.457155, 29.748223],\n              [104.470146, 29.785386],\n              [104.486608, 29.786965],\n              [104.50307, 29.807411],\n              [104.477425, 29.811317],\n              [104.483248, 29.852194],\n              [104.482688, 29.852609],\n              [104.483136, 29.854104],\n              [104.483584, 29.854104],\n              [104.503294, 29.897454],\n              [104.490079, 29.904761],\n              [104.488512, 29.92153],\n              [104.473281, 29.93481],\n              [104.481792, 29.942363],\n              [104.461859, 29.950579],\n              [104.479217, 29.98891],\n              [104.455363, 30.000606],\n              [104.467234, 30.034689],\n              [104.464322, 30.049944],\n              [104.479888, 30.047374],\n              [104.467234, 30.066937],\n              [104.481904, 30.086663],\n              [104.461411, 30.086663],\n              [104.450212, 30.101081],\n              [104.428374, 30.089729],\n              [104.41012, 30.125521],\n              [104.39881, 30.124776],\n              [104.386379, 30.161798],\n              [104.358158, 30.173638],\n              [104.364541, 30.185974],\n              [104.327138, 30.204269],\n              [104.315379, 30.200792],\n              [104.282231, 30.220904],\n              [104.2726, 30.217842],\n              [104.264537, 30.241592],\n              [104.243259, 30.244239],\n              [104.23094, 30.256153],\n              [104.243371, 30.267403],\n              [104.231836, 30.280472],\n              [104.2315, 30.282209],\n              [104.232284, 30.313798],\n              [104.2016, 30.316526],\n              [104.192977, 30.329836],\n              [104.17853, 30.318262],\n              [104.174051, 30.298666],\n              [104.152213, 30.265335],\n              [104.150533, 30.245646],\n              [104.116601, 30.227194],\n              [104.091628, 30.24879],\n              [104.047393, 30.270381],\n              [104.030035, 30.266245],\n              [104.030035, 30.266245],\n              [103.998343, 30.264508],\n              [103.974713, 30.290727],\n              [103.965866, 30.316774],\n              [103.959819, 30.311565],\n              [103.954331, 30.313302],\n              [103.959259, 30.320742],\n              [103.93563, 30.346203],\n              [103.942237, 30.357773],\n              [103.913904, 30.353972],\n              [103.910432, 30.330663],\n              [103.887699, 30.328761],\n              [103.87426, 30.348104],\n              [103.845368, 30.34331],\n              [103.794749, 30.345872],\n              [103.769776, 30.332068],\n              [103.75141, 30.307927],\n              [103.727893, 30.30462],\n              [103.736516, 30.285848],\n              [103.718374, 30.283201],\n              [103.705271, 30.268975],\n              [103.681754, 30.269885],\n              [103.693065, 30.245894],\n              [103.648046, 30.229263],\n              [103.649502, 30.199799],\n              [103.628, 30.214863],\n              [103.617473, 30.195412],\n              [103.597204, 30.203524],\n              [103.533819, 30.178109],\n              [103.544233, 30.161218],\n              [103.533819, 30.146643],\n              [103.504142, 30.128503],\n              [103.486224, 30.104147],\n              [103.474577, 30.131237],\n              [103.450948, 30.132231],\n              [103.468082, 30.114255],\n              [103.462483, 30.096027],\n              [103.4505, 30.096524],\n              [103.443893, 30.117486],\n              [103.439637, 30.119474],\n              [103.395178, 30.094866],\n              [103.37838, 30.095944],\n              [103.372221, 30.082105],\n              [103.349599, 30.097684],\n              [103.339856, 30.074729],\n              [103.312531, 30.071745],\n              [103.302341, 30.087574],\n              [103.252506, 30.040078],\n              [103.225965, 29.970659],\n              [103.191249, 29.966344],\n              [103.1964, 29.944355],\n              [103.176915, 29.945931],\n              [103.159781, 29.930162],\n              [103.109946, 29.915636],\n              [103.093708, 29.886992],\n              [103.125064, 29.864154],\n              [103.165156, 29.77034],\n              [103.143206, 29.760862],\n              [103.162916, 29.737829],\n              [103.143654, 29.730926],\n              [103.153845, 29.713293],\n              [103.141303, 29.703145],\n              [103.150038, 29.672443],\n              [103.1282, 29.671527],\n              [103.099083, 29.693827],\n              [103.092028, 29.683177],\n              [103.052497, 29.675522],\n              [103.044546, 29.700066],\n              [103.007702, 29.72552],\n              [102.996055, 29.708302],\n              [102.962011, 29.721944],\n              [102.928751, 29.711047],\n              [102.938493, 29.67677],\n              [102.929646, 29.668115],\n              [102.931998, 29.61634],\n              [102.914416, 29.553208],\n              [102.869957, 29.530044],\n              [102.823146, 29.46569],\n              [102.879364, 29.415896],\n              [102.93211, 29.400545],\n              [102.975449, 29.397791]\n            ]\n          ],\n          [\n            [\n              [103.533595, 29.860666],\n              [103.517021, 29.85834],\n              [103.517916, 29.8502],\n              [103.518028, 29.843388],\n              [103.533371, 29.84156],\n              [103.533595, 29.860666]\n            ]\n          ],\n          [\n            [\n              [103.959259, 30.320742],\n              [103.954331, 30.313302],\n              [103.959819, 30.311565],\n              [103.965866, 30.316774],\n              [103.959259, 30.320742]\n            ]\n          ],\n          [\n            [\n              [104.483584, 29.854104],\n              [104.483136, 29.854104],\n              [104.482688, 29.852609],\n              [104.483248, 29.852194],\n              [104.483584, 29.854104]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511500,\n        \"name\": \"宜宾市\",\n        \"center\": [104.630825, 28.760189],\n        \"centroid\": [104.637629, 28.572053],\n        \"childrenNum\": 10,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 12,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.781983, 28.524549],\n              [103.800685, 28.533805],\n              [103.801357, 28.561821],\n              [103.837305, 28.58453],\n              [103.834841, 28.622285],\n              [103.851079, 28.667085],\n              [103.8737, 28.652798],\n              [103.874708, 28.626488],\n              [103.896322, 28.619678],\n              [103.909984, 28.631196],\n              [103.936749, 28.622621],\n              [103.942461, 28.603031],\n              [104.0596, 28.627665],\n              [104.096108, 28.603451],\n              [104.125224, 28.637248],\n              [104.170355, 28.643048],\n              [104.192529, 28.633634],\n              [104.231052, 28.635819],\n              [104.241467, 28.660782],\n              [104.252666, 28.660698],\n              [104.269688, 28.635147],\n              [104.296341, 28.63439],\n              [104.314819, 28.615643],\n              [104.343936, 28.640947],\n              [104.37406, 28.649352],\n              [104.404857, 28.64061],\n              [104.425239, 28.62674],\n              [104.417288, 28.59807],\n              [104.387723, 28.59891],\n              [104.368461, 28.58596],\n              [104.356814, 28.55568],\n              [104.329601, 28.558624],\n              [104.319299, 28.538685],\n              [104.287046, 28.532543],\n              [104.261961, 28.536918],\n              [104.248298, 28.528336],\n              [104.248634, 28.509654],\n              [104.265433, 28.502753],\n              [104.261401, 28.482046],\n              [104.27036, 28.465881],\n              [104.258377, 28.453251],\n              [104.267672, 28.42049],\n              [104.254346, 28.40895],\n              [104.278423, 28.346594],\n              [104.301828, 28.32847],\n              [104.29007, 28.314727],\n              [104.313923, 28.306632],\n              [104.33856, 28.33083],\n              [104.35827, 28.338923],\n              [104.384811, 28.330156],\n              [104.392874, 28.291538],\n              [104.408217, 28.269862],\n              [104.449316, 28.269946],\n              [104.444053, 28.259233],\n              [104.462306, 28.2416],\n              [104.445956, 28.21426],\n              [104.402281, 28.202866],\n              [104.404409, 28.17712],\n              [104.434982, 28.168255],\n              [104.451668, 28.17408],\n              [104.444836, 28.138193],\n              [104.450996, 28.116317],\n              [104.399034, 28.087761],\n              [104.395338, 28.063847],\n              [104.376524, 28.052268],\n              [104.341472, 28.057846],\n              [104.304068, 28.050746],\n              [104.298805, 28.0439],\n              [104.326578, 28.025471],\n              [104.356142, 28.018453],\n              [104.378764, 27.993677],\n              [104.383467, 27.968727],\n              [104.401161, 27.952315],\n              [104.449652, 27.927609],\n              [104.47037, 27.905098],\n              [104.497694, 27.895787],\n              [104.503294, 27.881989],\n              [104.53745, 27.886983],\n              [104.558392, 27.86658],\n              [104.558952, 27.852186],\n              [104.580901, 27.842024],\n              [104.608002, 27.858198],\n              [104.633647, 27.850916],\n              [104.679114, 27.882243],\n              [104.743731, 27.902051],\n              [104.759633, 27.884867],\n              [104.795245, 27.900527],\n              [104.829513, 27.89985],\n              [104.872964, 27.905944],\n              [104.887971, 27.914492],\n              [104.891442, 27.933025],\n              [104.921119, 27.94174],\n              [104.903089, 27.960437],\n              [104.929182, 27.985051],\n              [104.9471, 27.980568],\n              [104.946876, 27.994861],\n              [104.974985, 28.019891],\n              [104.980808, 28.062832],\n              [105.011045, 28.06672],\n              [105.059199, 28.098154],\n              [105.076782, 28.084212],\n              [105.108138, 28.081086],\n              [105.144198, 28.066636],\n              [105.17701, 28.066889],\n              [105.204111, 28.073396],\n              [105.220237, 28.091901],\n              [105.224493, 28.099843],\n              [105.275335, 28.134392],\n              [105.350255, 28.140811],\n              [105.358094, 28.153478],\n              [105.344767, 28.185646],\n              [105.348463, 28.205314],\n              [105.333121, 28.256533],\n              [105.339168, 28.280236],\n              [105.331553, 28.292634],\n              [105.336928, 28.313378],\n              [105.310611, 28.339597],\n              [105.306692, 28.359321],\n              [105.287654, 28.369181],\n              [105.3077, 28.371541],\n              [105.32293, 28.386371],\n              [105.32013, 28.427987],\n              [105.293813, 28.435651],\n              [105.295269, 28.449041],\n              [105.2311, 28.449378],\n              [105.228748, 28.449631],\n              [105.191121, 28.445757],\n              [105.206687, 28.457041],\n              [105.234012, 28.49341],\n              [105.237483, 28.523455],\n              [105.226285, 28.540536],\n              [105.203439, 28.548192],\n              [105.207807, 28.569055],\n              [105.172083, 28.607908],\n              [105.167939, 28.65036],\n              [105.201312, 28.673555],\n              [105.21139, 28.696325],\n              [105.203887, 28.709514],\n              [105.219342, 28.715813],\n              [105.216878, 28.739078],\n              [105.204111, 28.746635],\n              [105.240507, 28.774846],\n              [105.2311, 28.777448],\n              [105.225725, 28.807748],\n              [105.21531, 28.818405],\n              [105.202879, 28.869748],\n              [105.203999, 28.896751],\n              [105.177682, 28.907148],\n              [105.166483, 28.9271],\n              [105.145094, 28.942271],\n              [105.126952, 28.945288],\n              [105.111162, 28.933722],\n              [105.073758, 28.936404],\n              [105.017316, 28.972104],\n              [105.00511, 28.989866],\n              [104.986296, 28.991541],\n              [104.969722, 29.015749],\n              [104.944636, 29.021277],\n              [104.941837, 29.058873],\n              [104.902529, 29.047738],\n              [104.881475, 29.050836],\n              [104.879684, 29.024291],\n              [104.861542, 29.019685],\n              [104.85751, 29.003436],\n              [104.819546, 29.001761],\n              [104.811931, 28.990704],\n              [104.796701, 29.000086],\n              [104.76512, 28.998746],\n              [104.744067, 28.990369],\n              [104.720214, 28.996651],\n              [104.705207, 29.045477],\n              [104.713718, 29.06105],\n              [104.737236, 29.078796],\n              [104.73018, 29.106498],\n              [104.714614, 29.122396],\n              [104.697816, 29.118212],\n              [104.680346, 29.15569],\n              [104.692329, 29.177099],\n              [104.691993, 29.19934],\n              [104.649325, 29.198588],\n              [104.62424, 29.207282],\n              [104.596355, 29.190394],\n              [104.580117, 29.164639],\n              [104.540922, 29.143394],\n              [104.509453, 29.155522],\n              [104.46589, 29.207366],\n              [104.460963, 29.221827],\n              [104.434646, 29.220908],\n              [104.442597, 29.238543],\n              [104.417735, 29.236454],\n              [104.411688, 29.245479],\n              [104.380332, 29.238376],\n              [104.368685, 29.247652],\n              [104.323218, 29.2408],\n              [104.298805, 29.245647],\n              [104.284582, 29.259601],\n              [104.249082, 29.261356],\n              [104.265433, 29.231857],\n              [104.256026, 29.212298],\n              [104.23262, 29.205861],\n              [104.191409, 29.235869],\n              [104.195888, 29.220657],\n              [104.17685, 29.195745],\n              [104.174835, 29.183789],\n              [104.194097, 29.163719],\n              [104.167891, 29.15042],\n              [104.175395, 29.129591],\n              [104.161732, 29.117041],\n              [104.142358, 29.070593],\n              [104.139671, 29.024543],\n              [104.121641, 28.998243],\n              [104.122985, 28.963976],\n              [104.107082, 28.95082],\n              [104.072478, 28.967496],\n              [104.061839, 28.965401],\n              [104.076174, 28.920897],\n              [104.084685, 28.914441],\n              [104.030483, 28.884843],\n              [104.034402, 28.855908],\n              [104.024996, 28.84408],\n              [104.003494, 28.853475],\n              [103.979977, 28.792137],\n              [103.956459, 28.787521],\n              [103.938317, 28.764268],\n              [103.914912, 28.776273],\n              [103.851079, 28.832166],\n              [103.830473, 28.845338],\n              [103.803708, 28.83611],\n              [103.788478, 28.822433],\n              [103.761041, 28.815888],\n              [103.76944, 28.799355],\n              [103.746483, 28.764016],\n              [103.712775, 28.757299],\n              [103.7018, 28.746719],\n              [103.71591, 28.73849],\n              [103.724869, 28.717577],\n              [103.722853, 28.687923],\n              [103.685674, 28.63481],\n              [103.636623, 28.624134],\n              [103.614562, 28.613373],\n              [103.61389, 28.597313],\n              [103.639983, 28.604881],\n              [103.665404, 28.594874],\n              [103.689257, 28.562578],\n              [103.712551, 28.552904],\n              [103.712999, 28.541294],\n              [103.689929, 28.519332],\n              [103.685002, 28.497955],\n              [103.724533, 28.471522],\n              [103.739987, 28.51201],\n              [103.75701, 28.522782],\n              [103.781983, 28.524549]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511600,\n        \"name\": \"广安市\",\n        \"center\": [106.633369, 30.456398],\n        \"centroid\": [106.666151, 30.42449],\n        \"childrenNum\": 6,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 13,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [106.976088, 30.083596],\n              [106.975864, 30.087906],\n              [106.976648, 30.088071],\n              [106.97732, 30.087491],\n              [106.978552, 30.087408],\n              [106.979784, 30.088071],\n              [106.980456, 30.087657],\n              [106.981912, 30.085171],\n              [107.020659, 30.036845],\n              [107.042721, 30.035021],\n              [107.042497, 30.055084],\n              [107.059295, 30.043146],\n              [107.084492, 30.063871],\n              [107.073853, 30.080944],\n              [107.080125, 30.094204],\n              [107.103082, 30.090143],\n              [107.106554, 30.11384],\n              [107.131303, 30.121545],\n              [107.136454, 30.134385],\n              [107.173298, 30.164861],\n              [107.220221, 30.212794],\n              [107.256057, 30.263764],\n              [107.272743, 30.305447],\n              [107.255385, 30.322809],\n              [107.252809, 30.324876],\n              [107.253257, 30.325951],\n              [107.253593, 30.327356],\n              [107.260425, 30.328927],\n              [107.251802, 30.344302],\n              [107.242843, 30.338598],\n              [107.241611, 30.338516],\n              [107.240939, 30.339425],\n              [107.240267, 30.339921],\n              [107.239931, 30.340499],\n              [107.238587, 30.341739],\n              [107.237691, 30.342235],\n              [107.235563, 30.343723],\n              [107.234779, 30.34455],\n              [107.221341, 30.34612],\n              [107.22918, 30.369838],\n              [107.226828, 30.372069],\n              [107.223021, 30.377771],\n              [107.225932, 30.380084],\n              [107.208798, 30.391155],\n              [107.217533, 30.406438],\n              [107.206895, 30.410072],\n              [107.225372, 30.424113],\n              [107.219661, 30.436995],\n              [107.191776, 30.432123],\n              [107.186177, 30.450454],\n              [107.164115, 30.458793],\n              [107.195696, 30.492058],\n              [107.21395, 30.501218],\n              [107.204207, 30.524321],\n              [107.184945, 30.535705],\n              [107.189201, 30.516483],\n              [107.174418, 30.502868],\n              [107.140822, 30.520938],\n              [107.111593, 30.525971],\n              [107.095355, 30.506251],\n              [107.131303, 30.486363],\n              [107.142614, 30.47002],\n              [107.122792, 30.471671],\n              [107.118201, 30.48562],\n              [107.082365, 30.486198],\n              [107.076429, 30.51409],\n              [107.039361, 30.51541],\n              [107.038689, 30.514998],\n              [107.036898, 30.51574],\n              [107.03757, 30.517143],\n              [107.010917, 30.520691],\n              [107.00207, 30.505921],\n              [106.98348, 30.499485],\n              [106.974633, 30.533726],\n              [106.984599, 30.546511],\n              [107.017748, 30.548656],\n              [107.032082, 30.613217],\n              [107.043281, 30.642803],\n              [107.026819, 30.645193],\n              [106.998038, 30.635634],\n              [106.968585, 30.645522],\n              [106.949323, 30.635716],\n              [106.904305, 30.664225],\n              [106.890306, 30.697666],\n              [106.904528, 30.70236],\n              [106.924126, 30.684818],\n              [106.949547, 30.707137],\n              [106.883587, 30.715618],\n              [106.880451, 30.733978],\n              [106.840472, 30.738341],\n              [106.831177, 30.757107],\n              [106.809899, 30.763198],\n              [106.739123, 30.807875],\n              [106.730164, 30.832632],\n              [106.685257, 30.829342],\n              [106.675178, 30.838882],\n              [106.629599, 30.821036],\n              [106.617281, 30.82778],\n              [106.616497, 30.801705],\n              [106.626464, 30.789365],\n              [106.618401, 30.766572],\n              [106.584244, 30.756861],\n              [106.587604, 30.73974],\n              [106.542809, 30.743033],\n              [106.528923, 30.732496],\n              [106.506301, 30.762869],\n              [106.507757, 30.784511],\n              [106.487599, 30.787966],\n              [106.466546, 30.760893],\n              [106.448068, 30.753321],\n              [106.441124, 30.727144],\n              [106.420855, 30.708207],\n              [106.423094, 30.693219],\n              [106.403609, 30.695525],\n              [106.38905, 30.679876],\n              [106.364301, 30.697337],\n              [106.366877, 30.712736],\n              [106.354558, 30.722122],\n              [106.300468, 30.686218],\n              [106.286806, 30.70516],\n              [106.250746, 30.719323],\n              [106.207631, 30.722863],\n              [106.217486, 30.704666],\n              [106.238091, 30.706807],\n              [106.237531, 30.687454],\n              [106.225773, 30.695196],\n              [106.217822, 30.677652],\n              [106.166643, 30.648324],\n              [106.178962, 30.620058],\n              [106.192176, 30.612969],\n              [106.180194, 30.595658],\n              [106.157796, 30.598049],\n              [106.123192, 30.544449],\n              [106.112777, 30.503198],\n              [106.093851, 30.504189],\n              [106.066638, 30.491727],\n              [106.039426, 30.518216],\n              [106.028003, 30.505261],\n              [106.024755, 30.482071],\n              [105.980856, 30.488344],\n              [105.970665, 30.477119],\n              [105.971225, 30.456151],\n              [105.950172, 30.452931],\n              [105.948268, 30.441619],\n              [105.963834, 30.424691],\n              [105.9794, 30.427581],\n              [105.989815, 30.41255],\n              [105.987239, 30.394047],\n              [106.00079, 30.376283],\n              [106.032146, 30.371821],\n              [106.033714, 30.361823],\n              [106.07347, 30.334135],\n              [106.08926, 30.345541],\n              [106.088364, 30.32314],\n              [106.114793, 30.317353],\n              [106.131815, 30.301808],\n              [106.131815, 30.324132],\n              [106.149733, 30.30925],\n              [106.171235, 30.305033],\n              [106.180418, 30.277825],\n              [106.180418, 30.232821],\n              [106.201023, 30.228021],\n              [106.192288, 30.21627],\n              [106.212558, 30.20311],\n              [106.232268, 30.212546],\n              [106.24593, 30.196488],\n              [106.260601, 30.196985],\n              [106.260377, 30.20402],\n              [106.260265, 30.207911],\n              [106.264296, 30.209732],\n              [106.278407, 30.195743],\n              [106.296437, 30.205841],\n              [106.30058, 30.23853],\n              [106.335072, 30.226366],\n              [106.349295, 30.245232],\n              [106.372588, 30.248211],\n              [106.402713, 30.242088],\n              [106.427798, 30.253754],\n              [106.407976, 30.276171],\n              [106.434741, 30.276998],\n              [106.428582, 30.291554],\n              [106.449747, 30.297839],\n              [106.544825, 30.296764],\n              [106.560279, 30.31512],\n              [106.611009, 30.292712],\n              [106.634863, 30.265666],\n              [106.642142, 30.246556],\n              [106.611457, 30.228021],\n              [106.624448, 30.227111],\n              [106.631839, 30.186554],\n              [106.677642, 30.157409],\n              [106.673274, 30.122042],\n              [106.703175, 30.118148],\n              [106.700263, 30.073651],\n              [106.725797, 30.057073],\n              [106.732404, 30.026812],\n              [106.785486, 30.017276],\n              [106.800044, 30.030543],\n              [106.830169, 30.033943],\n              [106.842039, 30.049115],\n              [106.861413, 30.028139],\n              [106.884259, 30.034357],\n              [106.913599, 30.025568],\n              [106.914831, 30.033943],\n              [106.94854, 30.040161],\n              [106.956715, 30.067518],\n              [106.976088, 30.083596]\n            ]\n          ],\n          [\n            [\n              [107.225932, 30.380084],\n              [107.223021, 30.377771],\n              [107.226828, 30.372069],\n              [107.22918, 30.369838],\n              [107.225932, 30.380084]\n            ]\n          ],\n          [\n            [\n              [107.255385, 30.322809],\n              [107.272743, 30.305447],\n              [107.286742, 30.334796],\n              [107.304772, 30.354881],\n              [107.287749, 30.363062],\n              [107.276327, 30.357195],\n              [107.276663, 30.352401],\n              [107.27879, 30.346203],\n              [107.272295, 30.322148],\n              [107.261432, 30.326281],\n              [107.254153, 30.325951],\n              [107.253257, 30.325951],\n              [107.252809, 30.324876],\n              [107.255385, 30.322809]\n            ]\n          ],\n          [\n            [\n              [107.241611, 30.347856],\n              [107.238811, 30.346616],\n              [107.234779, 30.34455],\n              [107.235563, 30.343723],\n              [107.237691, 30.342235],\n              [107.238587, 30.341739],\n              [107.239931, 30.340499],\n              [107.240267, 30.339921],\n              [107.240939, 30.339425],\n              [107.241611, 30.338516],\n              [107.242843, 30.338598],\n              [107.251802, 30.344302],\n              [107.241611, 30.347856]\n            ]\n          ],\n          [\n            [\n              [106.264296, 30.209732],\n              [106.260265, 30.207911],\n              [106.260377, 30.20402],\n              [106.260601, 30.196985],\n              [106.264296, 30.209732]\n            ]\n          ],\n          [\n            [\n              [106.976648, 30.088071],\n              [106.975864, 30.087906],\n              [106.976088, 30.083596],\n              [106.981912, 30.085171],\n              [106.980456, 30.087657],\n              [106.979784, 30.088071],\n              [106.978552, 30.087408],\n              [106.97732, 30.087491],\n              [106.976648, 30.088071]\n            ]\n          ],\n          [\n            [\n              [107.260425, 30.328927],\n              [107.253593, 30.327356],\n              [107.254153, 30.325951],\n              [107.261432, 30.326281],\n              [107.260425, 30.328927]\n            ]\n          ],\n          [\n            [\n              [107.03757, 30.517143],\n              [107.036898, 30.51574],\n              [107.038689, 30.514998],\n              [107.039361, 30.51541],\n              [107.03757, 30.517143]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511700,\n        \"name\": \"达州市\",\n        \"center\": [107.502262, 31.209484],\n        \"centroid\": [107.650611, 31.367469],\n        \"childrenNum\": 7,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 14,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [107.304772, 30.354881],\n              [107.33904, 30.387107],\n              [107.345535, 30.425517],\n              [107.359981, 30.456233],\n              [107.408696, 30.521598],\n              [107.419895, 30.516483],\n              [107.442852, 30.535293],\n              [107.42751, 30.547666],\n              [107.46021, 30.571335],\n              [107.485295, 30.598296],\n              [107.493694, 30.618986],\n              [107.51542, 30.642061],\n              [107.499182, 30.660188],\n              [107.478576, 30.664472],\n              [107.456627, 30.682347],\n              [107.458642, 30.704831],\n              [107.436133, 30.721958],\n              [107.424374, 30.740645],\n              [107.439045, 30.747066],\n              [107.447892, 30.778751],\n              [107.466369, 30.77406],\n              [107.477792, 30.799813],\n              [107.497726, 30.809273],\n              [107.492127, 30.833125],\n              [107.481152, 30.836826],\n              [107.513852, 30.855081],\n              [107.527515, 30.839046],\n              [107.535466, 30.847681],\n              [107.577573, 30.848092],\n              [107.616209, 30.837731],\n              [107.631103, 30.817828],\n              [107.643646, 30.820624],\n              [107.691912, 30.874811],\n              [107.704119, 30.872263],\n              [107.717333, 30.888291],\n              [107.737715, 30.885004],\n              [107.760336, 30.862233],\n              [107.752273, 30.846036],\n              [107.763808, 30.817088],\n              [107.787885, 30.819473],\n              [107.818906, 30.797428],\n              [107.852278, 30.793479],\n              [107.891586, 30.830247],\n              [107.929437, 30.859356],\n              [107.955307, 30.873249],\n              [107.955979, 30.882949],\n              [107.992262, 30.902591],\n              [107.945004, 30.92338],\n              [107.936269, 30.952789],\n              [107.943548, 30.989415],\n              [107.981176, 30.983339],\n              [108.003797, 31.025369],\n              [108.053296, 31.040716],\n              [108.058895, 31.053926],\n              [108.028994, 31.061721],\n              [108.024739, 31.089283],\n              [108.009397, 31.108309],\n              [108.025747, 31.116345],\n              [108.036274, 31.139956],\n              [108.08566, 31.188063],\n              [108.089356, 31.205922],\n              [108.076141, 31.231804],\n              [108.040081, 31.218618],\n              [108.019475, 31.244988],\n              [108.066398, 31.261773],\n              [108.092379, 31.265784],\n              [108.095291, 31.275526],\n              [108.144341, 31.301225],\n              [108.185553, 31.338044],\n              [108.176034, 31.35473],\n              [108.154084, 31.370759],\n              [108.182865, 31.392999],\n              [108.206494, 31.397413],\n              [108.216349, 31.411146],\n              [108.210526, 31.435746],\n              [108.223852, 31.449229],\n              [108.223181, 31.46516],\n              [108.19328, 31.468183],\n              [108.19048, 31.491461],\n              [108.212206, 31.493748],\n              [108.226764, 31.505834],\n              [108.254761, 31.498811],\n              [108.28175, 31.507303],\n              [108.323297, 31.502404],\n              [108.344015, 31.512447],\n              [108.339535, 31.53898],\n              [108.350286, 31.546],\n              [108.381195, 31.542572],\n              [108.39161, 31.561425],\n              [108.377947, 31.570401],\n              [108.402584, 31.603851],\n              [108.442676, 31.633701],\n              [108.468321, 31.622284],\n              [108.472017, 31.639001],\n              [108.490159, 31.641284],\n              [108.504493, 31.656286],\n              [108.532826, 31.669084],\n              [108.546488, 31.66672],\n              [108.514796, 31.694106],\n              [108.525435, 31.702499],\n              [108.518603, 31.726207],\n              [108.505501, 31.732643],\n              [108.53529, 31.757728],\n              [108.515692, 31.761067],\n              [108.488591, 31.780283],\n              [108.462498, 31.780527],\n              [108.454435, 31.791111],\n              [108.465185, 31.808367],\n              [108.441444, 31.807635],\n              [108.391946, 31.828712],\n              [108.385898, 31.854097],\n              [108.340991, 31.863533],\n              [108.308403, 31.905984],\n              [108.282646, 31.917773],\n              [108.280182, 31.953047],\n              [108.259352, 31.966861],\n              [108.269879, 31.985141],\n              [108.282198, 31.97921],\n              [108.307059, 31.997244],\n              [108.35051, 31.97198],\n              [108.369436, 31.986847],\n              [108.329233, 32.019253],\n              [108.362493, 32.036304],\n              [108.364061, 32.048319],\n              [108.343567, 32.063904],\n              [108.373804, 32.077133],\n              [108.394521, 32.066177],\n              [108.412887, 32.070073],\n              [108.430021, 32.061388],\n              [108.450403, 32.074374],\n              [108.452531, 32.090279],\n              [108.431589, 32.101719],\n              [108.406616, 32.141303],\n              [108.369436, 32.17333],\n              [108.406392, 32.196188],\n              [108.45925, 32.181436],\n              [108.479296, 32.182085],\n              [108.509756, 32.201213],\n              [108.51446, 32.21823],\n              [108.507069, 32.245694],\n              [108.484447, 32.250716],\n              [108.471793, 32.27064],\n              [108.450739, 32.259302],\n              [108.421846, 32.260679],\n              [108.415015, 32.252498],\n              [108.390602, 32.263594],\n              [108.370668, 32.253632],\n              [108.347935, 32.253956],\n              [108.331808, 32.233381],\n              [108.312099, 32.232166],\n              [108.264504, 32.257439],\n              [108.248602, 32.274446],\n              [108.212206, 32.256953],\n              [108.213326, 32.248205],\n              [108.179729, 32.221714],\n              [108.15666, 32.238971],\n              [108.141654, 32.218878],\n              [108.123064, 32.218392],\n              [108.089915, 32.233705],\n              [108.066062, 32.229654],\n              [108.043329, 32.215232],\n              [108.018579, 32.211829],\n              [108.023171, 32.175924],\n              [107.995734, 32.147141],\n              [107.979384, 32.146006],\n              [107.954299, 32.163926],\n              [107.924734, 32.196998],\n              [107.890466, 32.214422],\n              [107.867508, 32.202428],\n              [107.835816, 32.223011],\n              [107.788669, 32.279871],\n              [107.754625, 32.338233],\n              [107.716773, 32.328846],\n              [107.703559, 32.318001],\n              [107.705239, 32.281814],\n              [107.679034, 32.251445],\n              [107.690456, 32.218797],\n              [107.630991, 32.199673],\n              [107.627855, 32.151763],\n              [107.641294, 32.138707],\n              [107.680601, 32.141059],\n              [107.708262, 32.115024],\n              [107.715765, 32.118998],\n              [107.74253, 32.102368],\n              [107.76392, 32.069667],\n              [107.7329, 32.039552],\n              [107.702439, 32.029809],\n              [107.67601, 32.006097],\n              [107.622368, 32.01438],\n              [107.584964, 32.000168],\n              [107.569174, 31.981241],\n              [107.58418, 31.962961],\n              [107.569622, 31.948659],\n              [107.541177, 31.943864],\n              [107.53233, 31.929803],\n              [107.515084, 31.926471],\n              [107.550696, 31.897122],\n              [107.533338, 31.877035],\n              [107.496046, 31.866462],\n              [107.57175, 31.834246],\n              [107.554504, 31.768721],\n              [107.533562, 31.760578],\n              [107.539049, 31.738426],\n              [107.492351, 31.729384],\n              [107.501645, 31.69818],\n              [107.516988, 31.683511],\n              [107.53289, 31.684571],\n              [107.518108, 31.637452],\n              [107.499966, 31.626525],\n              [107.489887, 31.596999],\n              [107.471633, 31.596265],\n              [107.454051, 31.583048],\n              [107.445428, 31.591615],\n              [107.429862, 31.572768],\n              [107.388986, 31.563955],\n              [107.361437, 31.541266],\n              [107.354494, 31.549101],\n              [107.331201, 31.53147],\n              [107.322914, 31.492931],\n              [107.285846, 31.491298],\n              [107.273191, 31.453723],\n              [107.258633, 31.445225],\n              [107.237691, 31.466304],\n              [107.225037, 31.434602],\n              [107.21003, 31.42643],\n              [107.17397, 31.427901],\n              [107.145413, 31.379672],\n              [107.149893, 31.356529],\n              [107.120328, 31.334035],\n              [107.101962, 31.335426],\n              [107.074861, 31.373376],\n              [107.046081, 31.34696],\n              [107.054592, 31.326836],\n              [107.035778, 31.321682],\n              [107.038689, 31.294678],\n              [107.019092, 31.304499],\n              [107.003525, 31.269223],\n              [106.983256, 31.248755],\n              [106.964778, 31.250802],\n              [106.958282, 31.228283],\n              [106.939917, 31.207151],\n              [106.938349, 31.1761],\n              [106.951003, 31.161267],\n              [106.931965, 31.133726],\n              [106.935325, 31.116591],\n              [106.909008, 31.107653],\n              [106.894786, 31.08756],\n              [106.86914, 31.081163],\n              [106.830505, 31.05286],\n              [106.819754, 31.011662],\n              [106.803292, 30.993684],\n              [106.78739, 30.995901],\n              [106.784814, 30.972336],\n              [106.771487, 30.96864],\n              [106.73162, 30.973649],\n              [106.740467, 30.951147],\n              [106.723221, 30.946629],\n              [106.707207, 30.915903],\n              [106.678986, 30.922887],\n              [106.666443, 30.909987],\n              [106.689177, 30.883606],\n              [106.675514, 30.867084],\n              [106.675178, 30.838882],\n              [106.685257, 30.829342],\n              [106.730164, 30.832632],\n              [106.739123, 30.807875],\n              [106.809899, 30.763198],\n              [106.831177, 30.757107],\n              [106.840472, 30.738341],\n              [106.880451, 30.733978],\n              [106.883587, 30.715618],\n              [106.949547, 30.707137],\n              [106.924126, 30.684818],\n              [106.904528, 30.70236],\n              [106.890306, 30.697666],\n              [106.904305, 30.664225],\n              [106.949323, 30.635716],\n              [106.968585, 30.645522],\n              [106.998038, 30.635634],\n              [107.026819, 30.645193],\n              [107.043281, 30.642803],\n              [107.032082, 30.613217],\n              [107.017748, 30.548656],\n              [106.984599, 30.546511],\n              [106.974633, 30.533726],\n              [106.98348, 30.499485],\n              [107.00207, 30.505921],\n              [107.010917, 30.520691],\n              [107.03757, 30.517143],\n              [107.039361, 30.51541],\n              [107.076429, 30.51409],\n              [107.082365, 30.486198],\n              [107.118201, 30.48562],\n              [107.122792, 30.471671],\n              [107.142614, 30.47002],\n              [107.131303, 30.486363],\n              [107.095355, 30.506251],\n              [107.111593, 30.525971],\n              [107.140822, 30.520938],\n              [107.174418, 30.502868],\n              [107.189201, 30.516483],\n              [107.184945, 30.535705],\n              [107.204207, 30.524321],\n              [107.21395, 30.501218],\n              [107.195696, 30.492058],\n              [107.164115, 30.458793],\n              [107.186177, 30.450454],\n              [107.191776, 30.432123],\n              [107.219661, 30.436995],\n              [107.225372, 30.424113],\n              [107.227388, 30.420561],\n              [107.227724, 30.414202],\n              [107.217533, 30.406438],\n              [107.208798, 30.391155],\n              [107.225932, 30.380084],\n              [107.22918, 30.369838],\n              [107.221341, 30.34612],\n              [107.234779, 30.34455],\n              [107.238811, 30.346616],\n              [107.238587, 30.349426],\n              [107.240379, 30.3505],\n              [107.241611, 30.347856],\n              [107.251802, 30.344302],\n              [107.260425, 30.328927],\n              [107.261432, 30.326281],\n              [107.272295, 30.322148],\n              [107.27879, 30.346203],\n              [107.271399, 30.345046],\n              [107.265576, 30.349343],\n              [107.276663, 30.352401],\n              [107.276327, 30.357195],\n              [107.274311, 30.37083],\n              [107.277447, 30.371574],\n              [107.287749, 30.363062],\n              [107.304772, 30.354881]\n            ]\n          ],\n          [\n            [\n              [107.227388, 30.420561],\n              [107.225372, 30.424113],\n              [107.206895, 30.410072],\n              [107.217533, 30.406438],\n              [107.227724, 30.414202],\n              [107.227388, 30.420561]\n            ]\n          ],\n          [\n            [\n              [107.254153, 30.325951],\n              [107.253593, 30.327356],\n              [107.253257, 30.325951],\n              [107.254153, 30.325951]\n            ]\n          ],\n          [\n            [\n              [107.277447, 30.371574],\n              [107.274311, 30.37083],\n              [107.276327, 30.357195],\n              [107.287749, 30.363062],\n              [107.277447, 30.371574]\n            ]\n          ],\n          [\n            [\n              [107.276663, 30.352401],\n              [107.265576, 30.349343],\n              [107.271399, 30.345046],\n              [107.27879, 30.346203],\n              [107.276663, 30.352401]\n            ]\n          ],\n          [\n            [\n              [107.240379, 30.3505],\n              [107.238587, 30.349426],\n              [107.238811, 30.346616],\n              [107.241611, 30.347856],\n              [107.240379, 30.3505]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511800,\n        \"name\": \"雅安市\",\n        \"center\": [103.001033, 29.987722],\n        \"centroid\": [102.665156, 29.914326],\n        \"childrenNum\": 8,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 15,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.395178, 30.094866],\n              [103.360574, 30.136787],\n              [103.372109, 30.148382],\n              [103.36091, 30.168008],\n              [103.370317, 30.22827],\n              [103.350047, 30.236048],\n              [103.320259, 30.23489],\n              [103.313875, 30.260372],\n              [103.282295, 30.263598],\n              [103.242651, 30.243081],\n              [103.233356, 30.213456],\n              [103.215998, 30.209235],\n              [103.211631, 30.232407],\n              [103.183634, 30.248128],\n              [103.147238, 30.207],\n              [103.076798, 30.220242],\n              [103.071534, 30.260951],\n              [103.061456, 30.270464],\n              [103.068623, 30.294283],\n              [103.062128, 30.302553],\n              [103.079038, 30.324545],\n              [103.091132, 30.326529],\n              [103.127976, 30.367111],\n              [103.116329, 30.380002],\n              [103.115993, 30.413954],\n              [103.12596, 30.451115],\n              [103.141751, 30.470845],\n              [103.162244, 30.472579],\n              [103.185874, 30.511945],\n              [103.180834, 30.525228],\n              [103.157765, 30.530013],\n              [103.166276, 30.555749],\n              [103.147798, 30.585847],\n              [103.126856, 30.593927],\n              [103.135591, 30.624096],\n              [103.13156, 30.65475],\n              [103.119017, 30.670898],\n              [103.103115, 30.672957],\n              [103.068735, 30.716194],\n              [103.031331, 30.703678],\n              [103.033907, 30.719076],\n              [103.005126, 30.74649],\n              [102.992919, 30.778339],\n              [102.962683, 30.769699],\n              [102.897954, 30.765255],\n              [102.863574, 30.798332],\n              [102.889443, 30.865851],\n              [102.889555, 30.900784],\n              [102.875221, 30.923298],\n              [102.852375, 30.936772],\n              [102.828298, 30.928721],\n              [102.801869, 30.93595],\n              [102.75405, 30.916396],\n              [102.708247, 30.915493],\n              [102.686634, 30.888045],\n              [102.679802, 30.857629],\n              [102.667148, 30.850723],\n              [102.590996, 30.847845],\n              [102.56132, 30.821036],\n              [102.532091, 30.811659],\n              [102.52134, 30.794548],\n              [102.493791, 30.790352],\n              [102.469042, 30.768712],\n              [102.4864, 30.744761],\n              [102.494463, 30.713642],\n              [102.486512, 30.685807],\n              [102.473298, 30.670898],\n              [102.47173, 30.640001],\n              [102.443397, 30.618245],\n              [102.43119, 30.596895],\n              [102.417976, 30.524156],\n              [102.419656, 30.452766],\n              [102.434438, 30.421387],\n              [102.425255, 30.384546],\n              [102.432758, 30.355129],\n              [102.414168, 30.303958],\n              [102.402298, 30.234228],\n              [102.341824, 30.200296],\n              [102.328946, 30.187961],\n              [102.29367, 30.128835],\n              [102.295126, 30.101164],\n              [102.268137, 30.077381],\n              [102.276872, 30.039995],\n              [102.274968, 30.017193],\n              [102.292214, 29.993721],\n              [102.303189, 29.954562],\n              [102.299381, 29.934063],\n              [102.284487, 29.917877],\n              [102.282583, 29.896956],\n              [102.270824, 29.881595],\n              [102.291094, 29.854519],\n              [102.291094, 29.838237],\n              [102.323346, 29.824778],\n              [102.326258, 29.799599],\n              [102.344064, 29.789209],\n              [102.353247, 29.76319],\n              [102.32861, 29.736748],\n              [102.336001, 29.720114],\n              [102.305764, 29.699567],\n              [102.296133, 29.683593],\n              [102.277208, 29.603767],\n              [102.284375, 29.590192],\n              [102.31002, 29.575283],\n              [102.318755, 29.551958],\n              [102.314051, 29.53346],\n              [102.203296, 29.456851],\n              [102.175859, 29.466524],\n              [102.178547, 29.512709],\n              [102.16578, 29.532877],\n              [102.145174, 29.53221],\n              [102.145622, 29.504207],\n              [102.13308, 29.510458],\n              [102.090637, 29.496121],\n              [102.033747, 29.500039],\n              [102.012021, 29.49112],\n              [101.97417, 29.489702],\n              [101.94942, 29.503874],\n              [101.935982, 29.50104],\n              [101.950764, 29.462688],\n              [101.95222, 29.437585],\n              [101.984136, 29.422403],\n              [101.972154, 29.38277],\n              [101.9567, 29.367414],\n              [101.949532, 29.344124],\n              [101.960171, 29.314816],\n              [101.983801, 29.299032],\n              [102.046066, 29.297779],\n              [102.096348, 29.2718],\n              [102.123337, 29.238627],\n              [102.119529, 29.221911],\n              [102.093996, 29.208453],\n              [102.056032, 29.177852],\n              [102.088509, 29.173336],\n              [102.109562, 29.185043],\n              [102.129608, 29.176096],\n              [102.131736, 29.159872],\n              [102.160741, 29.130344],\n              [102.15167, 29.102648],\n              [102.168468, 29.07302],\n              [102.156485, 29.045393],\n              [102.16522, 29.036518],\n              [102.188961, 29.024626],\n              [102.180898, 29.013404],\n              [102.22155, 28.962217],\n              [102.253802, 28.898763],\n              [102.29087, 28.899685],\n              [102.319763, 28.883082],\n              [102.352351, 28.854566],\n              [102.381804, 28.855572],\n              [102.429846, 28.845422],\n              [102.454148, 28.873606],\n              [102.481473, 28.920142],\n              [102.482929, 28.932716],\n              [102.46613, 28.969339],\n              [102.471506, 28.983834],\n              [102.497823, 29.003269],\n              [102.507006, 29.025883],\n              [102.525484, 29.036267],\n              [102.517757, 29.058454],\n              [102.524476, 29.077457],\n              [102.514845, 29.09361],\n              [102.522236, 29.111602],\n              [102.547657, 29.116957],\n              [102.559864, 29.133606],\n              [102.552697, 29.150671],\n              [102.563, 29.159955],\n              [102.594692, 29.160039],\n              [102.600515, 29.169991],\n              [102.590884, 29.191983],\n              [102.618993, 29.209707],\n              [102.635791, 29.210793],\n              [102.653373, 29.188053],\n              [102.649006, 29.177601],\n              [102.673419, 29.161544],\n              [102.69828, 29.167064],\n              [102.740388, 29.153348],\n              [102.772192, 29.159621],\n              [102.778575, 29.173336],\n              [102.766817, 29.18705],\n              [102.781487, 29.236705],\n              [102.804556, 29.249908],\n              [102.833113, 29.241886],\n              [102.836585, 29.208035],\n              [102.879812, 29.206112],\n              [102.905457, 29.222245],\n              [102.9124, 29.264531],\n              [102.940397, 29.302874],\n              [102.962347, 29.301871],\n              [103.003894, 29.287171],\n              [102.979817, 29.320578],\n              [102.980377, 29.340367],\n              [102.998519, 29.368332],\n              [102.975449, 29.397791],\n              [102.93211, 29.400545],\n              [102.879364, 29.415896],\n              [102.823146, 29.46569],\n              [102.869957, 29.530044],\n              [102.914416, 29.553208],\n              [102.931998, 29.61634],\n              [102.929646, 29.668115],\n              [102.938493, 29.67677],\n              [102.928751, 29.711047],\n              [102.962011, 29.721944],\n              [102.996055, 29.708302],\n              [103.007702, 29.72552],\n              [103.044546, 29.700066],\n              [103.052497, 29.675522],\n              [103.092028, 29.683177],\n              [103.099083, 29.693827],\n              [103.1282, 29.671527],\n              [103.150038, 29.672443],\n              [103.141303, 29.703145],\n              [103.153845, 29.713293],\n              [103.143654, 29.730926],\n              [103.162916, 29.737829],\n              [103.143206, 29.760862],\n              [103.165156, 29.77034],\n              [103.125064, 29.864154],\n              [103.093708, 29.886992],\n              [103.109946, 29.915636],\n              [103.159781, 29.930162],\n              [103.176915, 29.945931],\n              [103.1964, 29.944355],\n              [103.191249, 29.966344],\n              [103.225965, 29.970659],\n              [103.252506, 30.040078],\n              [103.302341, 30.087574],\n              [103.312531, 30.071745],\n              [103.339856, 30.074729],\n              [103.349599, 30.097684],\n              [103.372221, 30.082105],\n              [103.37838, 30.095944],\n              [103.395178, 30.094866]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 511900,\n        \"name\": \"巴中市\",\n        \"center\": [106.753669, 31.858809],\n        \"centroid\": [107.041958, 32.016794],\n        \"childrenNum\": 5,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 16,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [106.964778, 31.250802],\n              [106.983256, 31.248755],\n              [107.003525, 31.269223],\n              [107.019092, 31.304499],\n              [107.038689, 31.294678],\n              [107.035778, 31.321682],\n              [107.054592, 31.326836],\n              [107.046081, 31.34696],\n              [107.074861, 31.373376],\n              [107.101962, 31.335426],\n              [107.120328, 31.334035],\n              [107.149893, 31.356529],\n              [107.145413, 31.379672],\n              [107.17397, 31.427901],\n              [107.21003, 31.42643],\n              [107.225037, 31.434602],\n              [107.237691, 31.466304],\n              [107.258633, 31.445225],\n              [107.273191, 31.453723],\n              [107.285846, 31.491298],\n              [107.322914, 31.492931],\n              [107.331201, 31.53147],\n              [107.354494, 31.549101],\n              [107.361437, 31.541266],\n              [107.388986, 31.563955],\n              [107.429862, 31.572768],\n              [107.445428, 31.591615],\n              [107.454051, 31.583048],\n              [107.471633, 31.596265],\n              [107.489887, 31.596999],\n              [107.499966, 31.626525],\n              [107.518108, 31.637452],\n              [107.53289, 31.684571],\n              [107.516988, 31.683511],\n              [107.501645, 31.69818],\n              [107.492351, 31.729384],\n              [107.539049, 31.738426],\n              [107.533562, 31.760578],\n              [107.554504, 31.768721],\n              [107.57175, 31.834246],\n              [107.496046, 31.866462],\n              [107.533338, 31.877035],\n              [107.550696, 31.897122],\n              [107.515084, 31.926471],\n              [107.53233, 31.929803],\n              [107.541177, 31.943864],\n              [107.569622, 31.948659],\n              [107.58418, 31.962961],\n              [107.569174, 31.981241],\n              [107.584964, 32.000168],\n              [107.622368, 32.01438],\n              [107.67601, 32.006097],\n              [107.702439, 32.029809],\n              [107.7329, 32.039552],\n              [107.76392, 32.069667],\n              [107.74253, 32.102368],\n              [107.715765, 32.118998],\n              [107.708262, 32.115024],\n              [107.680601, 32.141059],\n              [107.641294, 32.138707],\n              [107.627855, 32.151763],\n              [107.630991, 32.199673],\n              [107.690456, 32.218797],\n              [107.679034, 32.251445],\n              [107.705239, 32.281814],\n              [107.703559, 32.318001],\n              [107.716773, 32.328846],\n              [107.707926, 32.332083],\n              [107.693592, 32.362911],\n              [107.695272, 32.374721],\n              [107.680377, 32.397609],\n              [107.648013, 32.413701],\n              [107.636366, 32.406019],\n              [107.602882, 32.411275],\n              [107.573317, 32.403513],\n              [107.566262, 32.394294],\n              [107.533114, 32.383618],\n              [107.512396, 32.386368],\n              [107.489775, 32.425262],\n              [107.456963, 32.417743],\n              [107.450691, 32.432214],\n              [107.462002, 32.441348],\n              [107.458194, 32.458401],\n              [107.438709, 32.465835],\n              [107.429302, 32.501141],\n              [107.436357, 32.52973],\n              [107.40612, 32.539177],\n              [107.377899, 32.538935],\n              [107.356846, 32.506391],\n              [107.313955, 32.490236],\n              [107.28607, 32.454522],\n              [107.283718, 32.434154],\n              [107.263896, 32.40327],\n              [107.230636, 32.416126],\n              [107.21003, 32.431971],\n              [107.189648, 32.468017],\n              [107.127048, 32.48248],\n              [107.10465, 32.516648],\n              [107.080125, 32.542407],\n              [107.091995, 32.552579],\n              [107.107786, 32.600761],\n              [107.097595, 32.62706],\n              [107.099051, 32.649481],\n              [107.08774, 32.667946],\n              [107.068366, 32.669962],\n              [107.059743, 32.686165],\n              [107.066798, 32.708894],\n              [107.03029, 32.712359],\n              [107.012596, 32.721545],\n              [106.988407, 32.711795],\n              [106.949099, 32.716549],\n              [106.91304, 32.704381],\n              [106.903409, 32.721303],\n              [106.872612, 32.725654],\n              [106.845959, 32.721062],\n              [106.821098, 32.706073],\n              [106.793213, 32.712601],\n              [106.78179, 32.700915],\n              [106.779439, 32.737498],\n              [106.7333, 32.739351],\n              [106.684473, 32.709297],\n              [106.66342, 32.69076],\n              [106.64035, 32.687294],\n              [106.645278, 32.63682],\n              [106.658044, 32.622463],\n              [106.652109, 32.590756],\n              [106.65838, 32.566221],\n              [106.649421, 32.50421],\n              [106.674842, 32.486196],\n              [106.689849, 32.453633],\n              [106.684697, 32.418066],\n              [106.691528, 32.404159],\n              [106.688953, 32.348024],\n              [106.725909, 32.336939],\n              [106.737779, 32.31533],\n              [106.745058, 32.322938],\n              [106.776191, 32.296874],\n              [106.755361, 32.285296],\n              [106.71695, 32.294607],\n              [106.718405, 32.269263],\n              [106.688393, 32.266267],\n              [106.674842, 32.272664],\n              [106.666219, 32.249663],\n              [106.594547, 32.23727],\n              [106.564647, 32.227548],\n              [106.556919, 32.1756],\n              [106.567558, 32.128407],\n              [106.535194, 32.098474],\n              [106.559159, 32.082733],\n              [106.533514, 32.08184],\n              [106.517836, 32.068531],\n              [106.519628, 32.050186],\n              [106.501038, 32.048969],\n              [106.508765, 32.024775],\n              [106.493087, 32.006016],\n              [106.482112, 31.977098],\n              [106.445492, 31.977179],\n              [106.464754, 31.954591],\n              [106.463522, 31.94167],\n              [106.446052, 31.943295],\n              [106.428694, 31.922813],\n              [106.427462, 31.915009],\n              [106.408984, 31.902081],\n              [106.424662, 31.889803],\n              [106.406408, 31.874189],\n              [106.416039, 31.83156],\n              [106.406296, 31.808286],\n              [106.39577, 31.805681],\n              [106.406632, 31.777026],\n              [106.42455, 31.755448],\n              [106.40764, 31.755204],\n              [106.405288, 31.725637],\n              [106.378747, 31.732969],\n              [106.382667, 31.720423],\n              [106.366429, 31.696632],\n              [106.400025, 31.681229],\n              [106.412568, 31.65702],\n              [106.438661, 31.655715],\n              [106.456803, 31.633049],\n              [106.460722, 31.586312],\n              [106.484016, 31.584517],\n              [106.492079, 31.567382],\n              [106.516604, 31.575052],\n              [106.536986, 31.572033],\n              [106.566438, 31.545755],\n              [106.566886, 31.518244],\n              [106.607874, 31.50665],\n              [106.626464, 31.510814],\n              [106.644942, 31.544694],\n              [106.632175, 31.567056],\n              [106.647517, 31.591125],\n              [106.673386, 31.569177],\n              [106.693656, 31.56118],\n              [106.718965, 31.571952],\n              [106.722101, 31.563383],\n              [106.7688, 31.5673],\n              [106.766224, 31.537592],\n              [106.787166, 31.531307],\n              [106.821098, 31.547877],\n              [106.815498, 31.515142],\n              [106.842151, 31.503139],\n              [106.846071, 31.456909],\n              [106.871268, 31.426512],\n              [106.883251, 31.420873],\n              [106.864549, 31.400683],\n              [106.917855, 31.377464],\n              [106.946748, 31.328963],\n              [106.934317, 31.309081],\n              [106.944172, 31.288949],\n              [106.964442, 31.291077],\n              [106.94574, 31.264802],\n              [106.946748, 31.265539],\n              [106.948092, 31.264638],\n              [106.947532, 31.263656],\n              [106.964778, 31.250802]\n            ]\n          ],\n          [\n            [\n              [106.946748, 31.265539],\n              [106.94574, 31.264802],\n              [106.947532, 31.263656],\n              [106.948092, 31.264638],\n              [106.946748, 31.265539]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 512000,\n        \"name\": \"资阳市\",\n        \"center\": [104.641917, 30.122211],\n        \"centroid\": [105.118328, 30.098408],\n        \"childrenNum\": 3,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 17,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [104.899505, 29.902353],\n              [104.902417, 29.907168],\n              [104.927166, 29.936221],\n              [104.903649, 29.941367],\n              [104.924367, 29.946844],\n              [104.932766, 29.977296],\n              [104.95158, 29.99256],\n              [104.976441, 29.993223],\n              [104.993687, 29.977047],\n              [105.0209, 29.976798],\n              [105.049345, 29.947508],\n              [105.074654, 29.944023],\n              [105.064015, 29.922526],\n              [105.097051, 29.904927],\n              [105.100747, 29.885498],\n              [105.080589, 29.88284],\n              [105.0947, 29.848954],\n              [105.125608, 29.830677],\n              [105.175554, 29.846711],\n              [105.217326, 29.8448],\n              [105.238491, 29.817549],\n              [105.233564, 29.804087],\n              [105.252714, 29.796025],\n              [105.288662, 29.798269],\n              [105.297733, 29.82054],\n              [105.319122, 29.821953],\n              [105.332225, 29.81115],\n              [105.35395, 29.811566],\n              [105.360446, 29.83425],\n              [105.373548, 29.824612],\n              [105.383179, 29.796856],\n              [105.405017, 29.78896],\n              [105.393482, 29.747226],\n              [105.416775, 29.721112],\n              [105.423943, 29.687587],\n              [105.436373, 29.676936],\n              [105.475681, 29.67469],\n              [105.479712, 29.716288],\n              [105.538842, 29.694908],\n              [105.529659, 29.707637],\n              [105.550488, 29.722443],\n              [105.549145, 29.737663],\n              [105.567398, 29.728015],\n              [105.575014, 29.744482],\n              [105.572326, 29.768677],\n              [105.583301, 29.819294],\n              [105.604914, 29.817216],\n              [105.610626, 29.836908],\n              [105.661804, 29.840813],\n              [105.677818, 29.85427],\n              [105.708951, 29.840564],\n              [105.719365, 29.856513],\n              [105.735716, 29.860915],\n              [105.738963, 29.891227],\n              [105.717462, 29.893552],\n              [105.702679, 29.924767],\n              [105.714998, 29.930743],\n              [105.731012, 29.956636],\n              [105.723397, 29.975969],\n              [105.73258, 29.998781],\n              [105.753634, 30.018602],\n              [105.746242, 30.034275],\n              [105.727988, 30.027227],\n              [105.722389, 30.041073],\n              [105.687001, 30.039001],\n              [105.674682, 30.071247],\n              [105.66046, 30.066274],\n              [105.639294, 30.076386],\n              [105.642206, 30.100915],\n              [105.598083, 30.109201],\n              [105.569974, 30.134302],\n              [105.593156, 30.144738],\n              [105.596851, 30.15716],\n              [105.570758, 30.161466],\n              [105.558216, 30.151943],\n              [105.536826, 30.15244],\n              [105.551048, 30.179186],\n              [105.556536, 30.187465],\n              [105.557544, 30.195826],\n              [105.547129, 30.212711],\n              [105.529323, 30.21958],\n              [105.521036, 30.202613],\n              [105.4824, 30.223222],\n              [105.480944, 30.238696],\n              [105.444996, 30.265997],\n              [105.425958, 30.259876],\n              [105.411064, 30.295606],\n              [105.380379, 30.276916],\n              [105.368845, 30.278404],\n              [105.35843, 30.308093],\n              [105.343088, 30.298087],\n              [105.328305, 30.303297],\n              [105.263913, 30.287915],\n              [105.258313, 30.280307],\n              [105.221805, 30.287171],\n              [105.218894, 30.30586],\n              [105.19784, 30.309994],\n              [105.197056, 30.310738],\n              [105.157412, 30.323388],\n              [105.151365, 30.341987],\n              [105.126056, 30.341491],\n              [105.101419, 30.385455],\n              [105.101083, 30.385372],\n              [105.100971, 30.385372],\n              [105.100859, 30.385372],\n              [105.100635, 30.385455],\n              [105.100635, 30.38562],\n              [105.097275, 30.396194],\n              [105.095259, 30.394873],\n              [105.094923, 30.395121],\n              [105.093916, 30.395616],\n              [105.093804, 30.395864],\n              [105.093692, 30.395947],\n              [105.07387, 30.403133],\n              [105.079917, 30.411724],\n              [105.079469, 30.411807],\n              [105.079693, 30.412467],\n              [105.080141, 30.412385],\n              [105.090444, 30.425682],\n              [105.068942, 30.432949],\n              [105.073646, 30.442115],\n              [105.075214, 30.44228],\n              [105.090108, 30.442363],\n              [105.090444, 30.459536],\n              [105.076558, 30.481741],\n              [105.084173, 30.494616],\n              [105.059983, 30.522753],\n              [105.066927, 30.53587],\n              [105.048449, 30.545192],\n              [105.022916, 30.546099],\n              [105.025043, 30.530178],\n              [104.983944, 30.529271],\n              [104.963226, 30.56746],\n              [104.970393, 30.586425],\n              [104.953371, 30.612475],\n              [104.93019, 30.601429],\n              [104.932206, 30.617091],\n              [104.910928, 30.625662],\n              [104.886403, 30.609343],\n              [104.878788, 30.617997],\n              [104.859078, 30.611321],\n              [104.858854, 30.582385],\n              [104.879124, 30.550635],\n              [104.892786, 30.541645],\n              [104.8761, 30.5131],\n              [104.875092, 30.437078],\n              [104.881699, 30.393551],\n              [104.895922, 30.382315],\n              [104.881027, 30.360831],\n              [104.860982, 30.364384],\n              [104.855494, 30.347194],\n              [104.837016, 30.361988],\n              [104.850455, 30.338929],\n              [104.848775, 30.306852],\n              [104.823354, 30.293787],\n              [104.807228, 30.296847],\n              [104.795133, 30.279397],\n              [104.774863, 30.30156],\n              [104.738579, 30.290314],\n              [104.723797, 30.308341],\n              [104.703975, 30.301643],\n              [104.691993, 30.275427],\n              [104.643614, 30.283036],\n              [104.638239, 30.268148],\n              [104.653133, 30.240185],\n              [104.599603, 30.244488],\n              [104.600163, 30.220408],\n              [104.569254, 30.196985],\n              [104.541594, 30.184236],\n              [104.533754, 30.193673],\n              [104.484368, 30.181504],\n              [104.485264, 30.156001],\n              [104.468354, 30.157077],\n              [104.471937, 30.150287],\n              [104.471601, 30.149873],\n              [104.471041, 30.149873],\n              [104.469474, 30.150452],\n              [104.464994, 30.151529],\n              [104.449428, 30.132894],\n              [104.457715, 30.120634],\n              [104.437109, 30.107544],\n              [104.450212, 30.101081],\n              [104.461411, 30.086663],\n              [104.481904, 30.086663],\n              [104.467234, 30.066937],\n              [104.479888, 30.047374],\n              [104.464322, 30.049944],\n              [104.467234, 30.034689],\n              [104.468578, 30.026563],\n              [104.499486, 30.022666],\n              [104.498142, 30.035933],\n              [104.5239, 30.027227],\n              [104.533195, 29.999278],\n              [104.546297, 30.008485],\n              [104.568471, 29.995546],\n              [104.577989, 29.951076],\n              [104.592548, 29.950164],\n              [104.60677, 29.932901],\n              [104.631184, 29.940952],\n              [104.64395, 29.957383],\n              [104.673739, 29.905674],\n              [104.687289, 29.90227],\n              [104.689865, 29.920036],\n              [104.709127, 29.933233],\n              [104.672955, 29.944189],\n              [104.685049, 29.964436],\n              [104.691769, 29.954645],\n              [104.730628, 29.948504],\n              [104.743619, 29.933233],\n              [104.748322, 29.909244],\n              [104.798493, 29.880183],\n              [104.780575, 29.861413],\n              [104.791997, 29.849037],\n              [104.809132, 29.853024],\n              [104.793341, 29.866895],\n              [104.805436, 29.8752],\n              [104.839144, 29.866812],\n              [104.828057, 29.885498],\n              [104.863333, 29.890895],\n              [104.8789, 29.912897],\n              [104.899505, 29.902353]\n            ]\n          ],\n          [\n            [\n              [105.097275, 30.396194],\n              [105.093692, 30.395947],\n              [105.093804, 30.395864],\n              [105.094364, 30.396277],\n              [105.094364, 30.396277],\n              [105.093916, 30.395616],\n              [105.094923, 30.395121],\n              [105.095259, 30.394873],\n              [105.097275, 30.396194]\n            ]\n          ],\n          [\n            [\n              [104.471937, 30.150287],\n              [104.468354, 30.157077],\n              [104.464994, 30.151529],\n              [104.469474, 30.150452],\n              [104.471041, 30.149873],\n              [104.471601, 30.149873],\n              [104.471937, 30.150287]\n            ]\n          ],\n          [\n            [\n              [105.100635, 30.38562],\n              [105.100635, 30.385455],\n              [105.100859, 30.385372],\n              [105.100971, 30.385372],\n              [105.101083, 30.385372],\n              [105.101419, 30.385455],\n              [105.100635, 30.38562]\n            ]\n          ],\n          [\n            [\n              [105.561463, 30.183656],\n              [105.558887, 30.185561],\n              [105.556536, 30.187465],\n              [105.551048, 30.179186],\n              [105.561463, 30.183656]\n            ]\n          ],\n          [\n            [\n              [105.080141, 30.412385],\n              [105.079693, 30.412467],\n              [105.079469, 30.411807],\n              [105.079917, 30.411724],\n              [105.080141, 30.412385]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 513200,\n        \"name\": \"阿坝藏族羌族自治州\",\n        \"center\": [102.221374, 31.899792],\n        \"centroid\": [102.612554, 32.409135],\n        \"childrenNum\": 13,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 18,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [100.667948, 32.523674],\n              [100.659885, 32.514871],\n              [100.622481, 32.503645],\n              [100.634128, 32.479329],\n              [100.612962, 32.443207],\n              [100.594596, 32.427768],\n              [100.562344, 32.419441],\n              [100.537147, 32.39397],\n              [100.530428, 32.378199],\n              [100.537707, 32.364529],\n              [100.52718, 32.34592],\n              [100.531659, 32.327066],\n              [100.553833, 32.303998],\n              [100.552377, 32.282219],\n              [100.573543, 32.280438],\n              [100.588773, 32.269101],\n              [100.58015, 32.26076],\n              [100.599076, 32.231518],\n              [100.629536, 32.226819],\n              [100.638719, 32.233057],\n              [100.666492, 32.218554],\n              [100.682283, 32.187516],\n              [100.72047, 32.18322],\n              [100.726966, 32.162547],\n              [100.692473, 32.15598],\n              [100.698633, 32.133436],\n              [100.717335, 32.120377],\n              [100.730549, 32.099772],\n              [100.762913, 32.086628],\n              [100.766385, 32.069017],\n              [100.785423, 32.049131],\n              [100.799757, 32.050105],\n              [100.785199, 32.009751],\n              [100.803789, 31.991883],\n              [100.828986, 31.989608],\n              [100.834809, 31.976529],\n              [100.869302, 31.958167],\n              [100.880164, 31.967024],\n              [100.950044, 31.987496],\n              [100.962027, 31.979698],\n              [100.990472, 31.978885],\n              [101.01175, 31.948984],\n              [100.991816, 31.930616],\n              [100.98756, 31.911269],\n              [100.998759, 31.900374],\n              [100.992712, 31.864835],\n              [100.952844, 31.860524],\n              [100.938958, 31.825295],\n              [100.916896, 31.804949],\n              [100.862022, 31.785819],\n              [100.852839, 31.758705],\n              [100.869078, 31.73753],\n              [100.898306, 31.738182],\n              [100.933246, 31.751132],\n              [100.952956, 31.721808],\n              [100.964379, 31.718224],\n              [100.968858, 31.682044],\n              [101.016341, 31.653351],\n              [101.024516, 31.640877],\n              [101.063488, 31.628319],\n              [101.050497, 31.60638],\n              [101.053969, 31.593246],\n              [101.074798, 31.575705],\n              [101.061136, 31.567545],\n              [101.05968, 31.548693],\n              [101.07883, 31.493503],\n              [101.0991, 31.487132],\n              [101.107499, 31.468999],\n              [101.144231, 31.494973],\n              [101.185778, 31.509508],\n              [101.202576, 31.506405],\n              [101.221614, 31.535143],\n              [101.241548, 31.518244],\n              [101.264169, 31.46418],\n              [101.263385, 31.443509],\n              [101.245243, 31.398967],\n              [101.257114, 31.378609],\n              [101.285223, 31.375665],\n              [101.301013, 31.358655],\n              [101.32845, 31.384823],\n              [101.336737, 31.368878],\n              [101.354991, 31.371004],\n              [101.390155, 31.398803],\n              [101.405721, 31.397495],\n              [101.415688, 31.43689],\n              [101.449844, 31.435011],\n              [101.464403, 31.410492],\n              [101.456452, 31.389728],\n              [101.429799, 31.372149],\n              [101.426999, 31.345651],\n              [101.43831, 31.307035],\n              [101.452756, 31.294351],\n              [101.46933, 31.330681],\n              [101.447381, 31.347778],\n              [101.475602, 31.354239],\n              [101.481985, 31.368469],\n              [101.54593, 31.378691],\n              [101.563512, 31.366997],\n              [101.573031, 31.341397],\n              [101.610098, 31.382206],\n              [101.628016, 31.385313],\n              [101.685466, 31.353012],\n              [101.691849, 31.326918],\n              [101.708983, 31.315709],\n              [101.715479, 31.289195],\n              [101.765089, 31.309572],\n              [101.763745, 31.28232],\n              [101.78995, 31.276999],\n              [101.814811, 31.284939],\n              [101.836761, 31.281747],\n              [101.858263, 31.26603],\n              [101.863526, 31.201171],\n              [101.87898, 31.190193],\n              [101.884692, 31.160939],\n              [101.910673, 31.146104],\n              [101.929935, 31.168888],\n              [101.97417, 31.177083],\n              [101.985256, 31.156349],\n              [102.013701, 31.144628],\n              [102.02602, 31.089037],\n              [102.034307, 31.073288],\n              [102.078318, 31.084033],\n              [102.1314, 31.130693],\n              [102.154469, 31.140612],\n              [102.172835, 31.107161],\n              [102.163092, 31.090103],\n              [102.168356, 31.03292],\n              [102.163876, 30.995983],\n              [102.178211, 30.986952],\n              [102.194225, 30.950161],\n              [102.188626, 30.933732],\n              [102.200944, 30.909905],\n              [102.170596, 30.89577],\n              [102.163428, 30.902016],\n              [102.112586, 30.8984],\n              [102.087277, 30.89051],\n              [102.065439, 30.87103],\n              [102.069135, 30.827533],\n              [102.066111, 30.792491],\n              [102.03957, 30.76328],\n              [102.070367, 30.740728],\n              [102.057152, 30.736118],\n              [102.039458, 30.706642],\n              [102.054577, 30.698984],\n              [102.047969, 30.661671],\n              [102.066111, 30.668591],\n              [102.104747, 30.658128],\n              [102.114714, 30.638106],\n              [102.148086, 30.610579],\n              [102.177315, 30.594504],\n              [102.184818, 30.627887],\n              [102.227933, 30.63687],\n              [102.246859, 30.621459],\n              [102.2734, 30.635634],\n              [102.273736, 30.654091],\n              [102.296469, 30.676087],\n              [102.316739, 30.677899],\n              [102.348096, 30.705901],\n              [102.391771, 30.711995],\n              [102.447317, 30.681853],\n              [102.477329, 30.692972],\n              [102.475985, 30.738999],\n              [102.469042, 30.768712],\n              [102.493791, 30.790352],\n              [102.52134, 30.794548],\n              [102.532091, 30.811659],\n              [102.56132, 30.821036],\n              [102.590996, 30.847845],\n              [102.667148, 30.850723],\n              [102.679802, 30.857629],\n              [102.686634, 30.888045],\n              [102.708247, 30.915493],\n              [102.75405, 30.916396],\n              [102.801869, 30.93595],\n              [102.828298, 30.928721],\n              [102.852375, 30.936772],\n              [102.875221, 30.923298],\n              [102.889555, 30.900784],\n              [102.889443, 30.865851],\n              [102.863574, 30.798332],\n              [102.897954, 30.765255],\n              [102.962683, 30.769699],\n              [102.992919, 30.778339],\n              [103.037938, 30.802364],\n              [103.083629, 30.812728],\n              [103.123945, 30.79282],\n              [103.165716, 30.842171],\n              [103.199088, 30.845707],\n              [103.228653, 30.836579],\n              [103.25833, 30.842418],\n              [103.284647, 30.829589],\n              [103.305252, 30.810507],\n              [103.337617, 30.824655],\n              [103.354527, 30.850887],\n              [103.383084, 30.862891],\n              [103.409401, 30.864946],\n              [103.451396, 30.892565],\n              [103.454644, 30.924695],\n              [103.465058, 30.941536],\n              [103.516461, 30.971761],\n              [103.52094, 31.005095],\n              [103.517132, 31.030129],\n              [103.504814, 31.041044],\n              [103.521164, 31.067792],\n              [103.525644, 31.101092],\n              [103.557224, 31.149055],\n              [103.564839, 31.175034],\n              [103.583205, 31.191422],\n              [103.57671, 31.215834],\n              [103.581413, 31.246626],\n              [103.569095, 31.262019],\n              [103.579733, 31.291241],\n              [103.569991, 31.314563],\n              [103.569543, 31.338453],\n              [103.60717, 31.351295],\n              [103.627104, 31.344097],\n              [103.669323, 31.354812],\n              [103.700792, 31.391118],\n              [103.739876, 31.398885],\n              [103.75029, 31.419156],\n              [103.787246, 31.434439],\n              [103.802588, 31.430108],\n              [103.795757, 31.471777],\n              [103.84212, 31.510896],\n              [103.857798, 31.53849],\n              [103.898226, 31.512856],\n              [103.915136, 31.538409],\n              [103.907409, 31.564444],\n              [103.923311, 31.60328],\n              [103.917376, 31.612089],\n              [103.928238, 31.639572],\n              [103.962842, 31.656612],\n              [103.989384, 31.68237],\n              [104.016037, 31.678539],\n              [104.040786, 31.697691],\n              [104.085917, 31.688075],\n              [104.09398, 31.693535],\n              [104.103163, 31.710321],\n              [104.142694, 31.715454],\n              [104.147734, 31.727104],\n              [104.171027, 31.732317],\n              [104.169795, 31.779876],\n              [104.152213, 31.815855],\n              [104.132951, 31.815936],\n              [104.127576, 31.828712],\n              [104.080093, 31.838639],\n              [104.061055, 31.829038],\n              [104.046497, 31.849297],\n              [104.030707, 31.846938],\n              [104.01738, 31.862232],\n              [103.975497, 31.85605],\n              [103.957691, 31.903545],\n              [103.920623, 31.942239],\n              [103.886131, 31.929234],\n              [103.876836, 31.917854],\n              [103.845704, 31.921187],\n              [103.817931, 31.939801],\n              [103.763617, 31.946384],\n              [103.754882, 31.964342],\n              [103.758241, 31.997894],\n              [103.795869, 32.045965],\n              [103.817147, 32.054732],\n              [103.824874, 32.07056],\n              [103.811995, 32.097987],\n              [103.82689, 32.114375],\n              [103.826778, 32.130354],\n              [103.855111, 32.126704],\n              [103.850743, 32.161331],\n              [103.897442, 32.155736],\n              [103.922527, 32.143087],\n              [103.938877, 32.146817],\n              [103.974713, 32.140897],\n              [103.994983, 32.118917],\n              [104.048961, 32.131408],\n              [104.100587, 32.125001],\n              [104.129032, 32.140248],\n              [104.152885, 32.125893],\n              [104.142134, 32.149655],\n              [104.156581, 32.158899],\n              [104.158821, 32.176491],\n              [104.18189, 32.196593],\n              [104.221757, 32.215394],\n              [104.257481, 32.214746],\n              [104.247515, 32.24942],\n              [104.209439, 32.285053],\n              [104.211455, 32.298412],\n              [104.182114, 32.308936],\n              [104.159828, 32.25995],\n              [104.162292, 32.250473],\n              [104.135751, 32.234677],\n              [104.131048, 32.223011],\n              [104.075838, 32.237513],\n              [104.066655, 32.249258],\n              [104.033507, 32.248691],\n              [104.022756, 32.265214],\n              [103.981768, 32.305617],\n              [103.960155, 32.304564],\n              [103.921295, 32.315411],\n              [103.898002, 32.341227],\n              [103.904497, 32.347053],\n              [103.889155, 32.364852],\n              [103.914576, 32.432699],\n              [103.902817, 32.496617],\n              [103.906961, 32.51051],\n              [103.84492, 32.584058],\n              [103.853095, 32.61367],\n              [103.877508, 32.621333],\n              [103.890387, 32.638997],\n              [103.922415, 32.635771],\n              [103.993303, 32.647788],\n              [104.007973, 32.641578],\n              [104.035634, 32.651578],\n              [104.065871, 32.631013],\n              [104.068335, 32.608426],\n              [104.084237, 32.569127],\n              [104.129368, 32.530457],\n              [104.132279, 32.492094],\n              [104.0951, 32.467694],\n              [104.144486, 32.473754],\n              [104.162292, 32.521332],\n              [104.174835, 32.531345],\n              [104.168451, 32.579377],\n              [104.177634, 32.607054],\n              [104.182786, 32.663431],\n              [104.155909, 32.711473],\n              [104.130152, 32.730327],\n              [104.146502, 32.756589],\n              [104.121305, 32.799911],\n              [104.108314, 32.800635],\n              [104.101035, 32.848201],\n              [104.079309, 32.856971],\n              [104.068895, 32.845224],\n              [104.035522, 32.833073],\n              [104.032387, 32.820357],\n              [104.004614, 32.814159],\n              [103.971466, 32.839671],\n              [103.994535, 32.861154],\n              [103.993975, 32.879334],\n              [103.958027, 32.888422],\n              [103.952988, 32.917451],\n              [103.965082, 32.922114],\n              [103.959371, 32.939879],\n              [103.978521, 32.985602],\n              [103.973705, 33.005122],\n              [103.986472, 33.034674],\n              [104.013461, 33.041258],\n              [104.069231, 33.003114],\n              [104.113466, 32.99982],\n              [104.158821, 32.956998],\n              [104.195664, 32.916888],\n              [104.217278, 32.908767],\n              [104.220302, 32.896143],\n              [104.247851, 32.877564],\n              [104.277079, 32.891317],\n              [104.28615, 32.939075],\n              [104.305972, 32.951533],\n              [104.345392, 32.940361],\n              [104.378428, 32.953221],\n              [104.383579, 32.994278],\n              [104.426135, 33.010744],\n              [104.421095, 33.024235],\n              [104.391418, 33.035477],\n              [104.360174, 33.028411],\n              [104.337664, 33.038287],\n              [104.367229, 33.086768],\n              [104.360846, 33.099285],\n              [104.377196, 33.107067],\n              [104.374956, 33.11918],\n              [104.350879, 33.159038],\n              [104.328257, 33.224118],\n              [104.329041, 33.252956],\n              [104.303844, 33.30452],\n              [104.336321, 33.314205],\n              [104.349199, 33.300678],\n              [104.39825, 33.297316],\n              [104.393546, 33.310924],\n              [104.420087, 33.32709],\n              [104.367677, 33.345014],\n              [104.328034, 33.333092],\n              [104.295669, 33.332852],\n              [104.270584, 33.393325],\n              [104.242923, 33.406998],\n              [104.22075, 33.404599],\n              [104.221981, 33.428741],\n              [104.213134, 33.446884],\n              [104.18077, 33.473092],\n              [104.156133, 33.547118],\n              [104.168115, 33.570981],\n              [104.17965, 33.575689],\n              [104.168563, 33.611749],\n              [104.103499, 33.663499],\n              [104.05232, 33.685258],\n              [104.013237, 33.683265],\n              [103.966538, 33.670434],\n              [103.926783, 33.679679],\n              [103.861606, 33.68215],\n              [103.800461, 33.670194],\n              [103.778287, 33.658875],\n              [103.689257, 33.693386],\n              [103.667756, 33.685816],\n              [103.667308, 33.698566],\n              [103.64995, 33.700159],\n              [103.669099, 33.712429],\n              [103.651629, 33.721351],\n              [103.644238, 33.708525],\n              [103.633375, 33.721829],\n              [103.598883, 33.717846],\n              [103.563943, 33.699601],\n              [103.552073, 33.67147],\n              [103.520492, 33.678563],\n              [103.545577, 33.720396],\n              [103.549497, 33.740308],\n              [103.531355, 33.749069],\n              [103.54009, 33.766746],\n              [103.518364, 33.807102],\n              [103.506494, 33.810126],\n              [103.464498, 33.802407],\n              [103.431686, 33.750741],\n              [103.349599, 33.743494],\n              [103.320147, 33.752095],\n              [103.279607, 33.773593],\n              [103.284647, 33.802009],\n              [103.24993, 33.814026],\n              [103.228093, 33.794846],\n              [103.203008, 33.795403],\n              [103.161348, 33.807182],\n              [103.153397, 33.819118],\n              [103.18117, 33.900717],\n              [103.171203, 33.924403],\n              [103.134359, 33.930363],\n              [103.123049, 33.941567],\n              [103.123833, 33.96818],\n              [103.139511, 33.976123],\n              [103.157205, 33.998756],\n              [103.147238, 34.036543],\n              [103.119241, 34.039558],\n              [103.130888, 34.066934],\n              [103.170195, 34.065744],\n              [103.178371, 34.080341],\n              [103.149814, 34.102867],\n              [103.135479, 34.10025],\n              [103.121817, 34.1127],\n              [103.13268, 34.129033],\n              [103.124057, 34.161849],\n              [103.100315, 34.181896],\n              [103.071534, 34.184907],\n              [103.050481, 34.194731],\n              [103.03973, 34.185779],\n              [103.005574, 34.184907],\n              [102.973433, 34.205424],\n              [102.980153, 34.241298],\n              [102.956523, 34.2694],\n              [102.939949, 34.299946],\n              [102.913184, 34.312446],\n              [102.879252, 34.312129],\n              [102.86111, 34.302398],\n              [102.856743, 34.270667],\n              [102.806572, 34.274703],\n              [102.783839, 34.258081],\n              [102.777903, 34.235676],\n              [102.731877, 34.237498],\n              [102.701304, 34.197662],\n              [102.6639, 34.192513],\n              [102.647438, 34.178331],\n              [102.650462, 34.165573],\n              [102.625377, 34.167475],\n              [102.598388, 34.147741],\n              [102.641167, 34.127051],\n              [102.655725, 34.113493],\n              [102.660317, 34.085101],\n              [102.649454, 34.080024],\n              [102.61597, 34.099695],\n              [102.585285, 34.101043],\n              [102.5574, 34.091526],\n              [102.516749, 34.087401],\n              [102.46725, 34.073916],\n              [102.438805, 34.087401],\n              [102.417752, 34.042177],\n              [102.39961, 34.017731],\n              [102.391435, 33.970802],\n              [102.350559, 33.977394],\n              [102.345856, 33.96969],\n              [102.32525, 33.982159],\n              [102.310132, 33.971675],\n              [102.316179, 33.994071],\n              [102.287286, 33.977553],\n              [102.277768, 33.990021],\n              [102.25817, 33.975647],\n              [102.241484, 33.981524],\n              [102.238012, 33.963653],\n              [102.202624, 33.967068],\n              [102.198592, 33.978347],\n              [102.1669, 33.982874],\n              [102.136327, 33.965242],\n              [102.205424, 33.90493],\n              [102.233868, 33.870187],\n              [102.253354, 33.861518],\n              [102.261977, 33.824847],\n              [102.237004, 33.798746],\n              [102.238572, 33.788877],\n              [102.300277, 33.782349],\n              [102.324354, 33.754563],\n              [102.322898, 33.746043],\n              [102.295238, 33.739034],\n              [102.284375, 33.723423],\n              [102.301285, 33.70988],\n              [102.325474, 33.735291],\n              [102.3416, 33.720873],\n              [102.328386, 33.706294],\n              [102.313939, 33.668839],\n              [102.333649, 33.642053],\n              [102.344512, 33.606883],\n              [102.386619, 33.598747],\n              [102.410137, 33.579439],\n              [102.440261, 33.574811],\n              [102.454596, 33.555179],\n              [102.477889, 33.543446],\n              [102.474529, 33.529635],\n              [102.445973, 33.531152],\n              [102.461987, 33.504323],\n              [102.4537, 33.483636],\n              [102.462435, 33.449681],\n              [102.442277, 33.453117],\n              [102.434214, 33.439451],\n              [102.403641, 33.424585],\n              [102.396138, 33.405319],\n              [102.367134, 33.408996],\n              [102.370157, 33.394125],\n              [102.347424, 33.409716],\n              [102.31058, 33.397963],\n              [102.300949, 33.410915],\n              [102.277096, 33.407637],\n              [102.263433, 33.417151],\n              [102.261081, 33.396363],\n              [102.238124, 33.388607],\n              [102.219758, 33.351494],\n              [102.186946, 33.332772],\n              [102.205536, 33.320128],\n              [102.202288, 33.300998],\n              [102.217518, 33.248151],\n              [102.203408, 33.223317],\n              [102.174963, 33.233652],\n              [102.15279, 33.253117],\n              [102.144167, 33.274418],\n              [102.111466, 33.285628],\n              [102.108667, 33.257762],\n              [102.089517, 33.227563],\n              [102.089517, 33.204968],\n              [102.055025, 33.189981],\n              [102.010566, 33.191745],\n              [101.993767, 33.199999],\n              [101.957371, 33.186695],\n              [101.935646, 33.186855],\n              [101.923215, 33.155831],\n              [101.884132, 33.132495],\n              [101.86599, 33.103056],\n              [101.825562, 33.119501],\n              [101.840681, 33.160401],\n              [101.841352, 33.1891],\n              [101.82825, 33.214984],\n              [101.797565, 33.233011],\n              [101.788382, 33.229006],\n              [101.767553, 33.263368],\n              [101.8091, 33.28835],\n              [101.823882, 33.271215],\n              [101.832282, 33.291712],\n              [101.858039, 33.312044],\n              [101.876069, 33.314125],\n              [101.875509, 33.349334],\n              [101.886371, 33.382369],\n              [101.914144, 33.405878],\n              [101.915936, 33.425784],\n              [101.946285, 33.442808],\n              [101.924447, 33.45],\n              [101.927359, 33.472932],\n              [101.907425, 33.480201],\n              [101.897906, 33.519096],\n              [101.907201, 33.542009],\n              [101.885252, 33.56324],\n              [101.882004, 33.57928],\n              [101.844376, 33.602416],\n              [101.830826, 33.578801],\n              [101.830266, 33.554541],\n              [101.805964, 33.548155],\n              [101.782335, 33.556297],\n              [101.770016, 33.545042],\n              [101.777856, 33.533946],\n              [101.77584, 33.492023],\n              [101.768785, 33.465102],\n              [101.775952, 33.453516],\n              [101.75949, 33.444726],\n              [101.734516, 33.445126],\n              [101.695769, 33.433937],\n              [101.692969, 33.422427],\n              [101.662733, 33.38165],\n              [101.649294, 33.324609],\n              [101.678187, 33.297476],\n              [101.706744, 33.298517],\n              [101.730933, 33.283866],\n              [101.740452, 33.269133],\n              [101.727573, 33.2564],\n              [101.727461, 33.240461],\n              [101.711111, 33.213462],\n              [101.680651, 33.202003],\n              [101.686698, 33.185413],\n              [101.65411, 33.162726],\n              [101.661165, 33.136505],\n              [101.634176, 33.102414],\n              [101.567095, 33.154628],\n              [101.557576, 33.167136],\n              [101.515469, 33.193027],\n              [101.486464, 33.227163],\n              [101.475937, 33.223237],\n              [101.428231, 33.230287],\n              [101.40337, 33.22524],\n              [101.386795, 33.207372],\n              [101.396202, 33.187176],\n              [101.393851, 33.157835],\n              [101.381196, 33.154388],\n              [101.374477, 33.171385],\n              [101.328898, 33.223477],\n              [101.328674, 33.237337],\n              [101.310532, 33.244466],\n              [101.296982, 33.262247],\n              [101.246251, 33.262327],\n              [101.222734, 33.270335],\n              [101.206944, 33.255279],\n              [101.203248, 33.269614],\n              [101.183538, 33.270094],\n              [101.156997, 33.237017],\n              [101.127881, 33.223798],\n              [101.120377, 33.186615],\n              [101.13348, 33.1891],\n              [101.130568, 33.168899],\n              [101.158677, 33.144204],\n              [101.151174, 33.132415],\n              [101.169652, 33.101692],\n              [101.143223, 33.08412],\n              [101.146582, 33.056832],\n              [101.162149, 33.056591],\n              [101.184434, 33.041258],\n              [101.171332, 33.013555],\n              [101.184098, 32.984236],\n              [101.129112, 32.989539],\n              [101.133704, 32.947997],\n              [101.123961, 32.910054],\n              [101.176259, 32.894132],\n              [101.223854, 32.855522],\n              [101.222622, 32.838303],\n              [101.23774, 32.827681],\n              [101.224414, 32.771569],\n              [101.22307, 32.725816],\n              [101.190146, 32.686568],\n              [101.157445, 32.661577],\n              [101.130232, 32.660609],\n              [101.111866, 32.637223],\n              [101.112874, 32.671897],\n              [101.083981, 32.671897],\n              [101.076702, 32.683022],\n              [101.030563, 32.660528],\n              [100.997191, 32.627867],\n              [100.956876, 32.62093],\n              [100.932126, 32.60068],\n              [100.914768, 32.616574],\n              [100.89797, 32.615686],\n              [100.887555, 32.632545],\n              [100.860679, 32.635529],\n              [100.834026, 32.648917],\n              [100.807037, 32.646901],\n              [100.799645, 32.654884],\n              [100.773552, 32.640933],\n              [100.765825, 32.663673],\n              [100.752051, 32.65053],\n              [100.692025, 32.677701],\n              [100.684746, 32.67109],\n              [100.709271, 32.649804],\n              [100.717559, 32.617058],\n              [100.70412, 32.611249],\n              [100.676347, 32.627867],\n              [100.666156, 32.624318],\n              [100.658653, 32.599712],\n              [100.658093, 32.546686],\n              [100.667948, 32.523674]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 513300,\n        \"name\": \"甘孜藏族自治州\",\n        \"center\": [101.963815, 30.050663],\n        \"centroid\": [99.98712, 30.97906],\n        \"childrenNum\": 18,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 19,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [100.061536, 28.082776],\n              [100.072063, 28.08548],\n              [100.100284, 28.047957],\n              [100.201744, 27.984205],\n              [100.225822, 27.987165],\n              [100.234445, 27.971011],\n              [100.25617, 27.961283],\n              [100.270505, 27.966358],\n              [100.302981, 28.009829],\n              [100.337025, 28.010167],\n              [100.349008, 28.017354],\n              [100.380812, 28.015494],\n              [100.396715, 28.005516],\n              [100.418104, 28.005601],\n              [100.426839, 28.019468],\n              [100.404666, 28.073143],\n              [100.401754, 28.096464],\n              [100.38742, 28.133463],\n              [100.380252, 28.187925],\n              [100.367822, 28.206242],\n              [100.372861, 28.250459],\n              [100.413849, 28.290779],\n              [100.416424, 28.306464],\n              [100.390331, 28.324929],\n              [100.398618, 28.359405],\n              [100.420792, 28.38654],\n              [100.423928, 28.420153],\n              [100.4162, 28.433209],\n              [100.439606, 28.448199],\n              [100.449909, 28.474722],\n              [100.49112, 28.500312],\n              [100.506014, 28.524213],\n              [100.514973, 28.559633],\n              [100.530428, 28.574101],\n              [100.520125, 28.616568],\n              [100.526284, 28.643048],\n              [100.523708, 28.671118],\n              [100.49112, 28.694812],\n              [100.472418, 28.696493],\n              [100.472082, 28.70859],\n              [100.508814, 28.708674],\n              [100.539946, 28.736726],\n              [100.562792, 28.749574],\n              [100.594708, 28.743948],\n              [100.579926, 28.797929],\n              [100.586533, 28.821426],\n              [100.5638, 28.833425],\n              [100.558536, 28.86136],\n              [100.541738, 28.889791],\n              [100.543082, 28.91704],\n              [100.530316, 28.924417],\n              [100.521357, 28.949646],\n              [100.544762, 28.955261],\n              [100.577014, 28.945456],\n              [100.609155, 28.954591],\n              [100.63424, 28.990117],\n              [100.658093, 29.005447],\n              [100.65003, 29.01935],\n              [100.680155, 29.014158],\n              [100.704792, 28.997322],\n              [100.714199, 29.005195],\n              [100.779264, 29.010389],\n              [100.797518, 28.989279],\n              [100.820475, 28.993049],\n              [100.845784, 29.02069],\n              [100.832458, 29.055357],\n              [100.786431, 29.057868],\n              [100.77288, 29.063812],\n              [100.772432, 29.087668],\n              [100.802557, 29.107837],\n              [100.837497, 29.112941],\n              [100.883412, 29.146405],\n              [100.916336, 29.139881],\n              [100.924735, 29.119802],\n              [100.922384, 29.099468],\n              [100.936382, 29.087919],\n              [100.929103, 29.061217],\n              [100.959563, 29.074109],\n              [101.010182, 29.12683],\n              [101.050273, 29.145652],\n              [101.056881, 29.166395],\n              [101.09742, 29.146573],\n              [101.118362, 29.111937],\n              [101.116346, 29.070593],\n              [101.138855, 29.053515],\n              [101.142327, 29.031326],\n              [101.155877, 29.017759],\n              [101.145351, 28.999751],\n              [101.160357, 28.946965],\n              [101.183986, 28.941265],\n              [101.180851, 28.905471],\n              [101.192609, 28.891133],\n              [101.171668, 28.836445],\n              [101.173123, 28.788696],\n              [101.189922, 28.762085],\n              [101.20504, 28.754948],\n              [101.200224, 28.717409],\n              [101.209183, 28.700609],\n              [101.202576, 28.652714],\n              [101.229677, 28.66658],\n              [101.277048, 28.66574],\n              [101.297542, 28.673135],\n              [101.356223, 28.66616],\n              [101.369213, 28.647755],\n              [101.367646, 28.629262],\n              [101.427223, 28.646326],\n              [101.445813, 28.625479],\n              [101.472914, 28.631532],\n              [101.489824, 28.626824],\n              [101.516925, 28.58924],\n              [101.550745, 28.599415],\n              [101.575382, 28.58226],\n              [101.591844, 28.555427],\n              [101.620177, 28.537676],\n              [101.617714, 28.509402],\n              [101.62992, 28.491558],\n              [101.594532, 28.475227],\n              [101.569895, 28.474216],\n              [101.515357, 28.494083],\n              [101.473698, 28.499049],\n              [101.469218, 28.50553],\n              [101.427559, 28.505025],\n              [101.413001, 28.521099],\n              [101.383996, 28.482888],\n              [101.36787, 28.472449],\n              [101.373021, 28.461756],\n              [101.425543, 28.489538],\n              [101.439654, 28.471691],\n              [101.454436, 28.411056],\n              [101.46821, 28.404317],\n              [101.482097, 28.318521],\n              [101.509758, 28.314727],\n              [101.56228, 28.333106],\n              [101.591621, 28.358056],\n              [101.620177, 28.374911],\n              [101.631712, 28.354854],\n              [101.667548, 28.351819],\n              [101.715479, 28.380894],\n              [101.730709, 28.410635],\n              [101.731829, 28.434556],\n              [101.745827, 28.453672],\n              [101.757138, 28.49341],\n              [101.753554, 28.533889],\n              [101.832393, 28.594033],\n              [101.874165, 28.613121],\n              [101.904289, 28.606562],\n              [101.918736, 28.612616],\n              [101.928031, 28.640947],\n              [101.946621, 28.67137],\n              [101.985032, 28.702877],\n              [102.018069, 28.713965],\n              [102.022772, 28.723373],\n              [101.997799, 28.750162],\n              [101.989288, 28.80372],\n              [101.962747, 28.824027],\n              [101.98548, 28.857585],\n              [101.988392, 28.88803],\n              [102.00631, 28.907567],\n              [102.050993, 28.920477],\n              [102.058384, 28.954088],\n              [102.099708, 28.98065],\n              [102.14999, 29.031158],\n              [102.16522, 29.036518],\n              [102.156485, 29.045393],\n              [102.168468, 29.07302],\n              [102.15167, 29.102648],\n              [102.160741, 29.130344],\n              [102.131736, 29.159872],\n              [102.129608, 29.176096],\n              [102.109562, 29.185043],\n              [102.088509, 29.173336],\n              [102.056032, 29.177852],\n              [102.093996, 29.208453],\n              [102.119529, 29.221911],\n              [102.123337, 29.238627],\n              [102.096348, 29.2718],\n              [102.046066, 29.297779],\n              [101.983801, 29.299032],\n              [101.960171, 29.314816],\n              [101.949532, 29.344124],\n              [101.9567, 29.367414],\n              [101.972154, 29.38277],\n              [101.984136, 29.422403],\n              [101.95222, 29.437585],\n              [101.950764, 29.462688],\n              [101.935982, 29.50104],\n              [101.94942, 29.503874],\n              [101.97417, 29.489702],\n              [102.012021, 29.49112],\n              [102.033747, 29.500039],\n              [102.090637, 29.496121],\n              [102.13308, 29.510458],\n              [102.145622, 29.504207],\n              [102.145174, 29.53221],\n              [102.16578, 29.532877],\n              [102.178547, 29.512709],\n              [102.175859, 29.466524],\n              [102.203296, 29.456851],\n              [102.314051, 29.53346],\n              [102.318755, 29.551958],\n              [102.31002, 29.575283],\n              [102.284375, 29.590192],\n              [102.277208, 29.603767],\n              [102.296133, 29.683593],\n              [102.305764, 29.699567],\n              [102.336001, 29.720114],\n              [102.32861, 29.736748],\n              [102.353247, 29.76319],\n              [102.344064, 29.789209],\n              [102.326258, 29.799599],\n              [102.323346, 29.824778],\n              [102.291094, 29.838237],\n              [102.291094, 29.854519],\n              [102.270824, 29.881595],\n              [102.282583, 29.896956],\n              [102.284487, 29.917877],\n              [102.299381, 29.934063],\n              [102.303189, 29.954562],\n              [102.292214, 29.993721],\n              [102.274968, 30.017193],\n              [102.276872, 30.039995],\n              [102.268137, 30.077381],\n              [102.295126, 30.101164],\n              [102.29367, 30.128835],\n              [102.328946, 30.187961],\n              [102.341824, 30.200296],\n              [102.402298, 30.234228],\n              [102.414168, 30.303958],\n              [102.432758, 30.355129],\n              [102.425255, 30.384546],\n              [102.434438, 30.421387],\n              [102.419656, 30.452766],\n              [102.417976, 30.524156],\n              [102.43119, 30.596895],\n              [102.443397, 30.618245],\n              [102.47173, 30.640001],\n              [102.473298, 30.670898],\n              [102.486512, 30.685807],\n              [102.494463, 30.713642],\n              [102.4864, 30.744761],\n              [102.469042, 30.768712],\n              [102.475985, 30.738999],\n              [102.477329, 30.692972],\n              [102.447317, 30.681853],\n              [102.391771, 30.711995],\n              [102.348096, 30.705901],\n              [102.316739, 30.677899],\n              [102.296469, 30.676087],\n              [102.273736, 30.654091],\n              [102.2734, 30.635634],\n              [102.246859, 30.621459],\n              [102.227933, 30.63687],\n              [102.184818, 30.627887],\n              [102.177315, 30.594504],\n              [102.148086, 30.610579],\n              [102.114714, 30.638106],\n              [102.104747, 30.658128],\n              [102.066111, 30.668591],\n              [102.047969, 30.661671],\n              [102.054577, 30.698984],\n              [102.039458, 30.706642],\n              [102.057152, 30.736118],\n              [102.070367, 30.740728],\n              [102.03957, 30.76328],\n              [102.066111, 30.792491],\n              [102.069135, 30.827533],\n              [102.065439, 30.87103],\n              [102.087277, 30.89051],\n              [102.112586, 30.8984],\n              [102.163428, 30.902016],\n              [102.170596, 30.89577],\n              [102.200944, 30.909905],\n              [102.188626, 30.933732],\n              [102.194225, 30.950161],\n              [102.178211, 30.986952],\n              [102.163876, 30.995983],\n              [102.168356, 31.03292],\n              [102.163092, 31.090103],\n              [102.172835, 31.107161],\n              [102.154469, 31.140612],\n              [102.1314, 31.130693],\n              [102.078318, 31.084033],\n              [102.034307, 31.073288],\n              [102.02602, 31.089037],\n              [102.013701, 31.144628],\n              [101.985256, 31.156349],\n              [101.97417, 31.177083],\n              [101.929935, 31.168888],\n              [101.910673, 31.146104],\n              [101.884692, 31.160939],\n              [101.87898, 31.190193],\n              [101.863526, 31.201171],\n              [101.858263, 31.26603],\n              [101.836761, 31.281747],\n              [101.814811, 31.284939],\n              [101.78995, 31.276999],\n              [101.763745, 31.28232],\n              [101.765089, 31.309572],\n              [101.715479, 31.289195],\n              [101.708983, 31.315709],\n              [101.691849, 31.326918],\n              [101.685466, 31.353012],\n              [101.628016, 31.385313],\n              [101.610098, 31.382206],\n              [101.573031, 31.341397],\n              [101.563512, 31.366997],\n              [101.54593, 31.378691],\n              [101.481985, 31.368469],\n              [101.475602, 31.354239],\n              [101.447381, 31.347778],\n              [101.46933, 31.330681],\n              [101.452756, 31.294351],\n              [101.43831, 31.307035],\n              [101.426999, 31.345651],\n              [101.429799, 31.372149],\n              [101.456452, 31.389728],\n              [101.464403, 31.410492],\n              [101.449844, 31.435011],\n              [101.415688, 31.43689],\n              [101.405721, 31.397495],\n              [101.390155, 31.398803],\n              [101.354991, 31.371004],\n              [101.336737, 31.368878],\n              [101.32845, 31.384823],\n              [101.301013, 31.358655],\n              [101.285223, 31.375665],\n              [101.257114, 31.378609],\n              [101.245243, 31.398967],\n              [101.263385, 31.443509],\n              [101.264169, 31.46418],\n              [101.241548, 31.518244],\n              [101.221614, 31.535143],\n              [101.202576, 31.506405],\n              [101.185778, 31.509508],\n              [101.144231, 31.494973],\n              [101.107499, 31.468999],\n              [101.0991, 31.487132],\n              [101.07883, 31.493503],\n              [101.05968, 31.548693],\n              [101.061136, 31.567545],\n              [101.074798, 31.575705],\n              [101.053969, 31.593246],\n              [101.050497, 31.60638],\n              [101.063488, 31.628319],\n              [101.024516, 31.640877],\n              [101.016341, 31.653351],\n              [100.968858, 31.682044],\n              [100.964379, 31.718224],\n              [100.952956, 31.721808],\n              [100.933246, 31.751132],\n              [100.898306, 31.738182],\n              [100.869078, 31.73753],\n              [100.852839, 31.758705],\n              [100.862022, 31.785819],\n              [100.916896, 31.804949],\n              [100.938958, 31.825295],\n              [100.952844, 31.860524],\n              [100.992712, 31.864835],\n              [100.998759, 31.900374],\n              [100.98756, 31.911269],\n              [100.991816, 31.930616],\n              [101.01175, 31.948984],\n              [100.990472, 31.978885],\n              [100.962027, 31.979698],\n              [100.950044, 31.987496],\n              [100.880164, 31.967024],\n              [100.869302, 31.958167],\n              [100.834809, 31.976529],\n              [100.828986, 31.989608],\n              [100.803789, 31.991883],\n              [100.785199, 32.009751],\n              [100.799757, 32.050105],\n              [100.785423, 32.049131],\n              [100.766385, 32.069017],\n              [100.762913, 32.086628],\n              [100.730549, 32.099772],\n              [100.717335, 32.120377],\n              [100.698633, 32.133436],\n              [100.692473, 32.15598],\n              [100.726966, 32.162547],\n              [100.72047, 32.18322],\n              [100.682283, 32.187516],\n              [100.666492, 32.218554],\n              [100.638719, 32.233057],\n              [100.629536, 32.226819],\n              [100.599076, 32.231518],\n              [100.58015, 32.26076],\n              [100.588773, 32.269101],\n              [100.573543, 32.280438],\n              [100.552377, 32.282219],\n              [100.553833, 32.303998],\n              [100.531659, 32.327066],\n              [100.52718, 32.34592],\n              [100.537707, 32.364529],\n              [100.530428, 32.378199],\n              [100.537147, 32.39397],\n              [100.562344, 32.419441],\n              [100.594596, 32.427768],\n              [100.612962, 32.443207],\n              [100.634128, 32.479329],\n              [100.622481, 32.503645],\n              [100.659885, 32.514871],\n              [100.667948, 32.523674],\n              [100.645439, 32.52642],\n              [100.602883, 32.553629],\n              [100.572311, 32.556777],\n              [100.56492, 32.569611],\n              [100.544762, 32.570096],\n              [100.54465, 32.581475],\n              [100.52438, 32.594952],\n              [100.525052, 32.611249],\n              [100.508702, 32.61012],\n              [100.516541, 32.630045],\n              [100.48888, 32.667221],\n              [100.476338, 32.672461],\n              [100.470178, 32.694548],\n              [100.449909, 32.694065],\n              [100.434902, 32.720095],\n              [100.420344, 32.731778],\n              [100.390107, 32.695596],\n              [100.378685, 32.698417],\n              [100.398842, 32.739109],\n              [100.400634, 32.756186],\n              [100.33445, 32.718241],\n              [100.264345, 32.742734],\n              [100.262106, 32.729119],\n              [100.240268, 32.722673],\n              [100.230861, 32.696241],\n              [100.229741, 32.65053],\n              [100.20992, 32.605844],\n              [100.188082, 32.630771],\n              [100.131864, 32.632465],\n              [100.110139, 32.639239],\n              [100.105435, 32.656739],\n              [100.087853, 32.669075],\n              [100.125257, 32.714857],\n              [100.138696, 32.720981],\n              [100.136344, 32.740881],\n              [100.121785, 32.7764],\n              [100.117082, 32.802487],\n              [100.123129, 32.837257],\n              [100.109691, 32.846591],\n              [100.109243, 32.86228],\n              [100.088637, 32.864211],\n              [100.082366, 32.885125],\n              [100.066016, 32.895982],\n              [100.02962, 32.895821],\n              [100.038355, 32.929108],\n              [100.002519, 32.941647],\n              [99.970826, 32.939075],\n              [99.956604, 32.948077],\n              [99.947421, 32.986887],\n              [99.908897, 33.020622],\n              [99.903074, 33.047038],\n              [99.877317, 33.045513],\n              [99.882692, 33.025199],\n              [99.877765, 32.993716],\n              [99.863654, 32.980219],\n              [99.850888, 32.941888],\n              [99.828714, 32.95097],\n              [99.802845, 32.941969],\n              [99.788287, 32.956596],\n              [99.775296, 32.952337],\n              [99.763986, 32.924445],\n              [99.7744, 32.922516],\n              [99.791982, 32.883114],\n              [99.786495, 32.861798],\n              [99.766897, 32.826232],\n              [99.769809, 32.802326],\n              [99.76029, 32.769877],\n              [99.737109, 32.745312],\n              [99.73946, 32.732503],\n              [99.717735, 32.732181],\n              [99.7062, 32.764079],\n              [99.651326, 32.772132],\n              [99.640127, 32.790733],\n              [99.607427, 32.780829],\n              [99.586485, 32.792665],\n              [99.581782, 32.813515],\n              [99.557145, 32.840074],\n              [99.532396, 32.84804],\n              [99.490176, 32.850936],\n              [99.452772, 32.862441],\n              [99.435302, 32.877242],\n              [99.376173, 32.899842],\n              [99.354112, 32.885446],\n              [99.343473, 32.895258],\n              [99.327235, 32.881505],\n              [99.282888, 32.885044],\n              [99.269113, 32.878529],\n              [99.259482, 32.907963],\n              [99.245596, 32.928384],\n              [99.248955, 32.951533],\n              [99.233277, 32.954426],\n              [99.234733, 32.983353],\n              [99.215135, 32.990181],\n              [99.20864, 33.018694],\n              [99.179411, 33.04487],\n              [99.147607, 33.05041],\n              [99.124649, 33.045994],\n              [99.092733, 33.078101],\n              [99.075039, 33.075934],\n              [99.025764, 33.095033],\n              [99.014566, 33.081311],\n              [98.969883, 33.099526],\n              [98.957004, 33.118298],\n              [98.935502, 33.115651],\n              [98.902802, 33.125838],\n              [98.895635, 33.135061],\n              [98.860695, 33.150058],\n              [98.829674, 33.181325],\n              [98.830906, 33.196874],\n              [98.804701, 33.219311],\n              [98.813548, 33.248311],\n              [98.807501, 33.26529],\n              [98.785663, 33.276821],\n              [98.758786, 33.278102],\n              [98.774017, 33.301799],\n              [98.764274, 33.321088],\n              [98.783424, 33.344054],\n              [98.779168, 33.371652],\n              [98.762818, 33.37901],\n              [98.74658, 33.405159],\n              [98.734037, 33.410275],\n              [98.744228, 33.454315],\n              [98.742212, 33.477725],\n              [98.722838, 33.486113],\n              [98.72463, 33.505601],\n              [98.680059, 33.521571],\n              [98.668748, 33.544324],\n              [98.648031, 33.548794],\n              [98.657774, 33.576806],\n              [98.65251, 33.594997],\n              [98.622722, 33.610233],\n              [98.61757, 33.637269],\n              [98.656654, 33.647315],\n              [98.594501, 33.70239],\n              [98.596181, 33.717129],\n              [98.581734, 33.732185],\n              [98.538059, 33.747556],\n              [98.516893, 33.77415],\n              [98.497968, 33.768497],\n              [98.486769, 33.782111],\n              [98.492928, 33.793254],\n              [98.463475, 33.848395],\n              [98.435143, 33.843145],\n              [98.406922, 33.867244],\n              [98.42708, 33.908189],\n              [98.411849, 33.924721],\n              [98.415433, 33.95698],\n              [98.431111, 33.961826],\n              [98.44063, 33.981365],\n              [98.428199, 34.029002],\n              [98.391915, 34.058842],\n              [98.401882, 34.087718],\n              [98.338721, 34.094777],\n              [98.308821, 34.087718],\n              [98.209936, 34.078517],\n              [98.157302, 34.107387],\n              [98.14196, 34.104374],\n              [98.098172, 34.122928],\n              [98.050354, 34.114682],\n              [98.027844, 34.123325],\n              [98.012614, 34.14576],\n              [97.995592, 34.153765],\n              [97.944526, 34.198612],\n              [97.88898, 34.204474],\n              [97.810701, 34.207484],\n              [97.796478, 34.199167],\n              [97.790879, 34.178093],\n              [97.773409, 34.162007],\n              [97.667021, 34.127685],\n              [97.662989, 34.117458],\n              [97.683371, 34.080738],\n              [97.703193, 34.058127],\n              [97.702297, 34.036781],\n              [97.687403, 34.016619],\n              [97.65851, 34.012174],\n              [97.652798, 33.998359],\n              [97.659854, 33.956345],\n              [97.644399, 33.943315],\n              [97.633985, 33.919078],\n              [97.601844, 33.930045],\n              [97.546746, 33.914151],\n              [97.522109, 33.903261],\n              [97.503631, 33.912005],\n              [97.482801, 33.896981],\n              [97.468467, 33.902069],\n              [97.460628, 33.887361],\n              [97.395339, 33.88927],\n              [97.389628, 33.879967],\n              [97.398027, 33.848315],\n              [97.371822, 33.841952],\n              [97.368798, 33.824131],\n              [97.406426, 33.795165],\n              [97.409898, 33.767621],\n              [97.423224, 33.754961],\n              [97.417849, 33.728521],\n              [97.435319, 33.682468],\n              [97.40553, 33.626663],\n              [97.415721, 33.605527],\n              [97.437111, 33.600183],\n              [97.448645, 33.583668],\n              [97.472835, 33.587418],\n              [97.525245, 33.575769],\n              [97.51203, 33.519415],\n              [97.542155, 33.492662],\n              [97.55257, 33.465662],\n              [97.582358, 33.468777],\n              [97.604644, 33.451838],\n              [97.625585, 33.461507],\n              [97.645183, 33.449041],\n              [97.665005, 33.447683],\n              [97.67486, 33.433058],\n              [97.703641, 33.428981],\n              [97.741268, 33.411635],\n              [97.750003, 33.397403],\n              [97.719991, 33.386288],\n              [97.702297, 33.359734],\n              [97.676316, 33.357574],\n              [97.676092, 33.341013],\n              [97.636784, 33.344614],\n              [97.622002, 33.335972],\n              [97.615395, 33.301799],\n              [97.606548, 33.287469],\n              [97.60666, 33.262567],\n              [97.577655, 33.234453],\n              [97.575191, 33.220834],\n              [97.546746, 33.203686],\n              [97.532972, 33.20625],\n              [97.518078, 33.182607],\n              [97.487953, 33.168178],\n              [97.486273, 33.145246],\n              [97.498032, 33.137949],\n              [97.487729, 33.106746],\n              [97.516958, 33.09752],\n              [97.537339, 33.058196],\n              [97.542379, 33.036199],\n              [97.517966, 33.022148],\n              [97.497696, 33.021826],\n              [97.523789, 32.988575],\n              [97.464995, 32.972024],\n              [97.447413, 32.976283],\n              [97.410122, 32.9619],\n              [97.375741, 32.956676],\n              [97.361967, 32.941969],\n              [97.369582, 32.926535],\n              [97.361743, 32.906998],\n              [97.350096, 32.903943],\n              [97.355472, 32.886894],\n              [97.379101, 32.88239],\n              [97.3931, 32.828727],\n              [97.380221, 32.826313],\n              [97.38582, 32.780266],\n              [97.424792, 32.727749],\n              [97.423784, 32.704945],\n              [97.480786, 32.664076],\n              [97.484705, 32.652788],\n              [97.513262, 32.648836],\n              [97.543723, 32.621737],\n              [97.606324, 32.615283],\n              [97.610579, 32.596],\n              [97.629729, 32.575907],\n              [97.662989, 32.560006],\n              [97.698601, 32.536836],\n              [97.736229, 32.52642],\n              [97.757507, 32.530942],\n              [97.768817, 32.518344],\n              [97.797262, 32.520202],\n              [97.804541, 32.501706],\n              [97.836906, 32.504129],\n              [97.862775, 32.499364],\n              [97.880245, 32.486358],\n              [97.90645, 32.489347],\n              [97.940158, 32.482399],\n              [97.947101, 32.470765],\n              [97.970283, 32.470765],\n              [98.008582, 32.451128],\n              [98.023589, 32.452502],\n              [98.036803, 32.42898],\n              [98.051362, 32.428576],\n              [98.086526, 32.398499],\n              [98.112171, 32.391787],\n              [98.124154, 32.400682],\n              [98.139384, 32.379089],\n              [98.163125, 32.375611],\n              [98.197505, 32.36016],\n              [98.218895, 32.34236],\n              [98.208928, 32.319458],\n              [98.230542, 32.262865],\n              [98.219791, 32.25671],\n              [98.219119, 32.234191],\n              [98.258202, 32.210613],\n              [98.295494, 32.149898],\n              [98.301654, 32.12419],\n              [98.328867, 32.108291],\n              [98.345665, 32.087277],\n              [98.362687, 32.078918],\n              [98.405578, 32.04353],\n              [98.402666, 32.026642],\n              [98.434807, 32.007802],\n              [98.427863, 31.996432],\n              [98.434023, 31.959873],\n              [98.421592, 31.94232],\n              [98.432567, 31.922569],\n              [98.40345, 31.910456],\n              [98.399307, 31.895902],\n              [98.426296, 31.856782],\n              [98.415657, 31.830259],\n              [98.44119, 31.829445],\n              [98.445221, 31.807472],\n              [98.461124, 31.800228],\n              [98.460116, 31.78183],\n              [98.476802, 31.782318],\n              [98.493488, 31.768233],\n              [98.520477, 31.730118],\n              [98.518573, 31.716268],\n              [98.548138, 31.713498],\n              [98.556985, 31.690031],\n              [98.553961, 31.656612],\n              [98.587893, 31.631989],\n              [98.62093, 31.590309],\n              [98.650942, 31.578806],\n              [98.696633, 31.538572],\n              [98.695849, 31.530899],\n              [98.74042, 31.493176],\n              [98.771217, 31.476024],\n              [98.787231, 31.474227],\n              [98.79507, 31.458951],\n              [98.837625, 31.436564],\n              [98.843225, 31.41695],\n              [98.887012, 31.374602],\n              [98.810636, 31.30679],\n              [98.805933, 31.279291],\n              [98.780064, 31.251129],\n              [98.747812, 31.262837],\n              [98.733813, 31.289277],\n              [98.714439, 31.304253],\n              [98.692714, 31.332644],\n              [98.646127, 31.339025],\n              [98.632912, 31.332235],\n              [98.616114, 31.303762],\n              [98.60346, 31.256615],\n              [98.607715, 31.228037],\n              [98.623282, 31.221321],\n              [98.621042, 31.203547],\n              [98.604804, 31.18413],\n              [98.638736, 31.179213],\n              [98.643663, 31.169544],\n              [98.67502, 31.154055],\n              [98.709848, 31.11864],\n              [98.712424, 31.083213],\n              [98.734261, 31.066807],\n              [98.736949, 31.04925],\n              [98.774801, 31.031114],\n              [98.806045, 30.995654],\n              [98.796862, 30.948354],\n              [98.774465, 30.908426],\n              [98.782192, 30.891497],\n              [98.848712, 30.850312],\n              [98.856999, 30.829918],\n              [98.878725, 30.822352],\n              [98.883204, 30.799731],\n              [98.901794, 30.785086],\n              [98.952301, 30.769699],\n              [98.963947, 30.732166],\n              [98.936958, 30.716277],\n              [98.930799, 30.703266],\n              [98.907506, 30.698325],\n              [98.905938, 30.683006],\n              [98.923632, 30.639589],\n              [98.922064, 30.609095],\n              [98.942558, 30.590629],\n              [98.926767, 30.569439],\n              [98.937966, 30.549563],\n              [98.931583, 30.527703],\n              [98.945917, 30.499155],\n              [98.944349, 30.482731],\n              [98.965403, 30.450041],\n              [98.962715, 30.426838],\n              [98.974026, 30.397929],\n              [98.967307, 30.375375],\n              [98.973242, 30.353558],\n              [98.967419, 30.334961],\n              [98.981529, 30.321321],\n              [98.985001, 30.274848],\n              [98.970331, 30.260041],\n              [98.974362, 30.231331],\n              [98.991832, 30.216435],\n              [98.981529, 30.182911],\n              [98.989144, 30.15186],\n              [99.014678, 30.135461],\n              [99.009862, 30.121296],\n              [99.044802, 30.080033],\n              [99.034387, 30.022832],\n              [99.043234, 30.015037],\n              [99.054993, 29.958379],\n              [99.051297, 29.942529],\n              [99.06832, 29.931407],\n              [99.058017, 29.921364],\n              [99.052977, 29.892888],\n              [99.041667, 29.881927],\n              [99.034051, 29.855433],\n              [99.01367, 29.817881],\n              [99.018933, 29.791952],\n              [99.000679, 29.737164],\n              [98.997768, 29.68767],\n              [98.992056, 29.663205],\n              [99.011318, 29.628495],\n              [99.014678, 29.607347],\n              [99.052081, 29.563955],\n              [99.044802, 29.51996],\n              [99.049394, 29.49112],\n              [99.061376, 29.478948],\n              [99.056897, 29.456851],\n              [99.066864, 29.420818],\n              [99.058689, 29.417398],\n              [99.069775, 29.327091],\n              [99.068544, 29.297445],\n              [99.084782, 29.291264],\n              [99.094189, 29.267539],\n              [99.115242, 29.242053],\n              [99.111211, 29.216645],\n              [99.119162, 29.198922],\n              [99.104939, 29.162632],\n              [99.11793, 29.102397],\n              [99.113786, 29.074527],\n              [99.118602, 29.033754],\n              [99.127561, 29.016586],\n              [99.122969, 28.998411],\n              [99.131816, 28.949479],\n              [99.123529, 28.890126],\n              [99.104044, 28.841982],\n              [99.104268, 28.81421],\n              [99.11737, 28.780554],\n              [99.114346, 28.765863],\n              [99.133832, 28.734795],\n              [99.126889, 28.699517],\n              [99.140887, 28.68221],\n              [99.147383, 28.641031],\n              [99.162277, 28.635735],\n              [99.159253, 28.621108],\n              [99.172804, 28.613793],\n              [99.167093, 28.59521],\n              [99.183779, 28.588903],\n              [99.170116, 28.565185],\n              [99.172132, 28.545164],\n              [99.191618, 28.493073],\n              [99.183443, 28.472701],\n              [99.18725, 28.439862],\n              [99.165525, 28.424449],\n              [99.175828, 28.400863],\n              [99.201137, 28.377439],\n              [99.200913, 28.364377],\n              [99.230365, 28.349965],\n              [99.238429, 28.317004],\n              [99.280648, 28.298031],\n              [99.289495, 28.286056],\n              [99.281544, 28.259908],\n              [99.299574, 28.259064],\n              [99.306741, 28.227593],\n              [99.3456, 28.20447],\n              [99.361055, 28.181087],\n              [99.375949, 28.180834],\n              [99.402378, 28.150691],\n              [99.389164, 28.181425],\n              [99.386924, 28.210293],\n              [99.405962, 28.262523],\n              [99.417608, 28.266741],\n              [99.413801, 28.292803],\n              [99.393083, 28.317762],\n              [99.408985, 28.331673],\n              [99.40697, 28.357804],\n              [99.420856, 28.36876],\n              [99.437318, 28.398504],\n              [99.430935, 28.416195],\n              [99.417832, 28.4167],\n              [99.404506, 28.444241],\n              [99.426455, 28.452578],\n              [99.414025, 28.476826],\n              [99.395659, 28.493157],\n              [99.402826, 28.514199],\n              [99.394539, 28.524213],\n              [99.402938, 28.545753],\n              [99.426791, 28.555259],\n              [99.463411, 28.549202],\n              [99.466099, 28.579736],\n              [99.497007, 28.602863],\n              [99.496672, 28.616231],\n              [99.518173, 28.613793],\n              [99.540795, 28.623546],\n              [99.542586, 28.670614],\n              [99.531724, 28.680025],\n              [99.553785, 28.710438],\n              [99.601044, 28.726396],\n              [99.615826, 28.742185],\n              [99.605859, 28.771572],\n              [99.622545, 28.795243],\n              [99.625569, 28.814713],\n              [99.678427, 28.810266],\n              [99.700601, 28.835019],\n              [99.719527, 28.844751],\n              [99.72367, 28.810769],\n              [99.722774, 28.755956],\n              [99.736437, 28.734711],\n              [99.733189, 28.719509],\n              [99.756482, 28.700357],\n              [99.794446, 28.699097],\n              [99.841705, 28.653218],\n              [99.834538, 28.628085],\n              [99.873285, 28.631784],\n              [99.875973, 28.611439],\n              [99.91864, 28.599079],\n              [99.961531, 28.561568],\n              [99.964443, 28.539611],\n              [99.987065, 28.524465],\n              [99.990312, 28.476658],\n              [100.000839, 28.464955],\n              [100.045186, 28.446178],\n              [100.060864, 28.447694],\n              [100.074639, 28.424365],\n              [100.060976, 28.405833],\n              [100.054257, 28.376597],\n              [100.099948, 28.359405],\n              [100.134552, 28.351651],\n              [100.172628, 28.321135],\n              [100.168708, 28.296345],\n              [100.147543, 28.288755],\n              [100.188418, 28.252737],\n              [100.163445, 28.2335],\n              [100.168148, 28.220758],\n              [100.153366, 28.208268],\n              [100.10286, 28.201769],\n              [100.091997, 28.182354],\n              [100.061984, 28.193834],\n              [100.050337, 28.181763],\n              [100.033315, 28.184633],\n              [100.021109, 28.147398],\n              [100.039699, 28.130592],\n              [100.061536, 28.082776]\n            ]\n          ]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"adcode\": 513400,\n        \"name\": \"凉山彝族自治州\",\n        \"center\": [102.258746, 27.886762],\n        \"centroid\": [102.08054, 27.889541],\n        \"childrenNum\": 17,\n        \"level\": \"city\",\n        \"parent\": { \"adcode\": 510000 },\n        \"subFeatureIndex\": 20,\n        \"acroutes\": [100000, 510000]\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            [\n              [103.61389, 28.597313],\n              [103.585893, 28.614886],\n              [103.560696, 28.606899],\n              [103.530571, 28.612196],\n              [103.531803, 28.597649],\n              [103.504142, 28.560306],\n              [103.479057, 28.547099],\n              [103.42967, 28.531786],\n              [103.421831, 28.511506],\n              [103.438629, 28.500059],\n              [103.441541, 28.477331],\n              [103.43303, 28.452915],\n              [103.388347, 28.420659],\n              [103.370205, 28.423354],\n              [103.35699, 28.440872],\n              [103.339968, 28.443483],\n              [103.313875, 28.485581],\n              [103.299541, 28.521604],\n              [103.287782, 28.533048],\n              [103.253962, 28.541209],\n              [103.246571, 28.549791],\n              [103.242875, 28.59336],\n              [103.272776, 28.613121],\n              [103.287334, 28.655319],\n              [103.30626, 28.681958],\n              [103.31074, 28.702037],\n              [103.333585, 28.721861],\n              [103.334817, 28.743108],\n              [103.3085, 28.761749],\n              [103.270984, 28.805986],\n              [103.23862, 28.813538],\n              [103.225069, 28.803971],\n              [103.189905, 28.827887],\n              [103.153957, 28.82923],\n              [103.112522, 28.812364],\n              [103.107482, 28.771907],\n              [103.070527, 28.73681],\n              [103.066047, 28.688511],\n              [103.051265, 28.66969],\n              [103.032451, 28.665824],\n              [102.996503, 28.679941],\n              [102.990904, 28.672379],\n              [102.962571, 28.681118],\n              [102.938157, 28.740001],\n              [102.944205, 28.76645],\n              [102.925279, 28.801873],\n              [102.926287, 28.820168],\n              [102.941741, 28.860521],\n              [102.928079, 28.896415],\n              [102.946221, 28.920058],\n              [102.942413, 28.944115],\n              [102.913632, 28.999918],\n              [102.909041, 29.021612],\n              [102.922143, 29.037941],\n              [102.957755, 29.052008],\n              [102.970074, 29.065068],\n              [102.931326, 29.112941],\n              [102.928639, 29.127332],\n              [102.944877, 29.19006],\n              [102.974553, 29.222162],\n              [102.962795, 29.250828],\n              [103.02002, 29.250744],\n              [103.031779, 29.27982],\n              [103.003894, 29.287171],\n              [102.962347, 29.301871],\n              [102.940397, 29.302874],\n              [102.9124, 29.264531],\n              [102.905457, 29.222245],\n              [102.879812, 29.206112],\n              [102.836585, 29.208035],\n              [102.833113, 29.241886],\n              [102.804556, 29.249908],\n              [102.781487, 29.236705],\n              [102.766817, 29.18705],\n              [102.778575, 29.173336],\n              [102.772192, 29.159621],\n              [102.740388, 29.153348],\n              [102.69828, 29.167064],\n              [102.673419, 29.161544],\n              [102.649006, 29.177601],\n              [102.653373, 29.188053],\n              [102.635791, 29.210793],\n              [102.618993, 29.209707],\n              [102.590884, 29.191983],\n              [102.600515, 29.169991],\n              [102.594692, 29.160039],\n              [102.563, 29.159955],\n              [102.552697, 29.150671],\n              [102.559864, 29.133606],\n              [102.547657, 29.116957],\n              [102.522236, 29.111602],\n              [102.514845, 29.09361],\n              [102.524476, 29.077457],\n              [102.517757, 29.058454],\n              [102.525484, 29.036267],\n              [102.507006, 29.025883],\n              [102.497823, 29.003269],\n              [102.471506, 28.983834],\n              [102.46613, 28.969339],\n              [102.482929, 28.932716],\n              [102.481473, 28.920142],\n              [102.454148, 28.873606],\n              [102.429846, 28.845422],\n              [102.381804, 28.855572],\n              [102.352351, 28.854566],\n              [102.319763, 28.883082],\n              [102.29087, 28.899685],\n              [102.253802, 28.898763],\n              [102.22155, 28.962217],\n              [102.180898, 29.013404],\n              [102.188961, 29.024626],\n              [102.16522, 29.036518],\n              [102.14999, 29.031158],\n              [102.099708, 28.98065],\n              [102.058384, 28.954088],\n              [102.050993, 28.920477],\n              [102.00631, 28.907567],\n              [101.988392, 28.88803],\n              [101.98548, 28.857585],\n              [101.962747, 28.824027],\n              [101.989288, 28.80372],\n              [101.997799, 28.750162],\n              [102.022772, 28.723373],\n              [102.018069, 28.713965],\n              [101.985032, 28.702877],\n              [101.946621, 28.67137],\n              [101.928031, 28.640947],\n              [101.918736, 28.612616],\n              [101.904289, 28.606562],\n              [101.874165, 28.613121],\n              [101.832393, 28.594033],\n              [101.753554, 28.533889],\n              [101.757138, 28.49341],\n              [101.745827, 28.453672],\n              [101.731829, 28.434556],\n              [101.730709, 28.410635],\n              [101.715479, 28.380894],\n              [101.667548, 28.351819],\n              [101.631712, 28.354854],\n              [101.620177, 28.374911],\n              [101.591621, 28.358056],\n              [101.56228, 28.333106],\n              [101.509758, 28.314727],\n              [101.482097, 28.318521],\n              [101.46821, 28.404317],\n              [101.454436, 28.411056],\n              [101.439654, 28.471691],\n              [101.425543, 28.489538],\n              [101.373021, 28.461756],\n              [101.36787, 28.472449],\n              [101.383996, 28.482888],\n              [101.413001, 28.521099],\n              [101.427559, 28.505025],\n              [101.469218, 28.50553],\n              [101.473698, 28.499049],\n              [101.515357, 28.494083],\n              [101.569895, 28.474216],\n              [101.594532, 28.475227],\n              [101.62992, 28.491558],\n              [101.617714, 28.509402],\n              [101.620177, 28.537676],\n              [101.591844, 28.555427],\n              [101.575382, 28.58226],\n              [101.550745, 28.599415],\n              [101.516925, 28.58924],\n              [101.489824, 28.626824],\n              [101.472914, 28.631532],\n              [101.445813, 28.625479],\n              [101.427223, 28.646326],\n              [101.367646, 28.629262],\n              [101.369213, 28.647755],\n              [101.356223, 28.66616],\n              [101.297542, 28.673135],\n              [101.277048, 28.66574],\n              [101.229677, 28.66658],\n              [101.202576, 28.652714],\n              [101.209183, 28.700609],\n              [101.200224, 28.717409],\n              [101.20504, 28.754948],\n              [101.189922, 28.762085],\n              [101.173123, 28.788696],\n              [101.171668, 28.836445],\n              [101.192609, 28.891133],\n              [101.180851, 28.905471],\n              [101.183986, 28.941265],\n              [101.160357, 28.946965],\n              [101.145351, 28.999751],\n              [101.155877, 29.017759],\n              [101.142327, 29.031326],\n              [101.138855, 29.053515],\n              [101.116346, 29.070593],\n              [101.118362, 29.111937],\n              [101.09742, 29.146573],\n              [101.056881, 29.166395],\n              [101.050273, 29.145652],\n              [101.010182, 29.12683],\n              [100.959563, 29.074109],\n              [100.929103, 29.061217],\n              [100.936382, 29.087919],\n              [100.922384, 29.099468],\n              [100.924735, 29.119802],\n              [100.916336, 29.139881],\n              [100.883412, 29.146405],\n              [100.837497, 29.112941],\n              [100.802557, 29.107837],\n              [100.772432, 29.087668],\n              [100.77288, 29.063812],\n              [100.786431, 29.057868],\n              [100.832458, 29.055357],\n              [100.845784, 29.02069],\n              [100.820475, 28.993049],\n              [100.797518, 28.989279],\n              [100.779264, 29.010389],\n              [100.714199, 29.005195],\n              [100.704792, 28.997322],\n              [100.680155, 29.014158],\n              [100.65003, 29.01935],\n              [100.658093, 29.005447],\n              [100.63424, 28.990117],\n              [100.609155, 28.954591],\n              [100.577014, 28.945456],\n              [100.544762, 28.955261],\n              [100.521357, 28.949646],\n              [100.530316, 28.924417],\n              [100.543082, 28.91704],\n              [100.541738, 28.889791],\n              [100.558536, 28.86136],\n              [100.5638, 28.833425],\n              [100.586533, 28.821426],\n              [100.579926, 28.797929],\n              [100.594708, 28.743948],\n              [100.562792, 28.749574],\n              [100.539946, 28.736726],\n              [100.508814, 28.708674],\n              [100.472082, 28.70859],\n              [100.472418, 28.696493],\n              [100.49112, 28.694812],\n              [100.523708, 28.671118],\n              [100.526284, 28.643048],\n              [100.520125, 28.616568],\n              [100.530428, 28.574101],\n              [100.514973, 28.559633],\n              [100.506014, 28.524213],\n              [100.49112, 28.500312],\n              [100.449909, 28.474722],\n              [100.439606, 28.448199],\n              [100.4162, 28.433209],\n              [100.423928, 28.420153],\n              [100.420792, 28.38654],\n              [100.398618, 28.359405],\n              [100.390331, 28.324929],\n              [100.416424, 28.306464],\n              [100.413849, 28.290779],\n              [100.372861, 28.250459],\n              [100.367822, 28.206242],\n              [100.380252, 28.187925],\n              [100.38742, 28.133463],\n              [100.401754, 28.096464],\n              [100.404666, 28.073143],\n              [100.426839, 28.019468],\n              [100.418104, 28.005601],\n              [100.396715, 28.005516],\n              [100.380812, 28.015494],\n              [100.349008, 28.017354],\n              [100.337025, 28.010167],\n              [100.302981, 28.009829],\n              [100.270505, 27.966358],\n              [100.25617, 27.961283],\n              [100.234445, 27.971011],\n              [100.225822, 27.987165],\n              [100.201744, 27.984205],\n              [100.100284, 28.047957],\n              [100.072063, 28.08548],\n              [100.061536, 28.082776],\n              [100.086733, 28.030374],\n              [100.12089, 28.018707],\n              [100.142615, 27.991817],\n              [100.196145, 27.93734],\n              [100.16994, 27.907637],\n              [100.210479, 27.877248],\n              [100.25785, 27.864972],\n              [100.294918, 27.869544],\n              [100.30914, 27.859129],\n              [100.30858, 27.830421],\n              [100.286071, 27.805856],\n              [100.302869, 27.792386],\n              [100.307125, 27.748658],\n              [100.299509, 27.736113],\n              [100.32773, 27.720429],\n              [100.344416, 27.734333],\n              [100.3508, 27.755947],\n              [100.374765, 27.754591],\n              [100.377005, 27.775608],\n              [100.392795, 27.787556],\n              [100.411609, 27.815683],\n              [100.415192, 27.840923],\n              [100.443189, 27.866242],\n              [100.478017, 27.857859],\n              [100.495599, 27.844649],\n              [100.504334, 27.852016],\n              [100.511166, 27.827626],\n              [100.536587, 27.824661],\n              [100.546442, 27.808567],\n              [100.55988, 27.824153],\n              [100.607027, 27.855996],\n              [100.609043, 27.876232],\n              [100.634688, 27.915338],\n              [100.654958, 27.910853],\n              [100.679819, 27.924224],\n              [100.704456, 27.886814],\n              [100.699865, 27.86912],\n              [100.719462, 27.858283],\n              [100.708152, 27.842278],\n              [100.707032, 27.801366],\n              [100.73962, 27.774507],\n              [100.749923, 27.772897],\n              [100.775456, 27.743064],\n              [100.781503, 27.693635],\n              [100.789007, 27.684391],\n              [100.836489, 27.681677],\n              [100.848472, 27.670905],\n              [100.832346, 27.650207],\n              [100.850488, 27.640705],\n              [100.828202, 27.615758],\n              [100.855303, 27.62365],\n              [100.854071, 27.596662],\n              [100.86807, 27.591824],\n              [100.912081, 27.521689],\n              [100.901554, 27.486265],\n              [100.90133, 27.453379],\n              [100.921264, 27.47131],\n              [100.93683, 27.469101],\n              [100.957212, 27.43825],\n              [100.951836, 27.427199],\n              [101.001783, 27.349303],\n              [101.020261, 27.344454],\n              [101.010182, 27.312292],\n              [101.030004, 27.294591],\n              [101.0281, 27.266586],\n              [101.042546, 27.247003],\n              [101.038963, 27.233464],\n              [101.059568, 27.198629],\n              [101.082526, 27.195051],\n              [101.118698, 27.20868],\n              [101.170436, 27.195648],\n              [101.168084, 27.165232],\n              [101.197425, 27.18321],\n              [101.246027, 27.179205],\n              [101.283095, 27.197607],\n              [101.293174, 27.189599],\n              [101.315571, 27.197522],\n              [101.334721, 27.179546],\n              [101.355215, 27.184658],\n              [101.394299, 27.145206],\n              [101.41412, 27.162164],\n              [101.426999, 27.190792],\n              [101.419048, 27.215835],\n              [101.470674, 27.238829],\n              [101.495759, 27.228014],\n              [101.514685, 27.229802],\n              [101.530475, 27.277823],\n              [101.55836, 27.295357],\n              [101.584229, 27.334671],\n              [101.598452, 27.340456],\n              [101.635408, 27.33952],\n              [101.633728, 27.327949],\n              [101.659261, 27.313569],\n              [101.664748, 27.288888],\n              [101.643135, 27.24513],\n              [101.65075, 27.208169],\n              [101.681994, 27.150404],\n              [101.708759, 27.129012],\n              [101.744483, 27.124835],\n              [101.761729, 27.133444],\n              [101.803725, 27.114691],\n              [101.817387, 27.101732],\n              [101.833065, 27.122619],\n              [101.870357, 27.129694],\n              [101.879204, 27.168129],\n              [101.862966, 27.182784],\n              [101.878196, 27.189855],\n              [101.878084, 27.222734],\n              [101.886259, 27.255603],\n              [101.896786, 27.267096],\n              [101.912241, 27.243683],\n              [101.903618, 27.218561],\n              [101.914368, 27.213195],\n              [101.908433, 27.192666],\n              [101.922095, 27.180654],\n              [101.941021, 27.143842],\n              [101.927247, 27.137109],\n              [101.938782, 27.104034],\n              [101.97305, 27.122619],\n              [101.993879, 27.115202],\n              [102.000263, 27.096873],\n              [102.025908, 27.093462],\n              [102.034083, 27.076152],\n              [102.049761, 27.082718],\n              [102.081566, 27.129268],\n              [102.086269, 27.146484],\n              [102.114826, 27.159437],\n              [102.122665, 27.171878],\n              [102.161077, 27.182187],\n              [102.176419, 27.137535],\n              [102.203296, 27.131398],\n              [102.210351, 27.11776],\n              [102.2407, 27.106592],\n              [102.238684, 27.064298],\n              [102.217518, 27.04596],\n              [102.230173, 27.000485],\n              [102.214495, 26.957297],\n              [102.229165, 26.945174],\n              [102.225917, 26.923999],\n              [102.205312, 26.91042],\n              [102.214159, 26.889153],\n              [102.204976, 26.85216],\n              [102.202288, 26.840795],\n              [102.215615, 26.813617],\n              [102.192657, 26.820455],\n              [102.18213, 26.812591],\n              [102.174179, 26.802419],\n              [102.189857, 26.791904],\n              [102.175075, 26.774975],\n              [102.192993, 26.763602],\n              [102.195681, 26.744616],\n              [102.175859, 26.726568],\n              [102.178883, 26.708346],\n              [102.157605, 26.692346],\n              [102.157045, 26.680708],\n              [102.135543, 26.674718],\n              [102.132296, 26.637741],\n              [102.114714, 26.63406],\n              [102.084477, 26.654519],\n              [102.068351, 26.656659],\n              [102.073502, 26.670867],\n              [102.054801, 26.692688],\n              [102.063088, 26.718613],\n              [102.04573, 26.737517],\n              [102.033187, 26.712367],\n              [102.006534, 26.716388],\n              [101.997463, 26.698849],\n              [101.995559, 26.653577],\n              [101.984024, 26.638854],\n              [102.001383, 26.633632],\n              [102.011125, 26.598525],\n              [102.030611, 26.596898],\n              [102.038562, 26.571717],\n              [102.034083, 26.541133],\n              [102.050769, 26.49417],\n              [102.033411, 26.470768],\n              [102.029491, 26.434068],\n              [102.020196, 26.422832],\n              [101.994999, 26.431409],\n              [101.982121, 26.454906],\n              [101.942701, 26.448989],\n              [101.929039, 26.419487],\n              [101.939118, 26.410824],\n              [101.927583, 26.362263],\n              [101.935198, 26.322954],\n              [101.926015, 26.306213],\n              [101.921759, 26.27032],\n              [101.90205, 26.243521],\n              [101.906753, 26.191367],\n              [101.872261, 26.181483],\n              [101.840681, 26.16008],\n              [101.844712, 26.141683],\n              [101.832282, 26.117176],\n              [101.839897, 26.082429],\n              [101.835417, 26.045865],\n              [101.858039, 26.049392],\n              [101.881668, 26.072364],\n              [101.899698, 26.099202],\n              [101.922879, 26.107975],\n              [101.954684, 26.084494],\n              [102.020756, 26.096278],\n              [102.052561, 26.075547],\n              [102.084253, 26.065138],\n              [102.107771, 26.068235],\n              [102.117066, 26.086128],\n              [102.130056, 26.086386],\n              [102.136999, 26.108319],\n              [102.152342, 26.109609],\n              [102.175075, 26.147013],\n              [102.1996, 26.158447],\n              [102.241708, 26.188617],\n              [102.244955, 26.210874],\n              [102.257386, 26.220068],\n              [102.282807, 26.220154],\n              [102.351007, 26.245927],\n              [102.396138, 26.297627],\n              [102.440149, 26.300632],\n              [102.542954, 26.340121],\n              [102.551577, 26.362178],\n              [102.571063, 26.362607],\n              [102.629408, 26.33686],\n              [102.638591, 26.307673],\n              [102.611266, 26.282343],\n              [102.601299, 26.249019],\n              [102.620113, 26.245755],\n              [102.659197, 26.221442],\n              [102.674539, 26.205374],\n              [102.719782, 26.218177],\n              [102.721686, 26.239999],\n              [102.73994, 26.268602],\n              [102.761889, 26.275301],\n              [102.785183, 26.298915],\n              [102.833449, 26.306642],\n              [102.867493, 26.339005],\n              [102.88026, 26.366125],\n              [102.89325, 26.338834],\n              [102.926847, 26.334628],\n              [102.975561, 26.340894],\n              [102.998183, 26.371874],\n              [102.988328, 26.409023],\n              [102.997735, 26.459622],\n              [102.990344, 26.483027],\n              [103.031891, 26.486884],\n              [103.057088, 26.528109],\n              [103.053505, 26.554242],\n              [103.036706, 26.555355],\n              [103.019348, 26.590047],\n              [103.029651, 26.601694],\n              [103.024164, 26.639795],\n              [103.028195, 26.659569],\n              [103.00591, 26.677456],\n              [103.009605, 26.70732],\n              [102.996727, 26.724943],\n              [102.98396, 26.764799],\n              [102.991799, 26.774633],\n              [102.964474, 26.839428],\n              [102.947452, 26.844299],\n              [102.896498, 26.912556],\n              [102.888883, 26.954565],\n              [102.895266, 26.999802],\n              [102.871301, 27.02796],\n              [102.898962, 27.076323],\n              [102.913744, 27.134637],\n              [102.902209, 27.195903],\n              [102.90165, 27.235763],\n              [102.883284, 27.258242],\n              [102.882164, 27.293314],\n              [102.900082, 27.317653],\n              [102.911392, 27.349133],\n              [102.941405, 27.40552],\n              [102.955292, 27.411386],\n              [102.97097, 27.377628],\n              [102.985304, 27.367337],\n              [103.033347, 27.388003],\n              [103.055632, 27.409516],\n              [103.079598, 27.397272],\n              [103.111514, 27.401013],\n              [103.14455, 27.425584],\n              [103.14455, 27.450574],\n              [103.190353, 27.523472],\n              [103.204464, 27.529163],\n              [103.218126, 27.562111],\n              [103.236156, 27.570431],\n              [103.278711, 27.561856],\n              [103.293606, 27.564743],\n              [103.299205, 27.597171],\n              [103.280391, 27.617964],\n              [103.314547, 27.655297],\n              [103.349711, 27.678454],\n              [103.370093, 27.708644],\n              [103.39305, 27.709407],\n              [103.420935, 27.742979],\n              [103.448148, 27.7551],\n              [103.464722, 27.782472],\n              [103.489584, 27.797384],\n              [103.509181, 27.84033],\n              [103.499998, 27.877502],\n              [103.502574, 27.91043],\n              [103.526315, 27.940555],\n              [103.563943, 27.964159],\n              [103.563271, 27.977693],\n              [103.54065, 27.965766],\n              [103.516685, 27.965259],\n              [103.498879, 27.984121],\n              [103.496527, 28.016593],\n              [103.48824, 28.032403],\n              [103.459459, 28.021412],\n              [103.43247, 28.041279],\n              [103.432918, 28.072213],\n              [103.453636, 28.087677],\n              [103.454979, 28.12375],\n              [103.47021, 28.122145],\n              [103.533147, 28.168508],\n              [103.552633, 28.191302],\n              [103.573238, 28.230884],\n              [103.608178, 28.239069],\n              [103.632368, 28.259992],\n              [103.649502, 28.25704],\n              [103.694745, 28.227256],\n              [103.702024, 28.198983],\n              [103.721286, 28.202022],\n              [103.739987, 28.236032],\n              [103.770336, 28.2335],\n              [103.78579, 28.254087],\n              [103.813003, 28.265138],\n              [103.828906, 28.28496],\n              [103.870229, 28.301067],\n              [103.875604, 28.322147],\n              [103.853431, 28.356708],\n              [103.859814, 28.383506],\n              [103.851303, 28.40676],\n              [103.829801, 28.436325],\n              [103.830249, 28.458388],\n              [103.810428, 28.49543],\n              [103.781983, 28.524549],\n              [103.75701, 28.522782],\n              [103.739987, 28.51201],\n              [103.724533, 28.471522],\n              [103.685002, 28.497955],\n              [103.689929, 28.519332],\n              [103.712999, 28.541294],\n              [103.712551, 28.552904],\n              [103.689257, 28.562578],\n              [103.665404, 28.594874],\n              [103.639983, 28.604881],\n              [103.61389, 28.597313]\n            ]\n          ],\n          [\n            [\n              [101.91672, 26.703127],\n              [101.913024, 26.680537],\n              [101.920528, 26.635515],\n              [101.938782, 26.639367],\n              [101.946509, 26.707662],\n              [101.91672, 26.703127]\n            ]\n          ]\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/lego-map/package.json",
    "content": "{\n  \"name\": \"@td-design/lego-map\",\n  \"version\": \"1.4.1\",\n  \"description\": \"雷数大屏素材库-地图\",\n  \"keywords\": [\n    \"thundersdata\",\n    \"frontend\",\n    \"lego\",\n    \"map\"\n  ],\n  \"homepage\": \"https://github.com/thundersdata-frontend/td-design#readme\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/commonjs/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/thundersdata-frontend/td-design.git\"\n  },\n  \"scripts\": {\n    \"build\": \"rollup -c\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/thundersdata-frontend/td-design/issues\"\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\",\n  \"dependencies\": {\n    \"@amap/amap-jsapi-loader\": \"^1.0.1\",\n    \"echarts\": \"^5.4.3\",\n    \"echarts-for-react\": \"^3.0.2\",\n    \"lodash-es\": \"^4.17.21\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-commonjs\": \"^25.0.3\",\n    \"@rollup/plugin-node-resolve\": \"^15.1.0\",\n    \"@types/lodash-es\": \"^4.17.8\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-dom\": \"^18.2.7\",\n    \"postcss\": \"^8.4.31\",\n    \"postcss-url\": \"^10.1.3\",\n    \"less\": \"^4.1.3\",\n    \"rollup\": \"^3.26.3\",\n    \"rollup-plugin-postcss\": \"^4.0.2\",\n    \"rollup-plugin-typescript2\": \"^0.35.0\",\n    \"tslib\": \"^2.6.0\",\n    \"typescript\": \"^5.1.6\"\n  }\n}"
  },
  {
    "path": "packages/lego-map/rollup.config.js",
    "content": "const commonjs = require('@rollup/plugin-commonjs');\nconst resolve = require('@rollup/plugin-node-resolve');\nconst postcss = require('rollup-plugin-postcss');\nconst postcssurl = require('postcss-url')\nconst less = require('less');\nconst typescript = require('rollup-plugin-typescript2')\nconst fs = require(\"fs\")\n\nconst isProductionEnv = process.env.NODE_ENV === 'production';\n\nconst noDeclarationFiles = { compilerOptions: { declaration: false } };\n\n\nlet pkg = JSON.parse(fs.readFileSync('./package.json')),\n    external = Object.keys(pkg.dependencies || {});\n\nconst processLess = function (context, payload) {\n  return new Promise((resolve, reject) => {\n    less.render(\n      {\n        file: context,\n      },\n      function (err, result) {\n        if (!err) {\n          resolve(result);\n        } else {\n          reject(err);\n        }\n      }\n    );\n\n    less.render(context, {}).then(\n      function (output) {\n        if (output && output.css) {\n          resolve(output.css);\n        } else {\n          reject({});\n        }\n      },\n      function (err) {\n        reject(err);\n      }\n    );\n  });\n};\n\nmodule.exports = [\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/commonjs',\n      format: 'cjs',\n      name: '[name].js',\n      preserveModules: true,\n      preserveModulesRoot: 'src',\n    },\n    plugins: [\n      resolve(),\n      commonjs(),\n      typescript({tsconfig: \"tsconfig.json\",tsconfigOverride:{ compilerOptions: { declaration: true ,declarationDir:'./lib/typescript'} },useTsconfigDeclarationDir: true}),\n      postcss({\n        minimize: isProductionEnv,\n        process: processLess,\n        plugins:[\n          postcssurl({\n            url: 'inline',\n          }),\n        ]\n      }),\n      {\n        name: 'Custom Rollup Plugin`',\n\n        generateBundle: (options, bundle) => {\n          Object.entries(bundle).forEach(entry => {\n\n            // early return if the file we're currently looking at doesn't need to be acted upon by this plugin\n            if (!entry[0].match(/.*(.less.js)$/)) {\n              return;\n            }\n\n            // this line only runs for .scss.js files, which were generated by the postcss plugin.\n            // depending on the use-case, the relative path to style-inject might need to change\n            bundle[entry[0]].code = entry[1].code.replace(\n              '/home/runner/work/td-design/td-design/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js',\n              'style-inject',\n            );\n          });\n        },\n      }\n    ],\n    external:  (id) => {\n      if (/node_modules/.test(id)) return true;\n      return false;\n    },\n  },\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/module',\n      format: 'esm',\n      entryFileNames: '[name].js',\n      preserveModules: true,\n      preserveModulesRoot: 'src',\n    },\n    plugins: [\n      resolve(),\n      commonjs({\n        mainFields: ['module', 'main', 'jsnext:main', 'browser'],\n        extensions: ['.js', '.mjs', '.json'],\n        sourceMap: false,\n        browser: true,\n      }),\n      typescript({ tsconfigOverride: noDeclarationFiles}),\n      postcss({\n        minimize: isProductionEnv,\n        process: processLess,\n        plugins:[\n          postcssurl({\n            url: 'inline',\n          }),\n        ]\n      }),\n      {\n        name: 'Custom Rollup Plugin`',\n\n        generateBundle: (options, bundle) => {\n          Object.entries(bundle).forEach(entry => {\n\n            // early return if the file we're currently looking at doesn't need to be acted upon by this plugin\n            if (!entry[0].match(/.*(.less.js)$/)) {\n              return;\n            }\n\n            // this line only runs for .scss.js files, which were generated by the postcss plugin.\n            // depending on the use-case, the relative path to style-inject might need to change\n            bundle[entry[0]].code = entry[1].code.replace(\n              '/home/runner/work/td-design/td-design/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js',\n              'style-inject',\n            );\n          });\n        },\n      }\n    ],\n    external:  (id) => {\n      if (/node_modules/.test(id)) return true;\n      return false;\n    },\n  }\n]\n\n\n"
  },
  {
    "path": "packages/lego-map/src/assets/bgImage.js",
    "content": "export const defaultBg =\n  'data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAgICAgJCAkKCgkNDgwODRMREBARExwUFhQWFBwrGx8bGx8bKyYuJSMlLiZENS8vNUROQj5CTl9VVV93cXecnNEBCAgICAkICQoKCQ0ODA4NExEQEBETHBQWFBYUHCsbHxsbHxsrJi4lIyUuJkQ1Ly81RE5CPkJOX1VVX3dxd5yc0f/CABEIA60C/AMBIgACEQEDEQH/xAAyAAEBAQEAAwAAAAAAAAAAAAAAAQIFBAYHAQEBAQEAAwAAAAAAAAAAAAAAAQMCBAUG/9oADAMBAAIQAxAAAAD5F5R9T6QOuQAAAAAAAABSUQgsFAFIpAAAAAAAAAAAAAIoilgFgqEsoixQAAAAAAAAJyOwx0DbMAAAAAAAAUlEIUAUlEAAAAAAAAAAAAAAAAAAASiLFAqCykixQAAAAAAAAAAAAAAAFEIUAUlEAAAACgCiKIolAAABKIoiiKIAIAAAAAilgKgspIsUAAAAAAAAAAAAUEQFFJRAAAABaigAAAAAAUiiLAAAAAACKIsAgAABKIsUCpUixQAAAAAAAAAFAgAUQAAAKFJQAAAKJQFIoikiiKIoiiKWLBKIogAAEoiiACAAEogVYLKSBQAAAAAAFEQUUlEAAAFqUAACgUikAFIoiqlAAABKIoioiwAiiLFiiAASiLAIAASiLFWCykgUAAAABREFFAQAAKUAACgolEFIqiiKBSKIoiiKIoiiKIsIoijKiKiSiKXKiAASiACAAIsVYLKSBQAAFEQUUBAABaAAFBQEKBalAolpIoKIqoojQy0MtDKiKIsiKJNDKlkoiwiogIsWKIACLAIAAixVgspIFAURBRQEAAFoABQUBUFqVSVSUQqpaJVSKIolUiiKIok0MqIok1CTQypZKiTUJNRYsIshKJKWAAiwCAAIsVYLKSFVAFAQAAWgBSVQEUpQVSUQqlVIoKJVqLUzaItMtDLQy0MtQk0MtQk0XKoyok1DLUWTUjLUWSiSiCIsWLACKIIAAixVgpEBVEAAFoAUFBUlWpVCkKotSUC2otSLSNCLSKsjQy0MtDLQy0MqMtSXLQzNQy1DLUWTUiTUMtRcqjKxZNQiyIsWLACLAIAAgUBRAABaAFBQVBaFFEVaKQqlVJbSVSVbJVItMtCNDLSstDLQy0jDQy1CTUJNDM1JczcMzUMtRcqjM1Fk1IypcrCLIixYsAIsAgBKIVQQAWgBQUFQWlBVQqxVJasVRVJasLTNtItsi0zaI0MtDLQy0MtDM3DLUJNQy0lw1DM0MzUlzNQzNwzNSWSjM1JZKXKwiyIsWLACLAIAAAAUoBVASlpZRVRVslUVbFUVbJVFUKsltI0I0si0iiKI0MqIoy1CTQw0lw1DKjM1FysiTUMzUlzNQyslk1DM1JZKXKwiyJNRYBKIAJQQBZaAWUURVoUVUVbBRVsVolqxWiVbJbSW2pVSWiWiNEiiNKy0MtDLUjLQzNxczQzNQzNxcTcjM1DM3mWZ0M53JcTUMrJZNQzNSXKxZNQkqJKWASwCAAqgFFlFlRVpRGpbFUVbGlFWyaULbJpRVsltJaSWqloi0iiNDLQy0MqMtQk0MqMzSMTcXM1DM1JcNQznclzNQznclxNQyslksJKlzNRZLISxYsAIAIWWgFUFRZaVUVaUS1bFaFLGlFWxbaltSW0lqwtItJaJaSLTLQy0MtDLUJNDM0XM0MNQzNDOdyXDUMTcXE3mMzUlzNQzneZczUMzUlzNRczUiSxYsiTUWASiAoBRQUstlKWylRVq1UalsamhVsaWlVFpFWlUltSVSWiVSKqNDLQy0MqiTQzNDM1DLUMzUXM1DM3IxNRc53FxNSM53Jc51DM1JcTUWSyMrFkslkokqWSwAllAFUFRZatlS2Wy2WrVS1bFUtmrGpqlVGlQaqaULUloKotIoloiiKIoijKjLUMtQzNIzNQzNRczUMzUjE1FzneVzNSMTeZczUMTUlzLFksiSyWSlysiTUWAAFFlFLLZS2Wy2VLZqxqaFWy1bGlGpqxqVLZqlUVUVQtqVSWiVSKJaIok0MqJNDM0MzUMtQzNSMzUMzUXM1DOdyMTUXE1JcTUM51JczWZczUMyyWSxZLJZKJLJYsAFlKEtlq2VLZbLZaupUupbLVGpqxqasamhVsaUVUVRVpVJVCgUjQiliiKMtEyoyozNDM1DM1DKyMzUMzUXE1DM1JcTUMTWZczUXOdSM53mXM1lZLIkslksWCJKWApRZUpapUtlstmrLZotlstWy6mqamkalstUtVFUVaVRVJVCgpRSKIoiiLCKMqMrEk1DM1DM1DM1IzNQxNRczWTOd5lzneVzNZjM1mXM1mXM1kkslksXKyWSyEsWAtlRSrZoWasVUtmrLZqxqaGpqy1bLqVLVq1UamhVpVFUGiVVFJSCiKIoiiKICLKiwy1EzNQzNQzNQzNZjM1DE1FzneYznUXE1mXM1mWZ1DE1JcLJczWVk1mWLCSozZVoS2WrZUtlstmqtmktmrLZqy6lLqastlsupoalS1aVS2UpSlVQFgUlAAABKIsIsEqsrDLWUksJLDM1DOd5jOd5XM1kzneZc53mXE1DE1Jc51mXM1lZLIkslksWCM0WlRZatE1ZbLZqy2aLZqy2asupbLqaLZqy2aRqaGpatmhQtVVlBYUBSUUAABKIsEpMrBLKk1DM1EzNZJnUMzWYzNZMzWVzNZlzneTE1mXM1mWZ1mXM1kkslzNSXMpZLIhVWVLZatlS2Wy6ls1ZbLqaLZqy6lsuppLZqrZpLZaupS2UtmhRaWFlBVAKAAAEogIsEpMrCTUrM1EzNZJLDM1mMzWTM1lczWYznUXOdZlzneZczWTOdSXMslksWSyWSyJZVWVLZatlstmktmrLrOrLrOquppLZqzVlsupTVmktlq6zotlLZpVlFWAKFUAgoAiiLBKIKixJNQksJNSsyxJnUMywzNZjM1lcywznWZc53mXOdZWZ1IznWZcrJczWVkslksJZYWWrZS6zqy2VLrOrNWWzVls1rOi6ls1Zqy6zous6S2aq2UtUtlWiLZRZVWUCFAAAACASykoksSAksqZ1EzNZJnUM51IznWVzNZJnWZc51mXMsMyyXOdSXMslmdZWSyWSjNlhSrZpGs6q2VNWWzVls1ZbNazqtazpLqWy6zoupU1Zaus6LZS2VaWFBRVBZYABQAARLAKgIEksJKrMsSZ1DMsMyyMyxcywznWZcyxcTWYzLJczWZcyxZnWZWdZlgM2WKKus6RrOqtlTVls1ZbNWWt2VNazqzVls1ZU1ZTVlrVlLZS2VbZYoKFohZQAFAAASxAIKgSSwgrMsSSwzLDMsiZ1lcywznWZZnWZcSwmdZlmdZlzLJZLFmdZlgM2WKlq6zUus6q2VNWWzVls1ZbNazqtazpNXOrLrOjVzpNWWrrOi2UtlW2I0lKFqUWWAAUAAESwCoCBJAhKksSS5JLDMsjMsXMsM51mXMuVmbIzLJZmyXMsWZ1mVnWZYDNlhZatlLrOrLZUus6s1ZbNWWzWs6NXOrNazbNazous6S6za1ZTVzTVlWiLZRZVWUCKAAAACASyhBLEgJLKkuUZsJLkkuYmdZWZsJmyXOdZlzLDMslzLmWSyWZ1lZLJYQlllWVLZatls1c1NazbNazqy6zou8as1rNs3ZbNXOjWs1NWWrrNNWUus1bZS3NigoWpYAqCgELAEApBEQSwRKksSS5JLCZsiZsXMsM51mWZuZZnWVkuYmdZlkJZmxZLJZLCWJbZUtlq2Wy2VNXOrNWWzVzo1rNs3c6s1rNTWs2tazU1ZTVzqrZS6zTSVbYi2UWFoKlAAABABAERARKS5GbEksJmwmbImbFmbIzLlZnWZZm5lZsMy5lkslksWSyWSyIlW2EtlrSVNWWy6zbNazTWs2zWs2zdzqzWsaNazbNazU1rNNXOqus00lNXNW2C2I0lFhalAAAAEAREBARKREZsJLkZsiZsWZsJmyWZuSZslmbJZnWZZmwkslkSWEVLIzZVoS2WrZUtlsus2tazU3c2zWs2zdzo1rGrNWWzWsaNXOk1c2tXNNWUtg1YXSUWItgqUAqCwBCwEAQQpmxIQksJEGbmGblWbCZuZWbmWRCRJZnWZZmxZLIkslksWCM2FtlSpaus0us2zVzU1rNs1rNs1rGjWsas3c2zdzpNXNrdzU1c6NXNrVzTVzS6yNXNW2CpYqCoKgqCoAEKQEREQRBEGbIkQkRZLmJLlZmyWZslkuSZslkJZEVmyVAhJYC2C2VLc2tWE1ZbLrNs1rNNWWzVzqzWsarWsaTVzqzVzTdzU1c01c2tXNNXNLc00hdILYKgqCoLAICBBEQRBAkSERZLkZsJm5lZuVZsiZslmbJZmwkslksWQlkshLFgFlKEtlq2VLZbLZa1c6TVzqy6zTWsas3c2zWsaNXNs3c01c1NXNNXNrVzS3NNININMjSFqCoKkSoCAkLEEQJIRBEWS5EZlRCZslkSWS5GbmWSxZLIkslksVCIRQFgtlSpatlLZbLZUus2zWsaNXNs3c2zWsaNaxqzVzpNXNrVzTVzU1c01cq1c00zS3NKg0zSoKkKgqQqQsQsQRIRBEVEEZhEWRJZEJCWRJZEISWSxZLJYQElQJZQC3NLYS2WrZUtlstlNXNs1rNs1c01rNs1rGjVzbN3Gk1cq3caNXJNs01cq1cjSDSCoKgqCoLILILICSLIVEEQRIkRUZVEhlJUQkSWSxZLIkslhFQhEUCAoFg0lSpatlLYTVizVza3c1NXOrNXGjVzbN3Gq1c1Ns1NXNrVzTVxTVzU0zTTNKg0yrTI0yKiKkKkLELIVEEQskhEVGVRIRmVLkRJZEEslkFkslhASVAAghZaAqUthLZatzU1c2tXNTVzbNaxTaWzVzTVzbN3FN3Fs3cU2zbNXI2zTTNNM1LcjTI0grI1IKkKkWpCyAgRmWxBGZUQRJUQZuZUQRJURUSEsVCERQBAICqBYLZRZUtza0lS3OrLc01c2zdxo1c2zVxTdys3caNXNs1cU2zU0za0zTTI1cjTI0yNMjUgrIqQqQqSLJFsQRmWxBGZbEEZlRBCWEISVEVLISxUACACAFloBZSpUqWrYNXNTVzbLYNXNs3cU2zbNXNNXNs1cU3cU1c2zTNNM00yTVyNMjTKtMjUiKyNSRakLELJJbIEQuUlGSySVEEJUQRJUFRASBFASwCAAAqpQC3NKEtirZS3NTVzbLYNXNs1c01c2y2DVzTTNs1cU2yNsrNXI0gtyNMjUgqCyCpCspbICQsSUgRBElRBCVEESURUBCERQBAAIlhaEAWKoALYLYS2K0lLc1NJbLc0tzbNXNNXNNM2zVyNXI1crNXI0zTTI0yNMjTI0yKkNSCxCyJbICQsSVECQsSUQRJRFQEIQVAAQAgCBalQABYqgWC2C2EtirYNJUtza0hNIrVzU1cU1cjVzbLc0tyNM00yNMjTJNMl0yKkNSCxCpCxJbJCxCyFIhEUSCFQEIQVAAQAgAQsogWpUAAWKoFgtgthLc2rc00hNIrVzUqUtyrVyTVzTTI1cjSLNMjTI0yNMjTIqFsiKyLELILIUSLECFIhBUQsIQVAAQAgACBVgssFgoQABYqgWC3NKEqWqlKg0lS3KtXNSoNILc2rck0zSoNMjTI0yNSCpDUgsRaiCCxCyFEixFEBAIQVAAQAgABBRSAqVIsVYKEAAWKoAKlKlFhLYq3NLc0qVKitM0tyTSCoNM0qCoKgqQqCoLEKkKhRIsRbELAQgQEUABACAAEFFBEBQKlSLFWChAAFiqABYLYKlSoLc2qlKg0zUqC2CoqoNMjTI0yKgqCwggqQqFELAIgBBSAABACAUEQUUEQFAAAqVIsVYKEAACqlAAKg0gqVFgqWqgqC2CoKgqCoKgqCoLAIKgEKiBCoUgAAEAAgABBRQRAUAAAACpUixVgqVAAAFiqlAAKgtgqEoFgqCoqgAAAEKiKgsAAhbAIAABCwAgAAQsFFBEBQAAAAAAKlIogKhKAAAKWCpQAACoKgtgqEqCoKgqCoKhagIKgsAAAQqAIAAAEAUoEQFAAAAAAAAAWCykgVYKlQAAABYqoKAAAAAAAAAAAAAAAgsAAIAAELBQFEQUAAAAAAAAAAAACpUilgFgqVAAAAAAKiqgqCpQAAAQqCoKgACAAAABCoUAoEQFAAAAAAAAAAAAAAAWCpUilgFgqEoAAAAAAAAAAAAAAAAAABCwUAoESwUAAAAAAAA5XVy7DXgAAAAAAAABYKlSKIsUBYKhKAAAAAFAABAAAACCoUAApBCwUAAAAAAAABM+teLv/AP/EACgQAAIBAwQCAAcBAQAAAAAAAAEREABQYAIgMEADcAQFEiExgKAikP/aAAgBAQABPwD4b4bR4NA+w+tf6OPEAgghg15/l2o+QnxfSNK/BJ/rvVLYsWXsRUoUqliihcyxhUsZULhULesDW9SuNSvWKpUuFUqWIL2evXSpev1S9erav1fFkXv0Y6MgF/MHGDlh7Q2i8nafQQvJ2HuiBcT1j0xsG0XsyYMnsCBQgSLwdp7AkQJF7PAeqJEChAkbhcjBk9sbRyCxm2CRA2jeLGbYIFCBtG8WM2wbRyCxnonsChAgUIHCLkYMntiBIvZ4D1RIgUIEi8GTB644ReDJkwZPYFzPSOw4sZPfHALsZMHujaLyYMn0GLoZNkF8MmDZRezJ7o/5fPIXT/R90/Yr9ZPovEXT4XDxp08ZfWeHunTp7Xh74XTp06eLOnyunizh04eJPNHizp06f9dpIH5NfL/idepeEgLTp+xx7ya/o8evWmgSq83m1+byHXqTSQr/xAAfEQADAAEDBQAAAAAAAAAAAAABAgMEEkFQABEiMbD/2gAIAQIBAT8ARFRQqjsBx9YSsAHX18rGNVtMOu/H5OUuPp8dRO3X/8QAGxEBAAICAwAAAAAAAAAAAAAAAQIDEVAAIbD/2gAIAQMBAT8AlJkquV19ds61YvlY2Qa5sXX00Nue8Bz/2Q==';\n"
  },
  {
    "path": "packages/lego-map/src/assets/china.js",
    "content": "﻿export default {\n  type: 'FeatureCollection',\n  features: [\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 110000,\n        name: '北京市',\n        center: [116.405285, 39.904989],\n        centroid: [116.41995, 40.18994],\n        childrenNum: 16,\n        level: 'province',\n        subFeatureIndex: 0,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [117.348611, 40.581141],\n              [117.348611, 40.581141],\n              [117.269771, 40.560684],\n              [117.247597, 40.539766],\n              [117.262995, 40.512927],\n              [117.208793, 40.501552],\n              [117.263611, 40.442367],\n              [117.234046, 40.417312],\n              [117.226039, 40.368997],\n              [117.243285, 40.369453],\n              [117.271618, 40.325211],\n              [117.271618, 40.325211],\n              [117.295024, 40.2782],\n              [117.331365, 40.289613],\n              [117.351075, 40.229786],\n              [117.389879, 40.227958],\n              [117.383719, 40.188195],\n              [117.367089, 40.172649],\n              [117.367089, 40.173106],\n              [117.367089, 40.173106],\n              [117.367089, 40.172649],\n              [117.349227, 40.136513],\n              [117.307343, 40.136971],\n              [117.274082, 40.105852],\n              [117.254988, 40.114548],\n              [117.254988, 40.114548],\n              [117.254988, 40.114548],\n              [117.224191, 40.094865],\n              [117.224191, 40.094865],\n              [117.210024, 40.082045],\n              [117.204481, 40.069681],\n              [117.159517, 40.077008],\n              [117.140423, 40.064185],\n              [117.105315, 40.074261],\n              [117.105315, 40.074261],\n              [117.051728, 40.059605],\n              [117.025243, 40.030283],\n              [116.945171, 40.04128],\n              [116.927924, 40.055024],\n              [116.867562, 40.041739],\n              [116.831222, 40.051359],\n              [116.820135, 40.02845],\n              [116.781331, 40.034866],\n              [116.757925, 39.967934],\n              [116.782563, 39.947749],\n              [116.78441, 39.891294],\n              [116.812128, 39.889916],\n              [116.865714, 39.843982],\n              [116.907598, 39.832494],\n              [116.918069, 39.84628],\n              [116.949482, 39.778703],\n              [116.902055, 39.763523],\n              [116.916837, 39.731314],\n              [116.887272, 39.72533],\n              [116.889736, 39.687576],\n              [116.90575, 39.688037],\n              [116.906366, 39.677444],\n              [116.8497, 39.66777],\n              [116.812128, 39.615695],\n              [116.79057, 39.595868],\n              [116.748686, 39.619844],\n              [116.709266, 39.618],\n              [116.726512, 39.595407],\n              [116.726512, 39.595407],\n              [116.724048, 39.59264],\n              [116.723432, 39.59264],\n              [116.724048, 39.59264],\n              [116.723432, 39.59264],\n              [116.664918, 39.605552],\n              [116.620571, 39.601863],\n              [116.592237, 39.621227],\n              [116.592237, 39.621227],\n              [116.524484, 39.596329],\n              [116.50847, 39.551122],\n              [116.473361, 39.552968],\n              [116.478289, 39.535431],\n              [116.437637, 39.526661],\n              [116.443796, 39.510041],\n              [116.401912, 39.528046],\n              [116.411767, 39.482794],\n              [116.444412, 39.482332],\n              [116.454883, 39.453226],\n              [116.434557, 39.442597],\n              [116.361876, 39.455074],\n              [116.361876, 39.455074],\n              [116.337854, 39.455536],\n              [116.307057, 39.488337],\n              [116.257782, 39.500344],\n              [116.240536, 39.564041],\n              [116.198652, 39.589412],\n              [116.151841, 39.583416],\n              [116.130283, 39.567732],\n              [116.09887, 39.575113],\n              [116.036044, 39.571884],\n              [116.026189, 39.587567],\n              [115.995392, 39.576958],\n              [115.978146, 39.595868],\n              [115.957204, 39.560812],\n              [115.910393, 39.600479],\n              [115.910393, 39.600479],\n              [115.91532, 39.582955],\n              [115.91532, 39.582955],\n              [115.867893, 39.546507],\n              [115.867893, 39.546507],\n              [115.828473, 39.541431],\n              [115.821081, 39.522968],\n              [115.821081, 39.522968],\n              [115.806299, 39.510041],\n              [115.806299, 39.510041],\n              [115.752712, 39.515581],\n              [115.738545, 39.539585],\n              [115.738545, 39.540046],\n              [115.738545, 39.539585],\n              [115.738545, 39.540046],\n              [115.724995, 39.5442],\n              [115.724995, 39.5442],\n              [115.722531, 39.543738],\n              [115.721299, 39.543738],\n              [115.722531, 39.543738],\n              [115.722531, 39.5442],\n              [115.721299, 39.543738],\n              [115.722531, 39.5442],\n              [115.720683, 39.551122],\n              [115.720683, 39.551122],\n              [115.718835, 39.553891],\n              [115.718835, 39.553891],\n              [115.716988, 39.56035],\n              [115.716988, 39.56035],\n              [115.699125, 39.570039],\n              [115.699125, 39.570039],\n              [115.698509, 39.577881],\n              [115.698509, 39.577881],\n              [115.667712, 39.615234],\n              [115.633836, 39.599557],\n              [115.633836, 39.599557],\n              [115.587024, 39.589873],\n              [115.545756, 39.618922],\n              [115.518039, 39.597252],\n              [115.522351, 39.640124],\n              [115.478619, 39.650723],\n              [115.478619, 39.650723],\n              [115.491554, 39.670074],\n              [115.486626, 39.741899],\n              [115.439815, 39.752022],\n              [115.443511, 39.785601],\n              [115.483547, 39.798477],\n              [115.483547, 39.798477],\n              [115.50572, 39.784222],\n              [115.552532, 39.794799],\n              [115.567314, 39.816407],\n              [115.514344, 39.837549],\n              [115.526046, 39.87568],\n              [115.515575, 39.892212],\n              [115.515575, 39.892212],\n              [115.522967, 39.899099],\n              [115.481083, 39.935819],\n              [115.426264, 39.950502],\n              [115.428728, 39.984443],\n              [115.450286, 39.992697],\n              [115.454597, 40.029825],\n              [115.485394, 40.040364],\n              [115.527278, 40.076092],\n              [115.59072, 40.096239],\n              [115.599959, 40.119583],\n              [115.75456, 40.145663],\n              [115.75456, 40.145663],\n              [115.773654, 40.176307],\n              [115.806299, 40.15344],\n              [115.847567, 40.147036],\n              [115.855574, 40.188652],\n              [115.870356, 40.185909],\n              [115.89869, 40.234354],\n              [115.968907, 40.264045],\n              [115.95166, 40.281852],\n              [115.917784, 40.354405],\n              [115.864197, 40.359422],\n              [115.771806, 40.443734],\n              [115.781045, 40.49336],\n              [115.736082, 40.503372],\n              [115.755176, 40.540221],\n              [115.784741, 40.55841],\n              [115.819849, 40.55932],\n              [115.827857, 40.587504],\n              [115.885139, 40.595229],\n              [115.907929, 40.617493],\n              [115.971986, 40.6025],\n              [115.982457, 40.578868],\n              [116.005247, 40.583868],\n              [116.09887, 40.630665],\n              [116.133979, 40.666536],\n              [116.162928, 40.662451],\n              [116.171551, 40.695582],\n              [116.204812, 40.740035],\n              [116.22021, 40.744115],\n              [116.247311, 40.791707],\n              [116.273181, 40.762703],\n              [116.311369, 40.754996],\n              [116.316912, 40.772221],\n              [116.453651, 40.765876],\n              [116.46597, 40.774487],\n              [116.438253, 40.81934],\n              [116.334159, 40.90443],\n              [116.339702, 40.929303],\n              [116.370499, 40.94377],\n              [116.398216, 40.90624],\n              [116.477057, 40.899907],\n              [116.447492, 40.953715],\n              [116.455499, 40.980828],\n              [116.519557, 40.98128],\n              [116.519557, 40.98128],\n              [116.5676, 40.992574],\n              [116.598397, 40.974503],\n              [116.623034, 41.021026],\n              [116.615643, 41.053076],\n              [116.647672, 41.059394],\n              [116.688324, 41.044501],\n              [116.698795, 41.021477],\n              [116.677853, 40.970888],\n              [116.722201, 40.927495],\n              [116.713577, 40.909858],\n              [116.759773, 40.889954],\n              [116.81336, 40.848319],\n              [116.848468, 40.839264],\n              [116.924229, 40.773581],\n              [116.926692, 40.745022],\n              [116.964881, 40.709647],\n              [117.012308, 40.693767],\n              [117.11209, 40.707379],\n              [117.117018, 40.70012],\n              [117.208177, 40.694675],\n              [117.278394, 40.664267],\n              [117.319662, 40.657911],\n              [117.342451, 40.673799],\n              [117.408973, 40.686961],\n              [117.493973, 40.675161],\n              [117.514914, 40.660181],\n              [117.501364, 40.636569],\n              [117.467487, 40.649738],\n              [117.467487, 40.649738],\n              [117.412669, 40.605226],\n              [117.429915, 40.576141],\n              [117.389879, 40.561593],\n              [117.348611, 40.581141],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 120000,\n        name: '天津市',\n        center: [117.190182, 39.125596],\n        centroid: [117.347019, 39.28803],\n        childrenNum: 16,\n        level: 'province',\n        subFeatureIndex: 1,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [117.765602, 39.400527],\n              [117.699696, 39.407463],\n              [117.673211, 39.386652],\n              [117.668899, 39.412087],\n              [117.614081, 39.407001],\n              [117.601146, 39.419485],\n              [117.570965, 39.404689],\n              [117.521074, 39.357043],\n              [117.536472, 39.338068],\n              [117.594987, 39.349176],\n              [117.669515, 39.322792],\n              [117.670747, 39.35658],\n              [117.74466, 39.354729],\n              [117.784696, 39.376938],\n              [117.805022, 39.373237],\n              [117.810565, 39.354729],\n              [117.850601, 39.363984],\n              [117.850601, 39.363984],\n              [117.854297, 39.328348],\n              [117.854913, 39.328348],\n              [117.854297, 39.328348],\n              [117.854913, 39.328348],\n              [117.88879, 39.332051],\n              [117.919587, 39.318162],\n              [117.919587, 39.318162],\n              [117.965782, 39.314921],\n              [117.965782, 39.314921],\n              [117.973173, 39.312143],\n              [117.973173, 39.312143],\n              [117.979333, 39.300566],\n              [117.979333, 39.300566],\n              [117.982412, 39.298714],\n              [117.982412, 39.298714],\n              [118.024296, 39.289451],\n              [118.024296, 39.289451],\n              [118.036615, 39.264898],\n              [118.064948, 39.256094],\n              [118.064948, 39.231065],\n              [118.037231, 39.220402],\n              [117.977485, 39.206028],\n              [117.96455, 39.172631],\n              [117.871543, 39.122506],\n              [117.837667, 39.057011],\n              [117.855529, 38.957492],\n              [117.898029, 38.948649],\n              [117.875855, 38.920252],\n              [117.847522, 38.855502],\n              [117.778536, 38.869016],\n              [117.752051, 38.847579],\n              [117.64611, 38.828933],\n              [117.646725, 38.788827],\n              [117.671363, 38.772032],\n              [117.740964, 38.753833],\n              [117.740964, 38.700141],\n              [117.729261, 38.680055],\n              [117.65658, 38.66043],\n              [117.639334, 38.626776],\n              [117.55803, 38.613683],\n              [117.47919, 38.616489],\n              [117.432379, 38.601524],\n              [117.368937, 38.564566],\n              [117.25314, 38.556143],\n              [117.238358, 38.580943],\n              [117.258684, 38.608072],\n              [117.258684, 38.608072],\n              [117.213104, 38.639866],\n              [117.213104, 38.639866],\n              [117.183539, 38.61836],\n              [117.183539, 38.61836],\n              [117.150894, 38.617892],\n              [117.109626, 38.584685],\n              [117.070822, 38.608072],\n              [117.055424, 38.639398],\n              [117.068358, 38.680522],\n              [117.038793, 38.688464],\n              [116.95133, 38.689398],\n              [116.948866, 38.689398],\n              [116.950714, 38.689398],\n              [116.95133, 38.689398],\n              [116.950714, 38.689398],\n              [116.948866, 38.689398],\n              [116.877417, 38.680522],\n              [116.858939, 38.741231],\n              [116.794265, 38.744498],\n              [116.794265, 38.744498],\n              [116.746222, 38.754299],\n              [116.737599, 38.784629],\n              [116.75115, 38.831264],\n              [116.723432, 38.852706],\n              [116.722201, 38.896968],\n              [116.708034, 38.931892],\n              [116.72836, 38.975174],\n              [116.754845, 39.003084],\n              [116.754229, 39.034701],\n              [116.754229, 39.034701],\n              [116.783179, 39.05097],\n              [116.783179, 39.05097],\n              [116.812744, 39.05097],\n              [116.812744, 39.05097],\n              [116.871874, 39.054688],\n              [116.912526, 39.110898],\n              [116.91191, 39.111362],\n              [116.91191, 39.111362],\n              [116.912526, 39.110898],\n              [116.909446, 39.150822],\n              [116.870026, 39.153607],\n              [116.855859, 39.215766],\n              [116.881729, 39.225966],\n              [116.881729, 39.225966],\n              [116.87249, 39.291304],\n              [116.889736, 39.338068],\n              [116.870642, 39.357506],\n              [116.829374, 39.338994],\n              [116.818287, 39.3737],\n              [116.840461, 39.378326],\n              [116.839845, 39.413474],\n              [116.876185, 39.43474],\n              [116.832454, 39.435664],\n              [116.785026, 39.465702],\n              [116.820751, 39.482332],\n              [116.819519, 39.528507],\n              [116.78749, 39.554352],\n              [116.808432, 39.576497],\n              [116.812128, 39.615695],\n              [116.8497, 39.66777],\n              [116.906366, 39.677444],\n              [116.90575, 39.688037],\n              [116.932236, 39.706456],\n              [116.932236, 39.706456],\n              [116.944555, 39.695405],\n              [116.944555, 39.695405],\n              [116.948866, 39.680668],\n              [116.948866, 39.680668],\n              [116.964265, 39.64335],\n              [116.983359, 39.638742],\n              [116.983359, 39.638742],\n              [117.016004, 39.653949],\n              [117.10901, 39.625375],\n              [117.10901, 39.625375],\n              [117.152742, 39.623532],\n              [117.177996, 39.645194],\n              [117.165061, 39.718886],\n              [117.165061, 39.718886],\n              [117.161981, 39.748801],\n              [117.205713, 39.763984],\n              [117.15767, 39.796638],\n              [117.156438, 39.817326],\n              [117.192162, 39.832953],\n              [117.251908, 39.834332],\n              [117.247597, 39.860981],\n              [117.227887, 39.852712],\n              [117.162597, 39.876598],\n              [117.162597, 39.876598],\n              [117.150894, 39.944996],\n              [117.198322, 39.992697],\n              [117.192162, 40.066475],\n              [117.210024, 40.082045],\n              [117.224191, 40.094865],\n              [117.224191, 40.094865],\n              [117.254988, 40.114548],\n              [117.254988, 40.114548],\n              [117.254988, 40.114548],\n              [117.274082, 40.105852],\n              [117.307343, 40.136971],\n              [117.349227, 40.136513],\n              [117.367089, 40.172649],\n              [117.367089, 40.173106],\n              [117.367089, 40.173106],\n              [117.367089, 40.172649],\n              [117.383719, 40.188195],\n              [117.389879, 40.227958],\n              [117.415748, 40.248973],\n              [117.450241, 40.252627],\n              [117.505059, 40.227044],\n              [117.548791, 40.232527],\n              [117.571581, 40.219276],\n              [117.576508, 40.178593],\n              [117.609769, 40.160301],\n              [117.609769, 40.160301],\n              [117.613465, 40.158014],\n              [117.613465, 40.158014],\n              [117.651653, 40.122786],\n              [117.651653, 40.122786],\n              [117.654117, 40.114548],\n              [117.654117, 40.114548],\n              [117.655965, 40.109514],\n              [117.655965, 40.109514],\n              [117.675059, 40.082045],\n              [117.71879, 40.082045],\n              [117.71879, 40.082045],\n              [117.752667, 40.081588],\n              [117.776073, 40.059605],\n              [117.74774, 40.047236],\n              [117.744044, 40.018368],\n              [117.768681, 40.022034],\n              [117.768681, 40.022034],\n              [117.793319, 40.005534],\n              [117.793319, 40.005534],\n              [117.795167, 39.996823],\n              [117.795167, 39.996823],\n              [117.781616, 39.966558],\n              [117.781616, 39.966558],\n              [117.756363, 39.965181],\n              [117.691073, 39.984902],\n              [117.671363, 39.973896],\n              [117.614697, 39.97252],\n              [117.594987, 39.994531],\n              [117.594987, 39.994531],\n              [117.546327, 39.999116],\n              [117.534625, 39.954631],\n              [117.514914, 39.946832],\n              [117.513067, 39.910576],\n              [117.513067, 39.910576],\n              [117.512451, 39.90874],\n              [117.512451, 39.90874],\n              [117.508139, 39.901854],\n              [117.508139, 39.901854],\n              [117.529081, 39.859144],\n              [117.529081, 39.859144],\n              [117.561726, 39.799856],\n              [117.546327, 39.775943],\n              [117.56111, 39.754782],\n              [117.595603, 39.74604],\n              [117.57774, 39.726711],\n              [117.627015, 39.703693],\n              [117.668899, 39.666849],\n              [117.66274, 39.636437],\n              [117.637486, 39.603246],\n              [117.654117, 39.575113],\n              [117.684914, 39.58895],\n              [117.707088, 39.576036],\n              [117.715711, 39.529892],\n              [117.745276, 39.547892],\n              [117.753899, 39.579726],\n              [117.753899, 39.579726],\n              [117.766834, 39.598635],\n              [117.829659, 39.589873],\n              [117.868464, 39.59679],\n              [117.933753, 39.574191],\n              [117.904804, 39.533585],\n              [117.912195, 39.517428],\n              [117.912195, 39.517428],\n              [117.899877, 39.474479],\n              [117.870311, 39.455074],\n              [117.871543, 39.411625],\n              [117.846906, 39.407926],\n              [117.765602, 39.400527],\n            ],\n          ],\n          [\n            [\n              [117.805022, 39.373237],\n              [117.784696, 39.376938],\n              [117.765602, 39.400527],\n              [117.846906, 39.407926],\n              [117.852449, 39.380639],\n              [117.805022, 39.373237],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 130000,\n        name: '河北省',\n        center: [114.502461, 38.045474],\n        childrenNum: 11,\n        level: 'province',\n        subFeatureIndex: 2,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [117.467487, 40.649738],\n              [117.467487, 40.649738],\n              [117.501364, 40.636569],\n              [117.514914, 40.660181],\n              [117.493973, 40.675161],\n              [117.408973, 40.686961],\n              [117.342451, 40.673799],\n              [117.319662, 40.657911],\n              [117.278394, 40.664267],\n              [117.208177, 40.694675],\n              [117.117018, 40.70012],\n              [117.11209, 40.707379],\n              [117.012308, 40.693767],\n              [116.964881, 40.709647],\n              [116.926692, 40.745022],\n              [116.924229, 40.773581],\n              [116.848468, 40.839264],\n              [116.81336, 40.848319],\n              [116.759773, 40.889954],\n              [116.713577, 40.909858],\n              [116.722201, 40.927495],\n              [116.677853, 40.970888],\n              [116.698795, 41.021477],\n              [116.688324, 41.044501],\n              [116.647672, 41.059394],\n              [116.615643, 41.053076],\n              [116.623034, 41.021026],\n              [116.598397, 40.974503],\n              [116.5676, 40.992574],\n              [116.519557, 40.98128],\n              [116.519557, 40.98128],\n              [116.455499, 40.980828],\n              [116.447492, 40.953715],\n              [116.477057, 40.899907],\n              [116.398216, 40.90624],\n              [116.370499, 40.94377],\n              [116.339702, 40.929303],\n              [116.334159, 40.90443],\n              [116.438253, 40.81934],\n              [116.46597, 40.774487],\n              [116.453651, 40.765876],\n              [116.316912, 40.772221],\n              [116.311369, 40.754996],\n              [116.273181, 40.762703],\n              [116.247311, 40.791707],\n              [116.22021, 40.744115],\n              [116.204812, 40.740035],\n              [116.171551, 40.695582],\n              [116.162928, 40.662451],\n              [116.133979, 40.666536],\n              [116.09887, 40.630665],\n              [116.005247, 40.583868],\n              [115.982457, 40.578868],\n              [115.971986, 40.6025],\n              [115.907929, 40.617493],\n              [115.885139, 40.595229],\n              [115.827857, 40.587504],\n              [115.819849, 40.55932],\n              [115.784741, 40.55841],\n              [115.755176, 40.540221],\n              [115.736082, 40.503372],\n              [115.781045, 40.49336],\n              [115.771806, 40.443734],\n              [115.864197, 40.359422],\n              [115.917784, 40.354405],\n              [115.95166, 40.281852],\n              [115.968907, 40.264045],\n              [115.89869, 40.234354],\n              [115.870356, 40.185909],\n              [115.855574, 40.188652],\n              [115.847567, 40.147036],\n              [115.806299, 40.15344],\n              [115.773654, 40.176307],\n              [115.75456, 40.145663],\n              [115.75456, 40.145663],\n              [115.599959, 40.119583],\n              [115.59072, 40.096239],\n              [115.527278, 40.076092],\n              [115.485394, 40.040364],\n              [115.454597, 40.029825],\n              [115.450286, 39.992697],\n              [115.428728, 39.984443],\n              [115.426264, 39.950502],\n              [115.481083, 39.935819],\n              [115.522967, 39.899099],\n              [115.515575, 39.892212],\n              [115.515575, 39.892212],\n              [115.526046, 39.87568],\n              [115.514344, 39.837549],\n              [115.567314, 39.816407],\n              [115.552532, 39.794799],\n              [115.50572, 39.784222],\n              [115.483547, 39.798477],\n              [115.483547, 39.798477],\n              [115.443511, 39.785601],\n              [115.439815, 39.752022],\n              [115.486626, 39.741899],\n              [115.491554, 39.670074],\n              [115.478619, 39.650723],\n              [115.478619, 39.650723],\n              [115.522351, 39.640124],\n              [115.518039, 39.597252],\n              [115.545756, 39.618922],\n              [115.587024, 39.589873],\n              [115.633836, 39.599557],\n              [115.633836, 39.599557],\n              [115.667712, 39.615234],\n              [115.698509, 39.577881],\n              [115.698509, 39.577881],\n              [115.699125, 39.570039],\n              [115.699125, 39.570039],\n              [115.716988, 39.56035],\n              [115.716988, 39.56035],\n              [115.718835, 39.553891],\n              [115.718835, 39.553891],\n              [115.720683, 39.551122],\n              [115.720683, 39.551122],\n              [115.722531, 39.5442],\n              [115.721299, 39.543738],\n              [115.722531, 39.5442],\n              [115.722531, 39.543738],\n              [115.721299, 39.543738],\n              [115.722531, 39.543738],\n              [115.724995, 39.5442],\n              [115.724995, 39.5442],\n              [115.738545, 39.540046],\n              [115.738545, 39.539585],\n              [115.738545, 39.540046],\n              [115.738545, 39.539585],\n              [115.752712, 39.515581],\n              [115.806299, 39.510041],\n              [115.806299, 39.510041],\n              [115.821081, 39.522968],\n              [115.821081, 39.522968],\n              [115.828473, 39.541431],\n              [115.867893, 39.546507],\n              [115.867893, 39.546507],\n              [115.91532, 39.582955],\n              [115.91532, 39.582955],\n              [115.910393, 39.600479],\n              [115.910393, 39.600479],\n              [115.957204, 39.560812],\n              [115.978146, 39.595868],\n              [115.995392, 39.576958],\n              [116.026189, 39.587567],\n              [116.036044, 39.571884],\n              [116.09887, 39.575113],\n              [116.130283, 39.567732],\n              [116.151841, 39.583416],\n              [116.198652, 39.589412],\n              [116.240536, 39.564041],\n              [116.257782, 39.500344],\n              [116.307057, 39.488337],\n              [116.337854, 39.455536],\n              [116.361876, 39.455074],\n              [116.361876, 39.455074],\n              [116.434557, 39.442597],\n              [116.454883, 39.453226],\n              [116.444412, 39.482332],\n              [116.411767, 39.482794],\n              [116.401912, 39.528046],\n              [116.443796, 39.510041],\n              [116.437637, 39.526661],\n              [116.478289, 39.535431],\n              [116.473361, 39.552968],\n              [116.50847, 39.551122],\n              [116.524484, 39.596329],\n              [116.592237, 39.621227],\n              [116.592237, 39.621227],\n              [116.620571, 39.601863],\n              [116.664918, 39.605552],\n              [116.723432, 39.59264],\n              [116.724048, 39.59264],\n              [116.723432, 39.59264],\n              [116.724048, 39.59264],\n              [116.726512, 39.595407],\n              [116.726512, 39.595407],\n              [116.709266, 39.618],\n              [116.748686, 39.619844],\n              [116.79057, 39.595868],\n              [116.812128, 39.615695],\n              [116.808432, 39.576497],\n              [116.78749, 39.554352],\n              [116.819519, 39.528507],\n              [116.820751, 39.482332],\n              [116.785026, 39.465702],\n              [116.832454, 39.435664],\n              [116.876185, 39.43474],\n              [116.839845, 39.413474],\n              [116.840461, 39.378326],\n              [116.818287, 39.3737],\n              [116.829374, 39.338994],\n              [116.870642, 39.357506],\n              [116.889736, 39.338068],\n              [116.87249, 39.291304],\n              [116.881729, 39.225966],\n              [116.881729, 39.225966],\n              [116.855859, 39.215766],\n              [116.870026, 39.153607],\n              [116.909446, 39.150822],\n              [116.912526, 39.110898],\n              [116.91191, 39.111362],\n              [116.91191, 39.111362],\n              [116.912526, 39.110898],\n              [116.871874, 39.054688],\n              [116.812744, 39.05097],\n              [116.812744, 39.05097],\n              [116.783179, 39.05097],\n              [116.783179, 39.05097],\n              [116.754229, 39.034701],\n              [116.754229, 39.034701],\n              [116.754845, 39.003084],\n              [116.72836, 38.975174],\n              [116.708034, 38.931892],\n              [116.722201, 38.896968],\n              [116.723432, 38.852706],\n              [116.75115, 38.831264],\n              [116.737599, 38.784629],\n              [116.746222, 38.754299],\n              [116.794265, 38.744498],\n              [116.794265, 38.744498],\n              [116.858939, 38.741231],\n              [116.877417, 38.680522],\n              [116.948866, 38.689398],\n              [116.950714, 38.689398],\n              [116.95133, 38.689398],\n              [116.950714, 38.689398],\n              [116.948866, 38.689398],\n              [116.95133, 38.689398],\n              [117.038793, 38.688464],\n              [117.068358, 38.680522],\n              [117.055424, 38.639398],\n              [117.070822, 38.608072],\n              [117.109626, 38.584685],\n              [117.150894, 38.617892],\n              [117.183539, 38.61836],\n              [117.183539, 38.61836],\n              [117.213104, 38.639866],\n              [117.213104, 38.639866],\n              [117.258684, 38.608072],\n              [117.258684, 38.608072],\n              [117.238358, 38.580943],\n              [117.25314, 38.556143],\n              [117.368937, 38.564566],\n              [117.432379, 38.601524],\n              [117.47919, 38.616489],\n              [117.55803, 38.613683],\n              [117.639334, 38.626776],\n              [117.638102, 38.54491],\n              [117.68553, 38.539293],\n              [117.644878, 38.52759],\n              [117.678754, 38.477008],\n              [117.72495, 38.457328],\n              [117.730493, 38.424985],\n              [117.781, 38.373862],\n              [117.84629, 38.368232],\n              [117.937449, 38.387936],\n              [117.957775, 38.376208],\n              [117.948536, 38.346644],\n              [117.895565, 38.301572],\n              [117.848754, 38.255062],\n              [117.808718, 38.22827],\n              [117.789007, 38.180772],\n              [117.766834, 38.158658],\n              [117.771145, 38.134655],\n              [117.746508, 38.12524],\n              [117.704624, 38.076262],\n              [117.586979, 38.071551],\n              [117.557414, 38.046105],\n              [117.557414, 38.046105],\n              [117.524154, 37.989527],\n              [117.513067, 37.94329],\n              [117.481038, 37.914967],\n              [117.438538, 37.854035],\n              [117.400966, 37.844584],\n              [117.320278, 37.861596],\n              [117.271618, 37.839858],\n              [117.185387, 37.849783],\n              [117.150278, 37.839385],\n              [117.074518, 37.848837],\n              [117.027091, 37.832296],\n              [116.919301, 37.846002],\n              [116.837997, 37.835132],\n              [116.804736, 37.848837],\n              [116.753613, 37.793054],\n              [116.753613, 37.77035],\n              [116.724664, 37.744327],\n              [116.679085, 37.728708],\n              [116.66307, 37.686096],\n              [116.604556, 37.624975],\n              [116.575607, 37.610754],\n              [116.4826, 37.521573],\n              [116.448108, 37.503059],\n              [116.433941, 37.473142],\n              [116.38097, 37.522522],\n              [116.379738, 37.522047],\n              [116.38097, 37.522522],\n              [116.379738, 37.522047],\n              [116.36742, 37.566177],\n              [116.336007, 37.581355],\n              [116.295355, 37.554316],\n              [116.278724, 37.524895],\n              [116.290427, 37.484065],\n              [116.27626, 37.466967],\n              [116.240536, 37.489764],\n              [116.240536, 37.489764],\n              [116.224522, 37.479791],\n              [116.243, 37.447965],\n              [116.226369, 37.428007],\n              [116.2855, 37.404241],\n              [116.236224, 37.361442],\n              [116.193109, 37.365723],\n              [116.169087, 37.384271],\n              [116.106261, 37.368577],\n              [116.085935, 37.373809],\n              [116.024341, 37.360015],\n              [115.975682, 37.337179],\n              [115.969523, 37.239572],\n              [115.909777, 37.20669],\n              [115.91224, 37.177132],\n              [115.879596, 37.150901],\n              [115.888219, 37.112254],\n              [115.85619, 37.060694],\n              [115.776734, 36.992848],\n              [115.79706, 36.968945],\n              [115.75764, 36.902453],\n              [115.71206, 36.883308],\n              [115.688654, 36.838777],\n              [115.686807, 36.810034],\n              [115.524815, 36.763543],\n              [115.479851, 36.760187],\n              [115.451518, 36.702151],\n              [115.420105, 36.686795],\n              [115.365902, 36.621979],\n              [115.355431, 36.627262],\n              [115.33141, 36.550378],\n              [115.272895, 36.497476],\n              [115.291374, 36.460423],\n              [115.317243, 36.454166],\n              [115.297533, 36.413239],\n              [115.340033, 36.398307],\n              [115.368982, 36.342409],\n              [115.366518, 36.30914],\n              [115.423185, 36.32216],\n              [115.417025, 36.292742],\n              [115.462605, 36.276339],\n              [115.466916, 36.258969],\n              [115.466916, 36.258969],\n              [115.474923, 36.248352],\n              [115.483547, 36.148865],\n              [115.465068, 36.170125],\n              [115.450902, 36.152248],\n              [115.376989, 36.128083],\n              [115.365902, 36.099074],\n              [115.312931, 36.088436],\n              [115.30246, 36.127599],\n              [115.279055, 36.13775],\n              [115.242098, 36.19138],\n              [115.202678, 36.208765],\n              [115.202678, 36.208765],\n              [115.202678, 36.209248],\n              [115.202678, 36.209248],\n              [115.201446, 36.210214],\n              [115.201446, 36.210214],\n              [115.1842, 36.193312],\n              [115.12507, 36.209731],\n              [115.104744, 36.172058],\n              [115.06286, 36.178338],\n              [115.048693, 36.161912],\n              [115.04623, 36.112613],\n              [114.998186, 36.069572],\n              [114.914419, 36.052155],\n              [114.926737, 36.089403],\n              [114.912571, 36.140649],\n              [114.858368, 36.144516],\n              [114.857752, 36.127599],\n              [114.771521, 36.124699],\n              [114.734564, 36.15563],\n              [114.720398, 36.140166],\n              [114.640326, 36.137266],\n              [114.588587, 36.118414],\n              [114.586739, 36.141133],\n              [114.533152, 36.171575],\n              [114.480181, 36.177855],\n              [114.466015, 36.197658],\n              [114.417356, 36.205868],\n              [114.408117, 36.224699],\n              [114.356378, 36.230492],\n              [114.345291, 36.255591],\n              [114.299095, 36.245938],\n              [114.257827, 36.263794],\n              [114.241197, 36.251247],\n              [114.2104, 36.272962],\n              [114.203009, 36.245456],\n              [114.170364, 36.245938],\n              [114.170364, 36.245938],\n              [114.175907, 36.264759],\n              [114.129096, 36.280199],\n              [114.080437, 36.269585],\n              [114.04348, 36.303353],\n              [114.056415, 36.329392],\n              [114.002828, 36.334214],\n              [113.981887, 36.31782],\n              [113.962792, 36.353977],\n              [113.911054, 36.314927],\n              [113.882104, 36.353977],\n              [113.84946, 36.347711],\n              [113.856851, 36.329392],\n              [113.813119, 36.332285],\n              [113.755221, 36.366026],\n              [113.731199, 36.363135],\n              [113.708409, 36.423352],\n              [113.670221, 36.425278],\n              [113.635729, 36.451277],\n              [113.587069, 36.460904],\n              [113.554425, 36.494589],\n              [113.559968, 36.528741],\n              [113.588917, 36.547974],\n              [113.569823, 36.585947],\n              [113.539642, 36.594116],\n              [113.54457, 36.62342],\n              [113.486671, 36.635427],\n              [113.476816, 36.655114],\n              [113.506997, 36.705029],\n              [113.465113, 36.707908],\n              [113.499606, 36.740527],\n              [113.535946, 36.732373],\n              [113.549497, 36.752515],\n              [113.600004, 36.752995],\n              [113.680692, 36.789907],\n              [113.676381, 36.855539],\n              [113.696707, 36.882351],\n              [113.731815, 36.878521],\n              [113.731815, 36.858891],\n              [113.773083, 36.85506],\n              [113.792793, 36.894796],\n              [113.76138, 36.956034],\n              [113.791561, 36.98759],\n              [113.771851, 37.016745],\n              [113.788482, 37.059739],\n              [113.758301, 37.075497],\n              [113.773699, 37.107004],\n              [113.773083, 37.151855],\n              [113.832213, 37.167594],\n              [113.853155, 37.215269],\n              [113.886416, 37.239095],\n              [113.90243, 37.310052],\n              [113.962792, 37.355734],\n              [113.973879, 37.40329],\n              [114.014531, 37.42468],\n              [114.036705, 37.494037],\n              [114.118625, 37.59084],\n              [114.115545, 37.619761],\n              [114.139567, 37.675676],\n              [114.12848, 37.698409],\n              [114.068118, 37.721608],\n              [113.993589, 37.706932],\n              [113.996669, 37.730128],\n              [114.044712, 37.761834],\n              [114.006524, 37.813386],\n              [113.976959, 37.816696],\n              [113.959097, 37.906468],\n              [113.936307, 37.922993],\n              [113.901198, 37.984811],\n              [113.872249, 37.990471],\n              [113.876561, 38.055059],\n              [113.811271, 38.117707],\n              [113.831597, 38.16854],\n              [113.797105, 38.162894],\n              [113.720728, 38.174656],\n              [113.711489, 38.213695],\n              [113.678844, 38.20523],\n              [113.64312, 38.232031],\n              [113.598772, 38.22733],\n              [113.570439, 38.237202],\n              [113.54457, 38.270569],\n              [113.557504, 38.343359],\n              [113.525475, 38.383245],\n              [113.537794, 38.417952],\n              [113.583374, 38.459671],\n              [113.5612, 38.485909],\n              [113.561816, 38.558483],\n              [113.603084, 38.587024],\n              [113.612939, 38.645942],\n              [113.70225, 38.651551],\n              [113.720728, 38.713218],\n              [113.775547, 38.709949],\n              [113.802648, 38.763166],\n              [113.839605, 38.7585],\n              [113.836525, 38.795824],\n              [113.855619, 38.828933],\n              [113.795257, 38.860628],\n              [113.776163, 38.885788],\n              [113.76754, 38.959819],\n              [113.776779, 38.986804],\n              [113.80696, 38.989595],\n              [113.898119, 39.067699],\n              [113.930148, 39.063517],\n              [113.961561, 39.100681],\n              [113.994821, 39.095572],\n              [114.006524, 39.122971],\n              [114.050872, 39.135969],\n              [114.064422, 39.094179],\n              [114.082901, 39.09325],\n              [114.082901, 39.09325],\n              [114.10877, 39.052364],\n              [114.157429, 39.061194],\n              [114.180835, 39.049111],\n              [114.252284, 39.073739],\n              [114.345907, 39.075133],\n              [114.369928, 39.107648],\n              [114.360689, 39.134112],\n              [114.388406, 39.176807],\n              [114.443841, 39.174023],\n              [114.47587, 39.21623],\n              [114.416124, 39.242654],\n              [114.437066, 39.259337],\n              [114.430906, 39.307513],\n              [114.466631, 39.329736],\n              [114.469095, 39.400989],\n              [114.496812, 39.438437],\n              [114.501739, 39.476789],\n              [114.532536, 39.486027],\n              [114.568877, 39.573729],\n              [114.51529, 39.564964],\n              [114.49558, 39.608318],\n              [114.431522, 39.613851],\n              [114.408117, 39.652106],\n              [114.409964, 39.761683],\n              [114.41674, 39.775943],\n              [114.390254, 39.819165],\n              [114.406885, 39.833413],\n              [114.395182, 39.867412],\n              [114.285545, 39.858225],\n              [114.286776, 39.871087],\n              [114.215943, 39.8619],\n              [114.204241, 39.885324],\n              [114.229494, 39.899558],\n              [114.212248, 39.918839],\n              [114.17406, 39.897722],\n              [114.067502, 39.922511],\n              [114.047176, 39.916085],\n              [114.028082, 39.959218],\n              [114.029314, 39.985819],\n              [113.910438, 40.015618],\n              [113.959097, 40.033491],\n              [113.989278, 40.11226],\n              [114.018227, 40.103563],\n              [114.045944, 40.056856],\n              [114.086596, 40.071513],\n              [114.101995, 40.099901],\n              [114.073046, 40.168533],\n              [114.073046, 40.168533],\n              [114.097683, 40.193681],\n              [114.135871, 40.175392],\n              [114.180219, 40.191395],\n              [114.235654, 40.198252],\n              [114.255364, 40.236182],\n              [114.292936, 40.230242],\n              [114.362537, 40.249886],\n              [114.406269, 40.246232],\n              [114.46971, 40.268155],\n              [114.510978, 40.302851],\n              [114.530688, 40.345283],\n              [114.481413, 40.34802],\n              [114.438914, 40.371733],\n              [114.390254, 40.351213],\n              [114.381015, 40.36307],\n              [114.31203, 40.372645],\n              [114.286161, 40.425057],\n              [114.299711, 40.44009],\n              [114.267066, 40.474242],\n              [114.282465, 40.494725],\n              [114.293552, 40.55159],\n              [114.273842, 40.552954],\n              [114.283081, 40.590685],\n              [114.236269, 40.607043],\n              [114.183299, 40.67153],\n              [114.162357, 40.71373],\n              [114.134639, 40.737314],\n              [114.103227, 40.770861],\n              [114.104458, 40.797597],\n              [114.080437, 40.790348],\n              [114.044712, 40.830661],\n              [114.073661, 40.857372],\n              [114.055183, 40.867782],\n              [114.041633, 40.917546],\n              [114.057647, 40.925234],\n              [113.994821, 40.938798],\n              [113.973263, 40.983087],\n              [113.868554, 41.06887],\n              [113.819279, 41.09774],\n              [113.877793, 41.115777],\n              [113.920293, 41.172112],\n              [113.960945, 41.171211],\n              [113.996669, 41.19238],\n              [114.016379, 41.231999],\n              [113.992357, 41.269794],\n              [113.971416, 41.239649],\n              [113.95109, 41.282837],\n              [113.914749, 41.294529],\n              [113.899351, 41.316108],\n              [113.92522, 41.325546],\n              [113.94493, 41.392477],\n              [113.871017, 41.413126],\n              [113.877793, 41.431076],\n              [113.919677, 41.454404],\n              [113.933227, 41.487139],\n              [113.953553, 41.483553],\n              [113.976959, 41.505966],\n              [114.032394, 41.529715],\n              [114.101379, 41.537779],\n              [114.230726, 41.513584],\n              [114.221487, 41.582111],\n              [114.226414, 41.616572],\n              [114.259059, 41.623282],\n              [114.215328, 41.68499],\n              [114.237501, 41.698843],\n              [114.206704, 41.7386],\n              [114.215328, 41.75646],\n              [114.200545, 41.789934],\n              [114.282465, 41.863517],\n              [114.343443, 41.926774],\n              [114.352066, 41.953484],\n              [114.419203, 41.942356],\n              [114.478334, 41.951704],\n              [114.511594, 41.981962],\n              [114.467863, 42.025989],\n              [114.480181, 42.064654],\n              [114.502355, 42.06732],\n              [114.510978, 42.110844],\n              [114.560254, 42.132595],\n              [114.647717, 42.109512],\n              [114.675434, 42.12061],\n              [114.75489, 42.115727],\n              [114.789383, 42.130819],\n              [114.79431, 42.149457],\n              [114.825723, 42.139695],\n              [114.86268, 42.097967],\n              [114.860832, 42.054879],\n              [114.9021, 42.015763],\n              [114.915035, 41.960605],\n              [114.923658, 41.871093],\n              [114.939056, 41.846132],\n              [114.922426, 41.825175],\n              [114.868839, 41.813579],\n              [114.89594, 41.76762],\n              [114.902716, 41.695715],\n              [114.895325, 41.636255],\n              [114.860832, 41.60091],\n              [115.016049, 41.615229],\n              [115.056085, 41.602253],\n              [115.0992, 41.62373],\n              [115.195287, 41.602253],\n              [115.20391, 41.571367],\n              [115.256881, 41.580768],\n              [115.26612, 41.616124],\n              [115.290142, 41.622835],\n              [115.310468, 41.592854],\n              [115.377605, 41.603148],\n              [115.345576, 41.635807],\n              [115.360975, 41.661297],\n              [115.319091, 41.691693],\n              [115.346808, 41.712247],\n              [115.42996, 41.728775],\n              [115.488474, 41.760924],\n              [115.519887, 41.76762],\n              [115.57409, 41.80555],\n              [115.654162, 41.829189],\n              [115.688038, 41.867528],\n              [115.726227, 41.870202],\n              [115.811226, 41.912525],\n              [115.834632, 41.93835],\n              [115.85311, 41.927665],\n              [115.916552, 41.945027],\n              [115.954124, 41.874213],\n              [115.994776, 41.828743],\n              [116.007095, 41.797966],\n              [116.007095, 41.79752],\n              [116.007095, 41.797966],\n              [116.007095, 41.79752],\n              [116.034196, 41.782795],\n              [116.09887, 41.776547],\n              [116.129051, 41.805996],\n              [116.106877, 41.831419],\n              [116.122892, 41.861734],\n              [116.194341, 41.861734],\n              [116.212819, 41.885352],\n              [116.223906, 41.932562],\n              [116.298434, 41.96817],\n              [116.310137, 41.997086],\n              [116.373579, 42.009983],\n              [116.414231, 41.982407],\n              [116.393289, 41.942802],\n              [116.453651, 41.945917],\n              [116.4826, 41.975734],\n              [116.510933, 41.974399],\n              [116.553433, 41.928555],\n              [116.597165, 41.935679],\n              [116.639049, 41.929891],\n              [116.66923, 41.947698],\n              [116.727744, 41.951259],\n              [116.748686, 41.984186],\n              [116.796113, 41.977958],\n              [116.879881, 42.018431],\n              [116.890352, 42.092639],\n              [116.850316, 42.156556],\n              [116.825062, 42.155669],\n              [116.789338, 42.200462],\n              [116.903287, 42.190708],\n              [116.918685, 42.229716],\n              [116.897743, 42.297479],\n              [116.886656, 42.366496],\n              [116.910678, 42.394789],\n              [116.910678, 42.394789],\n              [116.910062, 42.395231],\n              [116.910062, 42.395231],\n              [116.921765, 42.403628],\n              [116.921765, 42.403628],\n              [116.936547, 42.410256],\n              [116.936547, 42.410256],\n              [116.944555, 42.415116],\n              [116.944555, 42.415116],\n              [116.97104, 42.427486],\n              [116.97104, 42.427486],\n              [116.974736, 42.426603],\n              [116.974736, 42.426603],\n              [116.99075, 42.425719],\n              [116.99075, 42.425719],\n              [117.005533, 42.43367],\n              [117.005533, 42.43367],\n              [117.009228, 42.44957],\n              [117.009228, 42.44957],\n              [117.01662, 42.456193],\n              [117.01662, 42.456193],\n              [117.080061, 42.463699],\n              [117.080061, 42.463699],\n              [117.09546, 42.484004],\n              [117.135496, 42.468996],\n              [117.188467, 42.468114],\n              [117.188467, 42.468114],\n              [117.275314, 42.481797],\n              [117.275314, 42.481797],\n              [117.332596, 42.46105],\n              [117.332596, 42.46105],\n              [117.390495, 42.461933],\n              [117.413284, 42.471645],\n              [117.410205, 42.519743],\n              [117.387415, 42.517537],\n              [117.387415, 42.517537],\n              [117.434226, 42.557224],\n              [117.435458, 42.585431],\n              [117.475494, 42.602613],\n              [117.530313, 42.590278],\n              [117.537088, 42.603054],\n              [117.60053, 42.603054],\n              [117.667051, 42.582347],\n              [117.708935, 42.588515],\n              [117.779768, 42.61847],\n              [117.801326, 42.612744],\n              [117.797631, 42.585431],\n              [117.856761, 42.539148],\n              [117.874007, 42.510038],\n              [117.997811, 42.416884],\n              [118.024296, 42.385064],\n              [118.008898, 42.346595],\n              [118.060021, 42.298364],\n              [118.047702, 42.280656],\n              [117.974405, 42.25054],\n              [117.977485, 42.229716],\n              [118.033535, 42.199132],\n              [118.106216, 42.172082],\n              [118.089586, 42.12283],\n              [118.097593, 42.105072],\n              [118.155491, 42.081091],\n              [118.116687, 42.037102],\n              [118.194296, 42.031324],\n              [118.220165, 42.058434],\n              [118.212774, 42.081091],\n              [118.239259, 42.092639],\n              [118.27252, 42.083312],\n              [118.296541, 42.057545],\n              [118.286686, 42.033991],\n              [118.239875, 42.024655],\n              [118.291614, 42.007759],\n              [118.313788, 41.98819],\n              [118.306396, 41.940131],\n              [118.268824, 41.930336],\n              [118.340273, 41.87243],\n              [118.335346, 41.845241],\n              [118.29223, 41.772976],\n              [118.247266, 41.773869],\n              [118.236179, 41.80778],\n              [118.178281, 41.814917],\n              [118.140093, 41.784134],\n              [118.132702, 41.733241],\n              [118.155491, 41.712694],\n              [118.159187, 41.67605],\n              [118.206614, 41.650566],\n              [118.215237, 41.59554],\n              [118.302701, 41.55256],\n              [118.315636, 41.512688],\n              [118.271904, 41.471446],\n              [118.327338, 41.450816],\n              [118.348896, 41.428384],\n              [118.361215, 41.384844],\n              [118.348896, 41.342622],\n              [118.380309, 41.312062],\n              [118.412338, 41.331838],\n              [118.528135, 41.355202],\n              [118.629765, 41.346666],\n              [118.677192, 41.35026],\n              [118.741866, 41.324198],\n              [118.770199, 41.352956],\n              [118.843496, 41.374516],\n              [118.844727, 41.342622],\n              [118.890923, 41.300823],\n              [118.949437, 41.317906],\n              [118.980234, 41.305769],\n              [119.092951, 41.293629],\n              [119.168712, 41.294978],\n              [119.197661, 41.282837],\n              [119.211827, 41.308016],\n              [119.239545, 41.31431],\n              [119.2494, 41.279689],\n              [119.209364, 41.244599],\n              [119.204436, 41.222546],\n              [119.169943, 41.222996],\n              [119.189038, 41.198234],\n              [119.126212, 41.138767],\n              [119.081248, 41.131555],\n              [119.080632, 41.095936],\n              [119.037516, 41.067516],\n              [118.964836, 41.079246],\n              [118.937118, 41.052625],\n              [118.951901, 41.018317],\n              [119.013495, 41.007479],\n              [119.00056, 40.967273],\n              [118.977154, 40.959138],\n              [118.977154, 40.959138],\n              [118.916792, 40.969984],\n              [118.90201, 40.960946],\n              [118.873061, 40.847866],\n              [118.845959, 40.822057],\n              [118.878604, 40.783098],\n              [118.907553, 40.775394],\n              [118.895234, 40.75409],\n              [118.950053, 40.747743],\n              [118.96114, 40.72008],\n              [119.011031, 40.687414],\n              [119.028277, 40.692406],\n              [119.054763, 40.664721],\n              [119.115125, 40.666536],\n              [119.165632, 40.69286],\n              [119.184726, 40.680153],\n              [119.14469, 40.632482],\n              [119.162552, 40.600228],\n              [119.177951, 40.609315],\n              [119.230921, 40.603863],\n              [119.22045, 40.569322],\n              [119.256175, 40.543404],\n              [119.30237, 40.530215],\n              [119.429254, 40.540221],\n              [119.477913, 40.533399],\n              [119.503783, 40.553864],\n              [119.559217, 40.547952],\n              [119.572152, 40.523846],\n              [119.553674, 40.502007],\n              [119.604797, 40.455119],\n              [119.586934, 40.375381],\n              [119.598021, 40.334335],\n              [119.651608, 40.271808],\n              [119.639289, 40.231613],\n              [119.639289, 40.231613],\n              [119.671934, 40.23938],\n              [119.716898, 40.195966],\n              [119.745847, 40.207851],\n              [119.760629, 40.136056],\n              [119.736608, 40.104936],\n              [119.772332, 40.08113],\n              [119.783419, 40.046778],\n              [119.783419, 40.046778],\n              [119.787115, 40.041739],\n              [119.787115, 40.041739],\n              [119.81668, 40.050443],\n              [119.81668, 40.050443],\n              [119.854252, 40.033033],\n              [119.845629, 40.000949],\n              [119.845629, 40.000949],\n              [119.854252, 39.98857],\n              [119.872114, 39.960594],\n              [119.842549, 39.956007],\n              [119.820375, 39.979399],\n              [119.787115, 39.950502],\n              [119.726137, 39.940867],\n              [119.681789, 39.922511],\n              [119.642369, 39.925264],\n              [119.620195, 39.904609],\n              [119.588166, 39.910576],\n              [119.540739, 39.888079],\n              [119.520413, 39.840306],\n              [119.536427, 39.809052],\n              [119.474217, 39.813189],\n              [119.366428, 39.734996],\n              [119.269726, 39.498497],\n              [119.316537, 39.437051],\n              [119.317153, 39.4107],\n              [119.272805, 39.363521],\n              [119.185342, 39.342234],\n              [119.121284, 39.281576],\n              [119.096031, 39.24219],\n              [119.038132, 39.211593],\n              [119.023966, 39.187012],\n              [118.97777, 39.163352],\n              [118.926031, 39.123435],\n              [118.890307, 39.118792],\n              [118.896466, 39.139683],\n              [118.951285, 39.178662],\n              [118.920488, 39.171703],\n              [118.897082, 39.151286],\n              [118.857662, 39.162888],\n              [118.814546, 39.138754],\n              [118.76096, 39.133648],\n              [118.637156, 39.157319],\n              [118.578642, 39.130863],\n              [118.588497, 39.107648],\n              [118.533062, 39.090928],\n              [118.570634, 38.999363],\n              [118.604511, 38.971452],\n              [118.539837, 38.910008],\n              [118.491178, 38.909077],\n              [118.377845, 38.971917],\n              [118.366143, 39.016104],\n              [118.319331, 39.009594],\n              [118.225092, 39.034701],\n              [118.1906, 39.080708],\n              [118.162883, 39.136433],\n              [118.12531, 39.182838],\n              [118.065564, 39.218084],\n              [118.056941, 39.219939],\n              [118.037231, 39.220402],\n              [118.064948, 39.231065],\n              [118.064948, 39.256094],\n              [118.036615, 39.264898],\n              [118.024296, 39.289451],\n              [118.024296, 39.289451],\n              [117.982412, 39.298714],\n              [117.982412, 39.298714],\n              [117.979333, 39.300566],\n              [117.979333, 39.300566],\n              [117.973173, 39.312143],\n              [117.973173, 39.312143],\n              [117.965782, 39.314921],\n              [117.965782, 39.314921],\n              [117.919587, 39.318162],\n              [117.919587, 39.318162],\n              [117.88879, 39.332051],\n              [117.854913, 39.328348],\n              [117.854297, 39.328348],\n              [117.854913, 39.328348],\n              [117.854297, 39.328348],\n              [117.850601, 39.363984],\n              [117.850601, 39.363984],\n              [117.810565, 39.354729],\n              [117.805022, 39.373237],\n              [117.852449, 39.380639],\n              [117.846906, 39.407926],\n              [117.871543, 39.411625],\n              [117.870311, 39.455074],\n              [117.899877, 39.474479],\n              [117.912195, 39.517428],\n              [117.912195, 39.517428],\n              [117.904804, 39.533585],\n              [117.933753, 39.574191],\n              [117.868464, 39.59679],\n              [117.829659, 39.589873],\n              [117.766834, 39.598635],\n              [117.753899, 39.579726],\n              [117.753899, 39.579726],\n              [117.745276, 39.547892],\n              [117.715711, 39.529892],\n              [117.707088, 39.576036],\n              [117.684914, 39.58895],\n              [117.654117, 39.575113],\n              [117.637486, 39.603246],\n              [117.66274, 39.636437],\n              [117.668899, 39.666849],\n              [117.627015, 39.703693],\n              [117.57774, 39.726711],\n              [117.595603, 39.74604],\n              [117.56111, 39.754782],\n              [117.546327, 39.775943],\n              [117.561726, 39.799856],\n              [117.529081, 39.859144],\n              [117.529081, 39.859144],\n              [117.508139, 39.901854],\n              [117.508139, 39.901854],\n              [117.512451, 39.90874],\n              [117.512451, 39.90874],\n              [117.513067, 39.910576],\n              [117.513067, 39.910576],\n              [117.514914, 39.946832],\n              [117.534625, 39.954631],\n              [117.546327, 39.999116],\n              [117.594987, 39.994531],\n              [117.594987, 39.994531],\n              [117.614697, 39.97252],\n              [117.671363, 39.973896],\n              [117.691073, 39.984902],\n              [117.756363, 39.965181],\n              [117.781616, 39.966558],\n              [117.781616, 39.966558],\n              [117.795167, 39.996823],\n              [117.795167, 39.996823],\n              [117.793319, 40.005534],\n              [117.793319, 40.005534],\n              [117.768681, 40.022034],\n              [117.768681, 40.022034],\n              [117.744044, 40.018368],\n              [117.74774, 40.047236],\n              [117.776073, 40.059605],\n              [117.752667, 40.081588],\n              [117.71879, 40.082045],\n              [117.71879, 40.082045],\n              [117.675059, 40.082045],\n              [117.655965, 40.109514],\n              [117.655965, 40.109514],\n              [117.654117, 40.114548],\n              [117.654117, 40.114548],\n              [117.651653, 40.122786],\n              [117.651653, 40.122786],\n              [117.613465, 40.158014],\n              [117.613465, 40.158014],\n              [117.609769, 40.160301],\n              [117.609769, 40.160301],\n              [117.576508, 40.178593],\n              [117.571581, 40.219276],\n              [117.548791, 40.232527],\n              [117.505059, 40.227044],\n              [117.450241, 40.252627],\n              [117.415748, 40.248973],\n              [117.389879, 40.227958],\n              [117.351075, 40.229786],\n              [117.331365, 40.289613],\n              [117.295024, 40.2782],\n              [117.271618, 40.325211],\n              [117.271618, 40.325211],\n              [117.243285, 40.369453],\n              [117.226039, 40.368997],\n              [117.234046, 40.417312],\n              [117.263611, 40.442367],\n              [117.208793, 40.501552],\n              [117.262995, 40.512927],\n              [117.247597, 40.539766],\n              [117.269771, 40.560684],\n              [117.348611, 40.581141],\n              [117.348611, 40.581141],\n              [117.389879, 40.561593],\n              [117.429915, 40.576141],\n              [117.412669, 40.605226],\n              [117.467487, 40.649738],\n            ],\n          ],\n          [\n            [\n              [117.210024, 40.082045],\n              [117.192162, 40.066475],\n              [117.198322, 39.992697],\n              [117.150894, 39.944996],\n              [117.162597, 39.876598],\n              [117.162597, 39.876598],\n              [117.227887, 39.852712],\n              [117.247597, 39.860981],\n              [117.251908, 39.834332],\n              [117.192162, 39.832953],\n              [117.156438, 39.817326],\n              [117.15767, 39.796638],\n              [117.205713, 39.763984],\n              [117.161981, 39.748801],\n              [117.165061, 39.718886],\n              [117.165061, 39.718886],\n              [117.177996, 39.645194],\n              [117.152742, 39.623532],\n              [117.10901, 39.625375],\n              [117.10901, 39.625375],\n              [117.016004, 39.653949],\n              [116.983359, 39.638742],\n              [116.983359, 39.638742],\n              [116.964265, 39.64335],\n              [116.948866, 39.680668],\n              [116.948866, 39.680668],\n              [116.944555, 39.695405],\n              [116.944555, 39.695405],\n              [116.932236, 39.706456],\n              [116.932236, 39.706456],\n              [116.90575, 39.688037],\n              [116.889736, 39.687576],\n              [116.887272, 39.72533],\n              [116.916837, 39.731314],\n              [116.902055, 39.763523],\n              [116.949482, 39.778703],\n              [116.918069, 39.84628],\n              [116.907598, 39.832494],\n              [116.865714, 39.843982],\n              [116.812128, 39.889916],\n              [116.78441, 39.891294],\n              [116.782563, 39.947749],\n              [116.757925, 39.967934],\n              [116.781331, 40.034866],\n              [116.820135, 40.02845],\n              [116.831222, 40.051359],\n              [116.867562, 40.041739],\n              [116.927924, 40.055024],\n              [116.945171, 40.04128],\n              [117.025243, 40.030283],\n              [117.051728, 40.059605],\n              [117.105315, 40.074261],\n              [117.105315, 40.074261],\n              [117.140423, 40.064185],\n              [117.159517, 40.077008],\n              [117.204481, 40.069681],\n              [117.210024, 40.082045],\n            ],\n          ],\n          [\n            [\n              [117.784696, 39.376938],\n              [117.74466, 39.354729],\n              [117.670747, 39.35658],\n              [117.669515, 39.322792],\n              [117.594987, 39.349176],\n              [117.536472, 39.338068],\n              [117.521074, 39.357043],\n              [117.570965, 39.404689],\n              [117.601146, 39.419485],\n              [117.614081, 39.407001],\n              [117.668899, 39.412087],\n              [117.673211, 39.386652],\n              [117.699696, 39.407463],\n              [117.765602, 39.400527],\n              [117.784696, 39.376938],\n            ],\n          ],\n          [\n            [\n              [118.869365, 39.142932],\n              [118.857662, 39.098824],\n              [118.82009, 39.108576],\n              [118.869365, 39.142932],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 140000,\n        name: '山西省',\n        center: [112.549248, 37.857014],\n        centroid: [112.304761, 37.618555],\n        childrenNum: 11,\n        level: 'province',\n        subFeatureIndex: 3,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [114.134639, 40.737314],\n              [114.162357, 40.71373],\n              [114.183299, 40.67153],\n              [114.236269, 40.607043],\n              [114.283081, 40.590685],\n              [114.273842, 40.552954],\n              [114.293552, 40.55159],\n              [114.282465, 40.494725],\n              [114.267066, 40.474242],\n              [114.299711, 40.44009],\n              [114.286161, 40.425057],\n              [114.31203, 40.372645],\n              [114.381015, 40.36307],\n              [114.390254, 40.351213],\n              [114.438914, 40.371733],\n              [114.481413, 40.34802],\n              [114.530688, 40.345283],\n              [114.510978, 40.302851],\n              [114.46971, 40.268155],\n              [114.406269, 40.246232],\n              [114.362537, 40.249886],\n              [114.292936, 40.230242],\n              [114.255364, 40.236182],\n              [114.235654, 40.198252],\n              [114.180219, 40.191395],\n              [114.135871, 40.175392],\n              [114.097683, 40.193681],\n              [114.073046, 40.168533],\n              [114.073046, 40.168533],\n              [114.101995, 40.099901],\n              [114.086596, 40.071513],\n              [114.045944, 40.056856],\n              [114.018227, 40.103563],\n              [113.989278, 40.11226],\n              [113.959097, 40.033491],\n              [113.910438, 40.015618],\n              [114.029314, 39.985819],\n              [114.028082, 39.959218],\n              [114.047176, 39.916085],\n              [114.067502, 39.922511],\n              [114.17406, 39.897722],\n              [114.212248, 39.918839],\n              [114.229494, 39.899558],\n              [114.204241, 39.885324],\n              [114.215943, 39.8619],\n              [114.286776, 39.871087],\n              [114.285545, 39.858225],\n              [114.395182, 39.867412],\n              [114.406885, 39.833413],\n              [114.390254, 39.819165],\n              [114.41674, 39.775943],\n              [114.409964, 39.761683],\n              [114.408117, 39.652106],\n              [114.431522, 39.613851],\n              [114.49558, 39.608318],\n              [114.51529, 39.564964],\n              [114.568877, 39.573729],\n              [114.532536, 39.486027],\n              [114.501739, 39.476789],\n              [114.496812, 39.438437],\n              [114.469095, 39.400989],\n              [114.466631, 39.329736],\n              [114.430906, 39.307513],\n              [114.437066, 39.259337],\n              [114.416124, 39.242654],\n              [114.47587, 39.21623],\n              [114.443841, 39.174023],\n              [114.388406, 39.176807],\n              [114.360689, 39.134112],\n              [114.369928, 39.107648],\n              [114.345907, 39.075133],\n              [114.252284, 39.073739],\n              [114.180835, 39.049111],\n              [114.157429, 39.061194],\n              [114.10877, 39.052364],\n              [114.082901, 39.09325],\n              [114.082901, 39.09325],\n              [114.064422, 39.094179],\n              [114.050872, 39.135969],\n              [114.006524, 39.122971],\n              [113.994821, 39.095572],\n              [113.961561, 39.100681],\n              [113.930148, 39.063517],\n              [113.898119, 39.067699],\n              [113.80696, 38.989595],\n              [113.776779, 38.986804],\n              [113.76754, 38.959819],\n              [113.776163, 38.885788],\n              [113.795257, 38.860628],\n              [113.855619, 38.828933],\n              [113.836525, 38.795824],\n              [113.839605, 38.7585],\n              [113.802648, 38.763166],\n              [113.775547, 38.709949],\n              [113.720728, 38.713218],\n              [113.70225, 38.651551],\n              [113.612939, 38.645942],\n              [113.603084, 38.587024],\n              [113.561816, 38.558483],\n              [113.5612, 38.485909],\n              [113.583374, 38.459671],\n              [113.537794, 38.417952],\n              [113.525475, 38.383245],\n              [113.557504, 38.343359],\n              [113.54457, 38.270569],\n              [113.570439, 38.237202],\n              [113.598772, 38.22733],\n              [113.64312, 38.232031],\n              [113.678844, 38.20523],\n              [113.711489, 38.213695],\n              [113.720728, 38.174656],\n              [113.797105, 38.162894],\n              [113.831597, 38.16854],\n              [113.811271, 38.117707],\n              [113.876561, 38.055059],\n              [113.872249, 37.990471],\n              [113.901198, 37.984811],\n              [113.936307, 37.922993],\n              [113.959097, 37.906468],\n              [113.976959, 37.816696],\n              [114.006524, 37.813386],\n              [114.044712, 37.761834],\n              [113.996669, 37.730128],\n              [113.993589, 37.706932],\n              [114.068118, 37.721608],\n              [114.12848, 37.698409],\n              [114.139567, 37.675676],\n              [114.115545, 37.619761],\n              [114.118625, 37.59084],\n              [114.036705, 37.494037],\n              [114.014531, 37.42468],\n              [113.973879, 37.40329],\n              [113.962792, 37.355734],\n              [113.90243, 37.310052],\n              [113.886416, 37.239095],\n              [113.853155, 37.215269],\n              [113.832213, 37.167594],\n              [113.773083, 37.151855],\n              [113.773699, 37.107004],\n              [113.758301, 37.075497],\n              [113.788482, 37.059739],\n              [113.771851, 37.016745],\n              [113.791561, 36.98759],\n              [113.76138, 36.956034],\n              [113.792793, 36.894796],\n              [113.773083, 36.85506],\n              [113.731815, 36.858891],\n              [113.731815, 36.878521],\n              [113.696707, 36.882351],\n              [113.676381, 36.855539],\n              [113.680692, 36.789907],\n              [113.600004, 36.752995],\n              [113.549497, 36.752515],\n              [113.535946, 36.732373],\n              [113.499606, 36.740527],\n              [113.465113, 36.707908],\n              [113.506997, 36.705029],\n              [113.476816, 36.655114],\n              [113.486671, 36.635427],\n              [113.54457, 36.62342],\n              [113.539642, 36.594116],\n              [113.569823, 36.585947],\n              [113.588917, 36.547974],\n              [113.559968, 36.528741],\n              [113.554425, 36.494589],\n              [113.587069, 36.460904],\n              [113.635729, 36.451277],\n              [113.670221, 36.425278],\n              [113.708409, 36.423352],\n              [113.731199, 36.363135],\n              [113.736127, 36.324571],\n              [113.712105, 36.303353],\n              [113.716417, 36.262347],\n              [113.681924, 36.216491],\n              [113.697939, 36.181719],\n              [113.651127, 36.174473],\n              [113.705946, 36.148865],\n              [113.712721, 36.129533],\n              [113.655439, 36.125182],\n              [113.671453, 36.115514],\n              [113.68562, 36.056026],\n              [113.660366, 36.034735],\n              [113.694859, 36.026991],\n              [113.678844, 35.985841],\n              [113.648663, 35.994073],\n              [113.654207, 35.931586],\n              [113.637576, 35.870019],\n              [113.660982, 35.837035],\n              [113.582758, 35.818111],\n              [113.604932, 35.797727],\n              [113.587685, 35.736542],\n              [113.592613, 35.691838],\n              [113.622794, 35.674825],\n              [113.625258, 35.632518],\n              [113.578446, 35.633491],\n              [113.547649, 35.656835],\n              [113.55812, 35.621816],\n              [113.513773, 35.57364],\n              [113.49899, 35.532254],\n              [113.439244, 35.507412],\n              [113.391817, 35.506925],\n              [113.348085, 35.468429],\n              [113.31236, 35.481101],\n              [113.304353, 35.426989],\n              [113.243375, 35.449418],\n              [113.189789, 35.44893],\n              [113.188557, 35.412357],\n              [113.165151, 35.412845],\n              [113.149137, 35.350878],\n              [113.126347, 35.332327],\n              [113.067217, 35.353806],\n              [112.996384, 35.362104],\n              [112.985913, 35.33965],\n              [112.992072, 35.29619],\n              [112.936022, 35.284466],\n              [112.934174, 35.262968],\n              [112.884283, 35.243909],\n              [112.822073, 35.258082],\n              [112.772798, 35.207732],\n              [112.720443, 35.206265],\n              [112.628052, 35.263457],\n              [112.637291, 35.225822],\n              [112.513487, 35.218489],\n              [112.390915, 35.239021],\n              [112.36751, 35.219956],\n              [112.288053, 35.219956],\n              [112.304684, 35.251728],\n              [112.242474, 35.234622],\n              [112.21722, 35.253195],\n              [112.094033, 35.279092],\n              [112.058924, 35.280069],\n              [112.078634, 35.219467],\n              [112.03983, 35.194039],\n              [112.066315, 35.153437],\n              [112.05646, 35.098615],\n              [112.062004, 35.056005],\n              [112.039214, 35.045717],\n              [112.018888, 35.068742],\n              [111.97762, 35.067272],\n              [111.933272, 35.083435],\n              [111.810084, 35.062374],\n              [111.807005, 35.032977],\n              [111.739251, 35.00406],\n              [111.664107, 34.984449],\n              [111.681969, 34.9511],\n              [111.646861, 34.938836],\n              [111.617911, 34.894671],\n              [111.592042, 34.881416],\n              [111.570484, 34.843114],\n              [111.543999, 34.853428],\n              [111.502731, 34.829851],\n              [111.439289, 34.838202],\n              [111.389398, 34.815113],\n              [111.345666, 34.831816],\n              [111.29208, 34.806759],\n              [111.255123, 34.819535],\n              [111.232949, 34.789559],\n              [111.148566, 34.807742],\n              [111.118385, 34.756623],\n              [111.035233, 34.740887],\n              [110.976103, 34.706456],\n              [110.929907, 34.731543],\n              [110.89911, 34.661673],\n              [110.870777, 34.636072],\n              [110.812263, 34.624746],\n              [110.780234, 34.648874],\n              [110.749437, 34.65232],\n              [110.710017, 34.605045],\n              [110.610851, 34.607508],\n              [110.533242, 34.583368],\n              [110.488279, 34.610956],\n              [110.424837, 34.588295],\n              [110.379257, 34.600612],\n              [110.29549, 34.610956],\n              [110.23636, 34.670533],\n              [110.231432, 34.701044],\n              [110.259149, 34.737937],\n              [110.232664, 34.80332],\n              [110.233896, 34.83722],\n              [110.259149, 34.884853],\n              [110.257301, 34.934912],\n              [110.272084, 34.942761],\n              [110.325671, 35.014844],\n              [110.369402, 35.158329],\n              [110.374946, 35.251728],\n              [110.45009, 35.327933],\n              [110.477808, 35.413821],\n              [110.531394, 35.511309],\n              [110.567735, 35.539559],\n              [110.609619, 35.632031],\n              [110.57759, 35.701559],\n              [110.571431, 35.800639],\n              [110.550489, 35.838005],\n              [110.549257, 35.877778],\n              [110.511684, 35.879718],\n              [110.516612, 35.918501],\n              [110.502445, 35.947575],\n              [110.516612, 35.971796],\n              [110.49259, 35.994073],\n              [110.491974, 36.034735],\n              [110.467953, 36.074893],\n              [110.447011, 36.164328],\n              [110.45625, 36.22663],\n              [110.474112, 36.248352],\n              [110.474112, 36.306729],\n              [110.459946, 36.327946],\n              [110.487047, 36.393972],\n              [110.489511, 36.430094],\n              [110.47288, 36.453203],\n              [110.503677, 36.488335],\n              [110.488895, 36.556628],\n              [110.496902, 36.582102],\n              [110.447627, 36.621018],\n              [110.426685, 36.657514],\n              [110.394656, 36.676716],\n              [110.402663, 36.697352],\n              [110.438388, 36.685835],\n              [110.447011, 36.737649],\n              [110.407591, 36.776007],\n              [110.423605, 36.818179],\n              [110.406975, 36.824886],\n              [110.424221, 36.855539],\n              [110.376178, 36.882351],\n              [110.408823, 36.892403],\n              [110.424221, 36.963685],\n              [110.381721, 37.002408],\n              [110.382953, 37.022001],\n              [110.426685, 37.008621],\n              [110.417446, 37.027257],\n              [110.460561, 37.044932],\n              [110.49567, 37.086956],\n              [110.535706, 37.115118],\n              [110.53509, 37.138021],\n              [110.590525, 37.187145],\n              [110.651503, 37.256722],\n              [110.660126, 37.281011],\n              [110.690307, 37.287201],\n              [110.678604, 37.317668],\n              [110.695234, 37.34955],\n              [110.641648, 37.360015],\n              [110.630561, 37.372858],\n              [110.644111, 37.435135],\n              [110.740198, 37.44939],\n              [110.759292, 37.474567],\n              [110.770995, 37.538184],\n              [110.795017, 37.558586],\n              [110.771611, 37.594634],\n              [110.763604, 37.639668],\n              [110.793169, 37.650567],\n              [110.775306, 37.680886],\n              [110.706321, 37.705511],\n              [110.716792, 37.728708],\n              [110.750669, 37.736281],\n              [110.735886, 37.77035],\n              [110.680452, 37.790216],\n              [110.59422, 37.922049],\n              [110.522771, 37.955088],\n              [110.528315, 37.990471],\n              [110.507989, 38.013107],\n              [110.501829, 38.097929],\n              [110.519692, 38.130889],\n              [110.509221, 38.192061],\n              [110.528315, 38.211814],\n              [110.565887, 38.215105],\n              [110.57759, 38.297345],\n              [110.601612, 38.308147],\n              [110.661358, 38.308617],\n              [110.701394, 38.353215],\n              [110.746973, 38.366355],\n              [110.77777, 38.440924],\n              [110.796864, 38.453579],\n              [110.840596, 38.439986],\n              [110.874473, 38.453579],\n              [110.870777, 38.510265],\n              [110.907733, 38.521035],\n              [110.920052, 38.581878],\n              [110.898494, 38.587024],\n              [110.880632, 38.626776],\n              [110.916357, 38.673981],\n              [110.915125, 38.704345],\n              [110.965016, 38.755699],\n              [111.009363, 38.847579],\n              [110.995813, 38.868084],\n              [111.016755, 38.889981],\n              [111.009979, 38.932823],\n              [110.980414, 38.970056],\n              [110.998276, 38.998433],\n              [111.038313, 39.020289],\n              [111.094363, 39.030053],\n              [111.138095, 39.064447],\n              [111.147334, 39.100681],\n              [111.173819, 39.135041],\n              [111.163348, 39.152678],\n              [111.219399, 39.244044],\n              [111.213239, 39.257021],\n              [111.247732, 39.302419],\n              [111.202152, 39.305197],\n              [111.179363, 39.326959],\n              [111.186138, 39.35149],\n              [111.155341, 39.338531],\n              [111.159037, 39.362596],\n              [111.125776, 39.366297],\n              [111.143022, 39.407926],\n              [111.171971, 39.423183],\n              [111.287152, 39.417173],\n              [111.358601, 39.432428],\n              [111.385086, 39.489722],\n              [111.431282, 39.508656],\n              [111.422043, 39.539123],\n              [111.441137, 39.59679],\n              [111.460847, 39.606935],\n              [111.445448, 39.640124],\n              [111.497187, 39.661781],\n              [111.525521, 39.662242],\n              [111.61668, 39.633211],\n              [111.646245, 39.644272],\n              [111.707839, 39.621227],\n              [111.722621, 39.606013],\n              [111.783599, 39.58895],\n              [111.842729, 39.620305],\n              [111.87907, 39.606013],\n              [111.9382, 39.623071],\n              [111.925265, 39.66731],\n              [111.959758, 39.692642],\n              [111.970229, 39.796638],\n              [112.012729, 39.827438],\n              [112.042294, 39.886243],\n              [112.07617, 39.919298],\n              [112.133453, 40.001866],\n              [112.142076, 40.027076],\n              [112.182112, 40.061437],\n              [112.183344, 40.083877],\n              [112.232003, 40.133311],\n              [112.232619, 40.169905],\n              [112.299756, 40.21105],\n              [112.310227, 40.256281],\n              [112.349031, 40.257194],\n              [112.418017, 40.295091],\n              [112.456205, 40.300112],\n              [112.511639, 40.269068],\n              [112.6299, 40.235725],\n              [112.712436, 40.178593],\n              [112.744464, 40.167161],\n              [112.848558, 40.206937],\n              [112.898449, 40.329317],\n              [113.03334, 40.368997],\n              [113.083231, 40.374925],\n              [113.251382, 40.413211],\n              [113.27602, 40.388601],\n              [113.316672, 40.319736],\n              [113.387505, 40.319279],\n              [113.500222, 40.334335],\n              [113.559968, 40.348476],\n              [113.688699, 40.448288],\n              [113.763228, 40.473787],\n              [113.794641, 40.517932],\n              [113.850691, 40.460583],\n              [113.890112, 40.466503],\n              [113.948626, 40.514747],\n              [114.011452, 40.515657],\n              [114.061959, 40.52885],\n              [114.080437, 40.547952],\n              [114.076741, 40.575686],\n              [114.041633, 40.608861],\n              [114.07243, 40.679246],\n              [114.063806, 40.706925],\n              [114.084748, 40.729605],\n              [114.134639, 40.737314],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 150000,\n        name: '内蒙古自治区',\n        center: [111.670801, 40.818311],\n        centroid: [114.077404, 44.331072],\n        childrenNum: 12,\n        level: 'province',\n        subFeatureIndex: 4,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [111.125776, 39.366297],\n              [111.087588, 39.376013],\n              [111.098059, 39.401914],\n              [111.064182, 39.400989],\n              [111.058639, 39.447681],\n              [111.10545, 39.472631],\n              [111.10545, 39.497573],\n              [111.148566, 39.531277],\n              [111.154725, 39.569116],\n              [111.136863, 39.587106],\n              [111.101138, 39.559428],\n              [111.017371, 39.552045],\n              [110.958856, 39.519275],\n              [110.891103, 39.509118],\n              [110.869545, 39.494341],\n              [110.782698, 39.38804],\n              [110.73835, 39.348713],\n              [110.731575, 39.30705],\n              [110.702626, 39.273701],\n              [110.626249, 39.266751],\n              [110.596684, 39.282966],\n              [110.566503, 39.320014],\n              [110.559728, 39.351027],\n              [110.524003, 39.382952],\n              [110.482735, 39.360745],\n              [110.434692, 39.381101],\n              [110.429764, 39.341308],\n              [110.385417, 39.310291],\n              [110.257917, 39.407001],\n              [110.243751, 39.423645],\n              [110.152592, 39.45415],\n              [110.12549, 39.432891],\n              [110.136577, 39.39174],\n              [110.161831, 39.387115],\n              [110.184005, 39.355192],\n              [110.217881, 39.281113],\n              [110.109476, 39.249606],\n              [110.041107, 39.21623],\n              [109.962267, 39.212056],\n              [109.90252, 39.271848],\n              [109.871723, 39.243581],\n              [109.961035, 39.191651],\n              [109.893897, 39.141075],\n              [109.92223, 39.107183],\n              [109.890818, 39.103932],\n              [109.851397, 39.122971],\n              [109.793499, 39.074204],\n              [109.762086, 39.057476],\n              [109.72513, 39.018429],\n              [109.665384, 38.981687],\n              [109.685094, 38.968195],\n              [109.672159, 38.928167],\n              [109.624116, 38.85457],\n              [109.549587, 38.805618],\n              [109.511399, 38.833595],\n              [109.444262, 38.782763],\n              [109.404226, 38.720689],\n              [109.338936, 38.701542],\n              [109.329081, 38.66043],\n              [109.367269, 38.627711],\n              [109.331545, 38.597783],\n              [109.276726, 38.623035],\n              [109.196654, 38.552867],\n              [109.175712, 38.518694],\n              [109.128901, 38.480288],\n              [109.054372, 38.433892],\n              [109.051292, 38.385122],\n              [109.007561, 38.359316],\n              [108.961981, 38.26493],\n              [108.976148, 38.245192],\n              [108.938575, 38.207582],\n              [108.964445, 38.154894],\n              [109.069155, 38.091336],\n              [109.050676, 38.055059],\n              [109.06977, 38.023008],\n              [109.037742, 38.021593],\n              [109.018648, 37.971602],\n              [108.982923, 37.964053],\n              [108.9743, 37.931962],\n              [108.93488, 37.922521],\n              [108.893612, 37.978207],\n              [108.883141, 38.01405],\n              [108.830786, 38.049875],\n              [108.797525, 38.04799],\n              [108.82709, 37.989056],\n              [108.798141, 37.93385],\n              [108.791982, 37.872934],\n              [108.799989, 37.784068],\n              [108.784591, 37.764673],\n              [108.791982, 37.700303],\n              [108.777815, 37.683728],\n              [108.720533, 37.683728],\n              [108.699591, 37.669518],\n              [108.628142, 37.651988],\n              [108.532671, 37.690832],\n              [108.485244, 37.678044],\n              [108.422418, 37.648672],\n              [108.301078, 37.640616],\n              [108.293071, 37.656726],\n              [108.24626, 37.665728],\n              [108.205608, 37.655779],\n              [108.193905, 37.638246],\n              [108.134159, 37.622131],\n              [108.055318, 37.652462],\n              [108.025137, 37.649619],\n              [108.012819, 37.66857],\n              [108.025753, 37.696041],\n              [107.993109, 37.735335],\n              [107.982022, 37.787378],\n              [107.884703, 37.808186],\n              [107.842819, 37.828987],\n              [107.732566, 37.84931],\n              [107.684523, 37.888522],\n              [107.65003, 37.86443],\n              [107.560719, 37.893717],\n              [107.49235, 37.944706],\n              [107.448618, 37.933378],\n              [107.411662, 37.948009],\n              [107.440611, 37.995659],\n              [107.3938, 38.014993],\n              [107.33159, 38.086625],\n              [107.240431, 38.111586],\n              [107.19054, 38.153953],\n              [107.138801, 38.161011],\n              [107.119091, 38.134185],\n              [107.071047, 38.138892],\n              [107.051337, 38.122886],\n              [107.010069, 38.120532],\n              [106.942316, 38.132302],\n              [106.858548, 38.156306],\n              [106.779092, 38.171833],\n              [106.737824, 38.197706],\n              [106.654672, 38.22921],\n              [106.627571, 38.232501],\n              [106.555506, 38.263521],\n              [106.482209, 38.319417],\n              [106.599854, 38.389812],\n              [106.647897, 38.470917],\n              [106.66268, 38.601524],\n              [106.709491, 38.718821],\n              [106.756302, 38.748699],\n              [106.837606, 38.847579],\n              [106.954019, 38.941202],\n              [106.971881, 39.026333],\n              [106.96757, 39.054688],\n              [106.933693, 39.076527],\n              [106.878874, 39.091392],\n              [106.859164, 39.107648],\n              [106.825288, 39.19397],\n              [106.795723, 39.214375],\n              [106.790795, 39.241263],\n              [106.806193, 39.277407],\n              [106.806809, 39.318625],\n              [106.781556, 39.371849],\n              [106.751375, 39.381564],\n              [106.683622, 39.357506],\n              [106.643586, 39.357969],\n              [106.602318, 39.37555],\n              [106.556122, 39.322329],\n              [106.525325, 39.308439],\n              [106.511774, 39.272311],\n              [106.402753, 39.291767],\n              [106.280181, 39.262118],\n              [106.29558, 39.167992],\n              [106.285109, 39.146181],\n              [106.251232, 39.131327],\n              [106.192718, 39.142932],\n              [106.170544, 39.163352],\n              [106.145907, 39.153142],\n              [106.096631, 39.084889],\n              [106.078153, 39.026333],\n              [106.087392, 39.006339],\n              [106.060907, 38.96866],\n              [106.021487, 38.953769],\n              [105.97098, 38.909077],\n              [105.992538, 38.857366],\n              [105.909386, 38.791159],\n              [105.908154, 38.737496],\n              [105.88598, 38.716953],\n              [105.894603, 38.696405],\n              [105.852719, 38.641735],\n              [105.874277, 38.593105],\n              [105.856415, 38.569714],\n              [105.863806, 38.53508],\n              [105.836705, 38.476071],\n              [105.850872, 38.443736],\n              [105.827466, 38.432486],\n              [105.835473, 38.387467],\n              [105.821307, 38.366824],\n              [105.86627, 38.296406],\n              [105.842248, 38.240962],\n              [105.802828, 38.220277],\n              [105.775111, 38.186887],\n              [105.76772, 38.121474],\n              [105.780655, 38.084741],\n              [105.840401, 38.004147],\n              [105.799749, 37.939986],\n              [105.80406, 37.862068],\n              [105.760944, 37.799674],\n              [105.677177, 37.771769],\n              [105.622358, 37.777919],\n              [105.616199, 37.722555],\n              [105.598952, 37.699356],\n              [105.467141, 37.695094],\n              [105.4037, 37.710246],\n              [105.315004, 37.702197],\n              [105.221998, 37.677097],\n              [105.187505, 37.657674],\n              [105.111128, 37.633981],\n              [105.027977, 37.580881],\n              [104.866601, 37.566651],\n              [104.805007, 37.539133],\n              [104.623305, 37.522522],\n              [104.433595, 37.515402],\n              [104.419429, 37.511604],\n              [104.407726, 37.464592],\n              [104.322726, 37.44844],\n              [104.287002, 37.428007],\n              [104.237727, 37.411847],\n              [104.183524, 37.406618],\n              [104.089285, 37.465067],\n              [103.935916, 37.572818],\n              [103.874938, 37.604117],\n              [103.841062, 37.64725],\n              [103.683381, 37.777919],\n              [103.627947, 37.797783],\n              [103.40744, 37.860651],\n              [103.362477, 38.037621],\n              [103.368636, 38.08898],\n              [103.53494, 38.156776],\n              [103.507838, 38.280905],\n              [103.465339, 38.353215],\n              [103.416063, 38.404821],\n              [103.85954, 38.64454],\n              [104.011677, 38.85923],\n              [104.044322, 38.895105],\n              [104.173053, 38.94446],\n              [104.196459, 38.9882],\n              [104.190915, 39.042139],\n              [104.207546, 39.083495],\n              [104.171205, 39.160567],\n              [104.047401, 39.297788],\n              [104.073271, 39.351953],\n              [104.089901, 39.419947],\n              [103.955626, 39.456923],\n              [103.85338, 39.461543],\n              [103.728961, 39.430117],\n              [103.595302, 39.386652],\n              [103.428998, 39.353341],\n              [103.344615, 39.331588],\n              [103.259615, 39.263971],\n              [103.188166, 39.215302],\n              [103.133347, 39.192579],\n              [103.007696, 39.099753],\n              [102.883892, 39.120649],\n              [102.616574, 39.171703],\n              [102.579002, 39.183301],\n              [102.45335, 39.255167],\n              [102.3548, 39.231993],\n              [102.276576, 39.188868],\n              [102.050526, 39.141075],\n              [102.012338, 39.127149],\n              [101.902701, 39.111827],\n              [101.833715, 39.08907],\n              [101.926106, 39.000758],\n              [101.955055, 38.985874],\n              [102.045599, 38.904885],\n              [102.075164, 38.891378],\n              [101.941505, 38.808883],\n              [101.873751, 38.733761],\n              [101.777049, 38.66043],\n              [101.672955, 38.6908],\n              [101.601506, 38.65529],\n              [101.562702, 38.713218],\n              [101.412413, 38.764099],\n              [101.331109, 38.777164],\n              [101.307087, 38.80282],\n              [101.34158, 38.822406],\n              [101.33542, 38.847113],\n              [101.24303, 38.860628],\n              [101.237486, 38.907214],\n              [101.198682, 38.943064],\n              [101.228863, 39.020754],\n              [101.117378, 38.975174],\n              [100.969553, 38.946788],\n              [100.961545, 39.005874],\n              [100.901799, 39.030053],\n              [100.875314, 39.002619],\n              [100.835278, 39.025869],\n              [100.829118, 39.075133],\n              [100.864227, 39.106719],\n              [100.842669, 39.199999],\n              [100.842053, 39.405614],\n              [100.707778, 39.404689],\n              [100.606764, 39.387577],\n              [100.498975, 39.400527],\n              [100.500823, 39.481408],\n              [100.44354, 39.485565],\n              [100.326512, 39.509118],\n              [100.301258, 39.572345],\n              [100.314193, 39.606935],\n              [100.250135, 39.685274],\n              [100.128179, 39.702312],\n              [100.040716, 39.757083],\n              [99.958796, 39.769504],\n              [99.904593, 39.785601],\n              [99.822058, 39.860063],\n              [99.672384, 39.888079],\n              [99.469124, 39.875221],\n              [99.440791, 39.885783],\n              [99.459885, 39.898181],\n              [99.491298, 39.884406],\n              [99.533182, 39.891753],\n              [99.714268, 39.972061],\n              [99.751225, 40.006909],\n              [99.841152, 40.013326],\n              [99.927383, 40.063727],\n              [99.955716, 40.150695],\n              [100.007455, 40.20008],\n              [100.169447, 40.277743],\n              [100.169447, 40.541131],\n              [100.242744, 40.618855],\n              [100.237201, 40.716905],\n              [100.224882, 40.727337],\n              [100.107853, 40.875475],\n              [100.057346, 40.908049],\n              [99.985897, 40.909858],\n              [99.673, 40.93292],\n              [99.565827, 40.846961],\n              [99.174705, 40.858278],\n              [99.172858, 40.747289],\n              [99.12543, 40.715091],\n              [99.102025, 40.676522],\n              [99.041662, 40.693767],\n              [98.984996, 40.782644],\n              [98.790975, 40.705564],\n              [98.80699, 40.660181],\n              [98.802678, 40.607043],\n              [98.762642, 40.639748],\n              [98.72199, 40.657911],\n              [98.689345, 40.691952],\n              [98.668403, 40.773128],\n              [98.569853, 40.746836],\n              [98.627751, 40.677884],\n              [98.344419, 40.568413],\n              [98.333332, 40.918903],\n              [98.25018, 40.93925],\n              [98.184891, 40.988056],\n              [98.142391, 41.001607],\n              [97.971776, 41.09774],\n              [97.903407, 41.168057],\n              [97.629314, 41.440498],\n              [97.613915, 41.477276],\n              [97.84674, 41.656379],\n              [97.653335, 41.986856],\n              [97.500582, 42.243894],\n              [97.371235, 42.457076],\n              [97.172903, 42.795257],\n              [97.28254, 42.782081],\n              [97.831958, 42.706047],\n              [98.195362, 42.653251],\n              [98.546447, 42.638284],\n              [98.962822, 42.607018],\n              [99.51224, 42.568244],\n              [99.969267, 42.647969],\n              [100.004376, 42.648849],\n              [100.272309, 42.636523],\n              [100.32528, 42.690213],\n              [100.826655, 42.675255],\n              [100.862995, 42.671295],\n              [101.291689, 42.586312],\n              [101.557775, 42.529887],\n              [101.770274, 42.509597],\n              [101.803534, 42.503861],\n              [101.877447, 42.432345],\n              [102.070236, 42.232374],\n              [102.093642, 42.223512],\n              [102.449039, 42.144133],\n              [102.540814, 42.162323],\n              [102.621502, 42.154338],\n              [102.712045, 42.153007],\n              [103.021862, 42.028212],\n              [103.20726, 41.96283],\n              [103.418527, 41.882233],\n              [103.454868, 41.877332],\n              [103.868779, 41.802427],\n              [104.080046, 41.805104],\n              [104.30856, 41.840782],\n              [104.418813, 41.860397],\n              [104.530298, 41.875104],\n              [104.524138, 41.661745],\n              [104.68921, 41.6452],\n              [104.803775, 41.652355],\n              [104.923267, 41.654143],\n              [105.009498, 41.583007],\n              [105.230621, 41.751103],\n              [105.291599, 41.749763],\n              [105.385221, 41.797073],\n              [105.589713, 41.888471],\n              [105.74185, 41.949033],\n              [106.01348, 42.032213],\n              [106.344855, 42.149457],\n              [106.372572, 42.161436],\n              [106.612789, 42.241679],\n              [106.785867, 42.291281],\n              [107.051337, 42.319166],\n              [107.271844, 42.364285],\n              [107.303872, 42.412465],\n              [107.46648, 42.458842],\n              [107.501589, 42.456635],\n              [107.57427, 42.412907],\n              [107.736262, 42.415116],\n              [107.939522, 42.403628],\n              [107.986949, 42.413349],\n              [108.022058, 42.433229],\n              [108.089195, 42.436321],\n              [108.238252, 42.460167],\n              [108.298614, 42.438529],\n              [108.532671, 42.442945],\n              [108.705134, 42.413349],\n              [108.798757, 42.415116],\n              [108.845569, 42.395673],\n              [108.983539, 42.449128],\n              [109.026039, 42.458401],\n              [109.291509, 42.435879],\n              [109.486761, 42.458842],\n              [109.544044, 42.472528],\n              [109.683862, 42.558988],\n              [109.733753, 42.579262],\n              [109.906216, 42.635643],\n              [110.108244, 42.642687],\n              [110.139657, 42.674815],\n              [110.34846, 42.742098],\n              [110.437156, 42.781203],\n              [110.469801, 42.839156],\n              [110.631177, 42.936061],\n              [110.689691, 43.02144],\n              [110.687227, 43.036314],\n              [110.736502, 43.089657],\n              [110.769763, 43.099272],\n              [110.82027, 43.149067],\n              [111.02045, 43.329998],\n              [111.069725, 43.357852],\n              [111.151029, 43.38004],\n              [111.183674, 43.396132],\n              [111.354289, 43.436125],\n              [111.400485, 43.472618],\n              [111.456535, 43.494329],\n              [111.564325, 43.490422],\n              [111.606209, 43.513863],\n              [111.79407, 43.672068],\n              [111.891388, 43.6738],\n              [111.951135, 43.693275],\n              [111.970845, 43.748205],\n              [111.959758, 43.823382],\n              [111.870447, 43.940279],\n              [111.773128, 44.010479],\n              [111.702295, 44.034147],\n              [111.662875, 44.061247],\n              [111.559397, 44.171238],\n              [111.541535, 44.206855],\n              [111.534144, 44.26217],\n              [111.507042, 44.294305],\n              [111.428818, 44.319573],\n              [111.415883, 44.35724],\n              [111.427586, 44.394455],\n              [111.478709, 44.488884],\n              [111.514434, 44.507666],\n              [111.530448, 44.55033],\n              [111.569868, 44.57634],\n              [111.560629, 44.647062],\n              [111.585267, 44.705789],\n              [111.624687, 44.778477],\n              [111.69244, 44.859983],\n              [111.764505, 44.969325],\n              [111.903707, 45.052252],\n              [112.002874, 45.090713],\n              [112.071243, 45.096206],\n              [112.113743, 45.072965],\n              [112.396459, 45.064512],\n              [112.438959, 45.071697],\n              [112.540589, 45.001072],\n              [112.599719, 44.930783],\n              [112.712436, 44.879494],\n              [112.850406, 44.840466],\n              [112.937869, 44.840042],\n              [113.037652, 44.822641],\n              [113.11526, 44.799714],\n              [113.503918, 44.777628],\n              [113.540874, 44.759358],\n              [113.631417, 44.745333],\n              [113.712105, 44.788247],\n              [113.798953, 44.849377],\n              [113.861778, 44.863377],\n              [113.907358, 44.915104],\n              [114.065038, 44.931206],\n              [114.116777, 44.957045],\n              [114.158045, 44.994301],\n              [114.19069, 45.036607],\n              [114.313262, 45.107189],\n              [114.347139, 45.119436],\n              [114.409348, 45.179371],\n              [114.459855, 45.21353],\n              [114.519602, 45.283893],\n              [114.539928, 45.325985],\n              [114.551014, 45.387383],\n              [114.600906, 45.403773],\n              [114.745035, 45.438217],\n              [114.920578, 45.386122],\n              [114.983404, 45.379397],\n              [115.178041, 45.396209],\n              [115.36467, 45.392427],\n              [115.586408, 45.440317],\n              [115.699741, 45.45963],\n              [115.864197, 45.572853],\n              [115.936878, 45.632727],\n              [116.026805, 45.661177],\n              [116.035428, 45.685013],\n              [116.1155, 45.679577],\n              [116.17463, 45.688775],\n              [116.217746, 45.72221],\n              [116.22329, 45.747273],\n              [116.260862, 45.776082],\n              [116.286731, 45.775247],\n              [116.278108, 45.831152],\n              [116.288579, 45.839074],\n              [116.243, 45.876169],\n              [116.271949, 45.966926],\n              [116.414231, 46.133896],\n              [116.439484, 46.137628],\n              [116.536187, 46.23251],\n              [116.573143, 46.258998],\n              [116.585462, 46.292504],\n              [116.673541, 46.325163],\n              [116.745606, 46.327642],\n              [116.81336, 46.355737],\n              [116.834302, 46.384229],\n              [116.876801, 46.375559],\n              [117.097308, 46.356976],\n              [117.247597, 46.366888],\n              [117.372017, 46.36028],\n              [117.383719, 46.394962],\n              [117.375712, 46.416421],\n              [117.392343, 46.463023],\n              [117.447777, 46.528117],\n              [117.42006, 46.582029],\n              [117.49582, 46.600535],\n              [117.596218, 46.603414],\n              [117.622704, 46.596012],\n              [117.641182, 46.558166],\n              [117.704008, 46.516587],\n              [117.748355, 46.521941],\n              [117.769913, 46.537586],\n              [117.813645, 46.530588],\n              [117.870927, 46.549935],\n              [117.868464, 46.575447],\n              [117.914659, 46.607936],\n              [117.982412, 46.614925],\n              [117.992883, 46.631366],\n              [118.04647, 46.631366],\n              [118.124078, 46.678195],\n              [118.192448, 46.682711],\n              [118.238643, 46.709392],\n              [118.274984, 46.715957],\n              [118.316252, 46.73934],\n              [118.41049, 46.728265],\n              [118.446831, 46.704467],\n              [118.586033, 46.692975],\n              [118.639004, 46.721291],\n              [118.677192, 46.6979],\n              [118.788061, 46.687227],\n              [118.788061, 46.717598],\n              [118.845343, 46.771731],\n              [118.914329, 46.77501],\n              [118.912481, 46.733188],\n              [118.951285, 46.722111],\n              [119.011647, 46.745902],\n              [119.073857, 46.676552],\n              [119.123132, 46.642872],\n              [119.152081, 46.658072],\n              [119.20074, 46.648213],\n              [119.26295, 46.649034],\n              [119.325776, 46.608759],\n              [119.357805, 46.619447],\n              [119.374435, 46.603414],\n              [119.431718, 46.638763],\n              [119.491464, 46.629311],\n              [119.557985, 46.633832],\n              [119.598637, 46.618214],\n              [119.656535, 46.625612],\n              [119.682405, 46.605058],\n              [119.677477, 46.584908],\n              [119.739687, 46.615336],\n              [119.783419, 46.626023],\n              [119.8136, 46.66834],\n              [119.804361, 46.68189],\n              [119.859179, 46.669572],\n              [119.911534, 46.669572],\n              [119.93494, 46.712674],\n              [119.917078, 46.758203],\n              [119.936172, 46.790173],\n              [119.920157, 46.853238],\n              [119.926933, 46.903963],\n              [119.859795, 46.917046],\n              [119.845013, 46.964852],\n              [119.795122, 47.013024],\n              [119.79081, 47.04525],\n              [119.806825, 47.055037],\n              [119.763093, 47.13082],\n              [119.716282, 47.195518],\n              [119.627586, 47.247544],\n              [119.56784, 47.248357],\n              [119.559217, 47.303172],\n              [119.450812, 47.353065],\n              [119.437877, 47.378602],\n              [119.386138, 47.397645],\n              [119.365812, 47.423161],\n              [119.32208, 47.42721],\n              [119.365812, 47.47739],\n              [119.205052, 47.520249],\n              [119.152081, 47.540453],\n              [119.134219, 47.664335],\n              [118.773278, 47.771034],\n              [118.568171, 47.992187],\n              [118.441903, 47.995791],\n              [118.422193, 48.01461],\n              [118.37415, 48.016612],\n              [118.351976, 48.006203],\n              [118.284839, 48.011007],\n              [118.238027, 48.031422],\n              [118.238643, 48.041826],\n              [118.150564, 48.036224],\n              [118.124694, 48.047427],\n              [118.107448, 48.031021],\n              [118.052014, 48.01421],\n              [117.96147, 48.011007],\n              [117.886942, 48.025418],\n              [117.813645, 48.016212],\n              [117.529081, 47.782697],\n              [117.519226, 47.761782],\n              [117.493357, 47.758563],\n              [117.384335, 47.641356],\n              [117.094844, 47.8241],\n              [116.879265, 47.893968],\n              [116.791186, 47.89758],\n              [116.669846, 47.890758],\n              [116.453035, 47.837358],\n              [116.26579, 47.876711],\n              [116.130283, 47.823296],\n              [116.111189, 47.811642],\n              [115.968291, 47.689721],\n              [115.939342, 47.683275],\n              [115.580249, 47.921649],\n              [115.539597, 48.104607],\n              [115.545141, 48.134971],\n              [115.529126, 48.155336],\n              [115.81061, 48.257042],\n              [115.822929, 48.259432],\n              [115.799523, 48.514982],\n              [115.83032, 48.560156],\n              [116.069305, 48.811437],\n              [116.077928, 48.822471],\n              [116.048363, 48.873274],\n              [116.428397, 49.430659],\n              [116.717889, 49.847288],\n              [116.736367, 49.847674],\n              [117.068974, 49.695389],\n              [117.278394, 49.636512],\n              [117.485349, 49.633024],\n              [117.638102, 49.574847],\n              [117.809333, 49.521263],\n              [117.849369, 49.551557],\n              [117.866, 49.591532],\n              [117.950999, 49.596187],\n              [117.995963, 49.623332],\n              [118.011362, 49.614803],\n              [118.082811, 49.616741],\n              [118.129622, 49.669446],\n              [118.156723, 49.660149],\n              [118.211542, 49.690744],\n              [118.220781, 49.729831],\n              [118.284223, 49.743755],\n              [118.315636, 49.766953],\n              [118.384005, 49.783958],\n              [118.398787, 49.802502],\n              [118.385853, 49.827217],\n              [118.443751, 49.835709],\n              [118.483787, 49.830691],\n              [118.485019, 49.866194],\n              [118.531214, 49.887791],\n              [118.574946, 49.931342],\n              [118.605127, 49.926719],\n              [118.672264, 49.955991],\n              [118.739402, 49.946364],\n              [118.761576, 49.959456],\n              [118.791757, 49.955606],\n              [118.964836, 49.988708],\n              [118.982082, 49.979087],\n              [119.090487, 49.985629],\n              [119.12498, 50.019095],\n              [119.163168, 50.027554],\n              [119.193965, 50.069826],\n              [119.190269, 50.087877],\n              [119.236465, 50.075204],\n              [119.290052, 50.121655],\n              [119.309762, 50.161161],\n              [119.350414, 50.166145],\n              [119.339327, 50.192206],\n              [119.358421, 50.197953],\n              [119.319001, 50.220933],\n              [119.339943, 50.244668],\n              [119.35103, 50.303953],\n              [119.381827, 50.324208],\n              [119.358421, 50.358965],\n              [119.322696, 50.352474],\n              [119.277117, 50.366218],\n              [119.259871, 50.345218],\n              [119.232153, 50.365455],\n              [119.188422, 50.347509],\n              [119.155777, 50.364691],\n              [119.176719, 50.378814],\n              [119.125596, 50.389118],\n              [119.165016, 50.422683],\n              [119.217371, 50.414675],\n              [119.22353, 50.441363],\n              [119.250631, 50.448604],\n              [119.262334, 50.490124],\n              [119.264182, 50.536933],\n              [119.295595, 50.573814],\n              [119.281428, 50.601551],\n              [119.298059, 50.616743],\n              [119.361501, 50.632689],\n              [119.394145, 50.667219],\n              [119.385522, 50.682769],\n              [119.430486, 50.684286],\n              [119.450196, 50.695281],\n              [119.506862, 50.763846],\n              [119.496391, 50.771795],\n              [119.515485, 50.814165],\n              [119.498855, 50.827776],\n              [119.491464, 50.87878],\n              [119.569688, 50.933879],\n              [119.598637, 50.984767],\n              [119.630666, 51.00925],\n              [119.678093, 51.016404],\n              [119.726753, 51.051028],\n              [119.719361, 51.075099],\n              [119.764325, 51.092017],\n              [119.752622, 51.117193],\n              [119.771716, 51.124331],\n              [119.788346, 51.174636],\n              [119.760629, 51.212516],\n              [119.784035, 51.22601],\n              [119.821607, 51.21439],\n              [119.797586, 51.243622],\n              [119.828383, 51.263099],\n              [119.811136, 51.281071],\n              [119.885049, 51.302777],\n              [119.883817, 51.336813],\n              [119.946643, 51.360736],\n              [119.914614, 51.374187],\n              [119.910918, 51.390994],\n              [119.97128, 51.40033],\n              [119.982983, 51.445112],\n              [120.002693, 51.459283],\n              [119.982367, 51.482396],\n              [119.985447, 51.505125],\n              [120.017476, 51.52114],\n              [120.052584, 51.560967],\n              [120.035954, 51.583657],\n              [120.05936, 51.634203],\n              [120.100628, 51.649058],\n              [120.087077, 51.678013],\n              [120.172693, 51.679868],\n              [120.226279, 51.717703],\n              [120.294649, 51.752171],\n              [120.317438, 51.785873],\n              [120.363634, 51.789945],\n              [120.40675, 51.81659],\n              [120.40059, 51.833605],\n              [120.480046, 51.855049],\n              [120.481278, 51.885719],\n              [120.549032, 51.882394],\n              [120.548416, 51.907877],\n              [120.656821, 51.926333],\n              [120.66298, 51.958061],\n              [120.704864, 51.983501],\n              [120.717799, 52.015556],\n              [120.691929, 52.026973],\n              [120.690698, 52.047221],\n              [120.717183, 52.072978],\n              [120.753523, 52.085483],\n              [120.76769, 52.10938],\n              [120.760299, 52.136937],\n              [120.786784, 52.15787],\n              [120.745516, 52.20594],\n              [120.755371, 52.258355],\n              [120.715951, 52.261286],\n              [120.695625, 52.290214],\n              [120.653741, 52.302658],\n              [120.627256, 52.323878],\n              [120.62356, 52.361172],\n              [120.653741, 52.371038],\n              [120.64943, 52.3904],\n              [120.688234, 52.427637],\n              [120.68269, 52.464479],\n              [120.706712, 52.492909],\n              [120.687002, 52.511489],\n              [120.734429, 52.536977],\n              [120.690698, 52.547532],\n              [120.658669, 52.56718],\n              [120.62664, 52.570818],\n              [120.605082, 52.589364],\n              [120.56135, 52.595544],\n              [120.483742, 52.630066],\n              [120.462184, 52.64532],\n              [120.396895, 52.616261],\n              [120.289721, 52.623527],\n              [120.194866, 52.578819],\n              [120.125265, 52.586819],\n              [120.07599, 52.586092],\n              [120.049505, 52.598453],\n              [120.035338, 52.646409],\n              [120.071063, 52.70628],\n              [120.031642, 52.773674],\n              [120.101244, 52.788877],\n              [120.14128, 52.813119],\n              [120.181316, 52.806969],\n              [120.222584, 52.84277],\n              [120.297112, 52.869872],\n              [120.295265, 52.891542],\n              [120.350699, 52.906343],\n              [120.363018, 52.94134],\n              [120.411061, 52.957927],\n              [120.452945, 53.01017],\n              [120.529321, 53.045803],\n              [120.562582, 53.082845],\n              [120.643886, 53.106923],\n              [120.659901, 53.137091],\n              [120.687002, 53.142476],\n              [120.690698, 53.174771],\n              [120.736277, 53.204892],\n              [120.821893, 53.241797],\n              [120.838523, 53.239648],\n              [120.820661, 53.269007],\n              [120.867472, 53.278669],\n              [120.882871, 53.294411],\n              [120.936457, 53.28833],\n              [120.950624, 53.29763],\n              [121.055334, 53.29155],\n              [121.098449, 53.306929],\n              [121.129246, 53.277238],\n              [121.155732, 53.285468],\n              [121.227797, 53.280459],\n              [121.308485, 53.301565],\n              [121.336818, 53.325877],\n              [121.416274, 53.319443],\n              [121.499426, 53.337314],\n              [121.504969, 53.323018],\n              [121.575802, 53.29155],\n              [121.615222, 53.258984],\n              [121.642324, 53.262564],\n              [121.679896, 53.240722],\n              [121.67928, 53.199515],\n              [121.660186, 53.195213],\n              [121.665114, 53.170467],\n              [121.722396, 53.145706],\n              [121.753193, 53.147501],\n              [121.784606, 53.104408],\n              [121.775367, 53.089674],\n              [121.817867, 53.061631],\n              [121.785838, 53.018451],\n              [121.715621, 52.997926],\n              [121.677432, 52.948192],\n              [121.66265, 52.912478],\n              [121.610295, 52.892264],\n              [121.604136, 52.872401],\n              [121.620766, 52.853251],\n              [121.591201, 52.824693],\n              [121.537614, 52.801542],\n              [121.511129, 52.779104],\n              [121.476636, 52.772225],\n              [121.455078, 52.73528],\n              [121.373158, 52.683067],\n              [121.309717, 52.676173],\n              [121.29247, 52.651855],\n              [121.237036, 52.619167],\n              [121.182217, 52.59918],\n              [121.225333, 52.577364],\n              [121.280151, 52.586819],\n              [121.323883, 52.573727],\n              [121.353448, 52.534793],\n              [121.411963, 52.52205],\n              [121.416274, 52.499468],\n              [121.474172, 52.482706],\n              [121.495114, 52.484892],\n              [121.519136, 52.456821],\n              [121.565331, 52.460468],\n              [121.590585, 52.443326],\n              [121.63986, 52.44442],\n              [121.678664, 52.419973],\n              [121.658338, 52.3904],\n              [121.715621, 52.342894],\n              [121.714389, 52.318025],\n              [121.769207, 52.308147],\n              [121.841272, 52.282526],\n              [121.901018, 52.280695],\n              [121.94783, 52.298266],\n              [121.976779, 52.343626],\n              [122.035909, 52.377615],\n              [122.040837, 52.413038],\n              [122.091344, 52.427272],\n              [122.080873, 52.440407],\n              [122.107358, 52.452445],\n              [122.142467, 52.495096],\n              [122.140003, 52.510032],\n              [122.168952, 52.513674],\n              [122.178191, 52.48963],\n              [122.207756, 52.469218],\n              [122.310618, 52.475416],\n              [122.326016, 52.459374],\n              [122.342031, 52.414133],\n              [122.367284, 52.413768],\n              [122.378987, 52.395512],\n              [122.419023, 52.375057],\n              [122.447356, 52.394052],\n              [122.484313, 52.341432],\n              [122.478153, 52.29607],\n              [122.560689, 52.282526],\n              [122.585943, 52.266413],\n              [122.67895, 52.276667],\n              [122.710979, 52.256157],\n              [122.76087, 52.26678],\n              [122.787355, 52.252494],\n              [122.766413, 52.232705],\n              [122.769493, 52.179893],\n              [122.73808, 52.153464],\n              [122.690653, 52.140243],\n              [122.629059, 52.13657],\n              [122.643841, 52.111585],\n              [122.625363, 52.067459],\n              [122.650616, 52.058997],\n              [122.664783, 51.99861],\n              [122.683877, 51.974654],\n              [122.726377, 51.978709],\n              [122.729457, 51.919321],\n              [122.706051, 51.890151],\n              [122.725761, 51.87833],\n              [122.732536, 51.832495],\n              [122.771957, 51.779579],\n              [122.749167, 51.746613],\n              [122.778732, 51.698048],\n              [122.816304, 51.655371],\n              [122.820616, 51.633088],\n              [122.85634, 51.606707],\n              [122.832935, 51.581797],\n              [122.874202, 51.561339],\n              [122.880362, 51.537894],\n              [122.858804, 51.524864],\n              [122.880362, 51.511085],\n              [122.854492, 51.477551],\n              [122.871123, 51.455181],\n              [122.900072, 51.445112],\n              [122.903768, 51.415262],\n              [122.946267, 51.405183],\n              [122.965977, 51.386886],\n              [122.965977, 51.345786],\n              [123.002934, 51.31213],\n              [123.069455, 51.321108],\n              [123.127969, 51.297913],\n              [123.231447, 51.279199],\n              [123.231447, 51.268716],\n              [123.294273, 51.254111],\n              [123.339853, 51.27246],\n              [123.376809, 51.266844],\n              [123.414381, 51.278825],\n              [123.440251, 51.270963],\n              [123.46304, 51.286686],\n              [123.582533, 51.294545],\n              [123.582533, 51.306893],\n              [123.661989, 51.319237],\n              [123.660141, 51.342795],\n              [123.711264, 51.398089],\n              [123.794416, 51.361109],\n              [123.842459, 51.367462],\n              [123.887423, 51.320734],\n              [123.926227, 51.300532],\n              [123.939777, 51.313253],\n              [123.994596, 51.322604],\n              [124.071588, 51.320734],\n              [124.090067, 51.3413],\n              [124.128255, 51.347281],\n              [124.192313, 51.33943],\n              [124.239124, 51.344664],\n              [124.271769, 51.308389],\n              [124.297638, 51.298661],\n              [124.143037, 50.566212],\n              [124.083907, 50.568493],\n              [124.086987, 50.539975],\n              [124.026625, 50.538454],\n              [124.023545, 50.518671],\n              [123.983509, 50.510299],\n              [124.001371, 50.492408],\n              [123.99398, 50.441363],\n              [124.005067, 50.434502],\n              [123.969958, 50.399419],\n              [123.931154, 50.391407],\n              [123.920067, 50.373089],\n              [123.88927, 50.383775],\n              [123.879415, 50.40247],\n              [123.840611, 50.411624],\n              [123.825829, 50.449366],\n              [123.800575, 50.455844],\n              [123.780249, 50.43717],\n              [123.790104, 50.423446],\n              [123.765467, 50.378051],\n              [123.78764, 50.371944],\n              [123.777785, 50.344454],\n              [123.814126, 50.307775],\n              [123.861553, 50.287131],\n              [123.870792, 50.270303],\n              [123.862785, 50.226294],\n              [123.878799, 50.208678],\n              [123.90898, 50.21021],\n              [123.926227, 50.188374],\n              [123.953944, 50.186842],\n              [124.007531, 50.219401],\n              [124.061733, 50.199102],\n              [124.098074, 50.214806],\n              [124.103001, 50.238927],\n              [124.189233, 50.216721],\n              [124.233581, 50.229356],\n              [124.278544, 50.231271],\n              [124.286551, 50.189524],\n              [124.32474, 50.178411],\n              [124.342602, 50.187991],\n              [124.544014, 49.638838],\n              [124.633325, 49.654725],\n              [124.645028, 49.676804],\n              [124.740499, 49.691905],\n              [124.737419, 49.708937],\n              [124.760825, 49.751489],\n              [124.74173, 49.761541],\n              [124.824882, 49.849989],\n              [124.847672, 49.85269],\n              [124.878469, 49.834937],\n              [124.972708, 49.836095],\n              [124.972708, 49.836095],\n              [124.974556, 49.839955],\n              [124.974556, 49.839955],\n              [124.935135, 49.866965],\n              [124.977019, 49.900899],\n              [125.044157, 49.827217],\n              [125.09528, 49.795935],\n              [125.177815, 49.829533],\n              [125.222779, 49.799026],\n              [125.221547, 49.754969],\n              [125.204301, 49.734086],\n              [125.225243, 49.726349],\n              [125.219699, 49.669058],\n              [125.185207, 49.634574],\n              [125.189518, 49.652401],\n              [125.164881, 49.669446],\n              [125.132236, 49.672157],\n              [125.127308, 49.655113],\n              [125.15441, 49.616741],\n              [125.16796, 49.629923],\n              [125.205533, 49.593859],\n              [125.23017, 49.595411],\n              [125.233866, 49.536801],\n              [125.211076, 49.539908],\n              [125.228323, 49.487063],\n              [125.270822, 49.454395],\n              [125.256656, 49.437275],\n              [125.25604, 49.395227],\n              [125.277598, 49.379644],\n              [125.256656, 49.359769],\n              [125.261583, 49.322336],\n              [125.214772, 49.277066],\n              [125.233866, 49.255587],\n              [125.219699, 49.189139],\n              [125.187671, 49.186792],\n              [125.158721, 49.144921],\n              [125.117453, 49.126127],\n              [125.034302, 49.157056],\n              [125.039845, 49.17623],\n              [124.983179, 49.162535],\n              [124.906802, 49.184054],\n              [124.860607, 49.166448],\n              [124.847672, 49.129651],\n              [124.809484, 49.115943],\n              [124.828578, 49.077933],\n              [124.808252, 49.020666],\n              [124.756513, 48.967262],\n              [124.744194, 48.920487],\n              [124.709086, 48.920487],\n              [124.715861, 48.885475],\n              [124.697383, 48.841775],\n              [124.654267, 48.83429],\n              [124.644412, 48.80789],\n              [124.656115, 48.783842],\n              [124.612383, 48.747945],\n              [124.624702, 48.701755],\n              [124.601912, 48.632587],\n              [124.579122, 48.596582],\n              [124.520608, 48.556195],\n              [124.548941, 48.535593],\n              [124.533543, 48.515379],\n              [124.555717, 48.467784],\n              [124.507674, 48.445558],\n              [124.52492, 48.426897],\n              [124.51876, 48.378027],\n              [124.547094, 48.35775],\n              [124.540934, 48.335476],\n              [124.579738, 48.297269],\n              [124.558796, 48.268197],\n              [124.579122, 48.262221],\n              [124.547094, 48.200829],\n              [124.512601, 48.164518],\n              [124.529847, 48.146951],\n              [124.505826, 48.124985],\n              [124.478108, 48.123387],\n              [124.46579, 48.098213],\n              [124.415899, 48.08782],\n              [124.430065, 48.12099],\n              [124.471333, 48.133373],\n              [124.467637, 48.178886],\n              [124.418978, 48.181679],\n              [124.412819, 48.219175],\n              [124.422058, 48.245884],\n              [124.365392, 48.283731],\n              [124.353689, 48.315978],\n              [124.317964, 48.35099],\n              [124.331515, 48.380015],\n              [124.309957, 48.413393],\n              [124.330283, 48.435633],\n              [124.302566, 48.456673],\n              [124.314269, 48.503881],\n              [124.25945, 48.536385],\n              [124.25945, 48.536385],\n              [124.136878, 48.463023],\n              [124.07898, 48.43603],\n              [124.019234, 48.39313],\n              [123.862785, 48.271782],\n              [123.746373, 48.197638],\n              [123.705105, 48.152142],\n              [123.579453, 48.045427],\n              [123.537569, 48.021816],\n              [123.300432, 47.953723],\n              [123.256085, 47.876711],\n              [123.214201, 47.824502],\n              [123.161846, 47.781892],\n              [123.041122, 47.746492],\n              [122.926557, 47.697777],\n              [122.848949, 47.67441],\n              [122.765181, 47.614333],\n              [122.59395, 47.54732],\n              [122.543443, 47.495589],\n              [122.507103, 47.401291],\n              [122.418407, 47.350632],\n              [122.441197, 47.310476],\n              [122.441197, 47.310476],\n              [122.462755, 47.27841],\n              [122.498479, 47.255262],\n              [122.531124, 47.198771],\n              [122.582863, 47.158092],\n              [122.582863, 47.158092],\n              [122.615508, 47.124306],\n              [122.679566, 47.094164],\n              [122.710363, 47.093349],\n              [122.710363, 47.093349],\n              [122.821232, 47.065636],\n              [122.852645, 47.072158],\n              [122.845869, 47.046881],\n              [122.778116, 47.002822],\n              [122.77442, 46.973837],\n              [122.798442, 46.9575],\n              [122.791051, 46.941567],\n              [122.83971, 46.937072],\n              [122.895144, 46.960359],\n              [122.893913, 46.895376],\n              [122.906847, 46.80738],\n              [122.996774, 46.761483],\n              [123.00355, 46.730726],\n              [123.026339, 46.718829],\n              [123.076846, 46.745082],\n              [123.103332, 46.734828],\n              [123.163694, 46.74016],\n              [123.198802, 46.803283],\n              [123.22344, 46.821305],\n              [123.221592, 46.850373],\n              [123.295505, 46.865105],\n              [123.341084, 46.826628],\n              [123.374345, 46.837683],\n              [123.40699, 46.906416],\n              [123.404526, 46.935438],\n              [123.360179, 46.970978],\n              [123.304128, 46.964852],\n              [123.301664, 46.999965],\n              [123.337389, 46.988943],\n              [123.42362, 46.934212],\n              [123.487678, 46.959951],\n              [123.52833, 46.944836],\n              [123.483366, 46.84587],\n              [123.506772, 46.827038],\n              [123.562823, 46.82581],\n              [123.575757, 46.845461],\n              [123.576989, 46.891286],\n              [123.605322, 46.891286],\n              [123.599163, 46.868378],\n              [123.625648, 46.847508],\n              [123.580069, 46.827447],\n              [123.629344, 46.813524],\n              [123.631808, 46.728675],\n              [123.603475, 46.68928],\n              [123.474743, 46.686817],\n              [123.366338, 46.677784],\n              [123.318295, 46.662179],\n              [123.276411, 46.660947],\n              [123.279491, 46.616981],\n              [123.228368, 46.588198],\n              [123.18094, 46.614103],\n              [123.098404, 46.603002],\n              [123.077462, 46.622324],\n              [123.04605, 46.617803],\n              [123.052825, 46.579972],\n              [123.002318, 46.574624],\n              [123.010325, 46.524823],\n              [123.011557, 46.434984],\n              [123.089781, 46.347888],\n              [123.142136, 46.298293],\n              [123.178476, 46.248239],\n              [123.128585, 46.210565],\n              [123.127354, 46.174523],\n              [123.102716, 46.172037],\n              [123.112571, 46.130163],\n              [123.070071, 46.123527],\n              [123.04605, 46.099878],\n              [122.792898, 46.073313],\n              [122.828623, 45.912406],\n              [122.80029, 45.856583],\n              [122.772572, 45.856583],\n              [122.752246, 45.834905],\n              [122.792283, 45.766063],\n              [122.751015, 45.735996],\n              [122.741775, 45.705077],\n              [122.671558, 45.70048],\n              [122.650001, 45.731401],\n              [122.640761, 45.771072],\n              [122.603189, 45.778169],\n              [122.556378, 45.82156],\n              [122.522501, 45.786933],\n              [122.504639, 45.786933],\n              [122.496016, 45.85825],\n              [122.446125, 45.916986],\n              [122.362357, 45.917403],\n              [122.372828, 45.856166],\n              [122.337719, 45.859917],\n              [122.301379, 45.813218],\n              [122.253952, 45.7982],\n              [122.236705, 45.831569],\n              [122.200981, 45.857],\n              [122.091344, 45.882002],\n              [122.085184, 45.912406],\n              [122.040221, 45.959022],\n              [121.92812, 45.988552],\n              [121.923808, 46.004767],\n              [121.864062, 46.002272],\n              [121.843736, 46.024301],\n              [121.819098, 46.023054],\n              [121.761816, 45.998947],\n              [121.809243, 45.961102],\n              [121.821562, 45.918235],\n              [121.805548, 45.900746],\n              [121.817251, 45.875336],\n              [121.769823, 45.84366],\n              [121.766744, 45.830318],\n              [121.766744, 45.830318],\n              [121.754425, 45.794862],\n              [121.697142, 45.76314],\n              [121.657106, 45.770238],\n              [121.644172, 45.752284],\n              [121.666345, 45.727641],\n              [121.713773, 45.701734],\n              [121.811091, 45.687103],\n              [121.812323, 45.704659],\n              [121.867142, 45.719703],\n              [121.934279, 45.71051],\n              [121.970004, 45.692956],\n              [122.003264, 45.623102],\n              [121.995873, 45.59882],\n              [121.966308, 45.596308],\n              [121.993409, 45.552741],\n              [122.002648, 45.507882],\n              [122.064242, 45.472641],\n              [122.168336, 45.439897],\n              [122.180039, 45.409655],\n              [122.146778, 45.374352],\n              [122.147394, 45.295682],\n              [122.239169, 45.276313],\n              [122.22993, 45.206784],\n              [122.192358, 45.180636],\n              [122.143082, 45.183167],\n              [122.109822, 45.142236],\n              [122.119677, 45.068739],\n              [122.098735, 45.02138],\n              [122.074713, 45.006573],\n              [122.087032, 44.95281],\n              [122.079025, 44.914256],\n              [122.04946, 44.912985],\n              [122.098119, 44.81882],\n              [122.099967, 44.7823],\n              [122.168952, 44.770405],\n              [122.142467, 44.753833],\n              [122.110438, 44.767856],\n              [122.10243, 44.736406],\n              [122.152322, 44.744057],\n              [122.161561, 44.728328],\n              [122.117213, 44.701961],\n              [122.103046, 44.67388],\n              [122.113517, 44.615546],\n              [122.13138, 44.577619],\n              [122.196053, 44.559712],\n              [122.224386, 44.526016],\n              [122.228082, 44.480345],\n              [122.28598, 44.477783],\n              [122.294604, 44.41113],\n              [122.291524, 44.310152],\n              [122.271198, 44.255741],\n              [122.319241, 44.233018],\n              [122.483081, 44.236877],\n              [122.515726, 44.251025],\n              [122.641993, 44.283595],\n              [122.675254, 44.285738],\n              [122.702971, 44.319145],\n              [122.76087, 44.369648],\n              [122.85634, 44.398304],\n              [123.025108, 44.493153],\n              [123.06576, 44.505959],\n              [123.12489, 44.5098],\n              [123.137209, 44.486322],\n              [123.125506, 44.455147],\n              [123.142136, 44.428228],\n              [123.114419, 44.40258],\n              [123.128585, 44.367081],\n              [123.196955, 44.34483],\n              [123.277027, 44.25274],\n              [123.286882, 44.211574],\n              [123.323838, 44.179823],\n              [123.386664, 44.161794],\n              [123.362642, 44.133452],\n              [123.350939, 44.092633],\n              [123.32815, 44.084035],\n              [123.331229, 44.028984],\n              [123.365722, 44.013922],\n              [123.400831, 43.979481],\n              [123.37065, 43.970006],\n              [123.397135, 43.954929],\n              [123.467968, 43.853599],\n              [123.461809, 43.822518],\n              [123.498149, 43.771114],\n              [123.48275, 43.737396],\n              [123.520323, 43.708419],\n              [123.518475, 43.682024],\n              [123.536953, 43.633964],\n              [123.510468, 43.624867],\n              [123.5117, 43.592801],\n              [123.421157, 43.598435],\n              [123.434091, 43.575461],\n              [123.461193, 43.568523],\n              [123.452569, 43.545971],\n              [123.452569, 43.545971],\n              [123.360179, 43.567223],\n              [123.304744, 43.550742],\n              [123.329998, 43.519071],\n              [123.315831, 43.492159],\n              [123.36449, 43.483475],\n              [123.382968, 43.469143],\n              [123.419925, 43.410046],\n              [123.442098, 43.437863],\n              [123.486446, 43.44525],\n              [123.519707, 43.402219],\n              [123.54496, 43.415262],\n              [123.608402, 43.366119],\n              [123.703873, 43.37047],\n              [123.698329, 43.272071],\n              [123.664453, 43.264663],\n              [123.676771, 43.223684],\n              [123.645974, 43.208855],\n              [123.666916, 43.179623],\n              [123.636119, 43.141644],\n              [123.631192, 43.088346],\n              [123.580685, 43.036314],\n              [123.572678, 43.003498],\n              [123.536337, 43.007],\n              [123.474743, 43.042438],\n              [123.434707, 43.027565],\n              [123.323222, 43.000872],\n              [123.259165, 42.993431],\n              [123.18402, 42.925983],\n              [123.188947, 42.895739],\n              [123.169853, 42.859777],\n              [123.227752, 42.831695],\n              [123.118114, 42.801405],\n              [123.058368, 42.768903],\n              [122.980144, 42.777689],\n              [122.945651, 42.753524],\n              [122.925941, 42.772417],\n              [122.887137, 42.770221],\n              [122.883442, 42.751766],\n              [122.883442, 42.751766],\n              [122.848949, 42.712203],\n              [122.848949, 42.712203],\n              [122.786123, 42.757479],\n              [122.73808, 42.77066],\n              [122.733152, 42.786034],\n              [122.653696, 42.78252],\n              [122.624747, 42.773296],\n              [122.580399, 42.789987],\n              [122.576088, 42.819405],\n              [122.556378, 42.827745],\n              [122.436886, 42.843105],\n              [122.35127, 42.830378],\n              [122.371596, 42.776371],\n              [122.439349, 42.770221],\n              [122.460907, 42.755282],\n              [122.396234, 42.707366],\n              [122.396234, 42.684054],\n              [122.338951, 42.669975],\n              [122.324785, 42.684934],\n              [122.261343, 42.695931],\n              [122.204676, 42.732867],\n              [122.204676, 42.685374],\n              [122.160945, 42.684934],\n              [122.072865, 42.710444],\n              [122.062394, 42.723635],\n              [122.018663, 42.69901],\n              [121.939207, 42.688453],\n              [121.94167, 42.666014],\n              [121.915801, 42.656332],\n              [121.921344, 42.605697],\n              [121.889931, 42.556784],\n              [121.844352, 42.522389],\n              [121.831417, 42.533856],\n              [121.817867, 42.504303],\n              [121.803084, 42.514891],\n              [121.747649, 42.484887],\n              [121.69899, 42.438529],\n              [121.66573, 42.437204],\n              [121.604136, 42.495037],\n              [121.607831, 42.516214],\n              [121.570875, 42.487093],\n              [121.506201, 42.482239],\n              [121.4791, 42.49636],\n              [121.434752, 42.475176],\n              [121.386093, 42.474294],\n              [121.304789, 42.435879],\n              [121.314644, 42.42837],\n              [121.285079, 42.387717],\n              [121.218558, 42.371802],\n              [121.184681, 42.333324],\n              [121.133558, 42.300135],\n              [121.120623, 42.280656],\n              [121.087978, 42.278885],\n              [121.070732, 42.254083],\n              [121.028848, 42.242565],\n              [120.992508, 42.264714],\n              [120.933994, 42.27977],\n              [120.883487, 42.269585],\n              [120.883487, 42.269585],\n              [120.883487, 42.242565],\n              [120.8299, 42.252755],\n              [120.820661, 42.227943],\n              [120.79048, 42.218636],\n              [120.745516, 42.223512],\n              [120.72211, 42.203565],\n              [120.624792, 42.154338],\n              [120.58414, 42.167203],\n              [120.56751, 42.152119],\n              [120.466496, 42.105516],\n              [120.493597, 42.073539],\n              [120.450481, 42.057101],\n              [120.456641, 42.016208],\n              [120.399358, 41.984631],\n              [120.373489, 41.994862],\n              [120.309431, 41.951704],\n              [120.318054, 41.93746],\n              [120.271859, 41.925439],\n              [120.260156, 41.904062],\n              [120.290337, 41.897381],\n              [120.286641, 41.880005],\n              [120.251533, 41.884016],\n              [120.215808, 41.853265],\n              [120.188707, 41.848361],\n              [120.183164, 41.826513],\n              [120.127113, 41.77253],\n              [120.1382, 41.729221],\n              [120.096316, 41.697056],\n              [120.035954, 41.708226],\n              [120.024867, 41.737707],\n              [120.050737, 41.776101],\n              [120.041498, 41.818932],\n              [120.023019, 41.816701],\n              [119.989759, 41.899163],\n              [119.954034, 41.923212],\n              [119.950954, 41.974399],\n              [119.924469, 41.98908],\n              [119.921389, 42.014429],\n              [119.897368, 42.030879],\n              [119.87581, 42.077982],\n              [119.845629, 42.097079],\n              [119.837622, 42.135257],\n              [119.854868, 42.170308],\n              [119.841933, 42.215534],\n              [119.744615, 42.211545],\n              [119.679941, 42.240793],\n              [119.617115, 42.252755],\n              [119.609108, 42.276671],\n              [119.557985, 42.289068],\n              [119.557985, 42.289068],\n              [119.539507, 42.297922],\n              [119.571536, 42.335536],\n              [119.572152, 42.359421],\n              [119.540123, 42.363401],\n              [119.502551, 42.388159],\n              [119.482841, 42.347037],\n              [119.432949, 42.317396],\n              [119.34795, 42.300578],\n              [119.280197, 42.260728],\n              [119.274037, 42.239021],\n              [119.237697, 42.200905],\n              [119.277733, 42.185387],\n              [119.286972, 42.154781],\n              [119.30853, 42.147239],\n              [119.314689, 42.119723],\n              [119.352261, 42.118391],\n              [119.384906, 42.08953],\n              [119.375667, 42.023322],\n              [119.324544, 41.969505],\n              [119.323928, 41.937014],\n              [119.340559, 41.926774],\n              [119.323312, 41.889807],\n              [119.334399, 41.871539],\n              [119.312841, 41.80555],\n              [119.292515, 41.790827],\n              [119.317769, 41.764049],\n              [119.319001, 41.727435],\n              [119.299907, 41.705545],\n              [119.307914, 41.657273],\n              [119.342406, 41.617914],\n              [119.415703, 41.590169],\n              [119.420015, 41.567785],\n              [119.362116, 41.566442],\n              [119.361501, 41.545841],\n              [119.406464, 41.503276],\n              [119.401537, 41.472343],\n              [119.378131, 41.459787],\n              [119.376283, 41.422102],\n              [119.309762, 41.405944],\n              [119.330704, 41.385293],\n              [119.296211, 41.325097],\n              [119.239545, 41.31431],\n              [119.211827, 41.308016],\n              [119.197661, 41.282837],\n              [119.168712, 41.294978],\n              [119.092951, 41.293629],\n              [118.980234, 41.305769],\n              [118.949437, 41.317906],\n              [118.890923, 41.300823],\n              [118.844727, 41.342622],\n              [118.843496, 41.374516],\n              [118.770199, 41.352956],\n              [118.741866, 41.324198],\n              [118.677192, 41.35026],\n              [118.629765, 41.346666],\n              [118.528135, 41.355202],\n              [118.412338, 41.331838],\n              [118.380309, 41.312062],\n              [118.348896, 41.342622],\n              [118.361215, 41.384844],\n              [118.348896, 41.428384],\n              [118.327338, 41.450816],\n              [118.271904, 41.471446],\n              [118.315636, 41.512688],\n              [118.302701, 41.55256],\n              [118.215237, 41.59554],\n              [118.206614, 41.650566],\n              [118.159187, 41.67605],\n              [118.155491, 41.712694],\n              [118.132702, 41.733241],\n              [118.140093, 41.784134],\n              [118.178281, 41.814917],\n              [118.236179, 41.80778],\n              [118.247266, 41.773869],\n              [118.29223, 41.772976],\n              [118.335346, 41.845241],\n              [118.340273, 41.87243],\n              [118.268824, 41.930336],\n              [118.306396, 41.940131],\n              [118.313788, 41.98819],\n              [118.291614, 42.007759],\n              [118.239875, 42.024655],\n              [118.286686, 42.033991],\n              [118.296541, 42.057545],\n              [118.27252, 42.083312],\n              [118.239259, 42.092639],\n              [118.212774, 42.081091],\n              [118.220165, 42.058434],\n              [118.194296, 42.031324],\n              [118.116687, 42.037102],\n              [118.155491, 42.081091],\n              [118.097593, 42.105072],\n              [118.089586, 42.12283],\n              [118.106216, 42.172082],\n              [118.033535, 42.199132],\n              [117.977485, 42.229716],\n              [117.974405, 42.25054],\n              [118.047702, 42.280656],\n              [118.060021, 42.298364],\n              [118.008898, 42.346595],\n              [118.024296, 42.385064],\n              [117.997811, 42.416884],\n              [117.874007, 42.510038],\n              [117.856761, 42.539148],\n              [117.797631, 42.585431],\n              [117.801326, 42.612744],\n              [117.779768, 42.61847],\n              [117.708935, 42.588515],\n              [117.667051, 42.582347],\n              [117.60053, 42.603054],\n              [117.537088, 42.603054],\n              [117.530313, 42.590278],\n              [117.475494, 42.602613],\n              [117.435458, 42.585431],\n              [117.434226, 42.557224],\n              [117.387415, 42.517537],\n              [117.387415, 42.517537],\n              [117.410205, 42.519743],\n              [117.413284, 42.471645],\n              [117.390495, 42.461933],\n              [117.332596, 42.46105],\n              [117.332596, 42.46105],\n              [117.275314, 42.481797],\n              [117.275314, 42.481797],\n              [117.188467, 42.468114],\n              [117.188467, 42.468114],\n              [117.135496, 42.468996],\n              [117.09546, 42.484004],\n              [117.080061, 42.463699],\n              [117.080061, 42.463699],\n              [117.01662, 42.456193],\n              [117.01662, 42.456193],\n              [117.009228, 42.44957],\n              [117.009228, 42.44957],\n              [117.005533, 42.43367],\n              [117.005533, 42.43367],\n              [116.99075, 42.425719],\n              [116.99075, 42.425719],\n              [116.974736, 42.426603],\n              [116.974736, 42.426603],\n              [116.97104, 42.427486],\n              [116.97104, 42.427486],\n              [116.944555, 42.415116],\n              [116.944555, 42.415116],\n              [116.936547, 42.410256],\n              [116.936547, 42.410256],\n              [116.921765, 42.403628],\n              [116.921765, 42.403628],\n              [116.910062, 42.395231],\n              [116.910062, 42.395231],\n              [116.910678, 42.394789],\n              [116.910678, 42.394789],\n              [116.886656, 42.366496],\n              [116.897743, 42.297479],\n              [116.918685, 42.229716],\n              [116.903287, 42.190708],\n              [116.789338, 42.200462],\n              [116.825062, 42.155669],\n              [116.850316, 42.156556],\n              [116.890352, 42.092639],\n              [116.879881, 42.018431],\n              [116.796113, 41.977958],\n              [116.748686, 41.984186],\n              [116.727744, 41.951259],\n              [116.66923, 41.947698],\n              [116.639049, 41.929891],\n              [116.597165, 41.935679],\n              [116.553433, 41.928555],\n              [116.510933, 41.974399],\n              [116.4826, 41.975734],\n              [116.453651, 41.945917],\n              [116.393289, 41.942802],\n              [116.414231, 41.982407],\n              [116.373579, 42.009983],\n              [116.310137, 41.997086],\n              [116.298434, 41.96817],\n              [116.223906, 41.932562],\n              [116.212819, 41.885352],\n              [116.194341, 41.861734],\n              [116.122892, 41.861734],\n              [116.106877, 41.831419],\n              [116.129051, 41.805996],\n              [116.09887, 41.776547],\n              [116.034196, 41.782795],\n              [116.007095, 41.79752],\n              [116.007095, 41.797966],\n              [116.007095, 41.79752],\n              [116.007095, 41.797966],\n              [115.994776, 41.828743],\n              [115.954124, 41.874213],\n              [115.916552, 41.945027],\n              [115.85311, 41.927665],\n              [115.834632, 41.93835],\n              [115.811226, 41.912525],\n              [115.726227, 41.870202],\n              [115.688038, 41.867528],\n              [115.654162, 41.829189],\n              [115.57409, 41.80555],\n              [115.519887, 41.76762],\n              [115.488474, 41.760924],\n              [115.42996, 41.728775],\n              [115.346808, 41.712247],\n              [115.319091, 41.691693],\n              [115.360975, 41.661297],\n              [115.345576, 41.635807],\n              [115.377605, 41.603148],\n              [115.310468, 41.592854],\n              [115.290142, 41.622835],\n              [115.26612, 41.616124],\n              [115.256881, 41.580768],\n              [115.20391, 41.571367],\n              [115.195287, 41.602253],\n              [115.0992, 41.62373],\n              [115.056085, 41.602253],\n              [115.016049, 41.615229],\n              [114.860832, 41.60091],\n              [114.895325, 41.636255],\n              [114.902716, 41.695715],\n              [114.89594, 41.76762],\n              [114.868839, 41.813579],\n              [114.922426, 41.825175],\n              [114.939056, 41.846132],\n              [114.923658, 41.871093],\n              [114.915035, 41.960605],\n              [114.9021, 42.015763],\n              [114.860832, 42.054879],\n              [114.86268, 42.097967],\n              [114.825723, 42.139695],\n              [114.79431, 42.149457],\n              [114.789383, 42.130819],\n              [114.75489, 42.115727],\n              [114.675434, 42.12061],\n              [114.647717, 42.109512],\n              [114.560254, 42.132595],\n              [114.510978, 42.110844],\n              [114.502355, 42.06732],\n              [114.480181, 42.064654],\n              [114.467863, 42.025989],\n              [114.511594, 41.981962],\n              [114.478334, 41.951704],\n              [114.419203, 41.942356],\n              [114.352066, 41.953484],\n              [114.343443, 41.926774],\n              [114.282465, 41.863517],\n              [114.200545, 41.789934],\n              [114.215328, 41.75646],\n              [114.206704, 41.7386],\n              [114.237501, 41.698843],\n              [114.215328, 41.68499],\n              [114.259059, 41.623282],\n              [114.226414, 41.616572],\n              [114.221487, 41.582111],\n              [114.230726, 41.513584],\n              [114.101379, 41.537779],\n              [114.032394, 41.529715],\n              [113.976959, 41.505966],\n              [113.953553, 41.483553],\n              [113.933227, 41.487139],\n              [113.919677, 41.454404],\n              [113.877793, 41.431076],\n              [113.871017, 41.413126],\n              [113.94493, 41.392477],\n              [113.92522, 41.325546],\n              [113.899351, 41.316108],\n              [113.914749, 41.294529],\n              [113.95109, 41.282837],\n              [113.971416, 41.239649],\n              [113.992357, 41.269794],\n              [114.016379, 41.231999],\n              [113.996669, 41.19238],\n              [113.960945, 41.171211],\n              [113.920293, 41.172112],\n              [113.877793, 41.115777],\n              [113.819279, 41.09774],\n              [113.868554, 41.06887],\n              [113.973263, 40.983087],\n              [113.994821, 40.938798],\n              [114.057647, 40.925234],\n              [114.041633, 40.917546],\n              [114.055183, 40.867782],\n              [114.073661, 40.857372],\n              [114.044712, 40.830661],\n              [114.080437, 40.790348],\n              [114.104458, 40.797597],\n              [114.103227, 40.770861],\n              [114.134639, 40.737314],\n              [114.084748, 40.729605],\n              [114.063806, 40.706925],\n              [114.07243, 40.679246],\n              [114.041633, 40.608861],\n              [114.076741, 40.575686],\n              [114.080437, 40.547952],\n              [114.061959, 40.52885],\n              [114.011452, 40.515657],\n              [113.948626, 40.514747],\n              [113.890112, 40.466503],\n              [113.850691, 40.460583],\n              [113.794641, 40.517932],\n              [113.763228, 40.473787],\n              [113.688699, 40.448288],\n              [113.559968, 40.348476],\n              [113.500222, 40.334335],\n              [113.387505, 40.319279],\n              [113.316672, 40.319736],\n              [113.27602, 40.388601],\n              [113.251382, 40.413211],\n              [113.083231, 40.374925],\n              [113.03334, 40.368997],\n              [112.898449, 40.329317],\n              [112.848558, 40.206937],\n              [112.744464, 40.167161],\n              [112.712436, 40.178593],\n              [112.6299, 40.235725],\n              [112.511639, 40.269068],\n              [112.456205, 40.300112],\n              [112.418017, 40.295091],\n              [112.349031, 40.257194],\n              [112.310227, 40.256281],\n              [112.299756, 40.21105],\n              [112.232619, 40.169905],\n              [112.232003, 40.133311],\n              [112.183344, 40.083877],\n              [112.182112, 40.061437],\n              [112.142076, 40.027076],\n              [112.133453, 40.001866],\n              [112.07617, 39.919298],\n              [112.042294, 39.886243],\n              [112.012729, 39.827438],\n              [111.970229, 39.796638],\n              [111.959758, 39.692642],\n              [111.925265, 39.66731],\n              [111.9382, 39.623071],\n              [111.87907, 39.606013],\n              [111.842729, 39.620305],\n              [111.783599, 39.58895],\n              [111.722621, 39.606013],\n              [111.707839, 39.621227],\n              [111.646245, 39.644272],\n              [111.61668, 39.633211],\n              [111.525521, 39.662242],\n              [111.497187, 39.661781],\n              [111.445448, 39.640124],\n              [111.460847, 39.606935],\n              [111.441137, 39.59679],\n              [111.422043, 39.539123],\n              [111.431282, 39.508656],\n              [111.385086, 39.489722],\n              [111.358601, 39.432428],\n              [111.287152, 39.417173],\n              [111.171971, 39.423183],\n              [111.143022, 39.407926],\n              [111.125776, 39.366297],\n            ],\n          ],\n          [\n            [\n              [125.559082, 51.461521],\n              [125.559082, 51.461521],\n              [125.595422, 51.416755],\n              [125.595422, 51.416755],\n              [125.60035, 51.413396],\n              [125.60035, 51.413396],\n              [125.600966, 51.410409],\n              [125.600966, 51.410409],\n              [125.62314, 51.398089],\n              [125.62314, 51.398089],\n              [125.623756, 51.387633],\n              [125.623756, 51.387633],\n              [125.626219, 51.380163],\n              [125.626219, 51.380163],\n              [125.700132, 51.327465],\n              [125.700132, 51.327465],\n              [125.740784, 51.27583],\n              [125.740784, 51.27583],\n              [125.76111, 51.261976],\n              [125.76111, 51.261976],\n              [125.761726, 51.226385],\n              [125.819008, 51.227134],\n              [125.850421, 51.21364],\n              [125.864588, 51.146487],\n              [125.909551, 51.138977],\n              [125.946508, 51.108176],\n              [125.970529, 51.123955],\n              [125.993935, 51.119072],\n              [125.976073, 51.084498],\n              [126.059225, 51.043503],\n              [126.033971, 51.011132],\n              [126.041978, 50.981753],\n              [126.068464, 50.967434],\n              [126.042594, 50.92558],\n              [126.02042, 50.927466],\n              [125.996399, 50.906715],\n              [125.997631, 50.872738],\n              [125.961906, 50.901054],\n              [125.939732, 50.85423],\n              [125.913247, 50.825885],\n              [125.878138, 50.816812],\n              [125.890457, 50.805845],\n              [125.836255, 50.793363],\n              [125.846726, 50.769524],\n              [125.828863, 50.756654],\n              [125.804226, 50.773309],\n              [125.758646, 50.746809],\n              [125.795603, 50.738856],\n              [125.78082, 50.725598],\n              [125.825784, 50.70362],\n              [125.789443, 50.679735],\n              [125.804226, 50.658874],\n              [125.793139, 50.643316],\n              [125.814697, 50.62092],\n              [125.807921, 50.60383],\n              [125.829479, 50.56165],\n              [125.794987, 50.532748],\n              [125.770349, 50.531227],\n              [125.754335, 50.506874],\n              [125.740784, 50.523237],\n              [125.699516, 50.487078],\n              [125.654553, 50.471082],\n              [125.627451, 50.443268],\n              [125.580024, 50.449366],\n              [125.562162, 50.438314],\n              [125.583104, 50.409717],\n              [125.567089, 50.402852],\n              [125.536292, 50.420014],\n              [125.522126, 50.404759],\n              [125.546763, 50.358965],\n              [125.520278, 50.3498],\n              [125.530749, 50.331085],\n              [125.463611, 50.295925],\n              [125.466075, 50.266861],\n              [125.442053, 50.260357],\n              [125.448829, 50.216338],\n              [125.417416, 50.195654],\n              [125.39093, 50.199868],\n              [125.382923, 50.172278],\n              [125.335496, 50.161161],\n              [125.376148, 50.137385],\n              [125.311474, 50.140453],\n              [125.27883, 50.127411],\n              [125.258504, 50.103618],\n              [125.287453, 50.093636],\n              [125.283757, 50.070211],\n              [125.328105, 50.065985],\n              [125.315786, 50.04562],\n              [125.289916, 50.057917],\n              [125.25296, 50.041393],\n              [125.283757, 50.036012],\n              [125.297924, 50.014481],\n              [125.278214, 49.996402],\n              [125.241873, 49.987938],\n              [125.231402, 49.957531],\n              [125.190134, 49.959841],\n              [125.199373, 49.935194],\n              [125.225859, 49.922481],\n              [125.212924, 49.907452],\n              [125.245569, 49.87198],\n              [125.225243, 49.867351],\n              [125.239409, 49.844587],\n              [125.177815, 49.829533],\n              [125.09528, 49.795935],\n              [125.044157, 49.827217],\n              [124.977019, 49.900899],\n              [124.935135, 49.866965],\n              [124.974556, 49.839955],\n              [124.974556, 49.839955],\n              [124.972708, 49.836095],\n              [124.972708, 49.836095],\n              [124.878469, 49.834937],\n              [124.847672, 49.85269],\n              [124.824882, 49.849989],\n              [124.74173, 49.761541],\n              [124.760825, 49.751489],\n              [124.737419, 49.708937],\n              [124.740499, 49.691905],\n              [124.645028, 49.676804],\n              [124.633325, 49.654725],\n              [124.544014, 49.638838],\n              [124.342602, 50.187991],\n              [124.359848, 50.199102],\n              [124.34445, 50.219018],\n              [124.368471, 50.258061],\n              [124.349377, 50.28063],\n              [124.374015, 50.310833],\n              [124.347529, 50.316565],\n              [124.36416, 50.360874],\n              [124.40358, 50.362401],\n              [124.43992, 50.385683],\n              [124.415899, 50.451652],\n              [124.43992, 50.45813],\n              [124.43992, 50.539975],\n              [124.420826, 50.548342],\n              [124.322892, 50.532748],\n              [124.289015, 50.553286],\n              [124.183073, 50.557468],\n              [124.143037, 50.566212],\n              [124.297638, 51.298661],\n              [124.339522, 51.293422],\n              [124.406659, 51.272086],\n              [124.430065, 51.301281],\n              [124.426985, 51.331953],\n              [124.443616, 51.35812],\n              [124.478108, 51.36223],\n              [124.490427, 51.380537],\n              [124.555717, 51.375307],\n              [124.58713, 51.363725],\n              [124.62655, 51.327465],\n              [124.693687, 51.3327],\n              [124.752817, 51.35812],\n              [124.76452, 51.38726],\n              [124.783614, 51.392115],\n              [124.864302, 51.37979],\n              [124.885244, 51.40817],\n              [124.942527, 51.447349],\n              [124.917889, 51.474196],\n              [124.928976, 51.498419],\n              [124.983795, 51.508478],\n              [125.004737, 51.529332],\n              [125.047236, 51.529704],\n              [125.073106, 51.553526],\n              [125.060171, 51.59667],\n              [125.098975, 51.658341],\n              [125.12854, 51.659083],\n              [125.130388, 51.635317],\n              [125.175968, 51.639403],\n              [125.214772, 51.627888],\n              [125.228938, 51.640517],\n              [125.289301, 51.633831],\n              [125.316402, 51.610052],\n              [125.35151, 51.623801],\n              [125.38046, 51.585516],\n              [125.424807, 51.562827],\n              [125.528285, 51.488359],\n              [125.559082, 51.461521],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 210000,\n        name: '辽宁省',\n        center: [123.429096, 41.796767],\n        centroid: [122.605251, 41.299975],\n        childrenNum: 14,\n        level: 'province',\n        subFeatureIndex: 5,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [119.557985, 42.289068],\n              [119.557985, 42.289068],\n              [119.609108, 42.276671],\n              [119.617115, 42.252755],\n              [119.679941, 42.240793],\n              [119.744615, 42.211545],\n              [119.841933, 42.215534],\n              [119.854868, 42.170308],\n              [119.837622, 42.135257],\n              [119.845629, 42.097079],\n              [119.87581, 42.077982],\n              [119.897368, 42.030879],\n              [119.921389, 42.014429],\n              [119.924469, 41.98908],\n              [119.950954, 41.974399],\n              [119.954034, 41.923212],\n              [119.989759, 41.899163],\n              [120.023019, 41.816701],\n              [120.041498, 41.818932],\n              [120.050737, 41.776101],\n              [120.024867, 41.737707],\n              [120.035954, 41.708226],\n              [120.096316, 41.697056],\n              [120.1382, 41.729221],\n              [120.127113, 41.77253],\n              [120.183164, 41.826513],\n              [120.188707, 41.848361],\n              [120.215808, 41.853265],\n              [120.251533, 41.884016],\n              [120.286641, 41.880005],\n              [120.290337, 41.897381],\n              [120.260156, 41.904062],\n              [120.271859, 41.925439],\n              [120.318054, 41.93746],\n              [120.309431, 41.951704],\n              [120.373489, 41.994862],\n              [120.399358, 41.984631],\n              [120.456641, 42.016208],\n              [120.450481, 42.057101],\n              [120.493597, 42.073539],\n              [120.466496, 42.105516],\n              [120.56751, 42.152119],\n              [120.58414, 42.167203],\n              [120.624792, 42.154338],\n              [120.72211, 42.203565],\n              [120.745516, 42.223512],\n              [120.79048, 42.218636],\n              [120.820661, 42.227943],\n              [120.8299, 42.252755],\n              [120.883487, 42.242565],\n              [120.883487, 42.269585],\n              [120.883487, 42.269585],\n              [120.933994, 42.27977],\n              [120.992508, 42.264714],\n              [121.028848, 42.242565],\n              [121.070732, 42.254083],\n              [121.087978, 42.278885],\n              [121.120623, 42.280656],\n              [121.133558, 42.300135],\n              [121.184681, 42.333324],\n              [121.218558, 42.371802],\n              [121.285079, 42.387717],\n              [121.314644, 42.42837],\n              [121.304789, 42.435879],\n              [121.386093, 42.474294],\n              [121.434752, 42.475176],\n              [121.4791, 42.49636],\n              [121.506201, 42.482239],\n              [121.570875, 42.487093],\n              [121.607831, 42.516214],\n              [121.604136, 42.495037],\n              [121.66573, 42.437204],\n              [121.69899, 42.438529],\n              [121.747649, 42.484887],\n              [121.803084, 42.514891],\n              [121.817867, 42.504303],\n              [121.831417, 42.533856],\n              [121.844352, 42.522389],\n              [121.889931, 42.556784],\n              [121.921344, 42.605697],\n              [121.915801, 42.656332],\n              [121.94167, 42.666014],\n              [121.939207, 42.688453],\n              [122.018663, 42.69901],\n              [122.062394, 42.723635],\n              [122.072865, 42.710444],\n              [122.160945, 42.684934],\n              [122.204676, 42.685374],\n              [122.204676, 42.732867],\n              [122.261343, 42.695931],\n              [122.324785, 42.684934],\n              [122.338951, 42.669975],\n              [122.396234, 42.684054],\n              [122.396234, 42.707366],\n              [122.460907, 42.755282],\n              [122.439349, 42.770221],\n              [122.371596, 42.776371],\n              [122.35127, 42.830378],\n              [122.436886, 42.843105],\n              [122.556378, 42.827745],\n              [122.576088, 42.819405],\n              [122.580399, 42.789987],\n              [122.624747, 42.773296],\n              [122.653696, 42.78252],\n              [122.733152, 42.786034],\n              [122.73808, 42.77066],\n              [122.786123, 42.757479],\n              [122.848949, 42.712203],\n              [122.848949, 42.712203],\n              [122.883442, 42.751766],\n              [122.883442, 42.751766],\n              [122.887137, 42.770221],\n              [122.925941, 42.772417],\n              [122.945651, 42.753524],\n              [122.980144, 42.777689],\n              [123.058368, 42.768903],\n              [123.118114, 42.801405],\n              [123.227752, 42.831695],\n              [123.169853, 42.859777],\n              [123.188947, 42.895739],\n              [123.18402, 42.925983],\n              [123.259165, 42.993431],\n              [123.323222, 43.000872],\n              [123.434707, 43.027565],\n              [123.474743, 43.042438],\n              [123.536337, 43.007],\n              [123.572678, 43.003498],\n              [123.580685, 43.036314],\n              [123.631192, 43.088346],\n              [123.636119, 43.141644],\n              [123.666916, 43.179623],\n              [123.645974, 43.208855],\n              [123.676771, 43.223684],\n              [123.664453, 43.264663],\n              [123.698329, 43.272071],\n              [123.703873, 43.37047],\n              [123.710032, 43.417001],\n              [123.749452, 43.439167],\n              [123.747604, 43.472184],\n              [123.79688, 43.489988],\n              [123.857858, 43.459153],\n              [123.857858, 43.459153],\n              [123.852314, 43.406133],\n              [123.881263, 43.392218],\n              [123.881263, 43.392218],\n              [123.896046, 43.361333],\n              [123.964415, 43.34088],\n              [124.032784, 43.280786],\n              [124.099306, 43.292983],\n              [124.117168, 43.2773],\n              [124.114088, 43.247229],\n              [124.168291, 43.244177],\n              [124.215102, 43.255947],\n              [124.228653, 43.235022],\n              [124.27608, 43.233278],\n              [124.287167, 43.207983],\n              [124.273617, 43.17875],\n              [124.366007, 43.121554],\n              [124.425754, 43.076107],\n              [124.333363, 42.997371],\n              [124.369703, 42.972854],\n              [124.42329, 42.975482],\n              [124.442384, 42.958841],\n              [124.431913, 42.930803],\n              [124.38079, 42.912835],\n              [124.371551, 42.880831],\n              [124.435609, 42.880831],\n              [124.466406, 42.847054],\n              [124.586514, 42.905384],\n              [124.607456, 42.937376],\n              [124.632093, 42.949642],\n              [124.635173, 42.972854],\n              [124.658579, 42.972854],\n              [124.677673, 43.002185],\n              [124.686912, 43.051185],\n              [124.719557, 43.069987],\n              [124.755281, 43.074359],\n              [124.785462, 43.117185],\n              [124.882781, 43.13422],\n              [124.88894, 43.074796],\n              [124.840897, 43.032377],\n              [124.869846, 42.988178],\n              [124.87231, 42.962344],\n              [124.84952, 42.882585],\n              [124.856911, 42.824234],\n              [124.874157, 42.789987],\n              [124.897563, 42.787791],\n              [124.92836, 42.819844],\n              [124.975171, 42.802722],\n              [124.996729, 42.745174],\n              [124.968396, 42.722756],\n              [124.99057, 42.677455],\n              [125.014592, 42.666014],\n              [125.010896, 42.63212],\n              [125.038613, 42.615387],\n              [125.097127, 42.622433],\n              [125.082961, 42.591159],\n              [125.089736, 42.567803],\n              [125.066946, 42.534738],\n              [125.090968, 42.515773],\n              [125.068794, 42.499449],\n              [125.105135, 42.490624],\n              [125.150098, 42.458842],\n              [125.140243, 42.44692],\n              [125.186439, 42.427928],\n              [125.185823, 42.38197],\n              [125.203685, 42.366938],\n              [125.167345, 42.351903],\n              [125.175352, 42.308102],\n              [125.224011, 42.30102],\n              [125.264047, 42.312528],\n              [125.299156, 42.289953],\n              [125.27575, 42.266928],\n              [125.27575, 42.231045],\n              [125.312706, 42.219966],\n              [125.280677, 42.175187],\n              [125.312706, 42.197359],\n              [125.305931, 42.146351],\n              [125.357054, 42.145464],\n              [125.368141, 42.182726],\n              [125.41372, 42.156112],\n              [125.458068, 42.160105],\n              [125.458068, 42.160105],\n              [125.490097, 42.136145],\n              [125.446365, 42.098411],\n              [125.414336, 42.101964],\n              [125.416184, 42.063766],\n              [125.363213, 42.017097],\n              [125.369989, 42.002868],\n              [125.29854, 41.974399],\n              [125.291764, 41.958825],\n              [125.35151, 41.92811],\n              [125.307779, 41.924548],\n              [125.294844, 41.822945],\n              [125.319482, 41.776993],\n              [125.319482, 41.776993],\n              [125.323177, 41.771191],\n              [125.323177, 41.771191],\n              [125.336112, 41.768067],\n              [125.336112, 41.768067],\n              [125.332416, 41.711354],\n              [125.317018, 41.676944],\n              [125.344119, 41.672474],\n              [125.412488, 41.691246],\n              [125.446981, 41.67605],\n              [125.461148, 41.642516],\n              [125.450061, 41.597777],\n              [125.479626, 41.544946],\n              [125.507343, 41.534195],\n              [125.493176, 41.509103],\n              [125.533212, 41.479069],\n              [125.534444, 41.428833],\n              [125.547995, 41.401006],\n              [125.581256, 41.396517],\n              [125.589879, 41.359245],\n              [125.610205, 41.365084],\n              [125.637306, 41.34442],\n              [125.62006, 41.318355],\n              [125.642234, 41.296327],\n              [125.646545, 41.264396],\n              [125.685349, 41.273842],\n              [125.695205, 41.244599],\n              [125.749407, 41.245499],\n              [125.758646, 41.232449],\n              [125.73832, 41.178418],\n              [125.791291, 41.167607],\n              [125.759878, 41.132908],\n              [125.734009, 41.125695],\n              [125.712451, 41.095485],\n              [125.739552, 41.08917],\n              [125.726617, 41.055332],\n              [125.684118, 41.021929],\n              [125.674879, 40.974503],\n              [125.650241, 40.970888],\n              [125.635458, 40.94151],\n              [125.589263, 40.931112],\n              [125.584335, 40.891764],\n              [125.652089, 40.91619],\n              [125.687813, 40.897645],\n              [125.707523, 40.866877],\n              [125.648393, 40.826133],\n              [125.641002, 40.798503],\n              [125.67611, 40.788082],\n              [125.685349, 40.769048],\n              [125.61698, 40.763609],\n              [125.585567, 40.788535],\n              [125.551075, 40.761796],\n              [125.544915, 40.729605],\n              [125.49564, 40.728697],\n              [125.459916, 40.707379],\n              [125.453756, 40.676522],\n              [125.418648, 40.673345],\n              [125.422343, 40.635661],\n              [125.375532, 40.658365],\n              [125.329337, 40.643835],\n              [125.305315, 40.661089],\n              [125.279445, 40.655187],\n              [125.262815, 40.620218],\n              [125.181511, 40.611132],\n              [125.113758, 40.569322],\n              [125.076801, 40.562048],\n              [125.015823, 40.533853],\n              [125.004737, 40.496091],\n              [125.042925, 40.483802],\n              [125.044157, 40.466503],\n              [124.985642, 40.475153],\n              [124.945606, 40.45603],\n              [124.913578, 40.481981],\n              [124.834121, 40.423235],\n              [124.739267, 40.371733],\n              [124.722636, 40.321561],\n              [124.62655, 40.291896],\n              [124.513833, 40.22019],\n              [124.490427, 40.18408],\n              [124.457782, 40.177679],\n              [124.428217, 40.144291],\n              [124.346913, 40.079756],\n              [124.336442, 40.049985],\n              [124.372167, 40.021576],\n              [124.349377, 39.989029],\n              [124.288399, 39.962888],\n              [124.286551, 39.931689],\n              [124.241588, 39.928477],\n              [124.216334, 39.89313],\n              [124.214486, 39.865116],\n              [124.173218, 39.841225],\n              [124.151045, 39.74558],\n              [124.099306, 39.777323],\n              [124.103001, 39.823302],\n              [124.002603, 39.800316],\n              [123.95148, 39.817786],\n              [123.812278, 39.831115],\n              [123.795032, 39.822842],\n              [123.687858, 39.808132],\n              [123.674924, 39.826979],\n              [123.645358, 39.823761],\n              [123.642279, 39.796178],\n              [123.612714, 39.775023],\n              [123.579453, 39.781002],\n              [123.546808, 39.756163],\n              [123.536337, 39.788361],\n              [123.484598, 39.763063],\n              [123.477823, 39.74696],\n              [123.392823, 39.723949],\n              [123.388512, 39.74742],\n              [123.350939, 39.750641],\n              [123.274563, 39.753862],\n              [123.270251, 39.714743],\n              [123.286882, 39.704154],\n              [123.253005, 39.689879],\n              [123.215433, 39.696786],\n              [123.212969, 39.665928],\n              [123.166774, 39.674219],\n              [123.146448, 39.647037],\n              [123.103332, 39.676983],\n              [123.010941, 39.655331],\n              [123.021412, 39.64335],\n              [122.978912, 39.616156],\n              [122.972753, 39.594946],\n              [122.941956, 39.604629],\n              [122.860652, 39.604629],\n              [122.847101, 39.581571],\n              [122.808913, 39.559889],\n              [122.682645, 39.514658],\n              [122.649385, 39.516505],\n              [122.637066, 39.488799],\n              [122.581631, 39.464316],\n              [122.532972, 39.419947],\n              [122.489856, 39.403764],\n              [122.412864, 39.411625],\n              [122.366053, 39.370461],\n              [122.30877, 39.346399],\n              [122.274893, 39.322329],\n              [122.242865, 39.267678],\n              [122.160329, 39.238019],\n              [122.117213, 39.213911],\n              [122.123988, 39.172631],\n              [122.167104, 39.158711],\n              [122.127684, 39.144788],\n              [122.088264, 39.112291],\n              [122.048228, 39.101146],\n              [122.071634, 39.074204],\n              [122.061778, 39.060264],\n              [122.013735, 39.073275],\n              [121.963228, 39.030053],\n              [121.913953, 39.0598],\n              [121.929352, 39.024939],\n              [121.864062, 39.037026],\n              [121.855439, 39.025869],\n              [121.905946, 38.997503],\n              [121.920728, 38.969591],\n              [121.863446, 38.942598],\n              [121.804932, 38.970986],\n              [121.790149, 39.022614],\n              [121.756889, 39.025869],\n              [121.73841, 38.998898],\n              [121.671273, 39.010059],\n              [121.66265, 38.966333],\n              [121.618918, 38.950046],\n              [121.655874, 38.946788],\n              [121.719316, 38.920252],\n              [121.708845, 38.872744],\n              [121.675585, 38.86156],\n              [121.618302, 38.862492],\n              [121.564715, 38.874607],\n              [121.509897, 38.817743],\n              [121.399028, 38.812613],\n              [121.359608, 38.822406],\n              [121.302325, 38.78976],\n              [121.259825, 38.786495],\n              [121.198848, 38.721623],\n              [121.13787, 38.723023],\n              [121.112, 38.776231],\n              [121.12863, 38.799089],\n              [121.110768, 38.862026],\n              [121.129862, 38.879266],\n              [121.094138, 38.894173],\n              [121.08921, 38.922115],\n              [121.128014, 38.958888],\n              [121.180369, 38.959819],\n              [121.204391, 38.941202],\n              [121.275224, 38.971917],\n              [121.341129, 38.980757],\n              [121.317108, 39.012384],\n              [121.370695, 39.060264],\n              [121.431057, 39.027263],\n              [121.508049, 39.034237],\n              [121.581962, 39.075598],\n              [121.599208, 39.098824],\n              [121.562252, 39.127149],\n              [121.590585, 39.154999],\n              [121.642324, 39.11972],\n              [121.605983, 39.080708],\n              [121.631853, 39.077921],\n              [121.68236, 39.117863],\n              [121.639244, 39.166136],\n              [121.604136, 39.166136],\n              [121.586889, 39.193506],\n              [121.591201, 39.228748],\n              [121.631237, 39.22643],\n              [121.589353, 39.263044],\n              [121.623846, 39.285745],\n              [121.672505, 39.275554],\n              [121.667577, 39.310754],\n              [121.70207, 39.326496],\n              [121.72486, 39.364447],\n              [121.621382, 39.326033],\n              [121.562252, 39.322792],\n              [121.51544, 39.286672],\n              [121.464933, 39.30103],\n              [121.466781, 39.320014],\n              [121.435984, 39.329736],\n              [121.432904, 39.357506],\n              [121.35468, 39.377863],\n              [121.324499, 39.371386],\n              [121.307869, 39.391277],\n              [121.270296, 39.374162],\n              [121.245659, 39.389427],\n              [121.246891, 39.421334],\n              [121.304173, 39.48187],\n              [121.286927, 39.507271],\n              [121.268449, 39.482794],\n              [121.224717, 39.519275],\n              [121.226565, 39.554814],\n              [121.263521, 39.589873],\n              [121.299246, 39.606013],\n              [121.325731, 39.601402],\n              [121.450151, 39.624914],\n              [121.451999, 39.658095],\n              [121.482796, 39.659478],\n              [121.502506, 39.703233],\n              [121.45939, 39.747881],\n              [121.487107, 39.760303],\n              [121.472325, 39.802155],\n              [121.530223, 39.851334],\n              [121.541926, 39.874302],\n              [121.572107, 39.865116],\n              [121.626925, 39.882569],\n              [121.699606, 39.937196],\n              [121.76428, 39.933525],\n              [121.779062, 39.942702],\n              [121.796309, 39.999116],\n              [121.824642, 40.025701],\n              [121.910257, 40.072887],\n              [121.956453, 40.133311],\n              [121.995257, 40.128277],\n              [122.003264, 40.172191],\n              [121.98109, 40.173106],\n              [121.950293, 40.204194],\n              [121.940438, 40.242121],\n              [122.02667, 40.244862],\n              [122.039605, 40.260391],\n              [122.040221, 40.322017],\n              [122.079641, 40.332967],\n              [122.110438, 40.315629],\n              [122.138155, 40.338897],\n              [122.111054, 40.348932],\n              [122.135691, 40.374925],\n              [122.152322, 40.357597],\n              [122.198517, 40.382219],\n              [122.186814, 40.422779],\n              [122.229314, 40.424146],\n              [122.250872, 40.445555],\n              [122.241633, 40.465137],\n              [122.278589, 40.482891],\n              [122.244712, 40.485167],\n              [122.245944, 40.519752],\n              [122.150474, 40.588413],\n              [122.133843, 40.614313],\n              [122.148626, 40.671983],\n              [122.122141, 40.657457],\n              [122.06609, 40.64883],\n              [122.025438, 40.674253],\n              [121.951525, 40.680607],\n              [121.936127, 40.711462],\n              [121.934279, 40.79805],\n              [121.883772, 40.802127],\n              [121.84312, 40.831567],\n              [121.816019, 40.894931],\n              [121.778446, 40.886787],\n              [121.735331, 40.862351],\n              [121.732251, 40.846961],\n              [121.682976, 40.829755],\n              [121.626309, 40.844244],\n              [121.576418, 40.837906],\n              [121.553013, 40.817528],\n              [121.55486, 40.849677],\n              [121.526527, 40.85194],\n              [121.499426, 40.880001],\n              [121.440296, 40.88181],\n              [121.440912, 40.84017],\n              [121.342977, 40.841528],\n              [121.290622, 40.851488],\n              [121.274608, 40.886335],\n              [121.251202, 40.880453],\n              [121.23642, 40.851035],\n              [121.177906, 40.873665],\n              [121.126167, 40.86914],\n              [121.076892, 40.815716],\n              [121.086747, 40.79805],\n              [121.010986, 40.784457],\n              [121.00729, 40.807563],\n              [120.971566, 40.805751],\n              [120.994356, 40.790801],\n              [120.980189, 40.766329],\n              [120.991276, 40.744115],\n              [121.028848, 40.746382],\n              [121.032544, 40.709193],\n              [120.983269, 40.712822],\n              [120.945081, 40.687868],\n              [120.861313, 40.684692],\n              [120.8299, 40.671076],\n              [120.837291, 40.644289],\n              [120.822509, 40.59432],\n              [120.72827, 40.539311],\n              [120.72211, 40.515657],\n              [120.693777, 40.505647],\n              [120.666676, 40.467413],\n              [120.615553, 40.453298],\n              [120.617401, 40.41959],\n              [120.596459, 40.399084],\n              [120.602618, 40.36079],\n              [120.537329, 40.325211],\n              [120.52193, 40.304676],\n              [120.523778, 40.256737],\n              [120.491749, 40.20008],\n              [120.451097, 40.177679],\n              [120.371641, 40.174478],\n              [120.273091, 40.127362],\n              [120.161606, 40.096239],\n              [120.134504, 40.074719],\n              [120.092005, 40.077466],\n              [119.947259, 40.040364],\n              [119.941715, 40.009659],\n              [119.91831, 39.989946],\n              [119.854252, 39.98857],\n              [119.845629, 40.000949],\n              [119.845629, 40.000949],\n              [119.854252, 40.033033],\n              [119.81668, 40.050443],\n              [119.81668, 40.050443],\n              [119.787115, 40.041739],\n              [119.787115, 40.041739],\n              [119.783419, 40.046778],\n              [119.783419, 40.046778],\n              [119.772332, 40.08113],\n              [119.736608, 40.104936],\n              [119.760629, 40.136056],\n              [119.745847, 40.207851],\n              [119.716898, 40.195966],\n              [119.671934, 40.23938],\n              [119.639289, 40.231613],\n              [119.639289, 40.231613],\n              [119.651608, 40.271808],\n              [119.598021, 40.334335],\n              [119.586934, 40.375381],\n              [119.604797, 40.455119],\n              [119.553674, 40.502007],\n              [119.572152, 40.523846],\n              [119.559217, 40.547952],\n              [119.503783, 40.553864],\n              [119.477913, 40.533399],\n              [119.429254, 40.540221],\n              [119.30237, 40.530215],\n              [119.256175, 40.543404],\n              [119.22045, 40.569322],\n              [119.230921, 40.603863],\n              [119.177951, 40.609315],\n              [119.162552, 40.600228],\n              [119.14469, 40.632482],\n              [119.184726, 40.680153],\n              [119.165632, 40.69286],\n              [119.115125, 40.666536],\n              [119.054763, 40.664721],\n              [119.028277, 40.692406],\n              [119.011031, 40.687414],\n              [118.96114, 40.72008],\n              [118.950053, 40.747743],\n              [118.895234, 40.75409],\n              [118.907553, 40.775394],\n              [118.878604, 40.783098],\n              [118.845959, 40.822057],\n              [118.873061, 40.847866],\n              [118.90201, 40.960946],\n              [118.916792, 40.969984],\n              [118.977154, 40.959138],\n              [118.977154, 40.959138],\n              [119.00056, 40.967273],\n              [119.013495, 41.007479],\n              [118.951901, 41.018317],\n              [118.937118, 41.052625],\n              [118.964836, 41.079246],\n              [119.037516, 41.067516],\n              [119.080632, 41.095936],\n              [119.081248, 41.131555],\n              [119.126212, 41.138767],\n              [119.189038, 41.198234],\n              [119.169943, 41.222996],\n              [119.204436, 41.222546],\n              [119.209364, 41.244599],\n              [119.2494, 41.279689],\n              [119.239545, 41.31431],\n              [119.296211, 41.325097],\n              [119.330704, 41.385293],\n              [119.309762, 41.405944],\n              [119.376283, 41.422102],\n              [119.378131, 41.459787],\n              [119.401537, 41.472343],\n              [119.406464, 41.503276],\n              [119.361501, 41.545841],\n              [119.362116, 41.566442],\n              [119.420015, 41.567785],\n              [119.415703, 41.590169],\n              [119.342406, 41.617914],\n              [119.307914, 41.657273],\n              [119.299907, 41.705545],\n              [119.319001, 41.727435],\n              [119.317769, 41.764049],\n              [119.292515, 41.790827],\n              [119.312841, 41.80555],\n              [119.334399, 41.871539],\n              [119.323312, 41.889807],\n              [119.340559, 41.926774],\n              [119.323928, 41.937014],\n              [119.324544, 41.969505],\n              [119.375667, 42.023322],\n              [119.384906, 42.08953],\n              [119.352261, 42.118391],\n              [119.314689, 42.119723],\n              [119.30853, 42.147239],\n              [119.286972, 42.154781],\n              [119.277733, 42.185387],\n              [119.237697, 42.200905],\n              [119.274037, 42.239021],\n              [119.280197, 42.260728],\n              [119.34795, 42.300578],\n              [119.432949, 42.317396],\n              [119.482841, 42.347037],\n              [119.502551, 42.388159],\n              [119.540123, 42.363401],\n              [119.572152, 42.359421],\n              [119.571536, 42.335536],\n              [119.539507, 42.297922],\n              [119.557985, 42.289068],\n            ],\n          ],\n          [\n            [\n              [122.673406, 39.269531],\n              [122.67895, 39.268605],\n              [122.57732, 39.269994],\n              [122.497248, 39.300566],\n              [122.540979, 39.308439],\n              [122.593334, 39.278334],\n              [122.641993, 39.288061],\n              [122.673406, 39.269531],\n            ],\n          ],\n          [\n            [\n              [122.335256, 39.149894],\n              [122.316161, 39.185157],\n              [122.343263, 39.203246],\n              [122.393154, 39.213448],\n              [122.383299, 39.190723],\n              [122.398697, 39.16196],\n              [122.366053, 39.174951],\n              [122.335256, 39.149894],\n            ],\n          ],\n          [\n            [\n              [122.691884, 39.23292],\n              [122.691268, 39.23431],\n              [122.690037, 39.234774],\n              [122.628443, 39.231993],\n              [122.635834, 39.241727],\n              [122.740544, 39.248679],\n              [122.751631, 39.229675],\n              [122.696812, 39.206492],\n              [122.691884, 39.23292],\n            ],\n          ],\n          [\n            [\n              [122.759022, 39.025404],\n              [122.732536, 39.013779],\n              [122.704819, 39.044463],\n              [122.725145, 39.048181],\n              [122.759022, 39.025404],\n            ],\n          ],\n          [\n            [\n              [123.022644, 39.546507],\n              [123.036194, 39.533123],\n              [122.995542, 39.495264],\n              [122.945035, 39.520198],\n              [122.96105, 39.551122],\n              [123.022644, 39.546507],\n            ],\n          ],\n          [\n            [\n              [122.503407, 39.241263],\n              [122.547755, 39.229211],\n              [122.502175, 39.224112],\n              [122.503407, 39.241263],\n            ],\n          ],\n          [\n            [\n              [120.786784, 40.473787],\n              [120.774465, 40.48016],\n              [120.805262, 40.525666],\n              [120.8299, 40.516112],\n              [120.83298, 40.491995],\n              [120.786784, 40.473787],\n            ],\n          ],\n          [\n            [\n              [123.086702, 39.426881],\n              [123.054057, 39.457847],\n              [123.090397, 39.450915],\n              [123.086702, 39.426881],\n            ],\n          ],\n          [\n            [\n              [123.160614, 39.025404],\n              [123.143984, 39.038885],\n              [123.145832, 39.091857],\n              [123.20065, 39.077921],\n              [123.205578, 39.057011],\n              [123.160614, 39.025404],\n            ],\n          ],\n          [\n            [\n              [123.716807, 39.74512],\n              [123.719887, 39.763063],\n              [123.756843, 39.754322],\n              [123.716807, 39.74512],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 220000,\n        name: '吉林省',\n        center: [125.3245, 43.886841],\n        centroid: [126.171249, 43.70394],\n        childrenNum: 9,\n        level: 'province',\n        subFeatureIndex: 6,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [126.188572, 41.114875],\n              [126.187956, 41.113072],\n              [126.16763, 41.094583],\n              [126.124514, 41.092327],\n              [126.133753, 41.063906],\n              [126.099877, 41.036376],\n              [126.1085, 41.011995],\n              [126.066, 40.997542],\n              [126.08263, 40.976762],\n              [126.051833, 40.96185],\n              [126.041362, 40.928851],\n              [126.008102, 40.936537],\n              [125.959442, 40.88181],\n              [125.921254, 40.882715],\n              [125.875059, 40.908501],\n              [125.860892, 40.888597],\n              [125.817161, 40.866877],\n              [125.778356, 40.897645],\n              [125.707523, 40.866877],\n              [125.687813, 40.897645],\n              [125.652089, 40.91619],\n              [125.584335, 40.891764],\n              [125.589263, 40.931112],\n              [125.635458, 40.94151],\n              [125.650241, 40.970888],\n              [125.674879, 40.974503],\n              [125.684118, 41.021929],\n              [125.726617, 41.055332],\n              [125.739552, 41.08917],\n              [125.712451, 41.095485],\n              [125.734009, 41.125695],\n              [125.759878, 41.132908],\n              [125.791291, 41.167607],\n              [125.73832, 41.178418],\n              [125.758646, 41.232449],\n              [125.749407, 41.245499],\n              [125.695205, 41.244599],\n              [125.685349, 41.273842],\n              [125.646545, 41.264396],\n              [125.642234, 41.296327],\n              [125.62006, 41.318355],\n              [125.637306, 41.34442],\n              [125.610205, 41.365084],\n              [125.589879, 41.359245],\n              [125.581256, 41.396517],\n              [125.547995, 41.401006],\n              [125.534444, 41.428833],\n              [125.533212, 41.479069],\n              [125.493176, 41.509103],\n              [125.507343, 41.534195],\n              [125.479626, 41.544946],\n              [125.450061, 41.597777],\n              [125.461148, 41.642516],\n              [125.446981, 41.67605],\n              [125.412488, 41.691246],\n              [125.344119, 41.672474],\n              [125.317018, 41.676944],\n              [125.332416, 41.711354],\n              [125.336112, 41.768067],\n              [125.336112, 41.768067],\n              [125.323177, 41.771191],\n              [125.323177, 41.771191],\n              [125.319482, 41.776993],\n              [125.319482, 41.776993],\n              [125.294844, 41.822945],\n              [125.307779, 41.924548],\n              [125.35151, 41.92811],\n              [125.291764, 41.958825],\n              [125.29854, 41.974399],\n              [125.369989, 42.002868],\n              [125.363213, 42.017097],\n              [125.416184, 42.063766],\n              [125.414336, 42.101964],\n              [125.446365, 42.098411],\n              [125.490097, 42.136145],\n              [125.458068, 42.160105],\n              [125.458068, 42.160105],\n              [125.41372, 42.156112],\n              [125.368141, 42.182726],\n              [125.357054, 42.145464],\n              [125.305931, 42.146351],\n              [125.312706, 42.197359],\n              [125.280677, 42.175187],\n              [125.312706, 42.219966],\n              [125.27575, 42.231045],\n              [125.27575, 42.266928],\n              [125.299156, 42.289953],\n              [125.264047, 42.312528],\n              [125.224011, 42.30102],\n              [125.175352, 42.308102],\n              [125.167345, 42.351903],\n              [125.203685, 42.366938],\n              [125.185823, 42.38197],\n              [125.186439, 42.427928],\n              [125.140243, 42.44692],\n              [125.150098, 42.458842],\n              [125.105135, 42.490624],\n              [125.068794, 42.499449],\n              [125.090968, 42.515773],\n              [125.066946, 42.534738],\n              [125.089736, 42.567803],\n              [125.082961, 42.591159],\n              [125.097127, 42.622433],\n              [125.038613, 42.615387],\n              [125.010896, 42.63212],\n              [125.014592, 42.666014],\n              [124.99057, 42.677455],\n              [124.968396, 42.722756],\n              [124.996729, 42.745174],\n              [124.975171, 42.802722],\n              [124.92836, 42.819844],\n              [124.897563, 42.787791],\n              [124.874157, 42.789987],\n              [124.856911, 42.824234],\n              [124.84952, 42.882585],\n              [124.87231, 42.962344],\n              [124.869846, 42.988178],\n              [124.840897, 43.032377],\n              [124.88894, 43.074796],\n              [124.882781, 43.13422],\n              [124.785462, 43.117185],\n              [124.755281, 43.074359],\n              [124.719557, 43.069987],\n              [124.686912, 43.051185],\n              [124.677673, 43.002185],\n              [124.658579, 42.972854],\n              [124.635173, 42.972854],\n              [124.632093, 42.949642],\n              [124.607456, 42.937376],\n              [124.586514, 42.905384],\n              [124.466406, 42.847054],\n              [124.435609, 42.880831],\n              [124.371551, 42.880831],\n              [124.38079, 42.912835],\n              [124.431913, 42.930803],\n              [124.442384, 42.958841],\n              [124.42329, 42.975482],\n              [124.369703, 42.972854],\n              [124.333363, 42.997371],\n              [124.425754, 43.076107],\n              [124.366007, 43.121554],\n              [124.273617, 43.17875],\n              [124.287167, 43.207983],\n              [124.27608, 43.233278],\n              [124.228653, 43.235022],\n              [124.215102, 43.255947],\n              [124.168291, 43.244177],\n              [124.114088, 43.247229],\n              [124.117168, 43.2773],\n              [124.099306, 43.292983],\n              [124.032784, 43.280786],\n              [123.964415, 43.34088],\n              [123.896046, 43.361333],\n              [123.881263, 43.392218],\n              [123.881263, 43.392218],\n              [123.852314, 43.406133],\n              [123.857858, 43.459153],\n              [123.857858, 43.459153],\n              [123.79688, 43.489988],\n              [123.747604, 43.472184],\n              [123.749452, 43.439167],\n              [123.710032, 43.417001],\n              [123.703873, 43.37047],\n              [123.608402, 43.366119],\n              [123.54496, 43.415262],\n              [123.519707, 43.402219],\n              [123.486446, 43.44525],\n              [123.442098, 43.437863],\n              [123.419925, 43.410046],\n              [123.382968, 43.469143],\n              [123.36449, 43.483475],\n              [123.315831, 43.492159],\n              [123.329998, 43.519071],\n              [123.304744, 43.550742],\n              [123.360179, 43.567223],\n              [123.452569, 43.545971],\n              [123.452569, 43.545971],\n              [123.461193, 43.568523],\n              [123.434091, 43.575461],\n              [123.421157, 43.598435],\n              [123.5117, 43.592801],\n              [123.510468, 43.624867],\n              [123.536953, 43.633964],\n              [123.518475, 43.682024],\n              [123.520323, 43.708419],\n              [123.48275, 43.737396],\n              [123.498149, 43.771114],\n              [123.461809, 43.822518],\n              [123.467968, 43.853599],\n              [123.397135, 43.954929],\n              [123.37065, 43.970006],\n              [123.400831, 43.979481],\n              [123.365722, 44.013922],\n              [123.331229, 44.028984],\n              [123.32815, 44.084035],\n              [123.350939, 44.092633],\n              [123.362642, 44.133452],\n              [123.386664, 44.161794],\n              [123.323838, 44.179823],\n              [123.286882, 44.211574],\n              [123.277027, 44.25274],\n              [123.196955, 44.34483],\n              [123.128585, 44.367081],\n              [123.114419, 44.40258],\n              [123.142136, 44.428228],\n              [123.125506, 44.455147],\n              [123.137209, 44.486322],\n              [123.12489, 44.5098],\n              [123.06576, 44.505959],\n              [123.025108, 44.493153],\n              [122.85634, 44.398304],\n              [122.76087, 44.369648],\n              [122.702971, 44.319145],\n              [122.675254, 44.285738],\n              [122.641993, 44.283595],\n              [122.515726, 44.251025],\n              [122.483081, 44.236877],\n              [122.319241, 44.233018],\n              [122.271198, 44.255741],\n              [122.291524, 44.310152],\n              [122.294604, 44.41113],\n              [122.28598, 44.477783],\n              [122.228082, 44.480345],\n              [122.224386, 44.526016],\n              [122.196053, 44.559712],\n              [122.13138, 44.577619],\n              [122.113517, 44.615546],\n              [122.103046, 44.67388],\n              [122.117213, 44.701961],\n              [122.161561, 44.728328],\n              [122.152322, 44.744057],\n              [122.10243, 44.736406],\n              [122.110438, 44.767856],\n              [122.142467, 44.753833],\n              [122.168952, 44.770405],\n              [122.099967, 44.7823],\n              [122.098119, 44.81882],\n              [122.04946, 44.912985],\n              [122.079025, 44.914256],\n              [122.087032, 44.95281],\n              [122.074713, 45.006573],\n              [122.098735, 45.02138],\n              [122.119677, 45.068739],\n              [122.109822, 45.142236],\n              [122.143082, 45.183167],\n              [122.192358, 45.180636],\n              [122.22993, 45.206784],\n              [122.239169, 45.276313],\n              [122.147394, 45.295682],\n              [122.146778, 45.374352],\n              [122.180039, 45.409655],\n              [122.168336, 45.439897],\n              [122.064242, 45.472641],\n              [122.002648, 45.507882],\n              [121.993409, 45.552741],\n              [121.966308, 45.596308],\n              [121.995873, 45.59882],\n              [122.003264, 45.623102],\n              [121.970004, 45.692956],\n              [121.934279, 45.71051],\n              [121.867142, 45.719703],\n              [121.812323, 45.704659],\n              [121.811091, 45.687103],\n              [121.713773, 45.701734],\n              [121.666345, 45.727641],\n              [121.644172, 45.752284],\n              [121.657106, 45.770238],\n              [121.697142, 45.76314],\n              [121.754425, 45.794862],\n              [121.766744, 45.830318],\n              [121.766744, 45.830318],\n              [121.769823, 45.84366],\n              [121.817251, 45.875336],\n              [121.805548, 45.900746],\n              [121.821562, 45.918235],\n              [121.809243, 45.961102],\n              [121.761816, 45.998947],\n              [121.819098, 46.023054],\n              [121.843736, 46.024301],\n              [121.864062, 46.002272],\n              [121.923808, 46.004767],\n              [121.92812, 45.988552],\n              [122.040221, 45.959022],\n              [122.085184, 45.912406],\n              [122.091344, 45.882002],\n              [122.200981, 45.857],\n              [122.236705, 45.831569],\n              [122.253952, 45.7982],\n              [122.301379, 45.813218],\n              [122.337719, 45.859917],\n              [122.372828, 45.856166],\n              [122.362357, 45.917403],\n              [122.446125, 45.916986],\n              [122.496016, 45.85825],\n              [122.504639, 45.786933],\n              [122.522501, 45.786933],\n              [122.556378, 45.82156],\n              [122.603189, 45.778169],\n              [122.640761, 45.771072],\n              [122.650001, 45.731401],\n              [122.671558, 45.70048],\n              [122.741775, 45.705077],\n              [122.751015, 45.735996],\n              [122.792283, 45.766063],\n              [122.752246, 45.834905],\n              [122.772572, 45.856583],\n              [122.80029, 45.856583],\n              [122.828623, 45.912406],\n              [122.792898, 46.073313],\n              [123.04605, 46.099878],\n              [123.070071, 46.123527],\n              [123.112571, 46.130163],\n              [123.102716, 46.172037],\n              [123.127354, 46.174523],\n              [123.128585, 46.210565],\n              [123.178476, 46.248239],\n              [123.248078, 46.273065],\n              [123.286266, 46.250308],\n              [123.320758, 46.254447],\n              [123.357099, 46.232096],\n              [123.357099, 46.232096],\n              [123.430396, 46.243687],\n              [123.452569, 46.233338],\n              [123.499381, 46.259826],\n              [123.569598, 46.223816],\n              [123.569598, 46.223816],\n              [123.604706, 46.251964],\n              [123.673692, 46.258585],\n              [123.726047, 46.255688],\n              [123.775938, 46.263136],\n              [123.84985, 46.302428],\n              [123.896046, 46.303668],\n              [123.917604, 46.25693],\n              [123.936082, 46.286715],\n              [123.960103, 46.288369],\n              [123.952096, 46.256516],\n              [123.979814, 46.228784],\n              [123.956408, 46.206009],\n              [123.971806, 46.170379],\n              [124.001987, 46.166649],\n              [123.991516, 46.143019],\n              [124.01677, 46.118549],\n              [123.99398, 46.101123],\n              [124.015538, 46.088257],\n              [124.009995, 46.057534],\n              [124.034016, 46.045074],\n              [124.040176, 46.01973],\n              [123.989053, 46.011833],\n              [124.011842, 45.981899],\n              [123.973654, 45.973997],\n              [123.968727, 45.936551],\n              [123.996444, 45.906993],\n              [124.061118, 45.886168],\n              [124.067277, 45.840325],\n              [124.03648, 45.83824],\n              [124.064197, 45.802372],\n              [124.001987, 45.770655],\n              [124.014922, 45.749779],\n              [124.054342, 45.751449],\n              [124.098074, 45.722628],\n              [124.10177, 45.700898],\n              [124.13503, 45.690448],\n              [124.122096, 45.669123],\n              [124.147349, 45.665359],\n              [124.128255, 45.641933],\n              [124.162132, 45.616404],\n              [124.226805, 45.633564],\n              [124.238508, 45.591702],\n              [124.273001, 45.584163],\n              [124.264377, 45.555256],\n              [124.287783, 45.539329],\n              [124.348761, 45.546874],\n              [124.369087, 45.512915],\n              [124.352457, 45.496557],\n              [124.374015, 45.45795],\n              [124.398652, 45.440737],\n              [124.480572, 45.456271],\n              [124.507058, 45.424778],\n              [124.544014, 45.411756],\n              [124.579738, 45.424358],\n              [124.575427, 45.451234],\n              [124.625318, 45.437377],\n              [124.690607, 45.452493],\n              [124.729412, 45.444096],\n              [124.776223, 45.468024],\n              [124.792853, 45.436958],\n              [124.839665, 45.455852],\n              [124.886476, 45.442836],\n              [124.884628, 45.495299],\n              [124.911114, 45.535976],\n              [124.936983, 45.53388],\n              [124.961005, 45.495299],\n              [125.025678, 45.493201],\n              [125.0497, 45.428558],\n              [125.08912, 45.420998],\n              [125.06633, 45.39915],\n              [125.097127, 45.38276],\n              [125.137779, 45.409655],\n              [125.189518, 45.39915],\n              [125.248649, 45.417637],\n              [125.301619, 45.402092],\n              [125.319482, 45.422678],\n              [125.361981, 45.392847],\n              [125.398322, 45.416797],\n              [125.434662, 45.462988],\n              [125.424807, 45.485649],\n              [125.480242, 45.486488],\n              [125.497488, 45.469283],\n              [125.583104, 45.491942],\n              [125.61698, 45.517947],\n              [125.660096, 45.507043],\n              [125.687813, 45.514173],\n              [125.711835, 45.477677],\n              [125.712451, 45.389485],\n              [125.695205, 45.352066],\n              [125.726001, 45.336503],\n              [125.761726, 45.291472],\n              [125.815929, 45.264942],\n              [125.823936, 45.237978],\n              [125.849805, 45.23882],\n              [125.915095, 45.196664],\n              [125.957595, 45.201303],\n              [125.992703, 45.192447],\n              [125.998247, 45.162072],\n              [126.047522, 45.170933],\n              [126.091869, 45.149411],\n              [126.142992, 45.147723],\n              [126.166398, 45.13337],\n              [126.225528, 45.154054],\n              [126.235383, 45.140125],\n              [126.285274, 45.162494],\n              [126.293282, 45.180214],\n              [126.356107, 45.185698],\n              [126.402919, 45.222805],\n              [126.519331, 45.248091],\n              [126.540273, 45.23882],\n              [126.569222, 45.252725],\n              [126.644983, 45.225334],\n              [126.640055, 45.214373],\n              [126.685635, 45.187807],\n              [126.732446, 45.187385],\n              [126.787265, 45.159118],\n              [126.792808, 45.135481],\n              [126.85625, 45.145613],\n              [126.96404, 45.132104],\n              [126.970815, 45.070852],\n              [126.984981, 45.067893],\n              [127.018242, 45.024341],\n              [127.050271, 45.004034],\n              [127.092771, 44.94688],\n              [127.073061, 44.907051],\n              [127.021938, 44.898997],\n              [126.999764, 44.87398],\n              [126.984366, 44.823914],\n              [126.9973, 44.764882],\n              [127.041032, 44.712169],\n              [127.030561, 44.673454],\n              [127.044112, 44.653874],\n              [127.041648, 44.591258],\n              [127.049655, 44.566961],\n              [127.089691, 44.593816],\n              [127.094619, 44.615972],\n              [127.138966, 44.607451],\n              [127.182082, 44.644507],\n              [127.228893, 44.642804],\n              [127.214111, 44.624917],\n              [127.261538, 44.61299],\n              [127.275705, 44.640249],\n              [127.392733, 44.632158],\n              [127.557189, 44.575488],\n              [127.570124, 44.55033],\n              [127.536247, 44.522176],\n              [127.485124, 44.528576],\n              [127.465414, 44.516628],\n              [127.463566, 44.484615],\n              [127.50853, 44.437202],\n              [127.486356, 44.410275],\n              [127.579363, 44.310581],\n              [127.623711, 44.278025],\n              [127.59045, 44.227872],\n              [127.626174, 44.187977],\n              [127.641573, 44.193555],\n              [127.681609, 44.166946],\n              [127.712406, 44.199133],\n              [127.735811, 44.11412],\n              [127.729036, 44.09908],\n              [127.783239, 44.071997],\n              [127.808492, 44.086615],\n              [127.846065, 44.081886],\n              [127.862695, 44.062967],\n              [127.912586, 44.064687],\n              [127.950158, 44.088334],\n              [128.042549, 44.103807],\n              [128.091208, 44.133022],\n              [128.088129, 44.158359],\n              [128.060411, 44.168663],\n              [128.09244, 44.181539],\n              [128.104143, 44.230017],\n              [128.064107, 44.251454],\n              [128.101679, 44.293449],\n              [128.065339, 44.307155],\n              [128.049941, 44.349965],\n              [128.074578, 44.370075],\n              [128.094904, 44.354673],\n              [128.137404, 44.357668],\n              [128.172512, 44.34697],\n              [128.211317, 44.431647],\n              [128.228563, 44.445748],\n              [128.293237, 44.467961],\n              [128.295084, 44.480772],\n              [128.372693, 44.514495],\n              [128.397946, 44.483761],\n              [128.427511, 44.473512],\n              [128.463236, 44.431647],\n              [128.457076, 44.409848],\n              [128.481714, 44.375637],\n              [128.475555, 44.346114],\n              [128.446605, 44.339694],\n              [128.472475, 44.320001],\n              [128.453997, 44.257884],\n              [128.471859, 44.247596],\n              [128.450301, 44.203423],\n              [128.471859, 44.157501],\n              [128.529141, 44.112401],\n              [128.574721, 44.047914],\n              [128.584576, 43.990246],\n              [128.610445, 43.960529],\n              [128.64001, 43.948035],\n              [128.636315, 43.891132],\n              [128.696061, 43.903207],\n              [128.729938, 43.889838],\n              [128.760734, 43.857482],\n              [128.719467, 43.816905],\n              [128.739177, 43.806972],\n              [128.760119, 43.755554],\n              [128.729322, 43.736964],\n              [128.768126, 43.732207],\n              [128.78722, 43.686784],\n              [128.821097, 43.637429],\n              [128.834647, 43.587599],\n              [128.878379, 43.539898],\n              [128.949828, 43.553779],\n              [128.962763, 43.53903],\n              [129.013886, 43.522976],\n              [129.037907, 43.540332],\n              [129.093958, 43.547706],\n              [129.145081, 43.570258],\n              [129.169102, 43.561585],\n              [129.23008, 43.593234],\n              [129.232544, 43.635263],\n              [129.217146, 43.648689],\n              [129.214066, 43.695006],\n              [129.232544, 43.709284],\n              [129.211602, 43.784509],\n              [129.254718, 43.819496],\n              [129.289826, 43.797038],\n              [129.30892, 43.812155],\n              [129.348341, 43.798333],\n              [129.406855, 43.819496],\n              [129.417942, 43.843672],\n              [129.449971, 43.850578],\n              [129.467833, 43.874741],\n              [129.529427, 43.870427],\n              [129.650767, 43.873016],\n              [129.699426, 43.8838],\n              [129.743158, 43.876035],\n              [129.739462, 43.895876],\n              [129.780114, 43.892857],\n              [129.802904, 43.964837],\n              [129.868193, 44.012631],\n              [129.881128, 44.000148],\n              [129.907614, 44.023821],\n              [129.951345, 44.027263],\n              [129.979062, 44.015644],\n              [130.017867, 43.961821],\n              [130.022794, 43.917866],\n              [130.009243, 43.889407],\n              [130.027722, 43.851872],\n              [130.079461, 43.835039],\n              [130.110873, 43.852735],\n              [130.116417, 43.878192],\n              [130.143518, 43.878624],\n              [130.153373, 43.915711],\n              [130.208192, 43.948466],\n              [130.262395, 43.949328],\n              [130.27225, 43.981634],\n              [130.307358, 44.002731],\n              [130.319061, 44.03974],\n              [130.365256, 44.044042],\n              [130.364025, 43.992399],\n              [130.338155, 43.963975],\n              [130.381887, 43.910106],\n              [130.368336, 43.894151],\n              [130.386198, 43.85403],\n              [130.362793, 43.844967],\n              [130.381887, 43.817768],\n              [130.382503, 43.777164],\n              [130.423155, 43.745179],\n              [130.394206, 43.703227],\n              [130.412684, 43.652586],\n              [130.437937, 43.646091],\n              [130.488444, 43.65605],\n              [130.501995, 43.636563],\n              [130.57098, 43.626167],\n              [130.57098, 43.626167],\n              [130.630726, 43.622268],\n              [130.623335, 43.589767],\n              [130.665835, 43.583698],\n              [130.671378, 43.565054],\n              [130.727429, 43.560284],\n              [130.776704, 43.52341],\n              [130.822899, 43.503446],\n              [130.841378, 43.454374],\n              [130.864167, 43.437863],\n              [130.907283, 43.434387],\n              [130.959638, 43.48608],\n              [131.026775, 43.508655],\n              [131.142572, 43.425695],\n              [131.175217, 43.444816],\n              [131.201086, 43.442209],\n              [131.234963, 43.475224],\n              [131.294093, 43.470012],\n              [131.304564, 43.502144],\n              [131.31873, 43.499539],\n              [131.314419, 43.461325],\n              [131.295941, 43.441774],\n              [131.314419, 43.392653],\n              [131.275615, 43.369165],\n              [131.269455, 43.297775],\n              [131.255289, 43.265099],\n              [131.206014, 43.237202],\n              [131.201086, 43.203185],\n              [131.218948, 43.191405],\n              [131.207861, 43.1316],\n              [131.173985, 43.111506],\n              [131.171521, 43.06955],\n              [131.120398, 43.068238],\n              [131.102536, 43.021002],\n              [131.11855, 43.007875],\n              [131.115471, 42.975482],\n              [131.151195, 42.968475],\n              [131.14442, 42.939566],\n              [131.114855, 42.915027],\n              [131.034167, 42.929051],\n              [131.017536, 42.915027],\n              [131.045869, 42.866796],\n              [130.981812, 42.857145],\n              [130.949783, 42.876884],\n              [130.890653, 42.852758],\n              [130.845073, 42.881269],\n              [130.801957, 42.879515],\n              [130.784095, 42.842227],\n              [130.75453, 42.845738],\n              [130.719422, 42.831695],\n              [130.708335, 42.846615],\n              [130.665835, 42.847932],\n              [130.603625, 42.819405],\n              [130.562357, 42.815015],\n              [130.532792, 42.787352],\n              [130.46627, 42.772417],\n              [130.40714, 42.731548],\n              [130.425003, 42.706926],\n              [130.464423, 42.688453],\n              [130.529096, 42.703408],\n              [130.592538, 42.671295],\n              [130.633806, 42.603494],\n              [130.622719, 42.573092],\n              [130.570364, 42.557224],\n              [130.565437, 42.506509],\n              [130.599929, 42.486211],\n              [130.600545, 42.450453],\n              [130.645509, 42.426603],\n              [130.581451, 42.435437],\n              [130.585763, 42.485328],\n              [130.558661, 42.495919],\n              [130.556198, 42.523712],\n              [130.520473, 42.583228],\n              [130.522937, 42.622433],\n              [130.482285, 42.626837],\n              [130.459495, 42.588075],\n              [130.476125, 42.570007],\n              [130.435474, 42.553257],\n              [130.423771, 42.574855],\n              [130.44656, 42.607459],\n              [130.420691, 42.617148],\n              [130.388046, 42.603054],\n              [130.373264, 42.630799],\n              [130.333228, 42.64973],\n              [130.290112, 42.702968],\n              [130.257467, 42.710884],\n              [130.242069, 42.738582],\n              [130.245148, 42.799209],\n              [130.258083, 42.860655],\n              [130.277793, 42.892232],\n              [130.258083, 42.90626],\n              [130.21004, 42.902315],\n              [130.17062, 42.912397],\n              [130.136127, 42.90363],\n              [130.10225, 42.922916],\n              [130.127504, 42.932556],\n              [130.120729, 42.954461],\n              [130.144134, 42.976357],\n              [130.10841, 42.989929],\n              [130.072685, 42.971541],\n              [130.027106, 42.9676],\n              [130.002468, 42.981174],\n              [129.963664, 42.978547],\n              [129.954425, 43.010938],\n              [129.897143, 43.001748],\n              [129.903918, 42.968475],\n              [129.868193, 42.97373],\n              [129.856491, 42.951833],\n              [129.874969, 42.923792],\n              [129.846636, 42.918533],\n              [129.835549, 42.866796],\n              [129.816454, 42.851003],\n              [129.810911, 42.795257],\n              [129.78381, 42.762752],\n              [129.767179, 42.707806],\n              [129.796744, 42.681854],\n              [129.754245, 42.645768],\n              [129.786889, 42.615387],\n              [129.746237, 42.58455],\n              [129.749933, 42.546644],\n              [129.738846, 42.500332],\n              [129.748701, 42.471204],\n              [129.704354, 42.427045],\n              [129.643991, 42.43102],\n              [129.624281, 42.459284],\n              [129.60026, 42.41114],\n              [129.546057, 42.361632],\n              [129.49863, 42.412023],\n              [129.452434, 42.441179],\n              [129.400695, 42.449128],\n              [129.368051, 42.425719],\n              [129.376058, 42.447803],\n              [129.344029, 42.451777],\n              [129.356348, 42.427045],\n              [129.331094, 42.429695],\n              [129.30892, 42.403628],\n              [129.326167, 42.389927],\n              [129.240551, 42.376223],\n              [129.231312, 42.356325],\n              [129.260261, 42.335536],\n              [129.208522, 42.293052],\n              [129.231312, 42.283755],\n              [129.215914, 42.265157],\n              [129.183269, 42.262056],\n              [129.181421, 42.242122],\n              [129.209138, 42.237692],\n              [129.215914, 42.208442],\n              [129.166639, 42.188047],\n              [129.113668, 42.140583],\n              [129.048378, 42.137476],\n              [129.039139, 42.107736],\n              [129.008958, 42.09175],\n              [128.971386, 42.097079],\n              [128.954755, 42.083756],\n              [128.952908, 42.025545],\n              [128.898089, 42.016653],\n              [128.795227, 42.042436],\n              [128.779213, 42.033546],\n              [128.737945, 42.050435],\n              [128.70222, 42.02021],\n              [128.658489, 42.018876],\n              [128.637547, 42.035324],\n              [128.60675, 42.02999],\n              [128.598127, 42.007315],\n              [128.49896, 42.000644],\n              [128.466316, 42.020654],\n              [128.405338, 42.018876],\n              [128.294468, 42.026434],\n              [128.090593, 42.022877],\n              [128.033926, 42.000199],\n              [128.106607, 41.949923],\n              [128.115846, 41.896935],\n              [128.104143, 41.843457],\n              [128.112766, 41.793504],\n              [128.147875, 41.78101],\n              [128.163889, 41.721628],\n              [128.208853, 41.688565],\n              [128.248889, 41.681414],\n              [128.30186, 41.627756],\n              [128.317874, 41.575844],\n              [128.301244, 41.544498],\n              [128.238418, 41.497898],\n              [128.243345, 41.477276],\n              [128.203925, 41.410882],\n              [128.169433, 41.404149],\n              [128.114614, 41.364186],\n              [128.090593, 41.374516],\n              [128.110919, 41.393375],\n              [128.040085, 41.393375],\n              [128.000049, 41.442741],\n              [127.991426, 41.421204],\n              [127.970484, 41.438704],\n              [127.93168, 41.444984],\n              [127.909506, 41.42973],\n              [127.882405, 41.448124],\n              [127.86947, 41.4037],\n              [127.854688, 41.420755],\n              [127.780159, 41.427038],\n              [127.684073, 41.422999],\n              [127.636645, 41.413575],\n              [127.618783, 41.432871],\n              [127.563964, 41.432871],\n              [127.547334, 41.477276],\n              [127.526392, 41.467859],\n              [127.465414, 41.479069],\n              [127.459255, 41.461581],\n              [127.419835, 41.460235],\n              [127.405668, 41.478621],\n              [127.360088, 41.479518],\n              [127.360704, 41.466065],\n              [127.296031, 41.486243],\n              [127.253531, 41.486691],\n              [127.28864, 41.501932],\n              [127.241212, 41.520754],\n              [127.188241, 41.527475],\n              [127.164836, 41.542706],\n              [127.14143, 41.530163],\n              [127.125416, 41.566442],\n              [127.178386, 41.600015],\n              [127.135887, 41.600463],\n              [127.127263, 41.622388],\n              [127.093387, 41.629993],\n              [127.103242, 41.647883],\n              [127.037952, 41.676944],\n              [127.057662, 41.703758],\n              [127.050887, 41.744852],\n              [127.005923, 41.749317],\n              [126.979438, 41.776993],\n              [126.940018, 41.773423],\n              [126.952953, 41.804212],\n              [126.931395, 41.812687],\n              [126.861178, 41.768067],\n              [126.83962, 41.727435],\n              [126.809439, 41.749317],\n              [126.8002, 41.702865],\n              [126.723207, 41.753335],\n              [126.694874, 41.751103],\n              [126.690562, 41.728328],\n              [126.724439, 41.710907],\n              [126.688099, 41.674262],\n              [126.644983, 41.661297],\n              [126.608027, 41.669345],\n              [126.592628, 41.624624],\n              [126.564295, 41.608965],\n              [126.582773, 41.563307],\n              [126.559983, 41.548081],\n              [126.497158, 41.406842],\n              [126.539041, 41.366881],\n              [126.524259, 41.349362],\n              [126.497158, 41.374965],\n              [126.437411, 41.353405],\n              [126.373354, 41.289133],\n              [126.35426, 41.244599],\n              [126.332086, 41.236949],\n              [126.295129, 41.171661],\n              [126.188572, 41.114875],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 230000,\n        name: '黑龙江省',\n        center: [126.642464, 45.756967],\n        centroid: [127.693016, 48.04047],\n        childrenNum: 13,\n        level: 'province',\n        subFeatureIndex: 7,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [123.569598, 46.223816],\n              [123.569598, 46.223816],\n              [123.499381, 46.259826],\n              [123.452569, 46.233338],\n              [123.430396, 46.243687],\n              [123.357099, 46.232096],\n              [123.357099, 46.232096],\n              [123.320758, 46.254447],\n              [123.286266, 46.250308],\n              [123.248078, 46.273065],\n              [123.178476, 46.248239],\n              [123.142136, 46.298293],\n              [123.089781, 46.347888],\n              [123.011557, 46.434984],\n              [123.010325, 46.524823],\n              [123.002318, 46.574624],\n              [123.052825, 46.579972],\n              [123.04605, 46.617803],\n              [123.077462, 46.622324],\n              [123.098404, 46.603002],\n              [123.18094, 46.614103],\n              [123.228368, 46.588198],\n              [123.279491, 46.616981],\n              [123.276411, 46.660947],\n              [123.318295, 46.662179],\n              [123.366338, 46.677784],\n              [123.474743, 46.686817],\n              [123.603475, 46.68928],\n              [123.631808, 46.728675],\n              [123.629344, 46.813524],\n              [123.580069, 46.827447],\n              [123.625648, 46.847508],\n              [123.599163, 46.868378],\n              [123.605322, 46.891286],\n              [123.576989, 46.891286],\n              [123.575757, 46.845461],\n              [123.562823, 46.82581],\n              [123.506772, 46.827038],\n              [123.483366, 46.84587],\n              [123.52833, 46.944836],\n              [123.487678, 46.959951],\n              [123.42362, 46.934212],\n              [123.337389, 46.988943],\n              [123.301664, 46.999965],\n              [123.304128, 46.964852],\n              [123.360179, 46.970978],\n              [123.404526, 46.935438],\n              [123.40699, 46.906416],\n              [123.374345, 46.837683],\n              [123.341084, 46.826628],\n              [123.295505, 46.865105],\n              [123.221592, 46.850373],\n              [123.22344, 46.821305],\n              [123.198802, 46.803283],\n              [123.163694, 46.74016],\n              [123.103332, 46.734828],\n              [123.076846, 46.745082],\n              [123.026339, 46.718829],\n              [123.00355, 46.730726],\n              [122.996774, 46.761483],\n              [122.906847, 46.80738],\n              [122.893913, 46.895376],\n              [122.895144, 46.960359],\n              [122.83971, 46.937072],\n              [122.791051, 46.941567],\n              [122.798442, 46.9575],\n              [122.77442, 46.973837],\n              [122.778116, 47.002822],\n              [122.845869, 47.046881],\n              [122.852645, 47.072158],\n              [122.821232, 47.065636],\n              [122.710363, 47.093349],\n              [122.710363, 47.093349],\n              [122.679566, 47.094164],\n              [122.615508, 47.124306],\n              [122.582863, 47.158092],\n              [122.582863, 47.158092],\n              [122.531124, 47.198771],\n              [122.498479, 47.255262],\n              [122.462755, 47.27841],\n              [122.441197, 47.310476],\n              [122.441197, 47.310476],\n              [122.418407, 47.350632],\n              [122.507103, 47.401291],\n              [122.543443, 47.495589],\n              [122.59395, 47.54732],\n              [122.765181, 47.614333],\n              [122.848949, 47.67441],\n              [122.926557, 47.697777],\n              [123.041122, 47.746492],\n              [123.161846, 47.781892],\n              [123.214201, 47.824502],\n              [123.256085, 47.876711],\n              [123.300432, 47.953723],\n              [123.537569, 48.021816],\n              [123.579453, 48.045427],\n              [123.705105, 48.152142],\n              [123.746373, 48.197638],\n              [123.862785, 48.271782],\n              [124.019234, 48.39313],\n              [124.07898, 48.43603],\n              [124.136878, 48.463023],\n              [124.25945, 48.536385],\n              [124.25945, 48.536385],\n              [124.314269, 48.503881],\n              [124.302566, 48.456673],\n              [124.330283, 48.435633],\n              [124.309957, 48.413393],\n              [124.331515, 48.380015],\n              [124.317964, 48.35099],\n              [124.353689, 48.315978],\n              [124.365392, 48.283731],\n              [124.422058, 48.245884],\n              [124.412819, 48.219175],\n              [124.418978, 48.181679],\n              [124.467637, 48.178886],\n              [124.471333, 48.133373],\n              [124.430065, 48.12099],\n              [124.415899, 48.08782],\n              [124.46579, 48.098213],\n              [124.478108, 48.123387],\n              [124.505826, 48.124985],\n              [124.529847, 48.146951],\n              [124.512601, 48.164518],\n              [124.547094, 48.200829],\n              [124.579122, 48.262221],\n              [124.558796, 48.268197],\n              [124.579738, 48.297269],\n              [124.540934, 48.335476],\n              [124.547094, 48.35775],\n              [124.51876, 48.378027],\n              [124.52492, 48.426897],\n              [124.507674, 48.445558],\n              [124.555717, 48.467784],\n              [124.533543, 48.515379],\n              [124.548941, 48.535593],\n              [124.520608, 48.556195],\n              [124.579122, 48.596582],\n              [124.601912, 48.632587],\n              [124.624702, 48.701755],\n              [124.612383, 48.747945],\n              [124.656115, 48.783842],\n              [124.644412, 48.80789],\n              [124.654267, 48.83429],\n              [124.697383, 48.841775],\n              [124.715861, 48.885475],\n              [124.709086, 48.920487],\n              [124.744194, 48.920487],\n              [124.756513, 48.967262],\n              [124.808252, 49.020666],\n              [124.828578, 49.077933],\n              [124.809484, 49.115943],\n              [124.847672, 49.129651],\n              [124.860607, 49.166448],\n              [124.906802, 49.184054],\n              [124.983179, 49.162535],\n              [125.039845, 49.17623],\n              [125.034302, 49.157056],\n              [125.117453, 49.126127],\n              [125.158721, 49.144921],\n              [125.187671, 49.186792],\n              [125.219699, 49.189139],\n              [125.233866, 49.255587],\n              [125.214772, 49.277066],\n              [125.261583, 49.322336],\n              [125.256656, 49.359769],\n              [125.277598, 49.379644],\n              [125.25604, 49.395227],\n              [125.256656, 49.437275],\n              [125.270822, 49.454395],\n              [125.228323, 49.487063],\n              [125.211076, 49.539908],\n              [125.233866, 49.536801],\n              [125.23017, 49.595411],\n              [125.205533, 49.593859],\n              [125.16796, 49.629923],\n              [125.15441, 49.616741],\n              [125.127308, 49.655113],\n              [125.132236, 49.672157],\n              [125.164881, 49.669446],\n              [125.189518, 49.652401],\n              [125.185207, 49.634574],\n              [125.219699, 49.669058],\n              [125.225243, 49.726349],\n              [125.204301, 49.734086],\n              [125.221547, 49.754969],\n              [125.222779, 49.799026],\n              [125.177815, 49.829533],\n              [125.239409, 49.844587],\n              [125.225243, 49.867351],\n              [125.245569, 49.87198],\n              [125.212924, 49.907452],\n              [125.225859, 49.922481],\n              [125.199373, 49.935194],\n              [125.190134, 49.959841],\n              [125.231402, 49.957531],\n              [125.241873, 49.987938],\n              [125.278214, 49.996402],\n              [125.297924, 50.014481],\n              [125.283757, 50.036012],\n              [125.25296, 50.041393],\n              [125.289916, 50.057917],\n              [125.315786, 50.04562],\n              [125.328105, 50.065985],\n              [125.283757, 50.070211],\n              [125.287453, 50.093636],\n              [125.258504, 50.103618],\n              [125.27883, 50.127411],\n              [125.311474, 50.140453],\n              [125.376148, 50.137385],\n              [125.335496, 50.161161],\n              [125.382923, 50.172278],\n              [125.39093, 50.199868],\n              [125.417416, 50.195654],\n              [125.448829, 50.216338],\n              [125.442053, 50.260357],\n              [125.466075, 50.266861],\n              [125.463611, 50.295925],\n              [125.530749, 50.331085],\n              [125.520278, 50.3498],\n              [125.546763, 50.358965],\n              [125.522126, 50.404759],\n              [125.536292, 50.420014],\n              [125.567089, 50.402852],\n              [125.583104, 50.409717],\n              [125.562162, 50.438314],\n              [125.580024, 50.449366],\n              [125.627451, 50.443268],\n              [125.654553, 50.471082],\n              [125.699516, 50.487078],\n              [125.740784, 50.523237],\n              [125.754335, 50.506874],\n              [125.770349, 50.531227],\n              [125.794987, 50.532748],\n              [125.829479, 50.56165],\n              [125.807921, 50.60383],\n              [125.814697, 50.62092],\n              [125.793139, 50.643316],\n              [125.804226, 50.658874],\n              [125.789443, 50.679735],\n              [125.825784, 50.70362],\n              [125.78082, 50.725598],\n              [125.795603, 50.738856],\n              [125.758646, 50.746809],\n              [125.804226, 50.773309],\n              [125.828863, 50.756654],\n              [125.846726, 50.769524],\n              [125.836255, 50.793363],\n              [125.890457, 50.805845],\n              [125.878138, 50.816812],\n              [125.913247, 50.825885],\n              [125.939732, 50.85423],\n              [125.961906, 50.901054],\n              [125.997631, 50.872738],\n              [125.996399, 50.906715],\n              [126.02042, 50.927466],\n              [126.042594, 50.92558],\n              [126.068464, 50.967434],\n              [126.041978, 50.981753],\n              [126.033971, 51.011132],\n              [126.059225, 51.043503],\n              [125.976073, 51.084498],\n              [125.993935, 51.119072],\n              [125.970529, 51.123955],\n              [125.946508, 51.108176],\n              [125.909551, 51.138977],\n              [125.864588, 51.146487],\n              [125.850421, 51.21364],\n              [125.819008, 51.227134],\n              [125.761726, 51.226385],\n              [125.76111, 51.261976],\n              [125.76111, 51.261976],\n              [125.740784, 51.27583],\n              [125.740784, 51.27583],\n              [125.700132, 51.327465],\n              [125.700132, 51.327465],\n              [125.626219, 51.380163],\n              [125.626219, 51.380163],\n              [125.623756, 51.387633],\n              [125.623756, 51.387633],\n              [125.62314, 51.398089],\n              [125.62314, 51.398089],\n              [125.600966, 51.410409],\n              [125.600966, 51.410409],\n              [125.60035, 51.413396],\n              [125.60035, 51.413396],\n              [125.595422, 51.416755],\n              [125.595422, 51.416755],\n              [125.559082, 51.461521],\n              [125.559082, 51.461521],\n              [125.528285, 51.488359],\n              [125.424807, 51.562827],\n              [125.38046, 51.585516],\n              [125.35151, 51.623801],\n              [125.316402, 51.610052],\n              [125.289301, 51.633831],\n              [125.228938, 51.640517],\n              [125.214772, 51.627888],\n              [125.175968, 51.639403],\n              [125.130388, 51.635317],\n              [125.12854, 51.659083],\n              [125.098975, 51.658341],\n              [125.060171, 51.59667],\n              [125.073106, 51.553526],\n              [125.047236, 51.529704],\n              [125.004737, 51.529332],\n              [124.983795, 51.508478],\n              [124.928976, 51.498419],\n              [124.917889, 51.474196],\n              [124.942527, 51.447349],\n              [124.885244, 51.40817],\n              [124.864302, 51.37979],\n              [124.783614, 51.392115],\n              [124.76452, 51.38726],\n              [124.752817, 51.35812],\n              [124.693687, 51.3327],\n              [124.62655, 51.327465],\n              [124.58713, 51.363725],\n              [124.555717, 51.375307],\n              [124.490427, 51.380537],\n              [124.478108, 51.36223],\n              [124.443616, 51.35812],\n              [124.426985, 51.331953],\n              [124.430065, 51.301281],\n              [124.406659, 51.272086],\n              [124.339522, 51.293422],\n              [124.297638, 51.298661],\n              [124.271769, 51.308389],\n              [124.239124, 51.344664],\n              [124.192313, 51.33943],\n              [124.128255, 51.347281],\n              [124.090067, 51.3413],\n              [124.071588, 51.320734],\n              [123.994596, 51.322604],\n              [123.939777, 51.313253],\n              [123.926227, 51.300532],\n              [123.887423, 51.320734],\n              [123.842459, 51.367462],\n              [123.794416, 51.361109],\n              [123.711264, 51.398089],\n              [123.660141, 51.342795],\n              [123.661989, 51.319237],\n              [123.582533, 51.306893],\n              [123.582533, 51.294545],\n              [123.46304, 51.286686],\n              [123.440251, 51.270963],\n              [123.414381, 51.278825],\n              [123.376809, 51.266844],\n              [123.339853, 51.27246],\n              [123.294273, 51.254111],\n              [123.231447, 51.268716],\n              [123.231447, 51.279199],\n              [123.127969, 51.297913],\n              [123.069455, 51.321108],\n              [123.002934, 51.31213],\n              [122.965977, 51.345786],\n              [122.965977, 51.386886],\n              [122.946267, 51.405183],\n              [122.903768, 51.415262],\n              [122.900072, 51.445112],\n              [122.871123, 51.455181],\n              [122.854492, 51.477551],\n              [122.880362, 51.511085],\n              [122.858804, 51.524864],\n              [122.880362, 51.537894],\n              [122.874202, 51.561339],\n              [122.832935, 51.581797],\n              [122.85634, 51.606707],\n              [122.820616, 51.633088],\n              [122.816304, 51.655371],\n              [122.778732, 51.698048],\n              [122.749167, 51.746613],\n              [122.771957, 51.779579],\n              [122.732536, 51.832495],\n              [122.725761, 51.87833],\n              [122.706051, 51.890151],\n              [122.729457, 51.919321],\n              [122.726377, 51.978709],\n              [122.683877, 51.974654],\n              [122.664783, 51.99861],\n              [122.650616, 52.058997],\n              [122.625363, 52.067459],\n              [122.643841, 52.111585],\n              [122.629059, 52.13657],\n              [122.690653, 52.140243],\n              [122.73808, 52.153464],\n              [122.769493, 52.179893],\n              [122.766413, 52.232705],\n              [122.787355, 52.252494],\n              [122.76087, 52.26678],\n              [122.710979, 52.256157],\n              [122.67895, 52.276667],\n              [122.585943, 52.266413],\n              [122.560689, 52.282526],\n              [122.478153, 52.29607],\n              [122.484313, 52.341432],\n              [122.447356, 52.394052],\n              [122.419023, 52.375057],\n              [122.378987, 52.395512],\n              [122.367284, 52.413768],\n              [122.342031, 52.414133],\n              [122.326016, 52.459374],\n              [122.310618, 52.475416],\n              [122.207756, 52.469218],\n              [122.178191, 52.48963],\n              [122.168952, 52.513674],\n              [122.140003, 52.510032],\n              [122.142467, 52.495096],\n              [122.107358, 52.452445],\n              [122.080873, 52.440407],\n              [122.091344, 52.427272],\n              [122.040837, 52.413038],\n              [122.035909, 52.377615],\n              [121.976779, 52.343626],\n              [121.94783, 52.298266],\n              [121.901018, 52.280695],\n              [121.841272, 52.282526],\n              [121.769207, 52.308147],\n              [121.714389, 52.318025],\n              [121.715621, 52.342894],\n              [121.658338, 52.3904],\n              [121.678664, 52.419973],\n              [121.63986, 52.44442],\n              [121.590585, 52.443326],\n              [121.565331, 52.460468],\n              [121.519136, 52.456821],\n              [121.495114, 52.484892],\n              [121.474172, 52.482706],\n              [121.416274, 52.499468],\n              [121.411963, 52.52205],\n              [121.353448, 52.534793],\n              [121.323883, 52.573727],\n              [121.280151, 52.586819],\n              [121.225333, 52.577364],\n              [121.182217, 52.59918],\n              [121.237036, 52.619167],\n              [121.29247, 52.651855],\n              [121.309717, 52.676173],\n              [121.373158, 52.683067],\n              [121.455078, 52.73528],\n              [121.476636, 52.772225],\n              [121.511129, 52.779104],\n              [121.537614, 52.801542],\n              [121.591201, 52.824693],\n              [121.620766, 52.853251],\n              [121.604136, 52.872401],\n              [121.610295, 52.892264],\n              [121.66265, 52.912478],\n              [121.677432, 52.948192],\n              [121.715621, 52.997926],\n              [121.785838, 53.018451],\n              [121.817867, 53.061631],\n              [121.775367, 53.089674],\n              [121.784606, 53.104408],\n              [121.753193, 53.147501],\n              [121.722396, 53.145706],\n              [121.665114, 53.170467],\n              [121.660186, 53.195213],\n              [121.67928, 53.199515],\n              [121.679896, 53.240722],\n              [121.642324, 53.262564],\n              [121.615222, 53.258984],\n              [121.575802, 53.29155],\n              [121.504969, 53.323018],\n              [121.499426, 53.337314],\n              [121.589969, 53.350891],\n              [121.697758, 53.392666],\n              [121.754425, 53.389454],\n              [121.816019, 53.41336],\n              [121.875765, 53.426556],\n              [122.026054, 53.428339],\n              [122.077177, 53.422277],\n              [122.111054, 53.426913],\n              [122.161561, 53.468614],\n              [122.227466, 53.461845],\n              [122.266886, 53.470039],\n              [122.350038, 53.505647],\n              [122.37406, 53.47467],\n              [122.435038, 53.444739],\n              [122.496016, 53.458638],\n              [122.5379, 53.453293],\n              [122.608117, 53.465408],\n              [122.673406, 53.459351],\n              [122.763949, 53.463626],\n              [122.826775, 53.457213],\n              [122.894528, 53.462914],\n              [122.943804, 53.483929],\n              [123.052209, 53.506715],\n              [123.093477, 53.508138],\n              [123.137209, 53.498172],\n              [123.179092, 53.509918],\n              [123.231447, 53.549404],\n              [123.274563, 53.563269],\n              [123.309672, 53.56078],\n              [123.394055, 53.538024],\n              [123.454417, 53.536602],\n              [123.47228, 53.509206],\n              [123.499381, 53.497816],\n              [123.510468, 53.509206],\n              [123.490758, 53.542648],\n              [123.517243, 53.558292],\n              [123.546808, 53.551537],\n              [123.557895, 53.531978],\n              [123.53141, 53.507071],\n              [123.569598, 53.505291],\n              [123.58746, 53.546915],\n              [123.620721, 53.550115],\n              [123.668764, 53.533756],\n              [123.698329, 53.498528],\n              [123.746373, 53.500308],\n              [123.797495, 53.489983],\n              [123.865249, 53.489627],\n              [123.985973, 53.434401],\n              [124.01369, 53.403371],\n              [124.058038, 53.404085],\n              [124.125791, 53.348033],\n              [124.19416, 53.37339],\n              [124.239124, 53.379817],\n              [124.327819, 53.331954],\n              [124.375863, 53.258984],\n              [124.412203, 53.248601],\n              [124.435609, 53.223886],\n              [124.487348, 53.217436],\n              [124.496587, 53.207759],\n              [124.563108, 53.201666],\n              [124.590209, 53.208476],\n              [124.678905, 53.207043],\n              [124.720789, 53.192344],\n              [124.712165, 53.162574],\n              [124.734339, 53.146783],\n              [124.787926, 53.140681],\n              [124.832889, 53.145347],\n              [124.87231, 53.099018],\n              [124.909266, 53.118059],\n              [124.887708, 53.164368],\n              [124.970244, 53.194137],\n              [125.038613, 53.202741],\n              [125.142091, 53.204175],\n              [125.195062, 53.198439],\n              [125.252344, 53.18051],\n              [125.315786, 53.144989],\n              [125.343503, 53.14463],\n              [125.452524, 53.107641],\n              [125.503647, 53.095424],\n              [125.504263, 53.061271],\n              [125.530749, 53.0512],\n              [125.588647, 53.081047],\n              [125.613901, 53.083564],\n              [125.640386, 53.06199],\n              [125.643466, 53.039686],\n              [125.684118, 53.00801],\n              [125.742632, 52.993964],\n              [125.737088, 52.943504],\n              [125.665023, 52.913561],\n              [125.666871, 52.869872],\n              [125.678574, 52.86084],\n              [125.722306, 52.880347],\n              [125.751255, 52.88143],\n              [125.772197, 52.89804],\n              [125.827631, 52.899123],\n              [125.854117, 52.891542],\n              [125.855349, 52.866259],\n              [125.923718, 52.815651],\n              [125.937269, 52.786705],\n              [125.966834, 52.759914],\n              [125.985312, 52.758465],\n              [126.02042, 52.795753],\n              [126.052449, 52.800095],\n              [126.116507, 52.768243],\n              [126.112195, 52.757016],\n              [126.044442, 52.739628],\n              [126.072775, 52.691048],\n              [126.061688, 52.673271],\n              [125.995783, 52.675085],\n              [125.971145, 52.654033],\n              [125.968682, 52.630429],\n              [125.989008, 52.603178],\n              [126.030891, 52.576273],\n              [126.055529, 52.582455],\n              [126.066616, 52.603905],\n              [126.147304, 52.573],\n              [126.213209, 52.525327],\n              [126.192883, 52.492181],\n              [126.205202, 52.466302],\n              [126.268644, 52.475051],\n              [126.326542, 52.424353],\n              [126.353644, 52.389304],\n              [126.348716, 52.357882],\n              [126.320999, 52.342163],\n              [126.327774, 52.310342],\n              [126.4331, 52.298632],\n              [126.436795, 52.277034],\n              [126.401071, 52.279597],\n              [126.357955, 52.264216],\n              [126.312992, 52.235271],\n              [126.306832, 52.205574],\n              [126.34502, 52.192002],\n              [126.403535, 52.185031],\n              [126.457121, 52.165212],\n              [126.499005, 52.16044],\n              [126.556288, 52.136203],\n              [126.563679, 52.119302],\n              [126.514404, 52.037282],\n              [126.487918, 52.041699],\n              [126.450962, 52.027709],\n              [126.447882, 52.009294],\n              [126.468208, 51.982395],\n              [126.462665, 51.948471],\n              [126.510092, 51.922274],\n              [126.555056, 51.874266],\n              [126.580925, 51.824728],\n              [126.622809, 51.777357],\n              [126.658534, 51.762544],\n              [126.6727, 51.73179],\n              [126.724439, 51.7266],\n              [126.734294, 51.711399],\n              [126.723823, 51.679126],\n              [126.741069, 51.642374],\n              [126.67886, 51.602246],\n              [126.69549, 51.57845],\n              [126.837156, 51.536033],\n              [126.843931, 51.521885],\n              [126.812518, 51.493948],\n              [126.784185, 51.448095],\n              [126.791577, 51.432428],\n              [126.835308, 51.413769],\n              [126.908605, 51.407423],\n              [126.930163, 51.359241],\n              [126.904293, 51.340552],\n              [126.837156, 51.345038],\n              [126.813134, 51.311756],\n              [126.820526, 51.281071],\n              [126.863025, 51.248492],\n              [126.908605, 51.246619],\n              [126.92154, 51.259729],\n              [126.908605, 51.283691],\n              [126.877808, 51.300906],\n              [126.887047, 51.321856],\n              [126.970815, 51.332327],\n              [126.98375, 51.318863],\n              [126.976358, 51.291551],\n              [126.926467, 51.246244],\n              [126.899982, 51.200518],\n              [126.917844, 51.138977],\n              [126.922772, 51.061937],\n              [126.985597, 51.029202],\n              [127.052119, 50.962911],\n              [127.113713, 50.93765],\n              [127.143894, 50.910111],\n              [127.236285, 50.781256],\n              [127.295415, 50.755139],\n              [127.305886, 50.733932],\n              [127.28864, 50.699451],\n              [127.294799, 50.663426],\n              [127.370559, 50.581415],\n              [127.36132, 50.547582],\n              [127.323132, 50.52552],\n              [127.293567, 50.46575],\n              [127.30527, 50.45432],\n              [127.3644, 50.438314],\n              [127.369944, 50.403996],\n              [127.332371, 50.340634],\n              [127.371791, 50.29669],\n              [127.44632, 50.270686],\n              [127.603385, 50.239309],\n              [127.60708, 50.178794],\n              [127.58737, 50.137768],\n              [127.501755, 50.056764],\n              [127.495595, 49.994479],\n              [127.543638, 49.944438],\n              [127.547334, 49.928645],\n              [127.529472, 49.864265],\n              [127.531936, 49.826059],\n              [127.583059, 49.786277],\n              [127.653892, 49.780094],\n              [127.674833, 49.764247],\n              [127.677913, 49.697712],\n              [127.705015, 49.665185],\n              [127.782007, 49.630698],\n              [127.815268, 49.593859],\n              [127.897804, 49.579116],\n              [127.949542, 49.596187],\n              [128.001281, 49.592307],\n              [128.070882, 49.556604],\n              [128.122005, 49.55311],\n              [128.185447, 49.53952],\n              [128.243345, 49.563203],\n              [128.287077, 49.566309],\n              [128.343128, 49.544956],\n              [128.389939, 49.58998],\n              [128.500192, 49.593859],\n              [128.537764, 49.604332],\n              [128.619684, 49.593471],\n              [128.656025, 49.577564],\n              [128.715155, 49.564756],\n              [128.744104, 49.595023],\n              [128.802618, 49.58222],\n              [128.813089, 49.558157],\n              [128.763198, 49.515824],\n              [128.76135, 49.482009],\n              [128.792147, 49.473065],\n              [128.871604, 49.492506],\n              [128.932582, 49.46801],\n              [129.013886, 49.457119],\n              [129.061929, 49.374189],\n              [129.084719, 49.359769],\n              [129.143849, 49.357431],\n              [129.180805, 49.386657],\n              [129.215298, 49.399122],\n              [129.266421, 49.396006],\n              [129.320623, 49.3586],\n              [129.358196, 49.355871],\n              [129.379138, 49.367175],\n              [129.374826, 49.414309],\n              [129.390224, 49.432605],\n              [129.448739, 49.441167],\n              [129.51834, 49.423652],\n              [129.546057, 49.395227],\n              [129.562687, 49.299706],\n              [129.604571, 49.279018],\n              [129.696962, 49.298535],\n              [129.730223, 49.288387],\n              [129.761636, 49.25754],\n              [129.753629, 49.208692],\n              [129.784426, 49.184054],\n              [129.847867, 49.181316],\n              [129.864498, 49.158621],\n              [129.855259, 49.133567],\n              [129.866962, 49.113985],\n              [129.913157, 49.1085],\n              [129.934715, 49.078717],\n              [129.9187, 49.060681],\n              [129.937179, 49.040285],\n              [130.020946, 49.021058],\n              [130.059135, 48.979047],\n              [130.113337, 48.956653],\n              [130.219895, 48.893739],\n              [130.237757, 48.868551],\n              [130.279641, 48.866976],\n              [130.412068, 48.905148],\n              [130.471198, 48.905541],\n              [130.501995, 48.865795],\n              [130.559277, 48.861071],\n              [130.609168, 48.881146],\n              [130.680617, 48.881146],\n              [130.689856, 48.849651],\n              [130.622103, 48.783842],\n              [130.576524, 48.688719],\n              [130.538951, 48.635751],\n              [130.538335, 48.612016],\n              [130.605473, 48.594207],\n              [130.615944, 48.575601],\n              [130.620871, 48.49595],\n              [130.647357, 48.484844],\n              [130.711414, 48.511414],\n              [130.767465, 48.507846],\n              [130.776704, 48.480084],\n              [130.745907, 48.449131],\n              [130.747755, 48.404256],\n              [130.785327, 48.357353],\n              [130.81982, 48.341444],\n              [130.845073, 48.296473],\n              [130.817972, 48.265409],\n              [130.787791, 48.256643],\n              [130.769313, 48.231136],\n              [130.765617, 48.18926],\n              [130.673842, 48.12818],\n              [130.666451, 48.105007],\n              [130.699711, 48.044227],\n              [130.737284, 48.034223],\n              [130.770544, 47.998194],\n              [130.870943, 47.943301],\n              [130.891269, 47.927263],\n              [130.961486, 47.828118],\n              [130.966413, 47.733211],\n              [130.983659, 47.713081],\n              [131.029855, 47.694555],\n              [131.115471, 47.689721],\n              [131.183224, 47.702611],\n              [131.236811, 47.733211],\n              [131.273767, 47.738846],\n              [131.359998, 47.730796],\n              [131.456085, 47.747297],\n              [131.543548, 47.736028],\n              [131.559563, 47.724757],\n              [131.568186, 47.682469],\n              [131.59036, 47.660707],\n              [131.641483, 47.663932],\n              [131.690142, 47.707041],\n              [131.741881, 47.706638],\n              [131.825649, 47.677231],\n              [131.900793, 47.685692],\n              [131.976554, 47.673201],\n              [132.000575, 47.712276],\n              [132.086191, 47.703013],\n              [132.157024, 47.70543],\n              [132.19706, 47.714289],\n              [132.242639, 47.70986],\n              [132.272205, 47.718718],\n              [132.288835, 47.742065],\n              [132.325175, 47.762184],\n              [132.371987, 47.765402],\n              [132.469305, 47.726368],\n              [132.558, 47.718316],\n              [132.6005, 47.740858],\n              [132.599268, 47.792347],\n              [132.621442, 47.82852],\n              [132.662094, 47.854227],\n              [132.687348, 47.88514],\n              [132.662094, 47.922451],\n              [132.661478, 47.944905],\n              [132.691043, 47.962941],\n              [132.723072, 47.962941],\n              [132.769268, 47.93849],\n              [132.819159, 47.936887],\n              [132.883216, 48.002599],\n              [132.992238, 48.035424],\n              [133.016259, 48.054228],\n              [133.02673, 48.085421],\n              [133.053216, 48.110202],\n              [133.130208, 48.134971],\n              [133.182563, 48.135769],\n              [133.239845, 48.126583],\n              [133.302055, 48.103009],\n              [133.407997, 48.124585],\n              [133.451728, 48.112999],\n              [133.545967, 48.121389],\n              [133.573068, 48.182078],\n              [133.59709, 48.194846],\n              [133.667307, 48.183275],\n              [133.693177, 48.186866],\n              [133.740604, 48.254651],\n              [133.791111, 48.261026],\n              [133.824372, 48.277359],\n              [133.876111, 48.282536],\n              [133.940784, 48.302047],\n              [133.995603, 48.303639],\n              [134.029479, 48.327519],\n              [134.0689, 48.338659],\n              [134.116327, 48.333089],\n              [134.150819, 48.346217],\n              [134.20379, 48.3824],\n              [134.369478, 48.382797],\n              [134.438463, 48.405448],\n              [134.501905, 48.418954],\n              [134.578281, 48.405448],\n              [134.696542, 48.407037],\n              [134.764295, 48.370076],\n              [134.820961, 48.37604],\n              [134.848679, 48.393925],\n              [134.886867, 48.437618],\n              [134.927519, 48.451513],\n              [134.996504, 48.439603],\n              [135.035924, 48.440795],\n              [135.068569, 48.459451],\n              [135.09567, 48.437618],\n              [135.090743, 48.403461],\n              [135.009439, 48.365703],\n              [134.864077, 48.332293],\n              [134.77107, 48.288908],\n              [134.679295, 48.256245],\n              [134.67252, 48.170505],\n              [134.632484, 48.099412],\n              [134.551796, 48.032622],\n              [134.55426, 47.982173],\n              [134.599839, 47.947711],\n              [134.607846, 47.909214],\n              [134.658969, 47.901191],\n              [134.677448, 47.884738],\n              [134.670056, 47.864667],\n              [134.678679, 47.819278],\n              [134.772918, 47.763391],\n              [134.779694, 47.7159],\n              [134.689766, 47.63813],\n              [134.678064, 47.588507],\n              [134.627556, 47.546512],\n              [134.576434, 47.519036],\n              [134.568426, 47.478199],\n              [134.522847, 47.468086],\n              [134.490202, 47.446235],\n              [134.339297, 47.439759],\n              [134.307268, 47.428829],\n              [134.266616, 47.391974],\n              [134.263536, 47.371307],\n              [134.203174, 47.347389],\n              [134.177305, 47.326299],\n              [134.156979, 47.248357],\n              [134.210566, 47.210155],\n              [134.230276, 47.182097],\n              [134.232739, 47.134892],\n              [134.222268, 47.105164],\n              [134.142812, 47.093349],\n              [134.118175, 47.061968],\n              [134.10216, 47.005678],\n              [134.063972, 46.979962],\n              [134.076291, 46.938298],\n              [134.042414, 46.886787],\n              [134.041182, 46.848326],\n              [134.025168, 46.810657],\n              [134.052885, 46.779928],\n              [134.033175, 46.759023],\n              [134.030711, 46.708981],\n              [134.011001, 46.637941],\n              [133.919842, 46.596012],\n              [133.890893, 46.525235],\n              [133.849625, 46.475389],\n              [133.852089, 46.450242],\n              [133.902596, 46.446119],\n              [133.948791, 46.401153],\n              [133.940784, 46.38134],\n              [133.876726, 46.362345],\n              [133.869335, 46.338386],\n              [133.922922, 46.330948],\n              [133.908139, 46.308216],\n              [133.91861, 46.280924],\n              [133.909987, 46.254447],\n              [133.867487, 46.250722],\n              [133.87919, 46.233752],\n              [133.849625, 46.203939],\n              [133.814517, 46.230854],\n              [133.794807, 46.193583],\n              [133.764626, 46.17328],\n              [133.706111, 46.163333],\n              [133.690713, 46.133896],\n              [133.745531, 46.075389],\n              [133.740604, 46.048812],\n              [133.681474, 45.986473],\n              [133.676546, 45.94321],\n              [133.614952, 45.942794],\n              [133.618032, 45.903662],\n              [133.583539, 45.868669],\n              [133.55459, 45.893249],\n              [133.51209, 45.887001],\n              [133.491764, 45.867002],\n              [133.494228, 45.840325],\n              [133.467743, 45.834905],\n              [133.469591, 45.799451],\n              [133.505315, 45.785681],\n              [133.469591, 45.777751],\n              [133.486837, 45.740173],\n              [133.454192, 45.731819],\n              [133.445569, 45.705077],\n              [133.484989, 45.691702],\n              [133.485605, 45.658667],\n              [133.448649, 45.647372],\n              [133.471438, 45.631053],\n              [133.412924, 45.618079],\n              [133.423395, 45.584163],\n              [133.393214, 45.580393],\n              [133.342707, 45.554836],\n              [133.333468, 45.562379],\n              [133.246005, 45.517528],\n              [133.201657, 45.515431],\n              [133.170244, 45.465506],\n              [133.164701, 45.437377],\n              [133.143759, 45.430658],\n              [133.144991, 45.367205],\n              [133.119121, 45.352908],\n              [133.128976, 45.336924],\n              [133.097563, 45.281788],\n              [133.109266, 45.232077],\n              [133.124665, 45.222805],\n              [133.137599, 45.178105],\n              [133.139447, 45.127459],\n              [133.107418, 45.124504],\n              [133.089556, 45.097473],\n              [133.070462, 45.097051],\n              [133.045824, 45.066203],\n              [132.986078, 45.031109],\n              [132.954049, 45.023072],\n              [132.916477, 45.031109],\n              [132.867202, 45.061976],\n              [132.76434, 45.081417],\n              [132.394161, 45.16376],\n              [132.17427, 45.216903],\n              [132.003655, 45.25441],\n              [131.976554, 45.277156],\n              [131.93159, 45.287683],\n              [131.917423, 45.339448],\n              [131.887858, 45.342393],\n              [131.82996, 45.311677],\n              [131.825649, 45.291472],\n              [131.788692, 45.245984],\n              [131.79362, 45.211844],\n              [131.759127, 45.213952],\n              [131.721555, 45.234606],\n              [131.681519, 45.215217],\n              [131.650722, 45.159962],\n              [131.687678, 45.1511],\n              [131.695685, 45.132104],\n              [131.63286, 45.075078],\n              [131.566338, 45.045487],\n              [131.529382, 45.012073],\n              [131.484418, 44.99557],\n              [131.501664, 44.977793],\n              [131.464708, 44.963397],\n              [131.409889, 44.985836],\n              [131.380324, 44.978216],\n              [131.355071, 44.990068],\n              [131.313803, 44.965938],\n              [131.311955, 44.94688],\n              [131.274999, 44.919766],\n              [131.263296, 44.929935],\n              [131.207861, 44.913833],\n              [131.20355, 44.932901],\n              [131.16105, 44.948151],\n              [131.090217, 44.924427],\n              [131.10192, 44.898997],\n              [131.07913, 44.881614],\n              [130.965181, 44.85065],\n              [130.972573, 44.820094],\n              [131.016304, 44.814575],\n              [131.016304, 44.789521],\n              [131.064348, 44.786973],\n              [131.069275, 44.759783],\n              [131.093297, 44.746183],\n              [131.090833, 44.717272],\n              [131.111775, 44.710042],\n              [131.310723, 44.046623],\n              [131.26576, 44.034578],\n              [131.245434, 43.95579],\n              [131.26268, 43.948897],\n              [131.254057, 43.893289],\n              [131.2171, 43.836334],\n              [131.213405, 43.801357],\n              [131.232499, 43.742585],\n              [131.215869, 43.72745],\n              [131.221412, 43.682024],\n              [131.239274, 43.670337],\n              [131.216485, 43.613169],\n              [131.222028, 43.593234],\n              [131.20047, 43.532089],\n              [131.276847, 43.495632],\n              [131.304564, 43.502144],\n              [131.294093, 43.470012],\n              [131.234963, 43.475224],\n              [131.201086, 43.442209],\n              [131.175217, 43.444816],\n              [131.142572, 43.425695],\n              [131.026775, 43.508655],\n              [130.959638, 43.48608],\n              [130.907283, 43.434387],\n              [130.864167, 43.437863],\n              [130.841378, 43.454374],\n              [130.822899, 43.503446],\n              [130.776704, 43.52341],\n              [130.727429, 43.560284],\n              [130.671378, 43.565054],\n              [130.665835, 43.583698],\n              [130.623335, 43.589767],\n              [130.630726, 43.622268],\n              [130.57098, 43.626167],\n              [130.57098, 43.626167],\n              [130.501995, 43.636563],\n              [130.488444, 43.65605],\n              [130.437937, 43.646091],\n              [130.412684, 43.652586],\n              [130.394206, 43.703227],\n              [130.423155, 43.745179],\n              [130.382503, 43.777164],\n              [130.381887, 43.817768],\n              [130.362793, 43.844967],\n              [130.386198, 43.85403],\n              [130.368336, 43.894151],\n              [130.381887, 43.910106],\n              [130.338155, 43.963975],\n              [130.364025, 43.992399],\n              [130.365256, 44.044042],\n              [130.319061, 44.03974],\n              [130.307358, 44.002731],\n              [130.27225, 43.981634],\n              [130.262395, 43.949328],\n              [130.208192, 43.948466],\n              [130.153373, 43.915711],\n              [130.143518, 43.878624],\n              [130.116417, 43.878192],\n              [130.110873, 43.852735],\n              [130.079461, 43.835039],\n              [130.027722, 43.851872],\n              [130.009243, 43.889407],\n              [130.022794, 43.917866],\n              [130.017867, 43.961821],\n              [129.979062, 44.015644],\n              [129.951345, 44.027263],\n              [129.907614, 44.023821],\n              [129.881128, 44.000148],\n              [129.868193, 44.012631],\n              [129.802904, 43.964837],\n              [129.780114, 43.892857],\n              [129.739462, 43.895876],\n              [129.743158, 43.876035],\n              [129.699426, 43.8838],\n              [129.650767, 43.873016],\n              [129.529427, 43.870427],\n              [129.467833, 43.874741],\n              [129.449971, 43.850578],\n              [129.417942, 43.843672],\n              [129.406855, 43.819496],\n              [129.348341, 43.798333],\n              [129.30892, 43.812155],\n              [129.289826, 43.797038],\n              [129.254718, 43.819496],\n              [129.211602, 43.784509],\n              [129.232544, 43.709284],\n              [129.214066, 43.695006],\n              [129.217146, 43.648689],\n              [129.232544, 43.635263],\n              [129.23008, 43.593234],\n              [129.169102, 43.561585],\n              [129.145081, 43.570258],\n              [129.093958, 43.547706],\n              [129.037907, 43.540332],\n              [129.013886, 43.522976],\n              [128.962763, 43.53903],\n              [128.949828, 43.553779],\n              [128.878379, 43.539898],\n              [128.834647, 43.587599],\n              [128.821097, 43.637429],\n              [128.78722, 43.686784],\n              [128.768126, 43.732207],\n              [128.729322, 43.736964],\n              [128.760119, 43.755554],\n              [128.739177, 43.806972],\n              [128.719467, 43.816905],\n              [128.760734, 43.857482],\n              [128.729938, 43.889838],\n              [128.696061, 43.903207],\n              [128.636315, 43.891132],\n              [128.64001, 43.948035],\n              [128.610445, 43.960529],\n              [128.584576, 43.990246],\n              [128.574721, 44.047914],\n              [128.529141, 44.112401],\n              [128.471859, 44.157501],\n              [128.450301, 44.203423],\n              [128.471859, 44.247596],\n              [128.453997, 44.257884],\n              [128.472475, 44.320001],\n              [128.446605, 44.339694],\n              [128.475555, 44.346114],\n              [128.481714, 44.375637],\n              [128.457076, 44.409848],\n              [128.463236, 44.431647],\n              [128.427511, 44.473512],\n              [128.397946, 44.483761],\n              [128.372693, 44.514495],\n              [128.295084, 44.480772],\n              [128.293237, 44.467961],\n              [128.228563, 44.445748],\n              [128.211317, 44.431647],\n              [128.172512, 44.34697],\n              [128.137404, 44.357668],\n              [128.094904, 44.354673],\n              [128.074578, 44.370075],\n              [128.049941, 44.349965],\n              [128.065339, 44.307155],\n              [128.101679, 44.293449],\n              [128.064107, 44.251454],\n              [128.104143, 44.230017],\n              [128.09244, 44.181539],\n              [128.060411, 44.168663],\n              [128.088129, 44.158359],\n              [128.091208, 44.133022],\n              [128.042549, 44.103807],\n              [127.950158, 44.088334],\n              [127.912586, 44.064687],\n              [127.862695, 44.062967],\n              [127.846065, 44.081886],\n              [127.808492, 44.086615],\n              [127.783239, 44.071997],\n              [127.729036, 44.09908],\n              [127.735811, 44.11412],\n              [127.712406, 44.199133],\n              [127.681609, 44.166946],\n              [127.641573, 44.193555],\n              [127.626174, 44.187977],\n              [127.59045, 44.227872],\n              [127.623711, 44.278025],\n              [127.579363, 44.310581],\n              [127.486356, 44.410275],\n              [127.50853, 44.437202],\n              [127.463566, 44.484615],\n              [127.465414, 44.516628],\n              [127.485124, 44.528576],\n              [127.536247, 44.522176],\n              [127.570124, 44.55033],\n              [127.557189, 44.575488],\n              [127.392733, 44.632158],\n              [127.275705, 44.640249],\n              [127.261538, 44.61299],\n              [127.214111, 44.624917],\n              [127.228893, 44.642804],\n              [127.182082, 44.644507],\n              [127.138966, 44.607451],\n              [127.094619, 44.615972],\n              [127.089691, 44.593816],\n              [127.049655, 44.566961],\n              [127.041648, 44.591258],\n              [127.044112, 44.653874],\n              [127.030561, 44.673454],\n              [127.041032, 44.712169],\n              [126.9973, 44.764882],\n              [126.984366, 44.823914],\n              [126.999764, 44.87398],\n              [127.021938, 44.898997],\n              [127.073061, 44.907051],\n              [127.092771, 44.94688],\n              [127.050271, 45.004034],\n              [127.018242, 45.024341],\n              [126.984981, 45.067893],\n              [126.970815, 45.070852],\n              [126.96404, 45.132104],\n              [126.85625, 45.145613],\n              [126.792808, 45.135481],\n              [126.787265, 45.159118],\n              [126.732446, 45.187385],\n              [126.685635, 45.187807],\n              [126.640055, 45.214373],\n              [126.644983, 45.225334],\n              [126.569222, 45.252725],\n              [126.540273, 45.23882],\n              [126.519331, 45.248091],\n              [126.402919, 45.222805],\n              [126.356107, 45.185698],\n              [126.293282, 45.180214],\n              [126.285274, 45.162494],\n              [126.235383, 45.140125],\n              [126.225528, 45.154054],\n              [126.166398, 45.13337],\n              [126.142992, 45.147723],\n              [126.091869, 45.149411],\n              [126.047522, 45.170933],\n              [125.998247, 45.162072],\n              [125.992703, 45.192447],\n              [125.957595, 45.201303],\n              [125.915095, 45.196664],\n              [125.849805, 45.23882],\n              [125.823936, 45.237978],\n              [125.815929, 45.264942],\n              [125.761726, 45.291472],\n              [125.726001, 45.336503],\n              [125.695205, 45.352066],\n              [125.712451, 45.389485],\n              [125.711835, 45.477677],\n              [125.687813, 45.514173],\n              [125.660096, 45.507043],\n              [125.61698, 45.517947],\n              [125.583104, 45.491942],\n              [125.497488, 45.469283],\n              [125.480242, 45.486488],\n              [125.424807, 45.485649],\n              [125.434662, 45.462988],\n              [125.398322, 45.416797],\n              [125.361981, 45.392847],\n              [125.319482, 45.422678],\n              [125.301619, 45.402092],\n              [125.248649, 45.417637],\n              [125.189518, 45.39915],\n              [125.137779, 45.409655],\n              [125.097127, 45.38276],\n              [125.06633, 45.39915],\n              [125.08912, 45.420998],\n              [125.0497, 45.428558],\n              [125.025678, 45.493201],\n              [124.961005, 45.495299],\n              [124.936983, 45.53388],\n              [124.911114, 45.535976],\n              [124.884628, 45.495299],\n              [124.886476, 45.442836],\n              [124.839665, 45.455852],\n              [124.792853, 45.436958],\n              [124.776223, 45.468024],\n              [124.729412, 45.444096],\n              [124.690607, 45.452493],\n              [124.625318, 45.437377],\n              [124.575427, 45.451234],\n              [124.579738, 45.424358],\n              [124.544014, 45.411756],\n              [124.507058, 45.424778],\n              [124.480572, 45.456271],\n              [124.398652, 45.440737],\n              [124.374015, 45.45795],\n              [124.352457, 45.496557],\n              [124.369087, 45.512915],\n              [124.348761, 45.546874],\n              [124.287783, 45.539329],\n              [124.264377, 45.555256],\n              [124.273001, 45.584163],\n              [124.238508, 45.591702],\n              [124.226805, 45.633564],\n              [124.162132, 45.616404],\n              [124.128255, 45.641933],\n              [124.147349, 45.665359],\n              [124.122096, 45.669123],\n              [124.13503, 45.690448],\n              [124.10177, 45.700898],\n              [124.098074, 45.722628],\n              [124.054342, 45.751449],\n              [124.014922, 45.749779],\n              [124.001987, 45.770655],\n              [124.064197, 45.802372],\n              [124.03648, 45.83824],\n              [124.067277, 45.840325],\n              [124.061118, 45.886168],\n              [123.996444, 45.906993],\n              [123.968727, 45.936551],\n              [123.973654, 45.973997],\n              [124.011842, 45.981899],\n              [123.989053, 46.011833],\n              [124.040176, 46.01973],\n              [124.034016, 46.045074],\n              [124.009995, 46.057534],\n              [124.015538, 46.088257],\n              [123.99398, 46.101123],\n              [124.01677, 46.118549],\n              [123.991516, 46.143019],\n              [124.001987, 46.166649],\n              [123.971806, 46.170379],\n              [123.956408, 46.206009],\n              [123.979814, 46.228784],\n              [123.952096, 46.256516],\n              [123.960103, 46.288369],\n              [123.936082, 46.286715],\n              [123.917604, 46.25693],\n              [123.896046, 46.303668],\n              [123.84985, 46.302428],\n              [123.775938, 46.263136],\n              [123.726047, 46.255688],\n              [123.673692, 46.258585],\n              [123.604706, 46.251964],\n              [123.569598, 46.223816],\n            ],\n          ],\n          [\n            [\n              [124.143037, 50.566212],\n              [124.183073, 50.557468],\n              [124.289015, 50.553286],\n              [124.322892, 50.532748],\n              [124.420826, 50.548342],\n              [124.43992, 50.539975],\n              [124.43992, 50.45813],\n              [124.415899, 50.451652],\n              [124.43992, 50.385683],\n              [124.40358, 50.362401],\n              [124.36416, 50.360874],\n              [124.347529, 50.316565],\n              [124.374015, 50.310833],\n              [124.349377, 50.28063],\n              [124.368471, 50.258061],\n              [124.34445, 50.219018],\n              [124.359848, 50.199102],\n              [124.342602, 50.187991],\n              [124.32474, 50.178411],\n              [124.286551, 50.189524],\n              [124.278544, 50.231271],\n              [124.233581, 50.229356],\n              [124.189233, 50.216721],\n              [124.103001, 50.238927],\n              [124.098074, 50.214806],\n              [124.061733, 50.199102],\n              [124.007531, 50.219401],\n              [123.953944, 50.186842],\n              [123.926227, 50.188374],\n              [123.90898, 50.21021],\n              [123.878799, 50.208678],\n              [123.862785, 50.226294],\n              [123.870792, 50.270303],\n              [123.861553, 50.287131],\n              [123.814126, 50.307775],\n              [123.777785, 50.344454],\n              [123.78764, 50.371944],\n              [123.765467, 50.378051],\n              [123.790104, 50.423446],\n              [123.780249, 50.43717],\n              [123.800575, 50.455844],\n              [123.825829, 50.449366],\n              [123.840611, 50.411624],\n              [123.879415, 50.40247],\n              [123.88927, 50.383775],\n              [123.920067, 50.373089],\n              [123.931154, 50.391407],\n              [123.969958, 50.399419],\n              [124.005067, 50.434502],\n              [123.99398, 50.441363],\n              [124.001371, 50.492408],\n              [123.983509, 50.510299],\n              [124.023545, 50.518671],\n              [124.026625, 50.538454],\n              [124.086987, 50.539975],\n              [124.083907, 50.568493],\n              [124.143037, 50.566212],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 310000,\n        name: '上海市',\n        center: [121.472644, 31.231706],\n        centroid: [121.438734, 31.07256],\n        childrenNum: 16,\n        level: 'province',\n        subFeatureIndex: 8,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [120.901349, 31.017327],\n              [120.890878, 31.094229],\n              [120.859465, 31.100379],\n              [120.881023, 31.134706],\n              [120.930298, 31.141365],\n              [121.018377, 31.134194],\n              [121.076892, 31.158267],\n              [121.060261, 31.245289],\n              [121.090442, 31.291838],\n              [121.138485, 31.276495],\n              [121.160659, 31.283144],\n              [121.129862, 31.302577],\n              [121.130478, 31.343987],\n              [121.113848, 31.37465],\n              [121.143413, 31.392021],\n              [121.174826, 31.44922],\n              [121.240731, 31.493627],\n              [121.247507, 31.476785],\n              [121.301093, 31.49873],\n              [121.301093, 31.49873],\n              [121.343593, 31.511996],\n              [121.404571, 31.479337],\n              [121.520984, 31.394575],\n              [121.599208, 31.37465],\n              [121.722396, 31.3036],\n              [121.809859, 31.196669],\n              [121.946598, 31.066039],\n              [121.977395, 31.016301],\n              [121.990945, 30.96859],\n              [121.994025, 30.862823],\n              [121.954605, 30.825828],\n              [121.970004, 30.789333],\n              [121.943518, 30.776993],\n              [121.904714, 30.814007],\n              [121.681128, 30.818633],\n              [121.601056, 30.805269],\n              [121.517288, 30.775451],\n              [121.426129, 30.730192],\n              [121.362071, 30.679764],\n              [121.274608, 30.677191],\n              [121.272144, 30.723504],\n              [121.232108, 30.755909],\n              [121.21671, 30.785734],\n              [121.174826, 30.771851],\n              [121.123087, 30.77905],\n              [121.13787, 30.826342],\n              [121.097833, 30.857171],\n              [121.060261, 30.845354],\n              [121.038087, 30.814007],\n              [120.991892, 30.837133],\n              [121.020225, 30.872069],\n              [120.993124, 30.889532],\n              [121.000515, 30.938309],\n              [120.989428, 31.01425],\n              [120.949392, 31.030148],\n              [120.940153, 31.010146],\n              [120.901349, 31.017327],\n            ],\n          ],\n          [\n            [\n              [121.974931, 31.61704],\n              [121.995873, 31.493117],\n              [121.981706, 31.464024],\n              [121.890547, 31.428795],\n              [121.819098, 31.437987],\n              [121.682976, 31.491075],\n              [121.625693, 31.501792],\n              [121.547469, 31.531382],\n              [121.434136, 31.590535],\n              [121.395332, 31.585437],\n              [121.371926, 31.553314],\n              [121.289391, 31.61653],\n              [121.145261, 31.75403],\n              [121.118775, 31.759119],\n              [121.200079, 31.834907],\n              [121.265369, 31.863883],\n              [121.323267, 31.868458],\n              [121.384861, 31.833382],\n              [121.431673, 31.769295],\n              [121.49881, 31.753012],\n              [121.599824, 31.703128],\n              [121.64294, 31.697527],\n              [121.715005, 31.673592],\n              [121.974931, 31.61704],\n            ],\n          ],\n          [\n            [\n              [121.779062, 31.310247],\n              [121.727939, 31.35472],\n              [121.572107, 31.435944],\n              [121.509897, 31.4824],\n              [121.520984, 31.494137],\n              [121.567179, 31.48342],\n              [121.585657, 31.454836],\n              [121.742106, 31.407345],\n              [121.792613, 31.363408],\n              [121.793845, 31.31945],\n              [121.779062, 31.310247],\n            ],\n          ],\n          [\n            [\n              [121.801852, 31.356765],\n              [121.792613, 31.377715],\n              [121.845584, 31.37465],\n              [121.951525, 31.337343],\n              [122.040837, 31.324051],\n              [122.116597, 31.320984],\n              [122.122756, 31.307179],\n              [122.097503, 31.255522],\n              [122.016199, 31.282121],\n              [121.932431, 31.283144],\n              [121.840656, 31.295418],\n              [121.8037, 31.328652],\n              [121.801852, 31.356765],\n            ],\n          ],\n          [\n            [\n              [121.626925, 31.445135],\n              [121.579498, 31.479848],\n              [121.631853, 31.456878],\n              [121.626925, 31.445135],\n            ],\n          ],\n          [\n            [\n              [121.943518, 31.215608],\n              [121.950909, 31.228915],\n              [122.008808, 31.221238],\n              [121.995873, 31.160828],\n              [121.959533, 31.159291],\n              [121.943518, 31.215608],\n            ],\n          ],\n          [\n            [\n              [121.88254, 31.240684],\n              [121.923808, 31.234032],\n              [121.909026, 31.195133],\n              [121.88254, 31.240684],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 320000,\n        name: '江苏省',\n        center: [118.767413, 32.041544],\n        centroid: [119.486395, 32.983908],\n        childrenNum: 13,\n        level: 'province',\n        subFeatureIndex: 9,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [117.311654, 34.561686],\n              [117.311654, 34.561686],\n              [117.32151, 34.566614],\n              [117.32151, 34.566614],\n              [117.325205, 34.573021],\n              [117.325205, 34.573021],\n              [117.362777, 34.589281],\n              [117.402813, 34.569571],\n              [117.402813, 34.550843],\n              [117.465023, 34.484767],\n              [117.53832, 34.467006],\n              [117.592523, 34.462566],\n              [117.609769, 34.490686],\n              [117.659044, 34.501044],\n              [117.684298, 34.547392],\n              [117.801942, 34.518798],\n              [117.791471, 34.583368],\n              [117.793935, 34.651827],\n              [117.902956, 34.644443],\n              [117.909732, 34.670533],\n              [117.951615, 34.678408],\n              [118.053861, 34.650843],\n              [118.084042, 34.655766],\n              [118.114839, 34.614404],\n              [118.079115, 34.569571],\n              [118.185056, 34.543942],\n              [118.16473, 34.50499],\n              [118.132702, 34.483287],\n              [118.177665, 34.45319],\n              [118.179513, 34.379628],\n              [118.217701, 34.379134],\n              [118.220165, 34.405802],\n              [118.277447, 34.404814],\n              [118.290382, 34.424563],\n              [118.379693, 34.415183],\n              [118.404947, 34.427525],\n              [118.416034, 34.473914],\n              [118.439439, 34.507949],\n              [118.424657, 34.595193],\n              [118.439439, 34.626223],\n              [118.473932, 34.623269],\n              [118.460997, 34.656258],\n              [118.545997, 34.705964],\n              [118.601431, 34.714327],\n              [118.607591, 34.694155],\n              [118.664257, 34.693663],\n              [118.690127, 34.678408],\n              [118.739402, 34.693663],\n              [118.783749, 34.723181],\n              [118.764039, 34.740396],\n              [118.719076, 34.745313],\n              [118.739402, 34.792508],\n              [118.772047, 34.794474],\n              [118.80038, 34.843114],\n              [118.805307, 34.87307],\n              [118.860742, 34.944233],\n              [118.86259, 35.025626],\n              [118.928495, 35.051106],\n              [118.942662, 35.040817],\n              [119.027045, 35.055516],\n              [119.114509, 35.055026],\n              [119.137915, 35.096167],\n              [119.217371, 35.106939],\n              [119.250016, 35.124562],\n              [119.286972, 35.115261],\n              [119.306066, 35.076578],\n              [119.292515, 35.068742],\n              [119.307298, 35.032977],\n              [119.291899, 35.028567],\n              [119.285124, 35.068252],\n              [119.238313, 35.048657],\n              [119.211211, 34.981507],\n              [119.214907, 34.925589],\n              [119.202588, 34.890253],\n              [119.217371, 34.827886],\n              [119.238313, 34.799388],\n              [119.272189, 34.797914],\n              [119.312841, 34.774813],\n              [119.378747, 34.764489],\n              [119.440957, 34.769406],\n              [119.439725, 34.785136],\n              [119.497007, 34.754164],\n              [119.494543, 34.754656],\n              [119.381827, 34.752198],\n              [119.456971, 34.748264],\n              [119.525956, 34.73351],\n              [119.465594, 34.672994],\n              [119.569072, 34.615389],\n              [119.610956, 34.592729],\n              [119.641137, 34.569078],\n              [119.781571, 34.515839],\n              [119.811752, 34.485754],\n              [119.962657, 34.459112],\n              [120.103707, 34.391481],\n              [120.311895, 34.306991],\n              [120.314359, 34.255563],\n              [120.347619, 34.179352],\n              [120.367329, 34.091674],\n              [120.48559, 33.859411],\n              [120.500372, 33.818152],\n              [120.534249, 33.782346],\n              [120.583524, 33.668362],\n              [120.651277, 33.57567],\n              [120.717183, 33.436945],\n              [120.741205, 33.337505],\n              [120.769538, 33.307],\n              [120.813885, 33.303499],\n              [120.833595, 33.274984],\n              [120.819429, 33.237951],\n              [120.843451, 33.209915],\n              [120.874247, 33.093672],\n              [120.871784, 33.047032],\n              [120.917979, 33.02596],\n              [120.932762, 33.005887],\n              [120.957399, 32.893395],\n              [120.981421, 32.85972],\n              [120.972182, 32.761134],\n              [120.953088, 32.714318],\n              [120.916131, 32.701225],\n              [120.963559, 32.68259],\n              [120.979573, 32.636236],\n              [120.961711, 32.612042],\n              [121.020225, 32.605489],\n              [121.153268, 32.52933],\n              [121.269681, 32.483402],\n              [121.352216, 32.474315],\n              [121.390405, 32.460682],\n              [121.425513, 32.430885],\n              [121.450151, 32.282256],\n              [121.493882, 32.263533],\n              [121.499426, 32.211394],\n              [121.458774, 32.177462],\n              [121.542542, 32.152132],\n              [121.525295, 32.136423],\n              [121.759352, 32.059362],\n              [121.772287, 32.032984],\n              [121.856055, 31.955328],\n              [121.889315, 31.866425],\n              [121.970004, 31.718911],\n              [121.974931, 31.61704],\n              [121.715005, 31.673592],\n              [121.64294, 31.697527],\n              [121.599824, 31.703128],\n              [121.49881, 31.753012],\n              [121.431673, 31.769295],\n              [121.384861, 31.833382],\n              [121.323267, 31.868458],\n              [121.265369, 31.863883],\n              [121.200079, 31.834907],\n              [121.118775, 31.759119],\n              [121.145261, 31.75403],\n              [121.289391, 31.61653],\n              [121.371926, 31.553314],\n              [121.343593, 31.511996],\n              [121.301093, 31.49873],\n              [121.301093, 31.49873],\n              [121.247507, 31.476785],\n              [121.240731, 31.493627],\n              [121.174826, 31.44922],\n              [121.143413, 31.392021],\n              [121.113848, 31.37465],\n              [121.130478, 31.343987],\n              [121.129862, 31.302577],\n              [121.160659, 31.283144],\n              [121.138485, 31.276495],\n              [121.090442, 31.291838],\n              [121.060261, 31.245289],\n              [121.076892, 31.158267],\n              [121.018377, 31.134194],\n              [120.930298, 31.141365],\n              [120.881023, 31.134706],\n              [120.859465, 31.100379],\n              [120.890878, 31.094229],\n              [120.901349, 31.017327],\n              [120.865624, 30.989627],\n              [120.820661, 31.006556],\n              [120.770154, 30.996809],\n              [120.746132, 30.962432],\n              [120.698089, 30.970643],\n              [120.684538, 30.955247],\n              [120.709176, 30.933176],\n              [120.713487, 30.88491],\n              [120.68269, 30.882342],\n              [120.653741, 30.846896],\n              [120.589068, 30.854603],\n              [120.563814, 30.835592],\n              [120.503452, 30.757967],\n              [120.489285, 30.763624],\n              [120.460336, 30.839702],\n              [120.441858, 30.860768],\n              [120.435083, 30.920855],\n              [120.42338, 30.902884],\n              [120.35809, 30.886964],\n              [120.371025, 30.948575],\n              [120.316206, 30.933689],\n              [120.223816, 30.926502],\n              [120.149903, 30.937283],\n              [120.111099, 30.955761],\n              [120.052584, 31.00553],\n              [120.001461, 31.027071],\n              [119.988527, 31.059375],\n              [119.946027, 31.106016],\n              [119.921389, 31.170045],\n              [119.878274, 31.160828],\n              [119.827151, 31.174142],\n              [119.809904, 31.148536],\n              [119.779723, 31.17875],\n              [119.715666, 31.169533],\n              [119.705811, 31.152634],\n              [119.678093, 31.167997],\n              [119.623891, 31.130096],\n              [119.599869, 31.10909],\n              [119.532732, 31.159291],\n              [119.461283, 31.156219],\n              [119.439109, 31.177214],\n              [119.391682, 31.174142],\n              [119.360269, 31.213049],\n              [119.374435, 31.258591],\n              [119.350414, 31.301043],\n              [119.338095, 31.259103],\n              [119.294363, 31.263195],\n              [119.266646, 31.250405],\n              [119.198277, 31.270357],\n              [119.197661, 31.295418],\n              [119.158241, 31.294907],\n              [119.107118, 31.250917],\n              [119.10527, 31.235055],\n              [119.014727, 31.241707],\n              [118.984546, 31.237102],\n              [118.870597, 31.242219],\n              [118.794836, 31.229426],\n              [118.756648, 31.279564],\n              [118.726467, 31.282121],\n              [118.720924, 31.322518],\n              [118.745561, 31.372606],\n              [118.767735, 31.363919],\n              [118.824401, 31.375672],\n              [118.852119, 31.393553],\n              [118.883532, 31.500261],\n              [118.885995, 31.519139],\n              [118.881684, 31.564023],\n              [118.858894, 31.623665],\n              [118.802844, 31.619078],\n              [118.773894, 31.682759],\n              [118.748025, 31.675629],\n              [118.736322, 31.633347],\n              [118.643315, 31.649651],\n              [118.643315, 31.671555],\n              [118.697518, 31.709747],\n              [118.653786, 31.73011],\n              [118.641467, 31.75861],\n              [118.571866, 31.746397],\n              [118.5577, 31.73011],\n              [118.521975, 31.743343],\n              [118.533678, 31.76726],\n              [118.481939, 31.778453],\n              [118.504729, 31.841516],\n              [118.466541, 31.857784],\n              [118.472084, 31.879639],\n              [118.363679, 31.930443],\n              [118.389548, 31.985281],\n              [118.394476, 32.076098],\n              [118.433896, 32.086746],\n              [118.501033, 32.121726],\n              [118.49549, 32.165304],\n              [118.510888, 32.194176],\n              [118.643931, 32.209875],\n              [118.674728, 32.250375],\n              [118.657482, 32.30148],\n              [118.703061, 32.328792],\n              [118.685199, 32.403604],\n              [118.691359, 32.472295],\n              [118.628533, 32.467751],\n              [118.592192, 32.481383],\n              [118.608823, 32.536899],\n              [118.564475, 32.562122],\n              [118.568787, 32.585825],\n              [118.59712, 32.600951],\n              [118.632844, 32.578261],\n              [118.658714, 32.594397],\n              [118.688895, 32.588346],\n              [118.719076, 32.614059],\n              [118.719076, 32.614059],\n              [118.73509, 32.58885],\n              [118.757264, 32.603976],\n              [118.784981, 32.582295],\n              [118.820706, 32.60448],\n              [118.84288, 32.56767],\n              [118.908169, 32.59238],\n              [118.890923, 32.553042],\n              [118.92172, 32.557078],\n              [118.922336, 32.557078],\n              [118.92172, 32.557078],\n              [118.922336, 32.557078],\n              [118.975923, 32.505108],\n              [119.041212, 32.515201],\n              [119.084944, 32.452602],\n              [119.142226, 32.499556],\n              [119.168096, 32.536394],\n              [119.152697, 32.557582],\n              [119.22045, 32.576748],\n              [119.230921, 32.607001],\n              [119.208748, 32.641276],\n              [119.211827, 32.708275],\n              [119.184726, 32.825529],\n              [119.113277, 32.823014],\n              [119.054763, 32.8748],\n              [119.020886, 32.955685],\n              [118.993169, 32.958196],\n              [118.934039, 32.93861],\n              [118.892771, 32.941121],\n              [118.89585, 32.957694],\n              [118.89585, 32.957694],\n              [118.849039, 32.956689],\n              [118.846575, 32.922034],\n              [118.821322, 32.920527],\n              [118.810235, 32.853687],\n              [118.743097, 32.853184],\n              [118.743097, 32.853184],\n              [118.73817, 32.772708],\n              [118.756648, 32.737477],\n              [118.707373, 32.72036],\n              [118.642699, 32.744525],\n              [118.572482, 32.719856],\n              [118.560163, 32.729926],\n              [118.483787, 32.721367],\n              [118.450526, 32.743518],\n              [118.411106, 32.715828],\n              [118.375382, 32.718849],\n              [118.363063, 32.770695],\n              [118.334114, 32.761637],\n              [118.300237, 32.783275],\n              [118.301469, 32.846145],\n              [118.250346, 32.848157],\n              [118.2331, 32.914498],\n              [118.252194, 32.936601],\n              [118.291614, 32.946143],\n              [118.303933, 32.96874],\n              [118.26944, 32.969242],\n              [118.244803, 32.998359],\n              [118.243571, 33.027967],\n              [118.219549, 33.114227],\n              [118.217085, 33.191888],\n              [118.178281, 33.217926],\n              [118.149332, 33.169348],\n              [118.038463, 33.134776],\n              [118.037231, 33.152314],\n              [117.988572, 33.180869],\n              [117.977485, 33.226437],\n              [117.942376, 33.224936],\n              [117.939297, 33.262475],\n              [117.974405, 33.279487],\n              [117.992883, 33.333005],\n              [118.029224, 33.374995],\n              [118.016905, 33.402978],\n              [118.027376, 33.455421],\n              [118.050782, 33.491863],\n              [118.107448, 33.475391],\n              [118.117919, 33.594615],\n              [118.112376, 33.617045],\n              [118.16781, 33.663381],\n              [118.161035, 33.735576],\n              [118.117919, 33.766427],\n              [118.065564, 33.76593],\n              [118.019985, 33.738562],\n              [117.972557, 33.74951],\n              [117.901724, 33.720146],\n              [117.843826, 33.736074],\n              [117.791471, 33.733585],\n              [117.750203, 33.710688],\n              [117.72495, 33.74951],\n              [117.739732, 33.758467],\n              [117.759442, 33.874318],\n              [117.753899, 33.891211],\n              [117.715095, 33.879287],\n              [117.672595, 33.934916],\n              [117.671363, 33.992494],\n              [117.629479, 34.028708],\n              [117.612849, 34.000433],\n              [117.569117, 33.985051],\n              [117.543248, 34.038627],\n              [117.514914, 34.060941],\n              [117.435458, 34.028212],\n              [117.404045, 34.03218],\n              [117.357234, 34.088205],\n              [117.311654, 34.067882],\n              [117.277162, 34.078787],\n              [117.257452, 34.065899],\n              [117.192162, 34.068873],\n              [117.130568, 34.101586],\n              [117.123793, 34.128342],\n              [117.046801, 34.151622],\n              [117.025243, 34.167469],\n              [117.051112, 34.221425],\n              [116.969192, 34.283753],\n              [116.983359, 34.348011],\n              [116.960569, 34.363821],\n              [116.969192, 34.389012],\n              [116.909446, 34.408271],\n              [116.828142, 34.389012],\n              [116.782563, 34.429993],\n              [116.773939, 34.453683],\n              [116.722816, 34.472434],\n              [116.662454, 34.472927],\n              [116.592237, 34.493646],\n              [116.594085, 34.511894],\n              [116.490607, 34.573513],\n              [116.477057, 34.614896],\n              [116.432709, 34.630163],\n              [116.430245, 34.650843],\n              [116.374195, 34.640011],\n              [116.392057, 34.710391],\n              [116.363724, 34.715311],\n              [116.369267, 34.749247],\n              [116.403144, 34.756131],\n              [116.408071, 34.850972],\n              [116.445028, 34.895652],\n              [116.557745, 34.908905],\n              [116.613795, 34.922645],\n              [116.622418, 34.939818],\n              [116.677853, 34.939327],\n              [116.781331, 34.916757],\n              [116.781947, 34.961891],\n              [116.809048, 34.968757],\n              [116.821983, 34.929515],\n              [116.858323, 34.928533],\n              [116.922381, 34.894671],\n              [116.929156, 34.843114],\n              [116.966113, 34.844588],\n              [116.979047, 34.815113],\n              [116.95133, 34.81069],\n              [116.969192, 34.771864],\n              [117.022163, 34.759081],\n              [117.070206, 34.713835],\n              [117.061583, 34.675947],\n              [117.073286, 34.639026],\n              [117.104083, 34.648874],\n              [117.15151, 34.559222],\n              [117.139191, 34.526687],\n              [117.166293, 34.434435],\n              [117.248213, 34.451216],\n              [117.252524, 34.48674],\n              [117.27285, 34.499565],\n              [117.267307, 34.528659],\n              [117.311654, 34.561686],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 330000,\n        name: '浙江省',\n        center: [120.153576, 30.287459],\n        centroid: [120.109921, 29.181449],\n        childrenNum: 11,\n        level: 'province',\n        subFeatureIndex: 10,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [118.433896, 28.288335],\n              [118.480091, 28.327325],\n              [118.455454, 28.384204],\n              [118.432048, 28.402104],\n              [118.456686, 28.424738],\n              [118.474548, 28.478934],\n              [118.414802, 28.497344],\n              [118.4302, 28.515225],\n              [118.412338, 28.55676],\n              [118.428352, 28.617193],\n              [118.428352, 28.617193],\n              [118.428352, 28.681267],\n              [118.403099, 28.702791],\n              [118.364295, 28.813491],\n              [118.300237, 28.826075],\n              [118.270056, 28.918836],\n              [118.195527, 28.904167],\n              [118.227556, 28.942406],\n              [118.165346, 28.986912],\n              [118.133933, 28.983771],\n              [118.115455, 29.009944],\n              [118.115455, 29.009944],\n              [118.097593, 28.998952],\n              [118.066796, 29.053898],\n              [118.076035, 29.074822],\n              [118.037847, 29.102017],\n              [118.045238, 29.149068],\n              [118.027992, 29.167882],\n              [118.042159, 29.210202],\n              [118.073571, 29.216993],\n              [118.077883, 29.290614],\n              [118.138861, 29.283828],\n              [118.178281, 29.297921],\n              [118.166578, 29.314099],\n              [118.205382, 29.343839],\n              [118.193064, 29.395472],\n              [118.248498, 29.431443],\n              [118.316252, 29.422581],\n              [118.306396, 29.479384],\n              [118.329802, 29.495012],\n              [118.347664, 29.474174],\n              [118.381541, 29.504909],\n              [118.496106, 29.519492],\n              [118.500417, 29.57572],\n              [118.532446, 29.588731],\n              [118.573714, 29.638159],\n              [118.61991, 29.654282],\n              [118.647011, 29.64336],\n              [118.700598, 29.706277],\n              [118.744945, 29.73902],\n              [118.740634, 29.814859],\n              [118.841032, 29.891159],\n              [118.838568, 29.934733],\n              [118.894619, 29.937845],\n              [118.902626, 30.029078],\n              [118.878604, 30.064822],\n              [118.873677, 30.11505],\n              [118.895234, 30.148694],\n              [118.852119, 30.149729],\n              [118.852735, 30.166805],\n              [118.929727, 30.2025],\n              [118.905089, 30.216464],\n              [118.877988, 30.282637],\n              [118.880452, 30.31519],\n              [118.954365, 30.360126],\n              [118.988857, 30.332237],\n              [119.06277, 30.304856],\n              [119.091719, 30.323972],\n              [119.126828, 30.304856],\n              [119.201356, 30.290905],\n              [119.236465, 30.297106],\n              [119.246936, 30.341018],\n              [119.277117, 30.341018],\n              [119.326392, 30.372002],\n              [119.349182, 30.349281],\n              [119.402768, 30.374584],\n              [119.36766, 30.38491],\n              [119.335015, 30.448389],\n              [119.336247, 30.508734],\n              [119.326392, 30.532964],\n              [119.272189, 30.510281],\n              [119.237081, 30.546881],\n              [119.265414, 30.574709],\n              [119.238929, 30.609225],\n              [119.323312, 30.630341],\n              [119.343022, 30.664322],\n              [119.39045, 30.685941],\n              [119.408312, 30.645274],\n              [119.444652, 30.650422],\n              [119.482841, 30.704467],\n              [119.479761, 30.772365],\n              [119.527188, 30.77905],\n              [119.55429, 30.825828],\n              [119.575847, 30.829939],\n              [119.557369, 30.874124],\n              [119.563529, 30.919315],\n              [119.582007, 30.932149],\n              [119.580159, 30.967051],\n              [119.633746, 31.019379],\n              [119.629434, 31.085517],\n              [119.649144, 31.104991],\n              [119.623891, 31.130096],\n              [119.678093, 31.167997],\n              [119.705811, 31.152634],\n              [119.715666, 31.169533],\n              [119.779723, 31.17875],\n              [119.809904, 31.148536],\n              [119.827151, 31.174142],\n              [119.878274, 31.160828],\n              [119.921389, 31.170045],\n              [119.946027, 31.106016],\n              [119.988527, 31.059375],\n              [120.001461, 31.027071],\n              [120.052584, 31.00553],\n              [120.111099, 30.955761],\n              [120.149903, 30.937283],\n              [120.223816, 30.926502],\n              [120.316206, 30.933689],\n              [120.371025, 30.948575],\n              [120.35809, 30.886964],\n              [120.42338, 30.902884],\n              [120.435083, 30.920855],\n              [120.441858, 30.860768],\n              [120.460336, 30.839702],\n              [120.489285, 30.763624],\n              [120.503452, 30.757967],\n              [120.563814, 30.835592],\n              [120.589068, 30.854603],\n              [120.653741, 30.846896],\n              [120.68269, 30.882342],\n              [120.713487, 30.88491],\n              [120.709176, 30.933176],\n              [120.684538, 30.955247],\n              [120.698089, 30.970643],\n              [120.746132, 30.962432],\n              [120.770154, 30.996809],\n              [120.820661, 31.006556],\n              [120.865624, 30.989627],\n              [120.901349, 31.017327],\n              [120.940153, 31.010146],\n              [120.949392, 31.030148],\n              [120.989428, 31.01425],\n              [121.000515, 30.938309],\n              [120.993124, 30.889532],\n              [121.020225, 30.872069],\n              [120.991892, 30.837133],\n              [121.038087, 30.814007],\n              [121.060261, 30.845354],\n              [121.097833, 30.857171],\n              [121.13787, 30.826342],\n              [121.123087, 30.77905],\n              [121.174826, 30.771851],\n              [121.21671, 30.785734],\n              [121.232108, 30.755909],\n              [121.272144, 30.723504],\n              [121.274608, 30.677191],\n              [121.239499, 30.648878],\n              [121.188992, 30.632916],\n              [121.148956, 30.599953],\n              [121.058413, 30.563888],\n              [121.092906, 30.515952],\n              [121.183449, 30.434458],\n              [121.225333, 30.404526],\n              [121.328195, 30.397299],\n              [121.371926, 30.37097],\n              [121.395332, 30.338435],\n              [121.497578, 30.258861],\n              [121.561636, 30.184395],\n              [121.635548, 30.070002],\n              [121.652795, 30.071037],\n              [121.699606, 30.007832],\n              [121.721164, 29.992802],\n              [121.78399, 29.99332],\n              [121.835113, 29.958068],\n              [121.919497, 29.920729],\n              [121.971235, 29.955476],\n              [122.00388, 29.92021],\n              [122.00696, 29.891678],\n              [122.140003, 29.901535],\n              [122.143082, 29.877668],\n              [122.10243, 29.859504],\n              [122.043916, 29.822647],\n              [122.003264, 29.762401],\n              [121.937359, 29.748373],\n              [121.833265, 29.653242],\n              [121.872685, 29.632437],\n              [121.909641, 29.650122],\n              [121.966308, 29.636078],\n              [122.000185, 29.582486],\n              [121.995257, 29.545007],\n              [121.968772, 29.515846],\n              [121.973083, 29.477821],\n              [121.993409, 29.45229],\n              [121.975547, 29.411113],\n              [121.937975, 29.384],\n              [121.936127, 29.348012],\n              [121.958301, 29.334448],\n              [121.94475, 29.28435],\n              [122.000185, 29.278608],\n              [122.002032, 29.260336],\n              [121.966924, 29.249894],\n              [121.971851, 29.193485],\n              [121.948446, 29.193485],\n              [121.986634, 29.154817],\n              [121.988482, 29.110906],\n              [121.970004, 29.092604],\n              [121.966308, 29.052852],\n              [121.884388, 29.105677],\n              [121.85975, 29.086328],\n              [121.811091, 29.10986],\n              [121.780294, 29.10986],\n              [121.767975, 29.166837],\n              [121.750113, 29.136523],\n              [121.715621, 29.125022],\n              [121.608447, 29.168927],\n              [121.616454, 29.143318],\n              [121.660186, 29.118226],\n              [121.658954, 29.058606],\n              [121.712541, 29.028783],\n              [121.711309, 28.985865],\n              [121.743338, 28.954451],\n              [121.772287, 28.898404],\n              [121.774751, 28.863818],\n              [121.687287, 28.863294],\n              [121.704534, 28.804577],\n              [121.689135, 28.719062],\n              [121.646019, 28.682842],\n              [121.540694, 28.655537],\n              [121.557324, 28.645033],\n              [121.596128, 28.575156],\n              [121.634317, 28.562542],\n              [121.646019, 28.511544],\n              [121.671273, 28.472621],\n              [121.692831, 28.407368],\n              [121.658954, 28.392628],\n              [121.634317, 28.347868],\n              [121.660186, 28.355768],\n              [121.669425, 28.33312],\n              [121.627541, 28.251966],\n              [121.580114, 28.240368],\n              [121.571491, 28.279376],\n              [121.538846, 28.299401],\n              [121.488955, 28.301509],\n              [121.45631, 28.250385],\n              [121.402107, 28.197127],\n              [121.373774, 28.133287],\n              [121.328195, 28.134343],\n              [121.299862, 28.067297],\n              [121.261057, 28.034551],\n              [121.176058, 28.022401],\n              [121.140949, 28.031382],\n              [121.121239, 28.12537],\n              [121.108304, 28.139092],\n              [121.059029, 28.096338],\n              [121.015298, 27.981714],\n              [120.991892, 27.95],\n              [121.05595, 27.900294],\n              [121.099681, 27.895005],\n              [121.162507, 27.90717],\n              [121.162507, 27.879136],\n              [121.193304, 27.872259],\n              [121.192072, 27.822518],\n              [121.152652, 27.810344],\n              [121.153268, 27.809815],\n              [121.149572, 27.801875],\n              [121.149572, 27.801345],\n              [121.13479, 27.787051],\n              [121.134174, 27.787051],\n              [121.152036, 27.815638],\n              [121.107688, 27.81352],\n              [121.070116, 27.834162],\n              [121.027616, 27.832574],\n              [120.97403, 27.887071],\n              [120.942001, 27.896592],\n              [120.910588, 27.864852],\n              [120.840371, 27.758986],\n              [120.797871, 27.779638],\n              [120.760915, 27.717671],\n              [120.709176, 27.682699],\n              [120.685154, 27.622797],\n              [120.634647, 27.577186],\n              [120.637111, 27.561271],\n              [120.703016, 27.478475],\n              [120.673451, 27.420055],\n              [120.665444, 27.357884],\n              [120.580444, 27.321203],\n              [120.554575, 27.25206],\n              [120.574901, 27.234501],\n              [120.545952, 27.156785],\n              [120.492365, 27.136016],\n              [120.461568, 27.142407],\n              [120.404286, 27.204166],\n              [120.401822, 27.250996],\n              [120.430155, 27.258976],\n              [120.343924, 27.363199],\n              [120.340844, 27.399867],\n              [120.273091, 27.38924],\n              [120.26262, 27.432804],\n              [120.221352, 27.420055],\n              [120.134504, 27.420055],\n              [120.136968, 27.402523],\n              [120.096316, 27.390302],\n              [120.052584, 27.338747],\n              [120.026099, 27.344063],\n              [120.008237, 27.375423],\n              [119.960194, 27.365857],\n              [119.938636, 27.329709],\n              [119.843165, 27.300464],\n              [119.768636, 27.307909],\n              [119.782187, 27.330241],\n              [119.739687, 27.362668],\n              [119.750774, 27.373829],\n              [119.711354, 27.403054],\n              [119.685485, 27.438646],\n              [119.703347, 27.446613],\n              [119.70889, 27.514042],\n              [119.690412, 27.537394],\n              [119.659615, 27.540578],\n              [119.675014, 27.574534],\n              [119.630666, 27.582491],\n              [119.626354, 27.620676],\n              [119.644217, 27.663619],\n              [119.606028, 27.674749],\n              [119.541971, 27.666799],\n              [119.501319, 27.649837],\n              [119.501935, 27.610601],\n              [119.466826, 27.526249],\n              [119.438493, 27.508734],\n              [119.416935, 27.539517],\n              [119.360269, 27.524657],\n              [119.334399, 27.480067],\n              [119.285124, 27.457766],\n              [119.26911, 27.42218],\n              [119.224146, 27.416868],\n              [119.14777, 27.424836],\n              [119.121284, 27.438115],\n              [119.129907, 27.475289],\n              [119.092335, 27.466262],\n              [119.03998, 27.478475],\n              [119.020886, 27.498118],\n              [118.983314, 27.498649],\n              [118.986393, 27.47582],\n              [118.955597, 27.4498],\n              [118.907553, 27.460952],\n              [118.869365, 27.540047],\n              [118.909401, 27.568168],\n              [118.913713, 27.619616],\n              [118.879836, 27.667859],\n              [118.873677, 27.733563],\n              [118.829329, 27.847921],\n              [118.818242, 27.916689],\n              [118.753568, 27.947885],\n              [118.730163, 27.970615],\n              [118.733858, 28.027684],\n              [118.719076, 28.063601],\n              [118.767735, 28.10584],\n              [118.802228, 28.117453],\n              [118.805923, 28.154923],\n              [118.771431, 28.188687],\n              [118.804075, 28.207675],\n              [118.802228, 28.240368],\n              [118.756032, 28.252493],\n              [118.719692, 28.312047],\n              [118.699366, 28.309939],\n              [118.674728, 28.27147],\n              [118.651322, 28.277267],\n              [118.595272, 28.258292],\n              [118.588497, 28.282538],\n              [118.493026, 28.262509],\n              [118.490562, 28.238259],\n              [118.444367, 28.253548],\n              [118.433896, 28.288335],\n            ],\n          ],\n          [\n            [\n              [122.163408, 29.988137],\n              [122.118445, 29.986582],\n              [122.106742, 30.005759],\n              [122.027902, 29.991247],\n              [121.978011, 30.059125],\n              [121.989714, 30.077252],\n              [121.983554, 30.100554],\n              [121.934895, 30.161631],\n              [121.955221, 30.183878],\n              [122.048844, 30.147141],\n              [122.095655, 30.158008],\n              [122.152938, 30.113497],\n              [122.293988, 30.100554],\n              [122.288444, 30.073109],\n              [122.310002, 30.039958],\n              [122.343879, 30.020269],\n              [122.341415, 29.976733],\n              [122.322321, 29.940438],\n              [122.279205, 29.937326],\n              [122.239785, 29.962735],\n              [122.163408, 29.988137],\n            ],\n          ],\n          [\n            [\n              [122.213915, 30.186464],\n              [122.168336, 30.138343],\n              [122.143698, 30.163183],\n              [122.152938, 30.19112],\n              [122.178807, 30.199396],\n              [122.213915, 30.186464],\n            ],\n          ],\n          [\n            [\n              [122.229314, 29.711995],\n              [122.231162, 29.710435],\n              [122.269966, 29.685482],\n              [122.210836, 29.700559],\n              [122.229314, 29.711995],\n            ],\n          ],\n          [\n            [\n              [122.427646, 30.738422],\n              [122.445509, 30.745109],\n              [122.475074, 30.714243],\n              [122.528045, 30.725047],\n              [122.532972, 30.696748],\n              [122.427031, 30.697777],\n              [122.427646, 30.738422],\n            ],\n          ],\n          [\n            [\n              [122.162793, 30.329654],\n              [122.176343, 30.351863],\n              [122.191126, 30.329654],\n              [122.228082, 30.329654],\n              [122.247176, 30.30124],\n              [122.231778, 30.234562],\n              [122.154169, 30.244903],\n              [122.058083, 30.291938],\n              [122.162793, 30.329654],\n            ],\n          ],\n          [\n            [\n              [122.317393, 30.249556],\n              [122.333408, 30.272817],\n              [122.40732, 30.272817],\n              [122.417175, 30.238699],\n              [122.365437, 30.255242],\n              [122.358661, 30.236113],\n              [122.277973, 30.242835],\n              [122.317393, 30.249556],\n            ],\n          ],\n          [\n            [\n              [122.026054, 29.178333],\n              [122.036525, 29.20759],\n              [122.075945, 29.176243],\n              [122.056851, 29.158476],\n              [122.013119, 29.151681],\n              [122.026054, 29.178333],\n            ],\n          ],\n          [\n            [\n              [122.372212, 29.893234],\n              [122.362973, 29.894272],\n              [122.353734, 29.89946],\n              [122.338951, 29.911911],\n              [122.330944, 29.937845],\n              [122.351886, 29.959105],\n              [122.398081, 29.9394],\n              [122.411632, 29.951846],\n              [122.43319, 29.919173],\n              [122.433806, 29.883376],\n              [122.401777, 29.869884],\n              [122.415944, 29.828877],\n              [122.386379, 29.834069],\n              [122.372212, 29.893234],\n            ],\n          ],\n          [\n            [\n              [122.43011, 30.408655],\n              [122.352502, 30.422074],\n              [122.318625, 30.407106],\n              [122.281669, 30.418461],\n              [122.277973, 30.471603],\n              [122.37406, 30.461802],\n              [122.432574, 30.445294],\n              [122.43011, 30.408655],\n            ],\n          ],\n          [\n            [\n              [121.837577, 28.770484],\n              [121.861598, 28.814016],\n              [121.86283, 28.782024],\n              [121.837577, 28.770484],\n            ],\n          ],\n          [\n            [\n              [122.265038, 29.84549],\n              [122.319241, 29.829397],\n              [122.299531, 29.819532],\n              [122.325401, 29.781621],\n              [122.310002, 29.766557],\n              [122.248408, 29.804473],\n              [122.221307, 29.832512],\n              [122.265038, 29.84549],\n            ],\n          ],\n          [\n            [\n              [121.790765, 29.082144],\n              [121.82033, 29.099402],\n              [121.84312, 29.082144],\n              [121.832649, 29.050236],\n              [121.790765, 29.082144],\n            ],\n          ],\n          [\n            [\n              [121.943518, 30.776993],\n              [121.970004, 30.789333],\n              [121.987866, 30.753338],\n              [121.992793, 30.695204],\n              [122.011271, 30.66947],\n              [122.075329, 30.647848],\n              [122.133227, 30.595317],\n              [122.087032, 30.602014],\n              [121.997105, 30.658659],\n              [121.968156, 30.688514],\n              [121.943518, 30.776993],\n            ],\n          ],\n          [\n            [\n              [121.889315, 28.471569],\n              [121.881924, 28.502603],\n              [121.918881, 28.497344],\n              [121.889315, 28.471569],\n            ],\n          ],\n          [\n            [\n              [122.182503, 29.650642],\n              [122.138155, 29.662083],\n              [122.095655, 29.716673],\n              [122.074097, 29.701599],\n              [122.047612, 29.719791],\n              [122.083952, 29.78318],\n              [122.13138, 29.788893],\n              [122.146778, 29.749412],\n              [122.200365, 29.712515],\n              [122.211452, 29.692241],\n              [122.182503, 29.650642],\n            ],\n          ],\n          [\n            [\n              [122.461523, 29.944068],\n              [122.459059, 29.938882],\n              [122.467067, 29.928509],\n              [122.462755, 29.927991],\n              [122.457827, 29.927472],\n              [122.45598, 29.926435],\n              [122.452284, 29.935252],\n              [122.4529, 29.936807],\n              [122.449204, 29.9394],\n              [122.450436, 29.940956],\n              [122.451052, 29.940956],\n              [122.451668, 29.943031],\n              [122.460291, 29.947179],\n              [122.459675, 29.944586],\n              [122.461523, 29.944068],\n            ],\n          ],\n          [\n            [\n              [122.570544, 30.644244],\n              [122.546523, 30.651967],\n              [122.559457, 30.679764],\n              [122.570544, 30.644244],\n            ],\n          ],\n          [\n            [\n              [121.869605, 28.423685],\n              [121.889931, 28.45105],\n              [121.910873, 28.44],\n              [121.869605, 28.423685],\n            ],\n          ],\n          [\n            [\n              [122.391306, 29.970512],\n              [122.3679, 29.980361],\n              [122.378371, 30.023896],\n              [122.411632, 30.025969],\n              [122.391306, 29.970512],\n            ],\n          ],\n          [\n            [\n              [122.065474, 30.179739],\n              [122.025438, 30.161631],\n              [122.017431, 30.186464],\n              [122.055619, 30.200431],\n              [122.065474, 30.179739],\n            ],\n          ],\n          [\n            [\n              [121.850511, 29.977251],\n              [121.844968, 29.982953],\n              [121.84004, 30.047211],\n              [121.848663, 30.101072],\n              [121.88562, 30.094859],\n              [121.924424, 30.052391],\n              [121.933047, 29.994875],\n              [121.874533, 29.964809],\n              [121.850511, 29.977251],\n            ],\n          ],\n          [\n            [\n              [121.066421, 27.478475],\n              [121.067036, 27.478475],\n              [121.107073, 27.443958],\n              [121.066421, 27.461483],\n              [121.066421, 27.478475],\n            ],\n          ],\n          [\n            [\n              [121.952141, 29.187738],\n              [121.976779, 29.191918],\n              [121.979243, 29.160043],\n              [121.952141, 29.187738],\n            ],\n          ],\n          [\n            [\n              [122.038373, 29.759284],\n              [122.02975, 29.716673],\n              [122.011271, 29.746294],\n              [122.038373, 29.759284],\n            ],\n          ],\n          [\n            [\n              [121.957685, 30.287804],\n              [121.921344, 30.30744],\n              [121.94167, 30.33327],\n              [121.989098, 30.339985],\n              [122.0008, 30.308473],\n              [121.957685, 30.287804],\n            ],\n          ],\n          [\n            [\n              [121.940438, 30.114533],\n              [121.962612, 30.106249],\n              [121.945982, 30.064304],\n              [121.910257, 30.089163],\n              [121.940438, 30.114533],\n            ],\n          ],\n          [\n            [\n              [122.155401, 29.970512],\n              [122.154169, 29.97103],\n              [122.152322, 29.97103],\n              [122.163408, 29.988137],\n              [122.196053, 29.960661],\n              [122.155401, 29.970512],\n            ],\n          ],\n          [\n            [\n              [122.287828, 29.723949],\n              [122.251488, 29.731225],\n              [122.2133, 29.771752],\n              [122.241633, 29.784738],\n              [122.258263, 29.753569],\n              [122.301379, 29.748373],\n              [122.287828, 29.723949],\n            ],\n          ],\n          [\n            [\n              [121.134174, 27.787051],\n              [121.13479, 27.787051],\n              [121.134174, 27.785992],\n              [121.134174, 27.787051],\n            ],\n          ],\n          [\n            [\n              [122.264423, 30.269716],\n              [122.300147, 30.271266],\n              [122.315545, 30.250073],\n              [122.253952, 30.237147],\n              [122.264423, 30.269716],\n            ],\n          ],\n          [\n            [\n              [122.282901, 29.860542],\n              [122.301379, 29.883895],\n              [122.343263, 29.882857],\n              [122.343263, 29.860542],\n              [122.30877, 29.849642],\n              [122.282901, 29.860542],\n            ],\n          ],\n          [\n            [\n              [122.781196, 30.694175],\n              [122.757174, 30.713728],\n              [122.778732, 30.729677],\n              [122.799674, 30.716301],\n              [122.781196, 30.694175],\n            ],\n          ],\n          [\n            [\n              [121.098449, 27.937311],\n              [121.038087, 27.948942],\n              [121.0695, 27.984357],\n              [121.120623, 27.986471],\n              [121.152652, 27.961629],\n              [121.098449, 27.937311],\n            ],\n          ],\n          [\n            [\n              [121.185913, 27.963215],\n              [121.17113, 27.978543],\n              [121.197616, 28.000739],\n              [121.237652, 27.988056],\n              [121.185913, 27.963215],\n            ],\n          ],\n          [\n            [\n              [122.454132, 29.956513],\n              [122.455364, 29.955994],\n              [122.458443, 29.951846],\n              [122.459059, 29.950809],\n              [122.447972, 29.947698],\n              [122.446741, 29.951327],\n              [122.445509, 29.952365],\n              [122.447972, 29.955994],\n              [122.454132, 29.956513],\n            ],\n          ],\n          [\n            [\n              [122.836014, 30.698806],\n              [122.807681, 30.714243],\n              [122.831087, 30.728648],\n              [122.836014, 30.698806],\n            ],\n          ],\n          [\n            [\n              [122.200365, 29.969475],\n              [122.239785, 29.960142],\n              [122.273662, 29.93214],\n              [122.233626, 29.946661],\n              [122.200365, 29.969475],\n            ],\n          ],\n          [\n            [\n              [122.029134, 29.954957],\n              [122.058699, 29.955994],\n              [122.043916, 29.930584],\n              [122.029134, 29.954957],\n            ],\n          ],\n          [\n            [\n              [121.044247, 27.979072],\n              [121.073812, 28.007608],\n              [121.089826, 27.998625],\n              [121.044247, 27.979072],\n            ],\n          ],\n          [\n            [\n              [122.471378, 29.927472],\n              [122.47261, 29.927472],\n              [122.473226, 29.925397],\n              [122.470762, 29.925916],\n              [122.471378, 29.927472],\n            ],\n          ],\n          [\n            [\n              [122.152322, 29.97103],\n              [122.154169, 29.97103],\n              [122.155401, 29.970512],\n              [122.152322, 29.97103],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 340000,\n        name: '安徽省',\n        center: [117.283042, 31.86119],\n        centroid: [117.226862, 31.849273],\n        childrenNum: 16,\n        level: 'province',\n        subFeatureIndex: 11,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [116.599629, 34.014324],\n              [116.599629, 34.014324],\n              [116.576223, 34.068873],\n              [116.576223, 34.068873],\n              [116.52818, 34.122892],\n              [116.536187, 34.151127],\n              [116.565752, 34.16945],\n              [116.542962, 34.203608],\n              [116.545426, 34.241711],\n              [116.582382, 34.266444],\n              [116.562056, 34.285731],\n              [116.516477, 34.296114],\n              [116.456731, 34.268917],\n              [116.409303, 34.273863],\n              [116.409303, 34.273863],\n              [116.372347, 34.26595],\n              [116.363724, 34.316877],\n              [116.301514, 34.342082],\n              [116.255934, 34.376665],\n              [116.213435, 34.382098],\n              [116.215898, 34.403333],\n              [116.178942, 34.430487],\n              [116.162312, 34.459605],\n              [116.178326, 34.496112],\n              [116.204196, 34.508442],\n              [116.191261, 34.535561],\n              [116.196804, 34.575977],\n              [116.247927, 34.551829],\n              [116.286116, 34.608986],\n              [116.32492, 34.601104],\n              [116.334159, 34.620806],\n              [116.374195, 34.640011],\n              [116.430245, 34.650843],\n              [116.432709, 34.630163],\n              [116.477057, 34.614896],\n              [116.490607, 34.573513],\n              [116.594085, 34.511894],\n              [116.592237, 34.493646],\n              [116.662454, 34.472927],\n              [116.722816, 34.472434],\n              [116.773939, 34.453683],\n              [116.782563, 34.429993],\n              [116.828142, 34.389012],\n              [116.909446, 34.408271],\n              [116.969192, 34.389012],\n              [116.960569, 34.363821],\n              [116.983359, 34.348011],\n              [116.969192, 34.283753],\n              [117.051112, 34.221425],\n              [117.025243, 34.167469],\n              [117.046801, 34.151622],\n              [117.123793, 34.128342],\n              [117.130568, 34.101586],\n              [117.192162, 34.068873],\n              [117.257452, 34.065899],\n              [117.277162, 34.078787],\n              [117.311654, 34.067882],\n              [117.357234, 34.088205],\n              [117.404045, 34.03218],\n              [117.435458, 34.028212],\n              [117.514914, 34.060941],\n              [117.543248, 34.038627],\n              [117.569117, 33.985051],\n              [117.612849, 34.000433],\n              [117.629479, 34.028708],\n              [117.671363, 33.992494],\n              [117.672595, 33.934916],\n              [117.715095, 33.879287],\n              [117.753899, 33.891211],\n              [117.759442, 33.874318],\n              [117.739732, 33.758467],\n              [117.72495, 33.74951],\n              [117.750203, 33.710688],\n              [117.791471, 33.733585],\n              [117.843826, 33.736074],\n              [117.901724, 33.720146],\n              [117.972557, 33.74951],\n              [118.019985, 33.738562],\n              [118.065564, 33.76593],\n              [118.117919, 33.766427],\n              [118.161035, 33.735576],\n              [118.16781, 33.663381],\n              [118.112376, 33.617045],\n              [118.117919, 33.594615],\n              [118.107448, 33.475391],\n              [118.050782, 33.491863],\n              [118.027376, 33.455421],\n              [118.016905, 33.402978],\n              [118.029224, 33.374995],\n              [117.992883, 33.333005],\n              [117.974405, 33.279487],\n              [117.939297, 33.262475],\n              [117.942376, 33.224936],\n              [117.977485, 33.226437],\n              [117.988572, 33.180869],\n              [118.037231, 33.152314],\n              [118.038463, 33.134776],\n              [118.149332, 33.169348],\n              [118.178281, 33.217926],\n              [118.217085, 33.191888],\n              [118.219549, 33.114227],\n              [118.243571, 33.027967],\n              [118.244803, 32.998359],\n              [118.26944, 32.969242],\n              [118.303933, 32.96874],\n              [118.291614, 32.946143],\n              [118.252194, 32.936601],\n              [118.2331, 32.914498],\n              [118.250346, 32.848157],\n              [118.301469, 32.846145],\n              [118.300237, 32.783275],\n              [118.334114, 32.761637],\n              [118.363063, 32.770695],\n              [118.375382, 32.718849],\n              [118.411106, 32.715828],\n              [118.450526, 32.743518],\n              [118.483787, 32.721367],\n              [118.560163, 32.729926],\n              [118.572482, 32.719856],\n              [118.642699, 32.744525],\n              [118.707373, 32.72036],\n              [118.756648, 32.737477],\n              [118.73817, 32.772708],\n              [118.743097, 32.853184],\n              [118.743097, 32.853184],\n              [118.810235, 32.853687],\n              [118.821322, 32.920527],\n              [118.846575, 32.922034],\n              [118.849039, 32.956689],\n              [118.89585, 32.957694],\n              [118.89585, 32.957694],\n              [118.892771, 32.941121],\n              [118.934039, 32.93861],\n              [118.993169, 32.958196],\n              [119.020886, 32.955685],\n              [119.054763, 32.8748],\n              [119.113277, 32.823014],\n              [119.184726, 32.825529],\n              [119.211827, 32.708275],\n              [119.208748, 32.641276],\n              [119.230921, 32.607001],\n              [119.22045, 32.576748],\n              [119.152697, 32.557582],\n              [119.168096, 32.536394],\n              [119.142226, 32.499556],\n              [119.084944, 32.452602],\n              [119.041212, 32.515201],\n              [118.975923, 32.505108],\n              [118.922336, 32.557078],\n              [118.92172, 32.557078],\n              [118.922336, 32.557078],\n              [118.92172, 32.557078],\n              [118.890923, 32.553042],\n              [118.908169, 32.59238],\n              [118.84288, 32.56767],\n              [118.820706, 32.60448],\n              [118.784981, 32.582295],\n              [118.757264, 32.603976],\n              [118.73509, 32.58885],\n              [118.719076, 32.614059],\n              [118.719076, 32.614059],\n              [118.688895, 32.588346],\n              [118.658714, 32.594397],\n              [118.632844, 32.578261],\n              [118.59712, 32.600951],\n              [118.568787, 32.585825],\n              [118.564475, 32.562122],\n              [118.608823, 32.536899],\n              [118.592192, 32.481383],\n              [118.628533, 32.467751],\n              [118.691359, 32.472295],\n              [118.685199, 32.403604],\n              [118.703061, 32.328792],\n              [118.657482, 32.30148],\n              [118.674728, 32.250375],\n              [118.643931, 32.209875],\n              [118.510888, 32.194176],\n              [118.49549, 32.165304],\n              [118.501033, 32.121726],\n              [118.433896, 32.086746],\n              [118.394476, 32.076098],\n              [118.389548, 31.985281],\n              [118.363679, 31.930443],\n              [118.472084, 31.879639],\n              [118.466541, 31.857784],\n              [118.504729, 31.841516],\n              [118.481939, 31.778453],\n              [118.533678, 31.76726],\n              [118.521975, 31.743343],\n              [118.5577, 31.73011],\n              [118.571866, 31.746397],\n              [118.641467, 31.75861],\n              [118.653786, 31.73011],\n              [118.697518, 31.709747],\n              [118.643315, 31.671555],\n              [118.643315, 31.649651],\n              [118.736322, 31.633347],\n              [118.748025, 31.675629],\n              [118.773894, 31.682759],\n              [118.802844, 31.619078],\n              [118.858894, 31.623665],\n              [118.881684, 31.564023],\n              [118.885995, 31.519139],\n              [118.868133, 31.520669],\n              [118.857046, 31.506384],\n              [118.883532, 31.500261],\n              [118.852119, 31.393553],\n              [118.824401, 31.375672],\n              [118.767735, 31.363919],\n              [118.745561, 31.372606],\n              [118.720924, 31.322518],\n              [118.726467, 31.282121],\n              [118.756648, 31.279564],\n              [118.794836, 31.229426],\n              [118.870597, 31.242219],\n              [118.984546, 31.237102],\n              [119.014727, 31.241707],\n              [119.10527, 31.235055],\n              [119.107118, 31.250917],\n              [119.158241, 31.294907],\n              [119.197661, 31.295418],\n              [119.198277, 31.270357],\n              [119.266646, 31.250405],\n              [119.294363, 31.263195],\n              [119.338095, 31.259103],\n              [119.350414, 31.301043],\n              [119.374435, 31.258591],\n              [119.360269, 31.213049],\n              [119.391682, 31.174142],\n              [119.439109, 31.177214],\n              [119.461283, 31.156219],\n              [119.532732, 31.159291],\n              [119.599869, 31.10909],\n              [119.623891, 31.130096],\n              [119.649144, 31.104991],\n              [119.629434, 31.085517],\n              [119.633746, 31.019379],\n              [119.580159, 30.967051],\n              [119.582007, 30.932149],\n              [119.563529, 30.919315],\n              [119.557369, 30.874124],\n              [119.575847, 30.829939],\n              [119.55429, 30.825828],\n              [119.527188, 30.77905],\n              [119.479761, 30.772365],\n              [119.482841, 30.704467],\n              [119.444652, 30.650422],\n              [119.408312, 30.645274],\n              [119.39045, 30.685941],\n              [119.343022, 30.664322],\n              [119.323312, 30.630341],\n              [119.238929, 30.609225],\n              [119.265414, 30.574709],\n              [119.237081, 30.546881],\n              [119.272189, 30.510281],\n              [119.326392, 30.532964],\n              [119.336247, 30.508734],\n              [119.335015, 30.448389],\n              [119.36766, 30.38491],\n              [119.402768, 30.374584],\n              [119.349182, 30.349281],\n              [119.326392, 30.372002],\n              [119.277117, 30.341018],\n              [119.246936, 30.341018],\n              [119.236465, 30.297106],\n              [119.201356, 30.290905],\n              [119.126828, 30.304856],\n              [119.091719, 30.323972],\n              [119.06277, 30.304856],\n              [118.988857, 30.332237],\n              [118.954365, 30.360126],\n              [118.880452, 30.31519],\n              [118.877988, 30.282637],\n              [118.905089, 30.216464],\n              [118.929727, 30.2025],\n              [118.852735, 30.166805],\n              [118.852119, 30.149729],\n              [118.895234, 30.148694],\n              [118.873677, 30.11505],\n              [118.878604, 30.064822],\n              [118.902626, 30.029078],\n              [118.894619, 29.937845],\n              [118.838568, 29.934733],\n              [118.841032, 29.891159],\n              [118.740634, 29.814859],\n              [118.744945, 29.73902],\n              [118.700598, 29.706277],\n              [118.647011, 29.64336],\n              [118.61991, 29.654282],\n              [118.573714, 29.638159],\n              [118.532446, 29.588731],\n              [118.500417, 29.57572],\n              [118.496106, 29.519492],\n              [118.381541, 29.504909],\n              [118.347664, 29.474174],\n              [118.329802, 29.495012],\n              [118.306396, 29.479384],\n              [118.316252, 29.422581],\n              [118.248498, 29.431443],\n              [118.193064, 29.395472],\n              [118.136397, 29.418932],\n              [118.127774, 29.47209],\n              [118.143788, 29.489803],\n              [118.095129, 29.534072],\n              [118.050782, 29.542924],\n              [118.042774, 29.566351],\n              [118.00397, 29.578322],\n              [117.933753, 29.549172],\n              [117.872775, 29.54761],\n              [117.795167, 29.570515],\n              [117.729877, 29.550213],\n              [117.690457, 29.555939],\n              [117.678754, 29.595496],\n              [117.647957, 29.614749],\n              [117.608537, 29.591333],\n              [117.543248, 29.588731],\n              [117.523538, 29.630356],\n              [117.530313, 29.654282],\n              [117.490277, 29.660003],\n              [117.453936, 29.688082],\n              [117.455168, 29.749412],\n              [117.408973, 29.802396],\n              [117.415132, 29.85068],\n              [117.382487, 29.840818],\n              [117.359082, 29.812782],\n              [117.338756, 29.848085],\n              [117.29256, 29.822647],\n              [117.25314, 29.834588],\n              [117.261763, 29.880781],\n              [117.246365, 29.915023],\n              [117.2168, 29.926953],\n              [117.171836, 29.920729],\n              [117.129952, 29.89946],\n              [117.127489, 29.86158],\n              [117.073286, 29.831992],\n              [117.123177, 29.798761],\n              [117.136728, 29.775388],\n              [117.108395, 29.75201],\n              [117.112706, 29.711995],\n              [117.041873, 29.680803],\n              [116.996294, 29.683403],\n              [116.974736, 29.657403],\n              [116.939627, 29.648561],\n              [116.873722, 29.609546],\n              [116.849084, 29.57624],\n              [116.780715, 29.569994],\n              [116.760389, 29.599139],\n              [116.721585, 29.564789],\n              [116.716657, 29.590813],\n              [116.651983, 29.637118],\n              [116.680317, 29.681323],\n              [116.704954, 29.688602],\n              [116.706802, 29.6964],\n              [116.70557, 29.69692],\n              [116.698795, 29.707836],\n              [116.673541, 29.709916],\n              [116.762237, 29.802396],\n              [116.780715, 29.792529],\n              [116.882961, 29.893753],\n              [116.900207, 29.949253],\n              [116.868794, 29.980361],\n              [116.83307, 29.95755],\n              [116.830606, 30.004723],\n              [116.802889, 29.99643],\n              [116.783794, 30.030632],\n              [116.747454, 30.057053],\n              [116.720353, 30.053945],\n              [116.666766, 30.076734],\n              [116.620571, 30.073109],\n              [116.585462, 30.045657],\n              [116.552201, 29.909836],\n              [116.525716, 29.897385],\n              [116.467818, 29.896347],\n              [116.342782, 29.835626],\n              [116.280572, 29.788893],\n              [116.250391, 29.785777],\n              [116.227601, 29.816936],\n              [116.172783, 29.828358],\n              [116.13521, 29.819532],\n              [116.128435, 29.897904],\n              [116.073616, 29.969993],\n              [116.091479, 30.036331],\n              [116.078544, 30.062233],\n              [116.088399, 30.110391],\n              [116.055754, 30.180774],\n              [116.065609, 30.204569],\n              [115.997856, 30.252657],\n              [115.985537, 30.290905],\n              [115.903001, 30.31364],\n              [115.91532, 30.337919],\n              [115.885139, 30.379747],\n              [115.921479, 30.416397],\n              [115.894994, 30.452517],\n              [115.910393, 30.519046],\n              [115.887603, 30.542758],\n              [115.876516, 30.582438],\n              [115.848799, 30.602014],\n              [115.819234, 30.597893],\n              [115.81369, 30.637035],\n              [115.762567, 30.685426],\n              [115.782893, 30.751795],\n              [115.851262, 30.756938],\n              [115.863581, 30.815549],\n              [115.848799, 30.828397],\n              [115.865429, 30.864364],\n              [115.932566, 30.889532],\n              [115.976298, 30.931636],\n              [116.03974, 30.957813],\n              [116.071769, 30.956787],\n              [116.058834, 31.012711],\n              [116.015102, 31.011685],\n              [116.006479, 31.034764],\n              [115.938726, 31.04707],\n              [115.939958, 31.071678],\n              [115.887603, 31.10909],\n              [115.867277, 31.147512],\n              [115.837712, 31.127022],\n              [115.797676, 31.128047],\n              [115.778582, 31.112164],\n              [115.700973, 31.201276],\n              [115.655394, 31.211002],\n              [115.603655, 31.17363],\n              [115.585793, 31.143926],\n              [115.540213, 31.194621],\n              [115.539597, 31.231985],\n              [115.507568, 31.267799],\n              [115.473076, 31.265242],\n              [115.443511, 31.344498],\n              [115.40717, 31.337854],\n              [115.372062, 31.349098],\n              [115.393004, 31.389977],\n              [115.373909, 31.405813],\n              [115.389924, 31.450241],\n              [115.371446, 31.495668],\n              [115.415793, 31.525771],\n              [115.439815, 31.588496],\n              [115.485394, 31.608885],\n              [115.476771, 31.643028],\n              [115.495249, 31.673083],\n              [115.534054, 31.698545],\n              [115.553764, 31.69549],\n              [115.676336, 31.778453],\n              [115.731154, 31.76726],\n              [115.767495, 31.78761],\n              [115.808147, 31.770313],\n              [115.808147, 31.770313],\n              [115.851878, 31.786593],\n              [115.886371, 31.776418],\n              [115.914704, 31.814567],\n              [115.893762, 31.832365],\n              [115.894994, 31.8649],\n              [115.920248, 31.920285],\n              [115.909161, 31.94314],\n              [115.928871, 32.003046],\n              [115.922095, 32.049725],\n              [115.941805, 32.166318],\n              [115.912856, 32.227596],\n              [115.899306, 32.390971],\n              [115.865429, 32.458662],\n              [115.883291, 32.487946],\n              [115.845719, 32.501575],\n              [115.8759, 32.542448],\n              [115.910393, 32.567165],\n              [115.891298, 32.576243],\n              [115.861117, 32.537403],\n              [115.789052, 32.468761],\n              [115.771806, 32.505108],\n              [115.742241, 32.476335],\n              [115.704669, 32.495013],\n              [115.667712, 32.409667],\n              [115.657857, 32.428864],\n              [115.626445, 32.40512],\n              [115.604271, 32.425833],\n              [115.57101, 32.419266],\n              [115.522967, 32.441997],\n              [115.509416, 32.466741],\n              [115.510648, 32.467751],\n              [115.510648, 32.468256],\n              [115.510648, 32.468761],\n              [115.5088, 32.468761],\n              [115.497713, 32.492489],\n              [115.409018, 32.549007],\n              [115.411482, 32.575235],\n              [115.304924, 32.553042],\n              [115.30554, 32.583303],\n              [115.267352, 32.578261],\n              [115.24333, 32.593388],\n              [115.20083, 32.591876],\n              [115.182968, 32.666973],\n              [115.179273, 32.726402],\n              [115.189744, 32.770695],\n              [115.211301, 32.785791],\n              [115.189744, 32.812452],\n              [115.197135, 32.856201],\n              [115.155867, 32.864747],\n              [115.139237, 32.897917],\n              [115.029599, 32.906962],\n              [115.035143, 32.932582],\n              [115.009273, 32.940117],\n              [114.943368, 32.935094],\n              [114.916266, 32.971251],\n              [114.883006, 32.990328],\n              [114.891629, 33.020441],\n              [114.925506, 33.016928],\n              [114.913187, 33.083143],\n              [114.897172, 33.086653],\n              [114.902716, 33.129764],\n              [114.932897, 33.153817],\n              [114.966158, 33.147304],\n              [114.990795, 33.102195],\n              [115.041302, 33.086653],\n              [115.168186, 33.088658],\n              [115.194671, 33.120743],\n              [115.245178, 33.135778],\n              [115.289526, 33.131769],\n              [115.303692, 33.149809],\n              [115.300613, 33.204407],\n              [115.340033, 33.260973],\n              [115.335105, 33.297997],\n              [115.361591, 33.298497],\n              [115.365286, 33.336005],\n              [115.341881, 33.370997],\n              [115.313547, 33.376994],\n              [115.328946, 33.403477],\n              [115.316627, 33.44893],\n              [115.345576, 33.449928],\n              [115.345576, 33.502842],\n              [115.366518, 33.5233],\n              [115.394851, 33.506335],\n              [115.422569, 33.557219],\n              [115.463837, 33.567193],\n              [115.561771, 33.563703],\n              [115.564851, 33.576169],\n              [115.639995, 33.585143],\n              [115.601191, 33.658898],\n              [115.601807, 33.718653],\n              [115.563003, 33.772895],\n              [115.576553, 33.787817],\n              [115.614126, 33.775879],\n              [115.631988, 33.869846],\n              [115.547604, 33.874815],\n              [115.577785, 33.950307],\n              [115.579017, 33.974133],\n              [115.60735, 34.030196],\n              [115.642459, 34.03218],\n              [115.658473, 34.061437],\n              [115.705901, 34.059949],\n              [115.736082, 34.076805],\n              [115.809378, 34.062428],\n              [115.846335, 34.028708],\n              [115.852494, 34.003906],\n              [115.877132, 34.002913],\n              [115.876516, 34.028708],\n              [115.904233, 34.009859],\n              [115.95782, 34.007875],\n              [116.00032, 33.965199],\n              [115.982457, 33.917039],\n              [116.05945, 33.860902],\n              [116.055754, 33.804727],\n              [116.074232, 33.781351],\n              [116.100102, 33.782843],\n              [116.132747, 33.751501],\n              [116.155536, 33.709693],\n              [116.2005, 33.72612],\n              [116.263326, 33.730101],\n              [116.316912, 33.771402],\n              [116.393905, 33.782843],\n              [116.408071, 33.805721],\n              [116.437021, 33.801246],\n              [116.437637, 33.846489],\n              [116.486296, 33.869846],\n              [116.558361, 33.881274],\n              [116.566984, 33.9081],\n              [116.631042, 33.887733],\n              [116.64336, 33.896675],\n              [116.641512, 33.978103],\n              [116.599629, 34.014324],\n            ],\n          ],\n          [\n            [\n              [118.868133, 31.520669],\n              [118.885995, 31.519139],\n              [118.883532, 31.500261],\n              [118.857046, 31.506384],\n              [118.868133, 31.520669],\n            ],\n          ],\n          [\n            [\n              [116.698795, 29.707836],\n              [116.70557, 29.69692],\n              [116.706802, 29.6964],\n              [116.704954, 29.688602],\n              [116.680317, 29.681323],\n              [116.653831, 29.694841],\n              [116.673541, 29.709916],\n              [116.698795, 29.707836],\n            ],\n          ],\n          [\n            [\n              [115.5088, 32.468761],\n              [115.510648, 32.468761],\n              [115.510648, 32.468256],\n              [115.510648, 32.467751],\n              [115.509416, 32.466741],\n              [115.5088, 32.468761],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 350000,\n        name: '福建省',\n        center: [119.306239, 26.075302],\n        centroid: [118.006365, 26.069889],\n        childrenNum: 9,\n        level: 'province',\n        subFeatureIndex: 12,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [119.004872, 24.970009],\n              [119.007335, 24.963499],\n              [119.032589, 24.961871],\n              [119.032589, 24.961328],\n              [119.014111, 24.941252],\n              [118.945741, 24.954275],\n              [118.91864, 24.932569],\n              [118.932807, 24.906518],\n              [118.987009, 24.898375],\n              [118.988857, 24.878831],\n              [118.933423, 24.870687],\n              [118.864437, 24.887518],\n              [118.834256, 24.854397],\n              [118.807771, 24.870687],\n              [118.748641, 24.84245],\n              [118.69875, 24.848967],\n              [118.702445, 24.865258],\n              [118.647627, 24.843536],\n              [118.650707, 24.808774],\n              [118.786213, 24.77672],\n              [118.778822, 24.743569],\n              [118.703677, 24.665278],\n              [118.670417, 24.679962],\n              [118.652554, 24.653857],\n              [118.661178, 24.622306],\n              [118.687047, 24.63373],\n              [118.680272, 24.58204],\n              [118.614366, 24.521617],\n              [118.558316, 24.51236],\n              [118.557084, 24.572788],\n              [118.512736, 24.60816],\n              [118.444367, 24.614689],\n              [118.363679, 24.567889],\n              [118.375382, 24.536317],\n              [118.242955, 24.51236],\n              [118.169042, 24.559725],\n              [118.150564, 24.583673],\n              [118.121615, 24.570067],\n              [118.084042, 24.528695],\n              [118.048934, 24.418122],\n              [118.088354, 24.408858],\n              [118.081579, 24.35653],\n              [118.112376, 24.357075],\n              [118.158571, 24.269814],\n              [118.115455, 24.229435],\n              [118.074803, 24.225615],\n              [118.019369, 24.197232],\n              [118.000275, 24.152462],\n              [117.936217, 24.100029],\n              [117.927594, 24.039922],\n              [117.910347, 24.012045],\n              [117.864768, 24.004938],\n              [117.807486, 23.947521],\n              [117.792703, 23.906494],\n              [117.762522, 23.886796],\n              [117.691073, 23.888985],\n              [117.671979, 23.878041],\n              [117.651653, 23.815093],\n              [117.660276, 23.789357],\n              [117.601762, 23.70171],\n              [117.54448, 23.715956],\n              [117.501364, 23.70445],\n              [117.493357, 23.642514],\n              [117.454552, 23.628259],\n              [117.463791, 23.584937],\n              [117.387415, 23.555317],\n              [117.302415, 23.550379],\n              [117.291328, 23.571225],\n              [117.192778, 23.5619],\n              [117.192778, 23.629356],\n              [117.147199, 23.654027],\n              [117.123793, 23.647448],\n              [117.055424, 23.694038],\n              [117.048032, 23.758687],\n              [117.019083, 23.801952],\n              [117.012308, 23.855054],\n              [116.981511, 23.855602],\n              [116.955642, 23.922359],\n              [116.976583, 23.931659],\n              [116.981511, 23.999471],\n              [116.953178, 24.008218],\n              [116.930388, 24.064514],\n              [116.9347, 24.126794],\n              [116.998757, 24.179217],\n              [116.956257, 24.216883],\n              [116.933468, 24.220157],\n              [116.938395, 24.28127],\n              [116.914374, 24.287817],\n              [116.919301, 24.321087],\n              [116.895895, 24.350533],\n              [116.903903, 24.369614],\n              [116.839229, 24.442097],\n              [116.860787, 24.460075],\n              [116.83307, 24.496568],\n              [116.796729, 24.502014],\n              [116.759157, 24.545572],\n              [116.761005, 24.583128],\n              [116.815207, 24.654944],\n              [116.777635, 24.679418],\n              [116.667382, 24.658752],\n              [116.623034, 24.64189],\n              [116.600861, 24.654401],\n              [116.570679, 24.621762],\n              [116.530027, 24.604895],\n              [116.506622, 24.621218],\n              [116.517709, 24.652225],\n              [116.485064, 24.720196],\n              [116.44626, 24.714216],\n              [116.416079, 24.744113],\n              [116.419158, 24.767482],\n              [116.375427, 24.803885],\n              [116.381586, 24.82507],\n              [116.417927, 24.840821],\n              [116.395137, 24.877746],\n              [116.363724, 24.87123],\n              [116.345862, 24.828872],\n              [116.297202, 24.801712],\n              [116.244232, 24.793563],\n              [116.251007, 24.82507],\n              [116.221442, 24.829959],\n              [116.191877, 24.877203],\n              [116.153073, 24.846795],\n              [116.068073, 24.850053],\n              [116.015102, 24.905975],\n              [115.985537, 24.899461],\n              [115.907929, 24.923343],\n              [115.89253, 24.936911],\n              [115.870356, 24.959701],\n              [115.925175, 24.960786],\n              [115.873436, 25.019911],\n              [115.928255, 25.050276],\n              [115.908545, 25.084428],\n              [115.880212, 25.092016],\n              [115.888219, 25.128866],\n              [115.860501, 25.165704],\n              [115.855574, 25.20957],\n              [115.930719, 25.236099],\n              [115.949813, 25.292386],\n              [115.987385, 25.290221],\n              [116.008327, 25.319437],\n              [115.992928, 25.374063],\n              [116.023109, 25.435691],\n              [116.005247, 25.490264],\n              [116.03666, 25.514571],\n              [116.040356, 25.548052],\n              [116.063145, 25.56317],\n              [116.041588, 25.62416],\n              [116.068689, 25.646282],\n              [116.067457, 25.703995],\n              [116.106877, 25.701299],\n              [116.129667, 25.758985],\n              [116.18079, 25.778926],\n              [116.131515, 25.824185],\n              [116.132131, 25.860273],\n              [116.17771, 25.894195],\n              [116.225138, 25.908731],\n              [116.258398, 25.902809],\n              [116.303362, 25.924341],\n              [116.326152, 25.956631],\n              [116.369883, 25.963088],\n              [116.360028, 25.991601],\n              [116.384666, 26.030864],\n              [116.489375, 26.113649],\n              [116.476441, 26.172745],\n              [116.435789, 26.159854],\n              [116.392057, 26.171133],\n              [116.400064, 26.202819],\n              [116.385282, 26.238253],\n              [116.412999, 26.297822],\n              [116.437021, 26.308016],\n              [116.459194, 26.345026],\n              [116.499846, 26.361651],\n              [116.519557, 26.410437],\n              [116.553433, 26.400253],\n              [116.553433, 26.365404],\n              [116.601476, 26.372911],\n              [116.608252, 26.429732],\n              [116.638433, 26.477418],\n              [116.610716, 26.476882],\n              [116.597165, 26.512768],\n              [116.539267, 26.559349],\n              [116.553433, 26.575942],\n              [116.566368, 26.650315],\n              [116.520172, 26.684543],\n              [116.515245, 26.720898],\n              [116.557745, 26.773806],\n              [116.543578, 26.803723],\n              [116.548506, 26.84004],\n              [116.602092, 26.888623],\n              [116.632889, 26.933984],\n              [116.679085, 26.978259],\n              [116.817671, 27.018252],\n              [116.851548, 27.009188],\n              [116.910062, 27.034779],\n              [116.936547, 27.019319],\n              [116.967344, 27.061962],\n              [117.05296, 27.100327],\n              [117.044953, 27.146667],\n              [117.149662, 27.241419],\n              [117.171836, 27.29036],\n              [117.136728, 27.303123],\n              [117.140423, 27.322798],\n              [117.104699, 27.330773],\n              [117.107163, 27.393491],\n              [117.133032, 27.42218],\n              [117.110242, 27.458828],\n              [117.103467, 27.533149],\n              [117.076982, 27.566046],\n              [117.054808, 27.5427],\n              [117.01662, 27.563393],\n              [117.024627, 27.592569],\n              [117.003685, 27.625449],\n              [117.040641, 27.669979],\n              [117.065279, 27.665739],\n              [117.094228, 27.627569],\n              [117.11209, 27.645596],\n              [117.096076, 27.667329],\n              [117.114554, 27.692238],\n              [117.174916, 27.677399],\n              [117.204481, 27.683759],\n              [117.205097, 27.714492],\n              [117.245133, 27.71926],\n              [117.296256, 27.764282],\n              [117.303031, 27.833103],\n              [117.276546, 27.847921],\n              [117.280242, 27.871201],\n              [117.334444, 27.8876],\n              [117.341836, 27.855858],\n              [117.366473, 27.88231],\n              [117.407741, 27.893948],\n              [117.453936, 27.939955],\n              [117.477958, 27.930966],\n              [117.52169, 27.982243],\n              [117.556182, 27.966387],\n              [117.609769, 27.863265],\n              [117.649805, 27.851625],\n              [117.68245, 27.823577],\n              [117.704624, 27.834162],\n              [117.740348, 27.800286],\n              [117.788392, 27.855858],\n              [117.78716, 27.896063],\n              [117.856145, 27.94577],\n              [117.910963, 27.949471],\n              [117.942992, 27.974315],\n              [117.965166, 27.962687],\n              [117.999043, 27.991227],\n              [118.096977, 27.970615],\n              [118.094513, 28.003909],\n              [118.129006, 28.017118],\n              [118.120999, 28.041946],\n              [118.153644, 28.062016],\n              [118.199839, 28.049869],\n              [118.242339, 28.075746],\n              [118.356288, 28.091586],\n              [118.361215, 28.155978],\n              [118.375382, 28.186577],\n              [118.339041, 28.193962],\n              [118.314404, 28.221913],\n              [118.424041, 28.291497],\n              [118.433896, 28.288335],\n              [118.444367, 28.253548],\n              [118.490562, 28.238259],\n              [118.493026, 28.262509],\n              [118.588497, 28.282538],\n              [118.595272, 28.258292],\n              [118.651322, 28.277267],\n              [118.674728, 28.27147],\n              [118.699366, 28.309939],\n              [118.719692, 28.312047],\n              [118.756032, 28.252493],\n              [118.802228, 28.240368],\n              [118.804075, 28.207675],\n              [118.771431, 28.188687],\n              [118.805923, 28.154923],\n              [118.802228, 28.117453],\n              [118.767735, 28.10584],\n              [118.719076, 28.063601],\n              [118.733858, 28.027684],\n              [118.730163, 27.970615],\n              [118.753568, 27.947885],\n              [118.818242, 27.916689],\n              [118.829329, 27.847921],\n              [118.873677, 27.733563],\n              [118.879836, 27.667859],\n              [118.913713, 27.619616],\n              [118.909401, 27.568168],\n              [118.869365, 27.540047],\n              [118.907553, 27.460952],\n              [118.955597, 27.4498],\n              [118.986393, 27.47582],\n              [118.983314, 27.498649],\n              [119.020886, 27.498118],\n              [119.03998, 27.478475],\n              [119.092335, 27.466262],\n              [119.129907, 27.475289],\n              [119.121284, 27.438115],\n              [119.14777, 27.424836],\n              [119.224146, 27.416868],\n              [119.26911, 27.42218],\n              [119.285124, 27.457766],\n              [119.334399, 27.480067],\n              [119.360269, 27.524657],\n              [119.416935, 27.539517],\n              [119.438493, 27.508734],\n              [119.466826, 27.526249],\n              [119.501935, 27.610601],\n              [119.501319, 27.649837],\n              [119.541971, 27.666799],\n              [119.606028, 27.674749],\n              [119.644217, 27.663619],\n              [119.626354, 27.620676],\n              [119.630666, 27.582491],\n              [119.675014, 27.574534],\n              [119.659615, 27.540578],\n              [119.690412, 27.537394],\n              [119.70889, 27.514042],\n              [119.703347, 27.446613],\n              [119.685485, 27.438646],\n              [119.711354, 27.403054],\n              [119.750774, 27.373829],\n              [119.739687, 27.362668],\n              [119.782187, 27.330241],\n              [119.768636, 27.307909],\n              [119.843165, 27.300464],\n              [119.938636, 27.329709],\n              [119.960194, 27.365857],\n              [120.008237, 27.375423],\n              [120.026099, 27.344063],\n              [120.052584, 27.338747],\n              [120.096316, 27.390302],\n              [120.136968, 27.402523],\n              [120.134504, 27.420055],\n              [120.221352, 27.420055],\n              [120.26262, 27.432804],\n              [120.273091, 27.38924],\n              [120.340844, 27.399867],\n              [120.343924, 27.363199],\n              [120.430155, 27.258976],\n              [120.401822, 27.250996],\n              [120.404286, 27.204166],\n              [120.461568, 27.142407],\n              [120.403054, 27.10086],\n              [120.391967, 27.081146],\n              [120.282946, 27.089671],\n              [120.29588, 27.035845],\n              [120.275554, 27.027315],\n              [120.279866, 26.987326],\n              [120.25954, 26.982526],\n              [120.232439, 26.907303],\n              [120.1807, 26.920644],\n              [120.117258, 26.916909],\n              [120.103707, 26.873143],\n              [120.037802, 26.86033],\n              [120.042729, 26.828292],\n              [120.082765, 26.822417],\n              [120.103707, 26.794642],\n              [120.136352, 26.797847],\n              [120.106787, 26.752966],\n              [120.151135, 26.750829],\n              [120.162222, 26.717691],\n              [120.110483, 26.692563],\n              [120.1382, 26.638012],\n              [120.093852, 26.613938],\n              [120.063671, 26.627848],\n              [120.007621, 26.595744],\n              [119.967585, 26.597885],\n              [119.93802, 26.576478],\n              [119.947875, 26.56042],\n              [119.867187, 26.509019],\n              [119.828383, 26.524013],\n              [119.851788, 26.595209],\n              [119.901679, 26.624638],\n              [119.949107, 26.624638],\n              [119.972512, 26.654594],\n              [119.969433, 26.686681],\n              [119.99407, 26.720363],\n              [120.061824, 26.768997],\n              [120.052584, 26.786629],\n              [119.942947, 26.784492],\n              [119.938636, 26.747088],\n              [119.899216, 26.693098],\n              [119.908455, 26.661547],\n              [119.873962, 26.642827],\n              [119.864107, 26.671174],\n              [119.833926, 26.690959],\n              [119.711354, 26.686681],\n              [119.664543, 26.726243],\n              [119.637441, 26.703256],\n              [119.619579, 26.649246],\n              [119.577695, 26.622498],\n              [119.605412, 26.595744],\n              [119.670086, 26.618218],\n              [119.740303, 26.610727],\n              [119.788346, 26.583435],\n              [119.83639, 26.454381],\n              [119.835774, 26.434019],\n              [119.893672, 26.355752],\n              [119.946027, 26.374519],\n              [119.95465, 26.352534],\n              [119.909687, 26.310161],\n              [119.862875, 26.307479],\n              [119.845013, 26.323036],\n              [119.806825, 26.307479],\n              [119.802513, 26.268846],\n              [119.7711, 26.285481],\n              [119.676246, 26.262943],\n              [119.664543, 26.202282],\n              [119.604181, 26.168985],\n              [119.618963, 26.11956],\n              [119.654688, 26.090002],\n              [119.668854, 26.026024],\n              [119.700267, 26.032477],\n              [119.723673, 26.011503],\n              [119.69534, 25.904424],\n              [119.638057, 25.889888],\n              [119.628202, 25.87212],\n              [119.626354, 25.723406],\n              [119.602949, 25.714779],\n              [119.602949, 25.68512],\n              [119.543819, 25.684581],\n              [119.472986, 25.662466],\n              [119.478529, 25.631715],\n              [119.541355, 25.6247],\n              [119.534579, 25.585303],\n              [119.586934, 25.59232],\n              [119.616499, 25.556691],\n              [119.611572, 25.519972],\n              [119.634362, 25.475137],\n              [119.675014, 25.475137],\n              [119.680557, 25.497827],\n              [119.715666, 25.51187],\n              [119.716898, 25.551292],\n              [119.683637, 25.592859],\n              [119.700267, 25.616606],\n              [119.784651, 25.667321],\n              [119.790194, 25.614447],\n              [119.843165, 25.597717],\n              [119.831462, 25.579905],\n              [119.883817, 25.546432],\n              [119.861027, 25.531313],\n              [119.81668, 25.532393],\n              [119.811136, 25.507009],\n              [119.83331, 25.48162],\n              [119.864107, 25.48],\n              [119.866571, 25.455145],\n              [119.804977, 25.457847],\n              [119.764325, 25.433529],\n              [119.773564, 25.395691],\n              [119.688564, 25.441095],\n              [119.682405, 25.445959],\n              [119.675014, 25.468113],\n              [119.622659, 25.434069],\n              [119.670086, 25.435691],\n              [119.656535, 25.396772],\n              [119.665159, 25.3719],\n              [119.649144, 25.342697],\n              [119.597405, 25.334584],\n              [119.582623, 25.374063],\n              [119.59063, 25.398394],\n              [119.577695, 25.445959],\n              [119.555521, 25.429205],\n              [119.578927, 25.400556],\n              [119.548746, 25.365952],\n              [119.486536, 25.369737],\n              [119.507478, 25.396231],\n              [119.48592, 25.418935],\n              [119.491464, 25.443257],\n              [119.463131, 25.448661],\n              [119.438493, 25.412449],\n              [119.45266, 25.493505],\n              [119.400921, 25.493505],\n              [119.359037, 25.521592],\n              [119.343638, 25.472436],\n              [119.353493, 25.411908],\n              [119.288204, 25.410827],\n              [119.26295, 25.428124],\n              [119.275269, 25.476758],\n              [119.256175, 25.488643],\n              [119.219834, 25.468654],\n              [119.232153, 25.442176],\n              [119.191501, 25.424341],\n              [119.151465, 25.426503],\n              [119.14469, 25.388121],\n              [119.218603, 25.368115],\n              [119.240776, 25.316733],\n              [119.247552, 25.333502],\n              [119.299291, 25.328634],\n              [119.333167, 25.287516],\n              [119.380595, 25.250173],\n              [119.331935, 25.230685],\n              [119.294979, 25.237182],\n              [119.314689, 25.190076],\n              [119.26911, 25.159746],\n              [119.231537, 25.188993],\n              [119.190269, 25.175995],\n              [119.131755, 25.223106],\n              [119.108349, 25.193867],\n              [119.137299, 25.15487],\n              [119.165632, 25.145661],\n              [119.146538, 25.056782],\n              [119.119436, 25.012861],\n              [119.107118, 25.075214],\n              [119.134219, 25.106107],\n              [119.075705, 25.099604],\n              [119.06585, 25.102855],\n              [119.028893, 25.139702],\n              [119.032589, 25.17437],\n              [119.054147, 25.168412],\n              [119.074473, 25.211195],\n              [119.055379, 25.219316],\n              [118.990089, 25.20199],\n              [118.975307, 25.237723],\n              [118.996864, 25.266411],\n              [118.956212, 25.272905],\n              [118.91556, 25.256668],\n              [118.940198, 25.21715],\n              [118.942046, 25.211195],\n              [118.985162, 25.19495],\n              [118.985162, 25.168954],\n              [118.951901, 25.15162],\n              [118.974691, 25.115319],\n              [118.892155, 25.092558],\n              [118.945126, 25.028588],\n              [118.974691, 25.024792],\n              [119.016575, 25.058409],\n              [119.023966, 25.04377],\n              [118.989473, 24.973807],\n              [119.004872, 24.970009],\n            ],\n          ],\n          [\n            [\n              [118.412338, 24.514538],\n              [118.451758, 24.506915],\n              [118.477012, 24.437738],\n              [118.457918, 24.412128],\n              [118.405563, 24.427931],\n              [118.353208, 24.415398],\n              [118.329802, 24.382152],\n              [118.282375, 24.413218],\n              [118.31194, 24.424661],\n              [118.298389, 24.477506],\n              [118.318715, 24.486765],\n              [118.374766, 24.458986],\n              [118.412338, 24.514538],\n            ],\n          ],\n          [\n            [\n              [119.471138, 25.197116],\n              [119.444036, 25.20199],\n              [119.44342, 25.238806],\n              [119.473601, 25.259916],\n              [119.501319, 25.21715],\n              [119.540739, 25.20199],\n              [119.566608, 25.210112],\n              [119.549362, 25.161912],\n              [119.52534, 25.157579],\n              [119.507478, 25.183036],\n              [119.471138, 25.197116],\n            ],\n          ],\n          [\n            [\n              [119.580159, 25.627398],\n              [119.580775, 25.650059],\n              [119.611572, 25.669479],\n              [119.580159, 25.627398],\n            ],\n          ],\n          [\n            [\n              [119.976824, 26.191005],\n              [119.970665, 26.217852],\n              [119.998998, 26.235569],\n              [120.016244, 26.217316],\n              [119.976824, 26.191005],\n            ],\n          ],\n          [\n            [\n              [118.230636, 24.401228],\n              [118.233716, 24.445911],\n              [118.273752, 24.441007],\n              [118.230636, 24.401228],\n            ],\n          ],\n          [\n            [\n              [119.906607, 26.68989],\n              [119.950954, 26.692563],\n              [119.926933, 26.664756],\n              [119.906607, 26.68989],\n            ],\n          ],\n          [\n            [\n              [118.204151, 24.504737],\n              [118.19368, 24.463344],\n              [118.143173, 24.420847],\n              [118.084042, 24.435559],\n              [118.068644, 24.463344],\n              [118.093281, 24.540672],\n              [118.14502, 24.560814],\n              [118.191832, 24.536861],\n              [118.204151, 24.504737],\n            ],\n          ],\n          [\n            [\n              [119.929397, 26.134067],\n              [119.919542, 26.172208],\n              [119.960194, 26.146961],\n              [119.929397, 26.134067],\n            ],\n          ],\n          [\n            [\n              [119.642985, 26.129231],\n              [119.606028, 26.15287],\n              [119.62697, 26.173282],\n              [119.665159, 26.155556],\n              [119.642985, 26.129231],\n            ],\n          ],\n          [\n            [\n              [120.034106, 26.488667],\n              [120.035954, 26.515981],\n              [120.071679, 26.521336],\n              [120.066751, 26.498308],\n              [120.034106, 26.488667],\n            ],\n          ],\n          [\n            [\n              [119.662079, 25.646822],\n              [119.716898, 25.664624],\n              [119.718745, 25.634952],\n              [119.673782, 25.632794],\n              [119.662079, 25.646822],\n            ],\n          ],\n          [\n            [\n              [119.760629, 26.613402],\n              [119.796354, 26.630523],\n              [119.818527, 26.616613],\n              [119.776644, 26.600025],\n              [119.760629, 26.613402],\n            ],\n          ],\n          [\n            [\n              [120.135736, 26.550784],\n              [120.117874, 26.568984],\n              [120.153598, 26.604841],\n              [120.167149, 26.571661],\n              [120.135736, 26.550784],\n            ],\n          ],\n          [\n            [\n              [120.360554, 26.916909],\n              [120.319286, 26.944654],\n              [120.327909, 26.963858],\n              [120.363018, 26.967592],\n              [120.394431, 26.933984],\n              [120.360554, 26.916909],\n            ],\n          ],\n          [\n            [\n              [119.668238, 26.628383],\n              [119.651608, 26.657269],\n              [119.673782, 26.680799],\n              [119.712586, 26.6685],\n              [119.748926, 26.681334],\n              [119.758781, 26.659408],\n              [119.720593, 26.635873],\n              [119.668238, 26.628383],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 360000,\n        name: '江西省',\n        center: [115.892151, 28.676493],\n        centroid: [115.732975, 27.636112],\n        childrenNum: 11,\n        level: 'province',\n        subFeatureIndex: 13,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [118.193064, 29.395472],\n              [118.205382, 29.343839],\n              [118.166578, 29.314099],\n              [118.178281, 29.297921],\n              [118.138861, 29.283828],\n              [118.077883, 29.290614],\n              [118.073571, 29.216993],\n              [118.042159, 29.210202],\n              [118.027992, 29.167882],\n              [118.045238, 29.149068],\n              [118.037847, 29.102017],\n              [118.076035, 29.074822],\n              [118.066796, 29.053898],\n              [118.097593, 28.998952],\n              [118.115455, 29.009944],\n              [118.115455, 29.009944],\n              [118.133933, 28.983771],\n              [118.165346, 28.986912],\n              [118.227556, 28.942406],\n              [118.195527, 28.904167],\n              [118.270056, 28.918836],\n              [118.300237, 28.826075],\n              [118.364295, 28.813491],\n              [118.403099, 28.702791],\n              [118.428352, 28.681267],\n              [118.428352, 28.617193],\n              [118.428352, 28.617193],\n              [118.412338, 28.55676],\n              [118.4302, 28.515225],\n              [118.414802, 28.497344],\n              [118.474548, 28.478934],\n              [118.456686, 28.424738],\n              [118.432048, 28.402104],\n              [118.455454, 28.384204],\n              [118.480091, 28.327325],\n              [118.433896, 28.288335],\n              [118.424041, 28.291497],\n              [118.314404, 28.221913],\n              [118.339041, 28.193962],\n              [118.375382, 28.186577],\n              [118.361215, 28.155978],\n              [118.356288, 28.091586],\n              [118.242339, 28.075746],\n              [118.199839, 28.049869],\n              [118.153644, 28.062016],\n              [118.120999, 28.041946],\n              [118.129006, 28.017118],\n              [118.094513, 28.003909],\n              [118.096977, 27.970615],\n              [117.999043, 27.991227],\n              [117.965166, 27.962687],\n              [117.942992, 27.974315],\n              [117.910963, 27.949471],\n              [117.856145, 27.94577],\n              [117.78716, 27.896063],\n              [117.788392, 27.855858],\n              [117.740348, 27.800286],\n              [117.704624, 27.834162],\n              [117.68245, 27.823577],\n              [117.649805, 27.851625],\n              [117.609769, 27.863265],\n              [117.556182, 27.966387],\n              [117.52169, 27.982243],\n              [117.477958, 27.930966],\n              [117.453936, 27.939955],\n              [117.407741, 27.893948],\n              [117.366473, 27.88231],\n              [117.341836, 27.855858],\n              [117.334444, 27.8876],\n              [117.280242, 27.871201],\n              [117.276546, 27.847921],\n              [117.303031, 27.833103],\n              [117.296256, 27.764282],\n              [117.245133, 27.71926],\n              [117.205097, 27.714492],\n              [117.204481, 27.683759],\n              [117.174916, 27.677399],\n              [117.114554, 27.692238],\n              [117.096076, 27.667329],\n              [117.11209, 27.645596],\n              [117.094228, 27.627569],\n              [117.065279, 27.665739],\n              [117.040641, 27.669979],\n              [117.003685, 27.625449],\n              [117.024627, 27.592569],\n              [117.01662, 27.563393],\n              [117.054808, 27.5427],\n              [117.076982, 27.566046],\n              [117.103467, 27.533149],\n              [117.110242, 27.458828],\n              [117.133032, 27.42218],\n              [117.107163, 27.393491],\n              [117.104699, 27.330773],\n              [117.140423, 27.322798],\n              [117.136728, 27.303123],\n              [117.171836, 27.29036],\n              [117.149662, 27.241419],\n              [117.044953, 27.146667],\n              [117.05296, 27.100327],\n              [116.967344, 27.061962],\n              [116.936547, 27.019319],\n              [116.910062, 27.034779],\n              [116.851548, 27.009188],\n              [116.817671, 27.018252],\n              [116.679085, 26.978259],\n              [116.632889, 26.933984],\n              [116.602092, 26.888623],\n              [116.548506, 26.84004],\n              [116.543578, 26.803723],\n              [116.557745, 26.773806],\n              [116.515245, 26.720898],\n              [116.520172, 26.684543],\n              [116.566368, 26.650315],\n              [116.553433, 26.575942],\n              [116.539267, 26.559349],\n              [116.597165, 26.512768],\n              [116.610716, 26.476882],\n              [116.638433, 26.477418],\n              [116.608252, 26.429732],\n              [116.601476, 26.372911],\n              [116.553433, 26.365404],\n              [116.553433, 26.400253],\n              [116.519557, 26.410437],\n              [116.499846, 26.361651],\n              [116.459194, 26.345026],\n              [116.437021, 26.308016],\n              [116.412999, 26.297822],\n              [116.385282, 26.238253],\n              [116.400064, 26.202819],\n              [116.392057, 26.171133],\n              [116.435789, 26.159854],\n              [116.476441, 26.172745],\n              [116.489375, 26.113649],\n              [116.384666, 26.030864],\n              [116.360028, 25.991601],\n              [116.369883, 25.963088],\n              [116.326152, 25.956631],\n              [116.303362, 25.924341],\n              [116.258398, 25.902809],\n              [116.225138, 25.908731],\n              [116.17771, 25.894195],\n              [116.132131, 25.860273],\n              [116.131515, 25.824185],\n              [116.18079, 25.778926],\n              [116.129667, 25.758985],\n              [116.106877, 25.701299],\n              [116.067457, 25.703995],\n              [116.068689, 25.646282],\n              [116.041588, 25.62416],\n              [116.063145, 25.56317],\n              [116.040356, 25.548052],\n              [116.03666, 25.514571],\n              [116.005247, 25.490264],\n              [116.023109, 25.435691],\n              [115.992928, 25.374063],\n              [116.008327, 25.319437],\n              [115.987385, 25.290221],\n              [115.949813, 25.292386],\n              [115.930719, 25.236099],\n              [115.855574, 25.20957],\n              [115.860501, 25.165704],\n              [115.888219, 25.128866],\n              [115.880212, 25.092016],\n              [115.908545, 25.084428],\n              [115.928255, 25.050276],\n              [115.873436, 25.019911],\n              [115.925175, 24.960786],\n              [115.870356, 24.959701],\n              [115.89253, 24.936911],\n              [115.885139, 24.898918],\n              [115.907313, 24.879917],\n              [115.861733, 24.863629],\n              [115.863581, 24.891318],\n              [115.824161, 24.909232],\n              [115.807531, 24.862543],\n              [115.790284, 24.856027],\n              [115.764415, 24.791933],\n              [115.776734, 24.774546],\n              [115.756408, 24.749004],\n              [115.769342, 24.708236],\n              [115.801371, 24.705517],\n              [115.780429, 24.663103],\n              [115.797676, 24.628834],\n              [115.840791, 24.584217],\n              [115.843871, 24.562446],\n              [115.785357, 24.567345],\n              [115.752712, 24.546116],\n              [115.68927, 24.545027],\n              [115.671408, 24.604895],\n              [115.605503, 24.62557],\n              [115.569778, 24.622306],\n              [115.555611, 24.683768],\n              [115.522967, 24.702799],\n              [115.476771, 24.762591],\n              [115.412714, 24.79302],\n              [115.372678, 24.774546],\n              [115.358511, 24.735416],\n              [115.306772, 24.758787],\n              [115.269816, 24.749548],\n              [115.258729, 24.728894],\n              [115.1842, 24.711498],\n              [115.104744, 24.667997],\n              [115.083802, 24.699537],\n              [115.057317, 24.703343],\n              [115.024672, 24.669085],\n              [115.00373, 24.679418],\n              [114.940288, 24.650049],\n              [114.909491, 24.661471],\n              [114.893477, 24.582584],\n              [114.868839, 24.562446],\n              [114.846665, 24.602719],\n              [114.827571, 24.588026],\n              [114.781376, 24.613057],\n              [114.729637, 24.608704],\n              [114.73826, 24.565168],\n              [114.704999, 24.525973],\n              [114.664963, 24.583673],\n              [114.627391, 24.576598],\n              [114.589819, 24.537406],\n              [114.534384, 24.559181],\n              [114.429058, 24.48622],\n              [114.403189, 24.497657],\n              [114.391486, 24.563535],\n              [114.363769, 24.582584],\n              [114.300943, 24.578775],\n              [114.289856, 24.619042],\n              [114.258443, 24.641346],\n              [114.19069, 24.656576],\n              [114.169132, 24.689749],\n              [114.27261, 24.700624],\n              [114.281849, 24.724001],\n              [114.336052, 24.749004],\n              [114.342211, 24.807145],\n              [114.378551, 24.861457],\n              [114.403189, 24.877746],\n              [114.395798, 24.951019],\n              [114.454928, 24.977062],\n              [114.45616, 24.99659],\n              [114.506051, 24.999844],\n              [114.532536, 25.022623],\n              [114.561485, 25.077382],\n              [114.604601, 25.083886],\n              [114.640326, 25.074129],\n              [114.664963, 25.10123],\n              [114.735796, 25.121822],\n              [114.73518, 25.155954],\n              [114.685905, 25.173287],\n              [114.693912, 25.213902],\n              [114.73518, 25.225813],\n              [114.743188, 25.274528],\n              [114.714238, 25.315651],\n              [114.63663, 25.324306],\n              [114.599674, 25.385959],\n              [114.541159, 25.416773],\n              [114.477718, 25.37136],\n              [114.438914, 25.376226],\n              [114.43029, 25.343779],\n              [114.382863, 25.317274],\n              [114.31511, 25.33837],\n              [114.2954, 25.299961],\n              [114.260291, 25.291845],\n              [114.204857, 25.29942],\n              [114.190074, 25.316733],\n              [114.115545, 25.302125],\n              [114.083517, 25.275611],\n              [114.055799, 25.277775],\n              [114.039785, 25.250714],\n              [114.017611, 25.273987],\n              [114.029314, 25.328093],\n              [114.050256, 25.36433],\n              [113.983118, 25.415152],\n              [114.003444, 25.442716],\n              [113.94493, 25.441635],\n              [113.962792, 25.528072],\n              [113.986198, 25.529153],\n              [113.983118, 25.599336],\n              [113.957249, 25.611749],\n              [113.913517, 25.701299],\n              [113.920293, 25.741197],\n              [113.961561, 25.77731],\n              [113.971416, 25.836036],\n              [114.028082, 25.893119],\n              [114.028082, 25.98138],\n              [114.008372, 26.015806],\n              [114.044096, 26.076564],\n              [114.087828, 26.06635],\n              [114.121089, 26.085702],\n              [114.10569, 26.097526],\n              [114.188842, 26.121172],\n              [114.237501, 26.152333],\n              [114.216559, 26.203355],\n              [114.181451, 26.214631],\n              [114.102611, 26.187783],\n              [114.088444, 26.168448],\n              [114.013299, 26.184023],\n              [113.962792, 26.150722],\n              [113.949242, 26.192616],\n              [113.972647, 26.20604],\n              [113.978807, 26.237716],\n              [114.029314, 26.266163],\n              [114.021307, 26.288701],\n              [114.047792, 26.337518],\n              [114.030546, 26.376664],\n              [114.062575, 26.406149],\n              [114.085364, 26.406149],\n              [114.090292, 26.455988],\n              [114.110002, 26.482775],\n              [114.07243, 26.480096],\n              [114.10877, 26.56952],\n              [114.019459, 26.587182],\n              [113.996669, 26.615543],\n              [113.912901, 26.613938],\n              [113.860546, 26.664221],\n              [113.853771, 26.769532],\n              [113.835909, 26.806394],\n              [113.877177, 26.859262],\n              [113.890112, 26.895562],\n              [113.927068, 26.948922],\n              [113.892575, 26.964925],\n              [113.86301, 27.018252],\n              [113.824206, 27.036378],\n              [113.803264, 27.099261],\n              [113.771851, 27.096598],\n              [113.779242, 27.137081],\n              [113.846996, 27.222262],\n              [113.872865, 27.289828],\n              [113.854387, 27.30525],\n              [113.872865, 27.346721],\n              [113.872865, 27.384988],\n              [113.72812, 27.350442],\n              [113.699786, 27.331836],\n              [113.657902, 27.347253],\n              [113.616635, 27.345658],\n              [113.605548, 27.38924],\n              [113.632033, 27.40518],\n              [113.59754, 27.428554],\n              [113.591381, 27.467855],\n              [113.627105, 27.49971],\n              [113.583374, 27.524657],\n              [113.579062, 27.545354],\n              [113.608627, 27.585143],\n              [113.607395, 27.625449],\n              [113.652359, 27.663619],\n              [113.696707, 27.71979],\n              [113.69917, 27.740979],\n              [113.763228, 27.799228],\n              [113.756453, 27.860091],\n              [113.72812, 27.874904],\n              [113.752141, 27.93361],\n              [113.822974, 27.982243],\n              [113.845148, 27.971672],\n              [113.864242, 28.004966],\n              [113.914133, 27.991227],\n              [113.936307, 28.018703],\n              [113.966488, 28.017646],\n              [113.970184, 28.041418],\n              [114.025618, 28.031382],\n              [114.047176, 28.057263],\n              [114.025002, 28.080499],\n              [113.992357, 28.161255],\n              [114.012068, 28.174972],\n              [114.068734, 28.171806],\n              [114.107538, 28.182885],\n              [114.109386, 28.205038],\n              [114.143879, 28.246694],\n              [114.182067, 28.249858],\n              [114.198081, 28.29097],\n              [114.2529, 28.319423],\n              [114.252284, 28.395787],\n              [114.214712, 28.403157],\n              [114.172212, 28.432632],\n              [114.217175, 28.466308],\n              [114.218407, 28.48472],\n              [114.15435, 28.507337],\n              [114.138335, 28.533629],\n              [114.08598, 28.558337],\n              [114.132176, 28.607211],\n              [114.122321, 28.623497],\n              [114.157429, 28.761566],\n              [114.137719, 28.779926],\n              [114.153734, 28.829221],\n              [114.124784, 28.843376],\n              [114.076741, 28.834464],\n              [114.056415, 28.872204],\n              [114.060111, 28.902596],\n              [114.028082, 28.891069],\n              [114.005292, 28.917788],\n              [114.008988, 28.955498],\n              [113.973879, 28.937692],\n              [113.955401, 28.978536],\n              [113.961561, 28.999476],\n              [113.94185, 29.047097],\n              [113.952321, 29.092604],\n              [113.98743, 29.126068],\n              [114.034857, 29.152204],\n              [114.063191, 29.204978],\n              [114.169748, 29.216993],\n              [114.252284, 29.23475],\n              [114.259059, 29.343839],\n              [114.307102, 29.365225],\n              [114.341595, 29.327665],\n              [114.376088, 29.322969],\n              [114.440145, 29.341752],\n              [114.466015, 29.324013],\n              [114.519602, 29.325578],\n              [114.589819, 29.352707],\n              [114.621847, 29.379828],\n              [114.67297, 29.395993],\n              [114.740724, 29.386607],\n              [114.759818, 29.363139],\n              [114.784455, 29.386086],\n              [114.812173, 29.383478],\n              [114.866375, 29.404335],\n              [114.895325, 29.397557],\n              [114.931049, 29.422581],\n              [114.947063, 29.465317],\n              [114.935977, 29.486678],\n              [114.90518, 29.473132],\n              [114.918114, 29.454374],\n              [114.888549, 29.436134],\n              [114.860216, 29.476258],\n              [114.900868, 29.505951],\n              [114.940288, 29.493971],\n              [114.966773, 29.522096],\n              [114.947679, 29.542924],\n              [115.00065, 29.572076],\n              [115.033295, 29.546568],\n              [115.087498, 29.560104],\n              [115.086266, 29.525741],\n              [115.154019, 29.510117],\n              [115.157099, 29.584568],\n              [115.120142, 29.597578],\n              [115.143548, 29.645961],\n              [115.117679, 29.655843],\n              [115.113367, 29.684963],\n              [115.176809, 29.654803],\n              [115.250722, 29.660003],\n              [115.28583, 29.618391],\n              [115.304924, 29.637118],\n              [115.355431, 29.649602],\n              [115.412714, 29.688602],\n              [115.470612, 29.739539],\n              [115.479235, 29.811224],\n              [115.51188, 29.840299],\n              [115.611662, 29.841337],\n              [115.667712, 29.850161],\n              [115.706517, 29.837703],\n              [115.762567, 29.793048],\n              [115.837096, 29.748373],\n              [115.909777, 29.723949],\n              [115.965827, 29.724469],\n              [116.049595, 29.761881],\n              [116.087167, 29.795125],\n              [116.13521, 29.819532],\n              [116.172783, 29.828358],\n              [116.227601, 29.816936],\n              [116.250391, 29.785777],\n              [116.280572, 29.788893],\n              [116.342782, 29.835626],\n              [116.467818, 29.896347],\n              [116.525716, 29.897385],\n              [116.552201, 29.909836],\n              [116.585462, 30.045657],\n              [116.620571, 30.073109],\n              [116.666766, 30.076734],\n              [116.720353, 30.053945],\n              [116.747454, 30.057053],\n              [116.783794, 30.030632],\n              [116.802889, 29.99643],\n              [116.830606, 30.004723],\n              [116.83307, 29.95755],\n              [116.868794, 29.980361],\n              [116.900207, 29.949253],\n              [116.882961, 29.893753],\n              [116.780715, 29.792529],\n              [116.762237, 29.802396],\n              [116.673541, 29.709916],\n              [116.653831, 29.694841],\n              [116.680317, 29.681323],\n              [116.651983, 29.637118],\n              [116.716657, 29.590813],\n              [116.721585, 29.564789],\n              [116.760389, 29.599139],\n              [116.780715, 29.569994],\n              [116.849084, 29.57624],\n              [116.873722, 29.609546],\n              [116.939627, 29.648561],\n              [116.974736, 29.657403],\n              [116.996294, 29.683403],\n              [117.041873, 29.680803],\n              [117.112706, 29.711995],\n              [117.108395, 29.75201],\n              [117.136728, 29.775388],\n              [117.123177, 29.798761],\n              [117.073286, 29.831992],\n              [117.127489, 29.86158],\n              [117.129952, 29.89946],\n              [117.171836, 29.920729],\n              [117.2168, 29.926953],\n              [117.246365, 29.915023],\n              [117.261763, 29.880781],\n              [117.25314, 29.834588],\n              [117.29256, 29.822647],\n              [117.338756, 29.848085],\n              [117.359082, 29.812782],\n              [117.382487, 29.840818],\n              [117.415132, 29.85068],\n              [117.408973, 29.802396],\n              [117.455168, 29.749412],\n              [117.453936, 29.688082],\n              [117.490277, 29.660003],\n              [117.530313, 29.654282],\n              [117.523538, 29.630356],\n              [117.543248, 29.588731],\n              [117.608537, 29.591333],\n              [117.647957, 29.614749],\n              [117.678754, 29.595496],\n              [117.690457, 29.555939],\n              [117.729877, 29.550213],\n              [117.795167, 29.570515],\n              [117.872775, 29.54761],\n              [117.933753, 29.549172],\n              [118.00397, 29.578322],\n              [118.042774, 29.566351],\n              [118.050782, 29.542924],\n              [118.095129, 29.534072],\n              [118.143788, 29.489803],\n              [118.127774, 29.47209],\n              [118.136397, 29.418932],\n              [118.193064, 29.395472],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 370000,\n        name: '山东省',\n        center: [117.000923, 36.675807],\n        centroid: [118.187667, 36.376018],\n        childrenNum: 16,\n        level: 'province',\n        subFeatureIndex: 14,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [116.374195, 34.640011],\n              [116.334159, 34.620806],\n              [116.32492, 34.601104],\n              [116.286116, 34.608986],\n              [116.247927, 34.551829],\n              [116.196804, 34.575977],\n              [116.156768, 34.5538],\n              [116.134594, 34.559715],\n              [116.101334, 34.60603],\n              [116.037276, 34.593222],\n              [115.991081, 34.615389],\n              [115.984305, 34.589281],\n              [115.838328, 34.5676],\n              [115.827241, 34.558236],\n              [115.787821, 34.580905],\n              [115.697278, 34.594207],\n              [115.685575, 34.556265],\n              [115.622749, 34.574499],\n              [115.553148, 34.568586],\n              [115.515575, 34.582383],\n              [115.461373, 34.637057],\n              [115.433655, 34.725149],\n              [115.449054, 34.74433],\n              [115.42688, 34.805285],\n              [115.317243, 34.859321],\n              [115.256265, 34.845079],\n              [115.239019, 34.87798],\n              [115.251953, 34.906451],\n              [115.205142, 34.914303],\n              [115.219309, 34.96042],\n              [115.157099, 34.957968],\n              [115.12815, 35.00455],\n              [115.075179, 35.000628],\n              [115.028983, 34.9717],\n              [115.008041, 34.988372],\n              [114.950759, 34.989843],\n              [114.923658, 34.968757],\n              [114.880542, 35.00357],\n              [114.824492, 35.012393],\n              [114.852209, 35.041797],\n              [114.818948, 35.051596],\n              [114.835578, 35.076578],\n              [114.883006, 35.098615],\n              [114.841738, 35.15099],\n              [114.861448, 35.182301],\n              [114.932281, 35.198441],\n              [114.929201, 35.244886],\n              [114.957534, 35.261014],\n              [115.04315, 35.376744],\n              [115.073947, 35.374304],\n              [115.091809, 35.416259],\n              [115.117679, 35.400163],\n              [115.126302, 35.41821],\n              [115.172497, 35.426501],\n              [115.237171, 35.423087],\n              [115.307388, 35.480126],\n              [115.356047, 35.490359],\n              [115.34496, 35.55368],\n              [115.383148, 35.568772],\n              [115.48601, 35.710306],\n              [115.52851, 35.733628],\n              [115.622749, 35.739457],\n              [115.693582, 35.754028],\n              [115.696046, 35.788989],\n              [115.73485, 35.833154],\n              [115.773654, 35.854014],\n              [115.81677, 35.844312],\n              [115.859886, 35.857894],\n              [115.882675, 35.879718],\n              [115.873436, 35.918985],\n              [115.907929, 35.92674],\n              [115.911624, 35.960171],\n              [115.984921, 35.974218],\n              [116.048979, 35.970343],\n              [116.063145, 36.028927],\n              [116.099486, 36.112129],\n              [116.057602, 36.104877],\n              [115.989849, 36.045381],\n              [115.89869, 36.026507],\n              [115.859886, 36.003756],\n              [115.817386, 36.012954],\n              [115.779813, 35.993588],\n              [115.774886, 35.974702],\n              [115.699125, 35.966468],\n              [115.648618, 35.922863],\n              [115.583945, 35.921893],\n              [115.513112, 35.890385],\n              [115.505104, 35.899112],\n              [115.495249, 35.896203],\n              [115.487858, 35.880688],\n              [115.460141, 35.867594],\n              [115.407786, 35.80889],\n              [115.363438, 35.779765],\n              [115.335105, 35.796756],\n              [115.364054, 35.894264],\n              [115.353583, 35.938854],\n              [115.362822, 35.971796],\n              [115.447822, 36.01247],\n              [115.449054, 36.047317],\n              [115.484163, 36.125666],\n              [115.483547, 36.148865],\n              [115.474923, 36.248352],\n              [115.466916, 36.258969],\n              [115.466916, 36.258969],\n              [115.462605, 36.276339],\n              [115.417025, 36.292742],\n              [115.423185, 36.32216],\n              [115.366518, 36.30914],\n              [115.368982, 36.342409],\n              [115.340033, 36.398307],\n              [115.297533, 36.413239],\n              [115.317243, 36.454166],\n              [115.291374, 36.460423],\n              [115.272895, 36.497476],\n              [115.33141, 36.550378],\n              [115.355431, 36.627262],\n              [115.365902, 36.621979],\n              [115.420105, 36.686795],\n              [115.451518, 36.702151],\n              [115.479851, 36.760187],\n              [115.524815, 36.763543],\n              [115.686807, 36.810034],\n              [115.688654, 36.838777],\n              [115.71206, 36.883308],\n              [115.75764, 36.902453],\n              [115.79706, 36.968945],\n              [115.776734, 36.992848],\n              [115.85619, 37.060694],\n              [115.888219, 37.112254],\n              [115.879596, 37.150901],\n              [115.91224, 37.177132],\n              [115.909777, 37.20669],\n              [115.969523, 37.239572],\n              [115.975682, 37.337179],\n              [116.024341, 37.360015],\n              [116.085935, 37.373809],\n              [116.106261, 37.368577],\n              [116.169087, 37.384271],\n              [116.193109, 37.365723],\n              [116.236224, 37.361442],\n              [116.2855, 37.404241],\n              [116.226369, 37.428007],\n              [116.243, 37.447965],\n              [116.224522, 37.479791],\n              [116.240536, 37.489764],\n              [116.240536, 37.489764],\n              [116.27626, 37.466967],\n              [116.290427, 37.484065],\n              [116.278724, 37.524895],\n              [116.295355, 37.554316],\n              [116.336007, 37.581355],\n              [116.36742, 37.566177],\n              [116.379738, 37.522047],\n              [116.38097, 37.522522],\n              [116.379738, 37.522047],\n              [116.38097, 37.522522],\n              [116.433941, 37.473142],\n              [116.448108, 37.503059],\n              [116.4826, 37.521573],\n              [116.575607, 37.610754],\n              [116.604556, 37.624975],\n              [116.66307, 37.686096],\n              [116.679085, 37.728708],\n              [116.724664, 37.744327],\n              [116.753613, 37.77035],\n              [116.753613, 37.793054],\n              [116.804736, 37.848837],\n              [116.837997, 37.835132],\n              [116.919301, 37.846002],\n              [117.027091, 37.832296],\n              [117.074518, 37.848837],\n              [117.150278, 37.839385],\n              [117.185387, 37.849783],\n              [117.271618, 37.839858],\n              [117.320278, 37.861596],\n              [117.400966, 37.844584],\n              [117.438538, 37.854035],\n              [117.481038, 37.914967],\n              [117.513067, 37.94329],\n              [117.524154, 37.989527],\n              [117.557414, 38.046105],\n              [117.557414, 38.046105],\n              [117.586979, 38.071551],\n              [117.704624, 38.076262],\n              [117.746508, 38.12524],\n              [117.771145, 38.134655],\n              [117.766834, 38.158658],\n              [117.789007, 38.180772],\n              [117.808718, 38.22827],\n              [117.848754, 38.255062],\n              [117.895565, 38.301572],\n              [117.896797, 38.279495],\n              [118.018753, 38.202409],\n              [118.045238, 38.214165],\n              [118.112376, 38.210403],\n              [118.177665, 38.186417],\n              [118.217085, 38.146893],\n              [118.331034, 38.12524],\n              [118.404331, 38.121003],\n              [118.431432, 38.106406],\n              [118.44991, 38.124299],\n              [118.504729, 38.11394],\n              [118.534294, 38.063541],\n              [118.552156, 38.05553],\n              [118.597736, 38.079088],\n              [118.607591, 38.129006],\n              [118.626069, 38.138421],\n              [118.703677, 38.151129],\n              [118.811467, 38.157717],\n              [118.908169, 38.139362],\n              [118.974075, 38.094162],\n              [119.001792, 37.99613],\n              [119.110813, 37.921577],\n              [119.12806, 37.847892],\n              [119.16132, 37.81906],\n              [119.212443, 37.838913],\n              [119.24016, 37.878131],\n              [119.291899, 37.869627],\n              [119.309146, 37.805349],\n              [119.280197, 37.692726],\n              [119.262334, 37.660517],\n              [119.236465, 37.651988],\n              [119.153313, 37.655305],\n              [119.023966, 37.642037],\n              [118.988857, 37.620709],\n              [118.939582, 37.527268],\n              [118.942662, 37.497361],\n              [119.001176, 37.31862],\n              [119.03998, 37.30434],\n              [119.054147, 37.254816],\n              [119.084328, 37.239572],\n              [119.091103, 37.257674],\n              [119.12806, 37.254816],\n              [119.136683, 37.230995],\n              [119.204436, 37.280058],\n              [119.190885, 37.25958],\n              [119.2069, 37.223371],\n              [119.298675, 37.197156],\n              [119.301138, 37.139452],\n              [119.327624, 37.115595],\n              [119.361501, 37.125616],\n              [119.428022, 37.125616],\n              [119.489616, 37.134681],\n              [119.576463, 37.127524],\n              [119.678709, 37.158056],\n              [119.698419, 37.127047],\n              [119.744615, 37.135158],\n              [119.83023, 37.225754],\n              [119.865339, 37.233854],\n              [119.89244, 37.263866],\n              [119.883201, 37.311004],\n              [119.837006, 37.346695],\n              [119.843781, 37.376662],\n              [119.926933, 37.386649],\n              [119.949723, 37.419927],\n              [120.010085, 37.442263],\n              [120.064903, 37.448915],\n              [120.086461, 37.465067],\n              [120.144359, 37.481691],\n              [120.222584, 37.532963],\n              [120.246605, 37.556689],\n              [120.208417, 37.588469],\n              [120.215192, 37.621183],\n              [120.272475, 37.636824],\n              [120.269395, 37.658622],\n              [120.22012, 37.671886],\n              [120.227511, 37.693673],\n              [120.367945, 37.697935],\n              [120.454793, 37.757576],\n              [120.517619, 37.750005],\n              [120.590915, 37.7642],\n              [120.634031, 37.796364],\n              [120.656821, 37.793054],\n              [120.733197, 37.833714],\n              [120.839139, 37.82426],\n              [120.845298, 37.826623],\n              [120.874863, 37.833241],\n              [120.940769, 37.819533],\n              [120.943233, 37.785486],\n              [120.994356, 37.759468],\n              [121.037471, 37.718767],\n              [121.136022, 37.723501],\n              [121.160043, 37.698882],\n              [121.142797, 37.661464],\n              [121.161891, 37.646302],\n              [121.148956, 37.626397],\n              [121.17421, 37.597479],\n              [121.217326, 37.582778],\n              [121.304789, 37.582778],\n              [121.358376, 37.597479],\n              [121.349137, 37.635403],\n              [121.391021, 37.625449],\n              [121.435368, 37.592737],\n              [121.395948, 37.589891],\n              [121.400876, 37.557638],\n              [121.460006, 37.522522],\n              [121.477252, 37.475992],\n              [121.571491, 37.441313],\n              [121.575802, 37.460317],\n              [121.635548, 37.494037],\n              [121.66573, 37.473617],\n              [121.772903, 37.466492],\n              [121.923808, 37.473142],\n              [121.997721, 37.494512],\n              [122.017431, 37.531065],\n              [122.075329, 37.540556],\n              [122.08888, 37.554316],\n              [122.150474, 37.557163],\n              [122.163408, 37.519199],\n              [122.131996, 37.49926],\n              [122.166488, 37.438937],\n              [122.194205, 37.456041],\n              [122.25272, 37.467917],\n              [122.287212, 37.445114],\n              [122.281053, 37.430858],\n              [122.337103, 37.414223],\n              [122.41656, 37.414699],\n              [122.487393, 37.43466],\n              [122.4954, 37.413748],\n              [122.553914, 37.407093],\n              [122.641377, 37.428482],\n              [122.67587, 37.413273],\n              [122.701739, 37.418501],\n              [122.714058, 37.392355],\n              [122.6925, 37.373809],\n              [122.650616, 37.388551],\n              [122.607501, 37.364296],\n              [122.611196, 37.339558],\n              [122.573624, 37.296247],\n              [122.567465, 37.25958],\n              [122.592718, 37.261485],\n              [122.624131, 37.190959],\n              [122.573624, 37.176178],\n              [122.581015, 37.147562],\n              [122.533588, 37.153286],\n              [122.484313, 37.128956],\n              [122.478769, 37.058784],\n              [122.467067, 37.037289],\n              [122.494168, 37.033945],\n              [122.575472, 37.054485],\n              [122.583479, 37.037289],\n              [122.544675, 37.004797],\n              [122.55761, 36.968467],\n              [122.532356, 36.901496],\n              [122.48924, 36.886659],\n              [122.483081, 36.913938],\n              [122.434422, 36.914416],\n              [122.457212, 36.868946],\n              [122.383915, 36.865595],\n              [122.378371, 36.844525],\n              [122.344495, 36.828239],\n              [122.280437, 36.835904],\n              [122.275509, 36.83734],\n              [122.220691, 36.848835],\n              [122.174495, 36.842609],\n              [122.188662, 36.866073],\n              [122.175727, 36.894317],\n              [122.119677, 36.891924],\n              [122.141235, 36.938337],\n              [122.124604, 36.944077],\n              [122.115981, 36.94025],\n              [122.093191, 36.913938],\n              [122.051923, 36.904846],\n              [122.042684, 36.871819],\n              [122.008808, 36.96225],\n              [121.965076, 36.938337],\n              [121.927504, 36.932597],\n              [121.767975, 36.874691],\n              [121.762432, 36.84644],\n              [121.726092, 36.826323],\n              [121.6762, 36.819137],\n              [121.631853, 36.80093],\n              [121.651563, 36.723739],\n              [121.556092, 36.764502],\n              [121.575186, 36.740047],\n              [121.532071, 36.73621],\n              [121.485259, 36.786073],\n              [121.548701, 36.807638],\n              [121.565331, 36.830635],\n              [121.506817, 36.803805],\n              [121.496962, 36.795179],\n              [121.454462, 36.752515],\n              [121.3941, 36.738129],\n              [121.400876, 36.701191],\n              [121.35776, 36.713186],\n              [121.31218, 36.702151],\n              [121.29863, 36.702151],\n              [121.251818, 36.671436],\n              [121.161275, 36.651273],\n              [121.078123, 36.607568],\n              [121.028848, 36.572971],\n              [120.955551, 36.575855],\n              [120.926602, 36.611892],\n              [120.882255, 36.627262],\n              [120.847146, 36.618617],\n              [120.884718, 36.601323],\n              [120.909972, 36.568645],\n              [120.962327, 36.562877],\n              [120.983269, 36.546051],\n              [120.95432, 36.507578],\n              [120.965407, 36.466199],\n              [120.938305, 36.447908],\n              [120.90874, 36.450315],\n              [120.919827, 36.419018],\n              [120.871784, 36.36699],\n              [120.848994, 36.403124],\n              [120.858849, 36.424797],\n              [120.828668, 36.46668],\n              [120.759683, 36.46283],\n              [120.694393, 36.390118],\n              [120.744284, 36.327946],\n              [120.66298, 36.331803],\n              [120.653741, 36.282129],\n              [120.686386, 36.279234],\n              [120.696857, 36.15563],\n              [120.712255, 36.126632],\n              [120.672835, 36.130016],\n              [120.64327, 36.114547],\n              [120.615553, 36.120348],\n              [120.593995, 36.100525],\n              [120.546568, 36.107778],\n              [120.546568, 36.091821],\n              [120.468959, 36.087952],\n              [120.429539, 36.056994],\n              [120.370409, 36.053607],\n              [120.289721, 36.059413],\n              [120.35809, 36.174956],\n              [120.362402, 36.196209],\n              [120.319902, 36.232423],\n              [120.297112, 36.225664],\n              [120.310047, 36.185101],\n              [120.263236, 36.182202],\n              [120.260772, 36.198624],\n              [120.224432, 36.19138],\n              [120.22012, 36.209248],\n              [120.181316, 36.203936],\n              [120.140664, 36.173507],\n              [120.142512, 36.143549],\n              [120.108635, 36.127599],\n              [120.116642, 36.102943],\n              [120.152367, 36.095206],\n              [120.181316, 36.066669],\n              [120.239214, 36.062316],\n              [120.234902, 36.030863],\n              [120.198562, 35.995525],\n              [120.257076, 36.025055],\n              [120.249069, 35.992136],\n              [120.285409, 36.01247],\n              [120.289721, 36.017311],\n              [120.316206, 36.002304],\n              [120.30512, 35.971796],\n              [120.265699, 35.966468],\n              [120.209033, 35.917531],\n              [120.202258, 35.89184],\n              [120.169613, 35.888446],\n              [120.207801, 35.947575],\n              [120.152983, 35.907353],\n              [120.125265, 35.906868],\n              [120.112331, 35.885052],\n              [120.064287, 35.873414],\n              [120.032258, 35.812288],\n              [120.049505, 35.786562],\n              [120.01378, 35.714193],\n              [119.958346, 35.760342],\n              [119.926317, 35.759856],\n              [119.920157, 35.739943],\n              [119.950339, 35.729741],\n              [119.91215, 35.660725],\n              [119.925085, 35.637382],\n              [119.868419, 35.60868],\n              [119.83023, 35.620357],\n              [119.824071, 35.646136],\n              [119.792658, 35.615492],\n              [119.800665, 35.581915],\n              [119.752622, 35.588729],\n              [119.75139, 35.617924],\n              [119.718129, 35.615492],\n              [119.662079, 35.589215],\n              [119.663311, 35.562931],\n              [119.618963, 35.459655],\n              [119.579543, 35.406504],\n              [119.590014, 35.37284],\n              [119.543819, 35.347949],\n              [119.538275, 35.296678],\n              [119.493312, 35.318655],\n              [119.450812, 35.285443],\n              [119.411392, 35.231689],\n              [119.397841, 35.137777],\n              [119.428022, 35.121136],\n              [119.373819, 35.078538],\n              [119.354109, 35.080007],\n              [119.306066, 35.076578],\n              [119.286972, 35.115261],\n              [119.250016, 35.124562],\n              [119.217371, 35.106939],\n              [119.137915, 35.096167],\n              [119.114509, 35.055026],\n              [119.027045, 35.055516],\n              [118.942662, 35.040817],\n              [118.928495, 35.051106],\n              [118.86259, 35.025626],\n              [118.860742, 34.944233],\n              [118.805307, 34.87307],\n              [118.80038, 34.843114],\n              [118.772047, 34.794474],\n              [118.739402, 34.792508],\n              [118.719076, 34.745313],\n              [118.764039, 34.740396],\n              [118.783749, 34.723181],\n              [118.739402, 34.693663],\n              [118.690127, 34.678408],\n              [118.664257, 34.693663],\n              [118.607591, 34.694155],\n              [118.601431, 34.714327],\n              [118.545997, 34.705964],\n              [118.460997, 34.656258],\n              [118.473932, 34.623269],\n              [118.439439, 34.626223],\n              [118.424657, 34.595193],\n              [118.439439, 34.507949],\n              [118.416034, 34.473914],\n              [118.404947, 34.427525],\n              [118.379693, 34.415183],\n              [118.290382, 34.424563],\n              [118.277447, 34.404814],\n              [118.220165, 34.405802],\n              [118.217701, 34.379134],\n              [118.179513, 34.379628],\n              [118.177665, 34.45319],\n              [118.132702, 34.483287],\n              [118.16473, 34.50499],\n              [118.185056, 34.543942],\n              [118.079115, 34.569571],\n              [118.114839, 34.614404],\n              [118.084042, 34.655766],\n              [118.053861, 34.650843],\n              [117.951615, 34.678408],\n              [117.909732, 34.670533],\n              [117.902956, 34.644443],\n              [117.793935, 34.651827],\n              [117.791471, 34.583368],\n              [117.801942, 34.518798],\n              [117.684298, 34.547392],\n              [117.659044, 34.501044],\n              [117.609769, 34.490686],\n              [117.592523, 34.462566],\n              [117.53832, 34.467006],\n              [117.465023, 34.484767],\n              [117.402813, 34.550843],\n              [117.402813, 34.569571],\n              [117.362777, 34.589281],\n              [117.325205, 34.573021],\n              [117.325205, 34.573021],\n              [117.32151, 34.566614],\n              [117.32151, 34.566614],\n              [117.311654, 34.561686],\n              [117.311654, 34.561686],\n              [117.267307, 34.528659],\n              [117.27285, 34.499565],\n              [117.252524, 34.48674],\n              [117.248213, 34.451216],\n              [117.166293, 34.434435],\n              [117.139191, 34.526687],\n              [117.15151, 34.559222],\n              [117.104083, 34.648874],\n              [117.073286, 34.639026],\n              [117.061583, 34.675947],\n              [117.070206, 34.713835],\n              [117.022163, 34.759081],\n              [116.969192, 34.771864],\n              [116.95133, 34.81069],\n              [116.979047, 34.815113],\n              [116.966113, 34.844588],\n              [116.929156, 34.843114],\n              [116.922381, 34.894671],\n              [116.858323, 34.928533],\n              [116.821983, 34.929515],\n              [116.809048, 34.968757],\n              [116.781947, 34.961891],\n              [116.781331, 34.916757],\n              [116.677853, 34.939327],\n              [116.622418, 34.939818],\n              [116.613795, 34.922645],\n              [116.557745, 34.908905],\n              [116.445028, 34.895652],\n              [116.408071, 34.850972],\n              [116.403144, 34.756131],\n              [116.369267, 34.749247],\n              [116.363724, 34.715311],\n              [116.392057, 34.710391],\n              [116.374195, 34.640011],\n            ],\n          ],\n          [\n            [\n              [120.729502, 37.947065],\n              [120.76461, 37.923937],\n              [120.76461, 37.895134],\n              [120.721495, 37.917328],\n              [120.729502, 37.947065],\n            ],\n          ],\n          [\n            [\n              [120.692545, 37.983867],\n              [120.724574, 37.987641],\n              [120.732581, 37.961694],\n              [120.692545, 37.983867],\n            ],\n          ],\n          [\n            [\n              [120.990044, 36.413239],\n              [120.950624, 36.414684],\n              [120.978341, 36.428649],\n              [120.990044, 36.413239],\n            ],\n          ],\n          [\n            [\n              [120.750444, 38.150188],\n              [120.742436, 38.199116],\n              [120.7874, 38.158658],\n              [120.750444, 38.150188],\n            ],\n          ],\n          [\n            [\n              [120.918595, 38.345236],\n              [120.895189, 38.36307],\n              [120.914899, 38.373393],\n              [120.918595, 38.345236],\n            ],\n          ],\n          [\n            [\n              [120.159142, 35.765198],\n              [120.172077, 35.785591],\n              [120.193019, 35.756942],\n              [120.169613, 35.740428],\n              [120.159142, 35.765198],\n            ],\n          ],\n          [\n            [\n              [120.62664, 37.94565],\n              [120.602002, 37.978678],\n              [120.631567, 37.981037],\n              [120.62664, 37.94565],\n            ],\n          ],\n          [\n            [\n              [120.802183, 38.284193],\n              [120.816349, 38.318008],\n              [120.848378, 38.305799],\n              [120.802183, 38.284193],\n            ],\n          ],\n          [\n            [\n              [121.489571, 37.577086],\n              [121.488955, 37.578035],\n              [121.489571, 37.578509],\n              [121.489571, 37.577561],\n              [121.489571, 37.577086],\n            ],\n          ],\n          [\n            [\n              [121.485875, 37.578509],\n              [121.487723, 37.578509],\n              [121.487723, 37.578035],\n              [121.485875, 37.578509],\n            ],\n          ],\n          [\n            [\n              [121.487723, 37.578509],\n              [121.488339, 37.578509],\n              [121.488955, 37.578509],\n              [121.488955, 37.578035],\n              [121.487723, 37.577561],\n              [121.487723, 37.578509],\n            ],\n          ],\n          [\n            [\n              [115.495249, 35.896203],\n              [115.505104, 35.899112],\n              [115.513112, 35.890385],\n              [115.487858, 35.880688],\n              [115.495249, 35.896203],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 410000,\n        name: '河南省',\n        center: [113.665412, 34.757975],\n        centroid: [113.619748, 33.902617],\n        childrenNum: 18,\n        level: 'province',\n        subFeatureIndex: 15,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [115.5088, 32.468761],\n              [115.509416, 32.466741],\n              [115.522967, 32.441997],\n              [115.57101, 32.419266],\n              [115.604271, 32.425833],\n              [115.626445, 32.40512],\n              [115.657857, 32.428864],\n              [115.667712, 32.409667],\n              [115.704669, 32.495013],\n              [115.742241, 32.476335],\n              [115.771806, 32.505108],\n              [115.789052, 32.468761],\n              [115.861117, 32.537403],\n              [115.891298, 32.576243],\n              [115.910393, 32.567165],\n              [115.8759, 32.542448],\n              [115.845719, 32.501575],\n              [115.883291, 32.487946],\n              [115.865429, 32.458662],\n              [115.899306, 32.390971],\n              [115.912856, 32.227596],\n              [115.941805, 32.166318],\n              [115.922095, 32.049725],\n              [115.928871, 32.003046],\n              [115.909161, 31.94314],\n              [115.920248, 31.920285],\n              [115.894994, 31.8649],\n              [115.893762, 31.832365],\n              [115.914704, 31.814567],\n              [115.886371, 31.776418],\n              [115.851878, 31.786593],\n              [115.808147, 31.770313],\n              [115.808147, 31.770313],\n              [115.767495, 31.78761],\n              [115.731154, 31.76726],\n              [115.676336, 31.778453],\n              [115.553764, 31.69549],\n              [115.534054, 31.698545],\n              [115.495249, 31.673083],\n              [115.476771, 31.643028],\n              [115.485394, 31.608885],\n              [115.439815, 31.588496],\n              [115.415793, 31.525771],\n              [115.371446, 31.495668],\n              [115.389924, 31.450241],\n              [115.373909, 31.405813],\n              [115.338801, 31.40428],\n              [115.301229, 31.383846],\n              [115.250722, 31.392021],\n              [115.252569, 31.421646],\n              [115.211301, 31.442072],\n              [115.218077, 31.515057],\n              [115.235939, 31.555354],\n              [115.212533, 31.555354],\n              [115.16449, 31.604808],\n              [115.12507, 31.599201],\n              [115.106592, 31.567592],\n              [115.114599, 31.530362],\n              [115.096121, 31.508425],\n              [115.022824, 31.527811],\n              [114.995107, 31.471171],\n              [114.962462, 31.494648],\n              [114.884238, 31.469129],\n              [114.870071, 31.479337],\n              [114.830035, 31.45892],\n              [114.789383, 31.480358],\n              [114.778912, 31.520669],\n              [114.696376, 31.525771],\n              [114.641558, 31.582378],\n              [114.61692, 31.585437],\n              [114.572572, 31.553824],\n              [114.560869, 31.560963],\n              [114.547935, 31.623665],\n              [114.57134, 31.660858],\n              [114.586123, 31.762172],\n              [114.549783, 31.766751],\n              [114.530688, 31.742834],\n              [114.443841, 31.728074],\n              [114.403189, 31.746906],\n              [114.350218, 31.755557],\n              [114.292936, 31.752503],\n              [114.235654, 31.833382],\n              [114.191922, 31.852192],\n              [114.134024, 31.843042],\n              [114.119241, 31.805922],\n              [114.089676, 31.781506],\n              [114.017611, 31.770822],\n              [113.988662, 31.749959],\n              [113.952321, 31.793714],\n              [113.957865, 31.852701],\n              [113.914749, 31.877098],\n              [113.893807, 31.847109],\n              [113.854387, 31.843042],\n              [113.830981, 31.87913],\n              [113.832213, 31.918761],\n              [113.805728, 31.929428],\n              [113.817431, 31.964467],\n              [113.757685, 31.98985],\n              [113.791561, 32.036028],\n              [113.728735, 32.083197],\n              [113.722576, 32.12426],\n              [113.750293, 32.11615],\n              [113.782322, 32.184553],\n              [113.752757, 32.215951],\n              [113.73859, 32.255942],\n              [113.749061, 32.272642],\n              [113.758301, 32.27669],\n              [113.768156, 32.284279],\n              [113.768772, 32.30148],\n              [113.753989, 32.328286],\n              [113.76754, 32.370249],\n              [113.735511, 32.410677],\n              [113.700402, 32.420782],\n              [113.650511, 32.412698],\n              [113.624642, 32.36115],\n              [113.511925, 32.316654],\n              [113.428773, 32.270618],\n              [113.376418, 32.298445],\n              [113.353628, 32.294904],\n              [113.317904, 32.327275],\n              [113.333918, 32.336377],\n              [113.2366, 32.407141],\n              [113.211962, 32.431895],\n              [113.158992, 32.410677],\n              [113.155912, 32.380863],\n              [113.118956, 32.375809],\n              [113.107869, 32.398551],\n              [113.078919, 32.394508],\n              [113.025949, 32.425328],\n              [113.000695, 32.41674],\n              [112.992072, 32.378336],\n              [112.912, 32.390971],\n              [112.888594, 32.37682],\n              [112.860877, 32.396024],\n              [112.776493, 32.358623],\n              [112.735841, 32.356095],\n              [112.716747, 32.357612],\n              [112.645298, 32.368227],\n              [112.612037, 32.386928],\n              [112.589248, 32.381369],\n              [112.545516, 32.404109],\n              [112.530733, 32.37682],\n              [112.477147, 32.380863],\n              [112.448814, 32.34295],\n              [112.390915, 32.37126],\n              [112.360118, 32.3657],\n              [112.328089, 32.321712],\n              [112.206133, 32.392992],\n              [112.172873, 32.385412],\n              [112.150083, 32.411688],\n              [112.155626, 32.377326],\n              [112.081098, 32.425833],\n              [112.063851, 32.474315],\n              [112.014576, 32.450077],\n              [111.975772, 32.471791],\n              [111.948671, 32.51722],\n              [111.890157, 32.503089],\n              [111.858128, 32.528826],\n              [111.808853, 32.536899],\n              [111.713382, 32.606497],\n              [111.646245, 32.605993],\n              [111.640701, 32.634724],\n              [111.577875, 32.593388],\n              [111.530448, 32.628172],\n              [111.513202, 32.674026],\n              [111.458383, 32.726402],\n              [111.475629, 32.760127],\n              [111.41342, 32.757108],\n              [111.380159, 32.829049],\n              [111.293311, 32.859217],\n              [111.276065, 32.903445],\n              [111.255123, 32.883846],\n              [111.242804, 32.930573],\n              [111.273601, 32.971753],\n              [111.258819, 33.006389],\n              [111.221862, 33.042517],\n              [111.152877, 33.039507],\n              [111.192913, 33.071609],\n              [111.179363, 33.115229],\n              [111.146102, 33.12375],\n              [111.12824, 33.15532],\n              [111.08882, 33.181871],\n              [111.045704, 33.169849],\n              [111.046936, 33.202905],\n              [110.984726, 33.255469],\n              [111.025994, 33.330504],\n              [111.025994, 33.375495],\n              [110.996429, 33.435946],\n              [111.02661, 33.467903],\n              [111.02661, 33.478386],\n              [111.002588, 33.535772],\n              [111.00382, 33.578662],\n              [110.966864, 33.609071],\n              [110.878784, 33.634486],\n              [110.823966, 33.685793],\n              [110.831973, 33.713675],\n              [110.81719, 33.751003],\n              [110.782082, 33.796272],\n              [110.74143, 33.798759],\n              [110.712481, 33.833564],\n              [110.66259, 33.85295],\n              [110.612083, 33.852453],\n              [110.587445, 33.887733],\n              [110.628713, 33.910086],\n              [110.627481, 33.925482],\n              [110.665669, 33.937895],\n              [110.671213, 33.966192],\n              [110.620706, 34.035652],\n              [110.587445, 34.023252],\n              [110.591757, 34.101586],\n              [110.61393, 34.113478],\n              [110.642264, 34.161032],\n              [110.621938, 34.177372],\n              [110.55788, 34.193214],\n              [110.55172, 34.213012],\n              [110.507989, 34.217466],\n              [110.43962, 34.243196],\n              [110.428533, 34.288203],\n              [110.451938, 34.292653],\n              [110.503677, 34.33714],\n              [110.473496, 34.393457],\n              [110.403279, 34.433448],\n              [110.403279, 34.433448],\n              [110.360779, 34.516825],\n              [110.372482, 34.544435],\n              [110.404511, 34.557743],\n              [110.366939, 34.566614],\n              [110.379257, 34.600612],\n              [110.424837, 34.588295],\n              [110.488279, 34.610956],\n              [110.533242, 34.583368],\n              [110.610851, 34.607508],\n              [110.710017, 34.605045],\n              [110.749437, 34.65232],\n              [110.780234, 34.648874],\n              [110.812263, 34.624746],\n              [110.870777, 34.636072],\n              [110.89911, 34.661673],\n              [110.929907, 34.731543],\n              [110.976103, 34.706456],\n              [111.035233, 34.740887],\n              [111.118385, 34.756623],\n              [111.148566, 34.807742],\n              [111.232949, 34.789559],\n              [111.255123, 34.819535],\n              [111.29208, 34.806759],\n              [111.345666, 34.831816],\n              [111.389398, 34.815113],\n              [111.439289, 34.838202],\n              [111.502731, 34.829851],\n              [111.543999, 34.853428],\n              [111.570484, 34.843114],\n              [111.592042, 34.881416],\n              [111.617911, 34.894671],\n              [111.646861, 34.938836],\n              [111.681969, 34.9511],\n              [111.664107, 34.984449],\n              [111.739251, 35.00406],\n              [111.807005, 35.032977],\n              [111.810084, 35.062374],\n              [111.933272, 35.083435],\n              [111.97762, 35.067272],\n              [112.018888, 35.068742],\n              [112.039214, 35.045717],\n              [112.062004, 35.056005],\n              [112.05646, 35.098615],\n              [112.066315, 35.153437],\n              [112.03983, 35.194039],\n              [112.078634, 35.219467],\n              [112.058924, 35.280069],\n              [112.094033, 35.279092],\n              [112.21722, 35.253195],\n              [112.242474, 35.234622],\n              [112.304684, 35.251728],\n              [112.288053, 35.219956],\n              [112.36751, 35.219956],\n              [112.390915, 35.239021],\n              [112.513487, 35.218489],\n              [112.637291, 35.225822],\n              [112.628052, 35.263457],\n              [112.720443, 35.206265],\n              [112.772798, 35.207732],\n              [112.822073, 35.258082],\n              [112.884283, 35.243909],\n              [112.934174, 35.262968],\n              [112.936022, 35.284466],\n              [112.992072, 35.29619],\n              [112.985913, 35.33965],\n              [112.996384, 35.362104],\n              [113.067217, 35.353806],\n              [113.126347, 35.332327],\n              [113.149137, 35.350878],\n              [113.165151, 35.412845],\n              [113.188557, 35.412357],\n              [113.189789, 35.44893],\n              [113.243375, 35.449418],\n              [113.304353, 35.426989],\n              [113.31236, 35.481101],\n              [113.348085, 35.468429],\n              [113.391817, 35.506925],\n              [113.439244, 35.507412],\n              [113.49899, 35.532254],\n              [113.513773, 35.57364],\n              [113.55812, 35.621816],\n              [113.547649, 35.656835],\n              [113.578446, 35.633491],\n              [113.625258, 35.632518],\n              [113.622794, 35.674825],\n              [113.592613, 35.691838],\n              [113.587685, 35.736542],\n              [113.604932, 35.797727],\n              [113.582758, 35.818111],\n              [113.660982, 35.837035],\n              [113.637576, 35.870019],\n              [113.654207, 35.931586],\n              [113.648663, 35.994073],\n              [113.678844, 35.985841],\n              [113.694859, 36.026991],\n              [113.660366, 36.034735],\n              [113.68562, 36.056026],\n              [113.671453, 36.115514],\n              [113.655439, 36.125182],\n              [113.712721, 36.129533],\n              [113.705946, 36.148865],\n              [113.651127, 36.174473],\n              [113.697939, 36.181719],\n              [113.681924, 36.216491],\n              [113.716417, 36.262347],\n              [113.712105, 36.303353],\n              [113.736127, 36.324571],\n              [113.731199, 36.363135],\n              [113.755221, 36.366026],\n              [113.813119, 36.332285],\n              [113.856851, 36.329392],\n              [113.84946, 36.347711],\n              [113.882104, 36.353977],\n              [113.911054, 36.314927],\n              [113.962792, 36.353977],\n              [113.981887, 36.31782],\n              [114.002828, 36.334214],\n              [114.056415, 36.329392],\n              [114.04348, 36.303353],\n              [114.080437, 36.269585],\n              [114.129096, 36.280199],\n              [114.175907, 36.264759],\n              [114.170364, 36.245938],\n              [114.170364, 36.245938],\n              [114.203009, 36.245456],\n              [114.2104, 36.272962],\n              [114.241197, 36.251247],\n              [114.257827, 36.263794],\n              [114.299095, 36.245938],\n              [114.345291, 36.255591],\n              [114.356378, 36.230492],\n              [114.408117, 36.224699],\n              [114.417356, 36.205868],\n              [114.466015, 36.197658],\n              [114.480181, 36.177855],\n              [114.533152, 36.171575],\n              [114.586739, 36.141133],\n              [114.588587, 36.118414],\n              [114.640326, 36.137266],\n              [114.720398, 36.140166],\n              [114.734564, 36.15563],\n              [114.771521, 36.124699],\n              [114.857752, 36.127599],\n              [114.858368, 36.144516],\n              [114.912571, 36.140649],\n              [114.926737, 36.089403],\n              [114.914419, 36.052155],\n              [114.998186, 36.069572],\n              [115.04623, 36.112613],\n              [115.048693, 36.161912],\n              [115.06286, 36.178338],\n              [115.104744, 36.172058],\n              [115.12507, 36.209731],\n              [115.1842, 36.193312],\n              [115.201446, 36.210214],\n              [115.201446, 36.210214],\n              [115.202678, 36.209248],\n              [115.202678, 36.209248],\n              [115.202678, 36.208765],\n              [115.202678, 36.208765],\n              [115.242098, 36.19138],\n              [115.279055, 36.13775],\n              [115.30246, 36.127599],\n              [115.312931, 36.088436],\n              [115.365902, 36.099074],\n              [115.376989, 36.128083],\n              [115.450902, 36.152248],\n              [115.465068, 36.170125],\n              [115.483547, 36.148865],\n              [115.484163, 36.125666],\n              [115.449054, 36.047317],\n              [115.447822, 36.01247],\n              [115.362822, 35.971796],\n              [115.353583, 35.938854],\n              [115.364054, 35.894264],\n              [115.335105, 35.796756],\n              [115.363438, 35.779765],\n              [115.407786, 35.80889],\n              [115.460141, 35.867594],\n              [115.487858, 35.880688],\n              [115.513112, 35.890385],\n              [115.583945, 35.921893],\n              [115.648618, 35.922863],\n              [115.699125, 35.966468],\n              [115.774886, 35.974702],\n              [115.779813, 35.993588],\n              [115.817386, 36.012954],\n              [115.859886, 36.003756],\n              [115.89869, 36.026507],\n              [115.989849, 36.045381],\n              [116.057602, 36.104877],\n              [116.099486, 36.112129],\n              [116.063145, 36.028927],\n              [116.048979, 35.970343],\n              [115.984921, 35.974218],\n              [115.911624, 35.960171],\n              [115.907929, 35.92674],\n              [115.873436, 35.918985],\n              [115.882675, 35.879718],\n              [115.859886, 35.857894],\n              [115.81677, 35.844312],\n              [115.773654, 35.854014],\n              [115.73485, 35.833154],\n              [115.696046, 35.788989],\n              [115.693582, 35.754028],\n              [115.622749, 35.739457],\n              [115.52851, 35.733628],\n              [115.48601, 35.710306],\n              [115.383148, 35.568772],\n              [115.34496, 35.55368],\n              [115.356047, 35.490359],\n              [115.307388, 35.480126],\n              [115.237171, 35.423087],\n              [115.172497, 35.426501],\n              [115.126302, 35.41821],\n              [115.117679, 35.400163],\n              [115.091809, 35.416259],\n              [115.073947, 35.374304],\n              [115.04315, 35.376744],\n              [114.957534, 35.261014],\n              [114.929201, 35.244886],\n              [114.932281, 35.198441],\n              [114.861448, 35.182301],\n              [114.841738, 35.15099],\n              [114.883006, 35.098615],\n              [114.835578, 35.076578],\n              [114.818948, 35.051596],\n              [114.852209, 35.041797],\n              [114.824492, 35.012393],\n              [114.880542, 35.00357],\n              [114.923658, 34.968757],\n              [114.950759, 34.989843],\n              [115.008041, 34.988372],\n              [115.028983, 34.9717],\n              [115.075179, 35.000628],\n              [115.12815, 35.00455],\n              [115.157099, 34.957968],\n              [115.219309, 34.96042],\n              [115.205142, 34.914303],\n              [115.251953, 34.906451],\n              [115.239019, 34.87798],\n              [115.256265, 34.845079],\n              [115.317243, 34.859321],\n              [115.42688, 34.805285],\n              [115.449054, 34.74433],\n              [115.433655, 34.725149],\n              [115.461373, 34.637057],\n              [115.515575, 34.582383],\n              [115.553148, 34.568586],\n              [115.622749, 34.574499],\n              [115.685575, 34.556265],\n              [115.697278, 34.594207],\n              [115.787821, 34.580905],\n              [115.827241, 34.558236],\n              [115.838328, 34.5676],\n              [115.984305, 34.589281],\n              [115.991081, 34.615389],\n              [116.037276, 34.593222],\n              [116.101334, 34.60603],\n              [116.134594, 34.559715],\n              [116.156768, 34.5538],\n              [116.196804, 34.575977],\n              [116.191261, 34.535561],\n              [116.204196, 34.508442],\n              [116.178326, 34.496112],\n              [116.162312, 34.459605],\n              [116.178942, 34.430487],\n              [116.215898, 34.403333],\n              [116.213435, 34.382098],\n              [116.255934, 34.376665],\n              [116.301514, 34.342082],\n              [116.363724, 34.316877],\n              [116.372347, 34.26595],\n              [116.409303, 34.273863],\n              [116.409303, 34.273863],\n              [116.456731, 34.268917],\n              [116.516477, 34.296114],\n              [116.562056, 34.285731],\n              [116.582382, 34.266444],\n              [116.545426, 34.241711],\n              [116.542962, 34.203608],\n              [116.565752, 34.16945],\n              [116.536187, 34.151127],\n              [116.52818, 34.122892],\n              [116.576223, 34.068873],\n              [116.576223, 34.068873],\n              [116.599629, 34.014324],\n              [116.599629, 34.014324],\n              [116.641512, 33.978103],\n              [116.64336, 33.896675],\n              [116.631042, 33.887733],\n              [116.566984, 33.9081],\n              [116.558361, 33.881274],\n              [116.486296, 33.869846],\n              [116.437637, 33.846489],\n              [116.437021, 33.801246],\n              [116.408071, 33.805721],\n              [116.393905, 33.782843],\n              [116.316912, 33.771402],\n              [116.263326, 33.730101],\n              [116.2005, 33.72612],\n              [116.155536, 33.709693],\n              [116.132747, 33.751501],\n              [116.100102, 33.782843],\n              [116.074232, 33.781351],\n              [116.055754, 33.804727],\n              [116.05945, 33.860902],\n              [115.982457, 33.917039],\n              [116.00032, 33.965199],\n              [115.95782, 34.007875],\n              [115.904233, 34.009859],\n              [115.876516, 34.028708],\n              [115.877132, 34.002913],\n              [115.852494, 34.003906],\n              [115.846335, 34.028708],\n              [115.809378, 34.062428],\n              [115.736082, 34.076805],\n              [115.705901, 34.059949],\n              [115.658473, 34.061437],\n              [115.642459, 34.03218],\n              [115.60735, 34.030196],\n              [115.579017, 33.974133],\n              [115.577785, 33.950307],\n              [115.547604, 33.874815],\n              [115.631988, 33.869846],\n              [115.614126, 33.775879],\n              [115.576553, 33.787817],\n              [115.563003, 33.772895],\n              [115.601807, 33.718653],\n              [115.601191, 33.658898],\n              [115.639995, 33.585143],\n              [115.564851, 33.576169],\n              [115.561771, 33.563703],\n              [115.463837, 33.567193],\n              [115.422569, 33.557219],\n              [115.394851, 33.506335],\n              [115.366518, 33.5233],\n              [115.345576, 33.502842],\n              [115.345576, 33.449928],\n              [115.316627, 33.44893],\n              [115.328946, 33.403477],\n              [115.313547, 33.376994],\n              [115.341881, 33.370997],\n              [115.365286, 33.336005],\n              [115.361591, 33.298497],\n              [115.335105, 33.297997],\n              [115.340033, 33.260973],\n              [115.300613, 33.204407],\n              [115.303692, 33.149809],\n              [115.289526, 33.131769],\n              [115.245178, 33.135778],\n              [115.194671, 33.120743],\n              [115.168186, 33.088658],\n              [115.041302, 33.086653],\n              [114.990795, 33.102195],\n              [114.966158, 33.147304],\n              [114.932897, 33.153817],\n              [114.902716, 33.129764],\n              [114.897172, 33.086653],\n              [114.913187, 33.083143],\n              [114.925506, 33.016928],\n              [114.891629, 33.020441],\n              [114.883006, 32.990328],\n              [114.916266, 32.971251],\n              [114.943368, 32.935094],\n              [115.009273, 32.940117],\n              [115.035143, 32.932582],\n              [115.029599, 32.906962],\n              [115.139237, 32.897917],\n              [115.155867, 32.864747],\n              [115.197135, 32.856201],\n              [115.189744, 32.812452],\n              [115.211301, 32.785791],\n              [115.189744, 32.770695],\n              [115.179273, 32.726402],\n              [115.182968, 32.666973],\n              [115.20083, 32.591876],\n              [115.24333, 32.593388],\n              [115.267352, 32.578261],\n              [115.30554, 32.583303],\n              [115.304924, 32.553042],\n              [115.411482, 32.575235],\n              [115.409018, 32.549007],\n              [115.497713, 32.492489],\n              [115.5088, 32.468761],\n            ],\n          ],\n          [\n            [\n              [113.768156, 32.284279],\n              [113.758301, 32.27669],\n              [113.749061, 32.272642],\n              [113.768772, 32.30148],\n              [113.768156, 32.284279],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 420000,\n        name: '湖北省',\n        center: [114.298572, 30.584355],\n        centroid: [112.271286, 30.987521],\n        childrenNum: 17,\n        level: 'province',\n        subFeatureIndex: 16,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [111.045704, 33.169849],\n              [111.08882, 33.181871],\n              [111.12824, 33.15532],\n              [111.146102, 33.12375],\n              [111.179363, 33.115229],\n              [111.192913, 33.071609],\n              [111.152877, 33.039507],\n              [111.221862, 33.042517],\n              [111.258819, 33.006389],\n              [111.273601, 32.971753],\n              [111.242804, 32.930573],\n              [111.255123, 32.883846],\n              [111.276065, 32.903445],\n              [111.293311, 32.859217],\n              [111.380159, 32.829049],\n              [111.41342, 32.757108],\n              [111.475629, 32.760127],\n              [111.458383, 32.726402],\n              [111.513202, 32.674026],\n              [111.530448, 32.628172],\n              [111.577875, 32.593388],\n              [111.640701, 32.634724],\n              [111.646245, 32.605993],\n              [111.713382, 32.606497],\n              [111.808853, 32.536899],\n              [111.858128, 32.528826],\n              [111.890157, 32.503089],\n              [111.948671, 32.51722],\n              [111.975772, 32.471791],\n              [112.014576, 32.450077],\n              [112.063851, 32.474315],\n              [112.081098, 32.425833],\n              [112.155626, 32.377326],\n              [112.150083, 32.411688],\n              [112.172873, 32.385412],\n              [112.206133, 32.392992],\n              [112.328089, 32.321712],\n              [112.360118, 32.3657],\n              [112.390915, 32.37126],\n              [112.448814, 32.34295],\n              [112.477147, 32.380863],\n              [112.530733, 32.37682],\n              [112.545516, 32.404109],\n              [112.589248, 32.381369],\n              [112.612037, 32.386928],\n              [112.645298, 32.368227],\n              [112.716747, 32.357612],\n              [112.724138, 32.358623],\n              [112.733993, 32.356601],\n              [112.735841, 32.356095],\n              [112.776493, 32.358623],\n              [112.860877, 32.396024],\n              [112.888594, 32.37682],\n              [112.912, 32.390971],\n              [112.992072, 32.378336],\n              [113.000695, 32.41674],\n              [113.025949, 32.425328],\n              [113.078919, 32.394508],\n              [113.107869, 32.398551],\n              [113.118956, 32.375809],\n              [113.155912, 32.380863],\n              [113.158992, 32.410677],\n              [113.211962, 32.431895],\n              [113.2366, 32.407141],\n              [113.333918, 32.336377],\n              [113.317904, 32.327275],\n              [113.353628, 32.294904],\n              [113.376418, 32.298445],\n              [113.428773, 32.270618],\n              [113.511925, 32.316654],\n              [113.624642, 32.36115],\n              [113.650511, 32.412698],\n              [113.700402, 32.420782],\n              [113.735511, 32.410677],\n              [113.76754, 32.370249],\n              [113.753989, 32.328286],\n              [113.768772, 32.30148],\n              [113.749061, 32.272642],\n              [113.73859, 32.255942],\n              [113.752757, 32.215951],\n              [113.782322, 32.184553],\n              [113.750293, 32.11615],\n              [113.722576, 32.12426],\n              [113.728735, 32.083197],\n              [113.791561, 32.036028],\n              [113.757685, 31.98985],\n              [113.817431, 31.964467],\n              [113.805728, 31.929428],\n              [113.832213, 31.918761],\n              [113.830981, 31.87913],\n              [113.854387, 31.843042],\n              [113.893807, 31.847109],\n              [113.914749, 31.877098],\n              [113.957865, 31.852701],\n              [113.952321, 31.793714],\n              [113.988662, 31.749959],\n              [114.017611, 31.770822],\n              [114.089676, 31.781506],\n              [114.119241, 31.805922],\n              [114.134024, 31.843042],\n              [114.191922, 31.852192],\n              [114.235654, 31.833382],\n              [114.292936, 31.752503],\n              [114.350218, 31.755557],\n              [114.403189, 31.746906],\n              [114.443841, 31.728074],\n              [114.530688, 31.742834],\n              [114.549783, 31.766751],\n              [114.586123, 31.762172],\n              [114.57134, 31.660858],\n              [114.547935, 31.623665],\n              [114.560869, 31.560963],\n              [114.572572, 31.553824],\n              [114.61692, 31.585437],\n              [114.641558, 31.582378],\n              [114.696376, 31.525771],\n              [114.778912, 31.520669],\n              [114.789383, 31.480358],\n              [114.830035, 31.45892],\n              [114.870071, 31.479337],\n              [114.884238, 31.469129],\n              [114.962462, 31.494648],\n              [114.995107, 31.471171],\n              [115.022824, 31.527811],\n              [115.096121, 31.508425],\n              [115.114599, 31.530362],\n              [115.106592, 31.567592],\n              [115.12507, 31.599201],\n              [115.16449, 31.604808],\n              [115.212533, 31.555354],\n              [115.235939, 31.555354],\n              [115.218077, 31.515057],\n              [115.211301, 31.442072],\n              [115.252569, 31.421646],\n              [115.250722, 31.392021],\n              [115.301229, 31.383846],\n              [115.338801, 31.40428],\n              [115.373909, 31.405813],\n              [115.393004, 31.389977],\n              [115.372062, 31.349098],\n              [115.40717, 31.337854],\n              [115.443511, 31.344498],\n              [115.473076, 31.265242],\n              [115.507568, 31.267799],\n              [115.539597, 31.231985],\n              [115.540213, 31.194621],\n              [115.585793, 31.143926],\n              [115.603655, 31.17363],\n              [115.655394, 31.211002],\n              [115.700973, 31.201276],\n              [115.778582, 31.112164],\n              [115.797676, 31.128047],\n              [115.837712, 31.127022],\n              [115.867277, 31.147512],\n              [115.887603, 31.10909],\n              [115.939958, 31.071678],\n              [115.938726, 31.04707],\n              [116.006479, 31.034764],\n              [116.015102, 31.011685],\n              [116.058834, 31.012711],\n              [116.071769, 30.956787],\n              [116.03974, 30.957813],\n              [115.976298, 30.931636],\n              [115.932566, 30.889532],\n              [115.865429, 30.864364],\n              [115.848799, 30.828397],\n              [115.863581, 30.815549],\n              [115.851262, 30.756938],\n              [115.782893, 30.751795],\n              [115.762567, 30.685426],\n              [115.81369, 30.637035],\n              [115.819234, 30.597893],\n              [115.848799, 30.602014],\n              [115.876516, 30.582438],\n              [115.887603, 30.542758],\n              [115.910393, 30.519046],\n              [115.894994, 30.452517],\n              [115.921479, 30.416397],\n              [115.885139, 30.379747],\n              [115.91532, 30.337919],\n              [115.903001, 30.31364],\n              [115.985537, 30.290905],\n              [115.997856, 30.252657],\n              [116.065609, 30.204569],\n              [116.055754, 30.180774],\n              [116.088399, 30.110391],\n              [116.078544, 30.062233],\n              [116.091479, 30.036331],\n              [116.073616, 29.969993],\n              [116.128435, 29.897904],\n              [116.13521, 29.819532],\n              [116.087167, 29.795125],\n              [116.049595, 29.761881],\n              [115.965827, 29.724469],\n              [115.909777, 29.723949],\n              [115.837096, 29.748373],\n              [115.762567, 29.793048],\n              [115.706517, 29.837703],\n              [115.667712, 29.850161],\n              [115.611662, 29.841337],\n              [115.51188, 29.840299],\n              [115.479235, 29.811224],\n              [115.470612, 29.739539],\n              [115.412714, 29.688602],\n              [115.355431, 29.649602],\n              [115.304924, 29.637118],\n              [115.28583, 29.618391],\n              [115.250722, 29.660003],\n              [115.176809, 29.654803],\n              [115.113367, 29.684963],\n              [115.117679, 29.655843],\n              [115.143548, 29.645961],\n              [115.120142, 29.597578],\n              [115.157099, 29.584568],\n              [115.154019, 29.510117],\n              [115.086266, 29.525741],\n              [115.087498, 29.560104],\n              [115.033295, 29.546568],\n              [115.00065, 29.572076],\n              [114.947679, 29.542924],\n              [114.966773, 29.522096],\n              [114.940288, 29.493971],\n              [114.900868, 29.505951],\n              [114.860216, 29.476258],\n              [114.888549, 29.436134],\n              [114.918114, 29.454374],\n              [114.90518, 29.473132],\n              [114.935977, 29.486678],\n              [114.947063, 29.465317],\n              [114.931049, 29.422581],\n              [114.895325, 29.397557],\n              [114.866375, 29.404335],\n              [114.812173, 29.383478],\n              [114.784455, 29.386086],\n              [114.759818, 29.363139],\n              [114.740724, 29.386607],\n              [114.67297, 29.395993],\n              [114.621847, 29.379828],\n              [114.589819, 29.352707],\n              [114.519602, 29.325578],\n              [114.466015, 29.324013],\n              [114.440145, 29.341752],\n              [114.376088, 29.322969],\n              [114.341595, 29.327665],\n              [114.307102, 29.365225],\n              [114.259059, 29.343839],\n              [114.252284, 29.23475],\n              [114.169748, 29.216993],\n              [114.063191, 29.204978],\n              [114.034857, 29.152204],\n              [113.98743, 29.126068],\n              [113.952321, 29.092604],\n              [113.94185, 29.047097],\n              [113.898119, 29.029307],\n              [113.876561, 29.038202],\n              [113.882104, 29.065407],\n              [113.852539, 29.058606],\n              [113.816199, 29.105154],\n              [113.775547, 29.095219],\n              [113.749677, 29.060699],\n              [113.722576, 29.104631],\n              [113.696091, 29.077437],\n              [113.690547, 29.114566],\n              [113.66283, 29.16945],\n              [113.691779, 29.19662],\n              [113.693011, 29.226394],\n              [113.651743, 29.225872],\n              [113.609859, 29.25146],\n              [113.632033, 29.316186],\n              [113.660982, 29.333405],\n              [113.674533, 29.388172],\n              [113.731199, 29.393907],\n              [113.755221, 29.446557],\n              [113.677613, 29.513763],\n              [113.630801, 29.523137],\n              [113.710257, 29.555419],\n              [113.73859, 29.579363],\n              [113.704098, 29.634518],\n              [113.680692, 29.64336],\n              [113.663446, 29.684443],\n              [113.606164, 29.666764],\n              [113.547033, 29.675603],\n              [113.540258, 29.699519],\n              [113.558736, 29.727067],\n              [113.550729, 29.768115],\n              [113.575367, 29.809147],\n              [113.571671, 29.849123],\n              [113.37765, 29.703158],\n              [113.277252, 29.594976],\n              [113.222433, 29.543965],\n              [113.181781, 29.485636],\n              [113.145441, 29.449163],\n              [113.099861, 29.459585],\n              [113.078304, 29.438218],\n              [113.057362, 29.522616],\n              [113.034572, 29.523658],\n              [112.950188, 29.473132],\n              [112.912, 29.606944],\n              [112.915696, 29.620992],\n              [113.005007, 29.693801],\n              [113.025949, 29.772791],\n              [112.974826, 29.732784],\n              [112.944645, 29.682883],\n              [112.926782, 29.692241],\n              [112.923703, 29.766557],\n              [112.929246, 29.77383],\n              [112.902145, 29.79149],\n              [112.894138, 29.783699],\n              [112.861493, 29.78318],\n              [112.79374, 29.735902],\n              [112.788812, 29.681323],\n              [112.733378, 29.645441],\n              [112.714283, 29.648561],\n              [112.693957, 29.601741],\n              [112.650842, 29.592374],\n              [112.640371, 29.607985],\n              [112.572001, 29.624113],\n              [112.54182, 29.60122],\n              [112.499321, 29.629316],\n              [112.439574, 29.633997],\n              [112.424792, 29.598619],\n              [112.368741, 29.541362],\n              [112.333017, 29.545007],\n              [112.291133, 29.517409],\n              [112.281278, 29.536676],\n              [112.303452, 29.585609],\n              [112.233851, 29.61631],\n              [112.244322, 29.659483],\n              [112.202438, 29.633997],\n              [112.178416, 29.656883],\n              [112.111279, 29.659483],\n              [112.089721, 29.685482],\n              [112.065699, 29.681323],\n              [112.07617, 29.743696],\n              [112.008417, 29.778505],\n              [111.95483, 29.796683],\n              [111.965917, 29.832512],\n              [111.925881, 29.836665],\n              [111.899396, 29.855871],\n              [111.899396, 29.855871],\n              [111.861207, 29.856909],\n              [111.8107, 29.901017],\n              [111.75773, 29.92021],\n              [111.723853, 29.909317],\n              [111.723853, 29.909317],\n              [111.705375, 29.890121],\n              [111.669034, 29.888565],\n              [111.669034, 29.888565],\n              [111.553854, 29.894272],\n              [111.527368, 29.925916],\n              [111.475629, 29.918654],\n              [111.436825, 29.930065],\n              [111.394325, 29.912948],\n              [111.382623, 29.95029],\n              [111.342587, 29.944586],\n              [111.3315, 29.970512],\n              [111.266826, 30.01146],\n              [111.242188, 30.040476],\n              [111.031537, 30.048765],\n              [110.929907, 30.063268],\n              [110.924364, 30.111426],\n              [110.851067, 30.126439],\n              [110.746973, 30.112979],\n              [110.756212, 30.054463],\n              [110.712481, 30.033223],\n              [110.650887, 30.07777],\n              [110.600996, 30.054463],\n              [110.531394, 30.061197],\n              [110.497518, 30.055499],\n              [110.491358, 30.019751],\n              [110.557264, 29.988137],\n              [110.517228, 29.961179],\n              [110.49875, 29.91243],\n              [110.538786, 29.895828],\n              [110.549873, 29.848085],\n              [110.60038, 29.839779],\n              [110.642879, 29.775907],\n              [110.562807, 29.712515],\n              [110.507373, 29.692241],\n              [110.467337, 29.713034],\n              [110.447011, 29.664684],\n              [110.372482, 29.633477],\n              [110.339221, 29.668324],\n              [110.302265, 29.661563],\n              [110.289946, 29.6964],\n              [110.219729, 29.746814],\n              [110.160599, 29.753569],\n              [110.113788, 29.789932],\n              [110.02386, 29.769674],\n              [109.941325, 29.774349],\n              [109.908064, 29.763959],\n              [109.869876, 29.774869],\n              [109.779333, 29.757725],\n              [109.755311, 29.733304],\n              [109.760238, 29.689122],\n              [109.714659, 29.673524],\n              [109.701108, 29.636078],\n              [109.717739, 29.615269],\n              [109.664768, 29.599659],\n              [109.651833, 29.625674],\n              [109.578536, 29.629836],\n              [109.558826, 29.606944],\n              [109.516326, 29.626194],\n              [109.488609, 29.553336],\n              [109.467051, 29.560104],\n              [109.458428, 29.513242],\n              [109.433791, 29.530948],\n              [109.436254, 29.488761],\n              [109.415928, 29.497617],\n              [109.418392, 29.453332],\n              [109.368501, 29.413719],\n              [109.391291, 29.372005],\n              [109.343863, 29.369398],\n              [109.352487, 29.284872],\n              [109.312451, 29.25146],\n              [109.257632, 29.222738],\n              [109.275494, 29.202366],\n              [109.261328, 29.161089],\n              [109.274262, 29.121885],\n              [109.232378, 29.119271],\n              [109.215748, 29.145409],\n              [109.162777, 29.180946],\n              [109.139372, 29.168927],\n              [109.110422, 29.21647],\n              [109.141835, 29.270256],\n              [109.106727, 29.288526],\n              [109.11227, 29.361053],\n              [109.060531, 29.403292],\n              [109.034662, 29.360531],\n              [108.999553, 29.36366],\n              [108.983539, 29.332883],\n              [108.919481, 29.3261],\n              [108.934264, 29.399643],\n              [108.927488, 29.435612],\n              [108.884373, 29.440824],\n              [108.866511, 29.470527],\n              [108.888684, 29.502305],\n              [108.878213, 29.539279],\n              [108.913322, 29.574679],\n              [108.901003, 29.604863],\n              [108.870206, 29.596537],\n              [108.888068, 29.628795],\n              [108.844337, 29.658443],\n              [108.781511, 29.635558],\n              [108.797525, 29.660003],\n              [108.786438, 29.691721],\n              [108.752562, 29.649082],\n              [108.690968, 29.689642],\n              [108.676801, 29.749412],\n              [108.680497, 29.800319],\n              [108.658939, 29.854833],\n              [108.601041, 29.863656],\n              [108.556077, 29.818493],\n              [108.52528, 29.770713],\n              [108.548686, 29.749412],\n              [108.504954, 29.728626],\n              [108.504338, 29.707836],\n              [108.460606, 29.741098],\n              [108.437201, 29.741098],\n              [108.442744, 29.778505],\n              [108.422418, 29.772791],\n              [108.424266, 29.815897],\n              [108.371295, 29.841337],\n              [108.433505, 29.880262],\n              [108.467998, 29.864175],\n              [108.516041, 29.885451],\n              [108.517889, 29.9394],\n              [108.536367, 29.983472],\n              [108.532055, 30.051873],\n              [108.513577, 30.057571],\n              [108.546222, 30.104178],\n              [108.56778, 30.157491],\n              [108.551766, 30.1637],\n              [108.581947, 30.255759],\n              [108.54499, 30.269716],\n              [108.524048, 30.309506],\n              [108.501258, 30.314673],\n              [108.460606, 30.35961],\n              [108.431041, 30.354446],\n              [108.402092, 30.376649],\n              [108.430425, 30.416397],\n              [108.411331, 30.438586],\n              [108.42673, 30.492233],\n              [108.472925, 30.487076],\n              [108.512961, 30.501515],\n              [108.556077, 30.487592],\n              [108.56778, 30.468508],\n              [108.6497, 30.53915],\n              [108.642925, 30.578831],\n              [108.688504, 30.58759],\n              [108.698975, 30.54482],\n              [108.743939, 30.494812],\n              [108.789518, 30.513374],\n              [108.808612, 30.491202],\n              [108.838793, 30.503062],\n              [108.893612, 30.565434],\n              [108.971836, 30.627766],\n              [109.006329, 30.626736],\n              [109.042669, 30.655571],\n              [109.071002, 30.640125],\n              [109.111654, 30.646303],\n              [109.106111, 30.61077],\n              [109.09256, 30.578831],\n              [109.103647, 30.565949],\n              [109.143683, 30.521108],\n              [109.191726, 30.545851],\n              [109.191726, 30.545851],\n              [109.245313, 30.580892],\n              [109.299516, 30.630341],\n              [109.314298, 30.599953],\n              [109.36111, 30.551004],\n              [109.337088, 30.521623],\n              [109.35495, 30.487076],\n              [109.418392, 30.559766],\n              [109.435638, 30.595832],\n              [109.535421, 30.664837],\n              [109.543428, 30.63961],\n              [109.574225, 30.646818],\n              [109.590855, 30.69366],\n              [109.625348, 30.702923],\n              [109.661072, 30.738936],\n              [109.656761, 30.760538],\n              [109.701724, 30.783677],\n              [109.780564, 30.848437],\n              [109.828608, 30.864364],\n              [109.894513, 30.899803],\n              [109.943788, 30.878746],\n              [110.008462, 30.883369],\n              [110.019549, 30.829425],\n              [110.048498, 30.800642],\n              [110.082375, 30.799614],\n              [110.151976, 30.911613],\n              [110.153824, 30.953708],\n              [110.172918, 30.978853],\n              [110.140889, 30.987062],\n              [110.140273, 31.030661],\n              [110.120563, 31.0322],\n              [110.119947, 31.088592],\n              [110.147048, 31.116776],\n              [110.180309, 31.121899],\n              [110.200019, 31.158779],\n              [110.180309, 31.179774],\n              [110.155671, 31.279564],\n              [110.161831, 31.314338],\n              [110.118715, 31.409899],\n              [110.054042, 31.410921],\n              [110.036795, 31.436966],\n              [109.98752, 31.474744],\n              [109.94502, 31.47066],\n              [109.969658, 31.508935],\n              [109.894513, 31.519139],\n              [109.837847, 31.555354],\n              [109.727594, 31.548214],\n              [109.745456, 31.598182],\n              [109.76455, 31.602769],\n              [109.737449, 31.628761],\n              [109.731289, 31.700582],\n              [109.683246, 31.719929],\n              [109.622268, 31.711783],\n              [109.585928, 31.726546],\n              [109.592087, 31.789136],\n              [109.633971, 31.804396],\n              [109.633971, 31.824738],\n              [109.60379, 31.885737],\n              [109.584696, 31.900472],\n              [109.62042, 31.928412],\n              [109.631507, 31.962436],\n              [109.590855, 32.012688],\n              [109.590855, 32.047696],\n              [109.621652, 32.106519],\n              [109.58716, 32.161251],\n              [109.604406, 32.199241],\n              [109.592703, 32.219495],\n              [109.550203, 32.225065],\n              [109.528645, 32.270112],\n              [109.495385, 32.300468],\n              [109.513247, 32.342444],\n              [109.502776, 32.38895],\n              [109.529877, 32.405625],\n              [109.526797, 32.43341],\n              [109.575457, 32.506622],\n              [109.637051, 32.540935],\n              [109.619804, 32.56767],\n              [109.631507, 32.599943],\n              [109.726978, 32.608513],\n              [109.746072, 32.594901],\n              [109.816905, 32.577252],\n              [109.910528, 32.592884],\n              [109.97089, 32.577756],\n              [110.017701, 32.546989],\n              [110.084223, 32.580782],\n              [110.090382, 32.617083],\n              [110.124259, 32.616579],\n              [110.153824, 32.593388],\n              [110.206179, 32.633212],\n              [110.156903, 32.683093],\n              [110.159367, 32.767173],\n              [110.127338, 32.77774],\n              [110.142121, 32.802895],\n              [110.105164, 32.832569],\n              [110.051578, 32.851676],\n              [109.988752, 32.886359],\n              [109.927158, 32.887364],\n              [109.907448, 32.903947],\n              [109.856941, 32.910479],\n              [109.847702, 32.893395],\n              [109.789804, 32.882339],\n              [109.76455, 32.909474],\n              [109.785492, 32.987316],\n              [109.794731, 33.067095],\n              [109.704188, 33.101694],\n              [109.688174, 33.116733],\n              [109.576073, 33.110216],\n              [109.522486, 33.138785],\n              [109.468283, 33.140288],\n              [109.438718, 33.152314],\n              [109.498464, 33.207412],\n              [109.514479, 33.237951],\n              [109.60687, 33.235949],\n              [109.619804, 33.275484],\n              [109.649985, 33.251465],\n              [109.693101, 33.254468],\n              [109.732521, 33.231443],\n              [109.813209, 33.236449],\n              [109.852013, 33.247961],\n              [109.916687, 33.229942],\n              [109.973353, 33.203907],\n              [109.999223, 33.212419],\n              [110.031252, 33.191888],\n              [110.164911, 33.209415],\n              [110.218497, 33.163336],\n              [110.285635, 33.171352],\n              [110.33799, 33.160331],\n              [110.372482, 33.186379],\n              [110.398352, 33.176862],\n              [110.398352, 33.176862],\n              [110.471032, 33.171352],\n              [110.54125, 33.255469],\n              [110.57759, 33.250464],\n              [110.59422, 33.168346],\n              [110.623785, 33.143796],\n              [110.650887, 33.157324],\n              [110.702626, 33.097182],\n              [110.753133, 33.15031],\n              [110.824582, 33.158327],\n              [110.828893, 33.201403],\n              [110.865234, 33.213921],\n              [110.9219, 33.203907],\n              [110.960704, 33.253967],\n              [110.984726, 33.255469],\n              [111.046936, 33.202905],\n              [111.035849, 33.187881],\n              [111.034001, 33.177864],\n              [111.045704, 33.169849],\n            ],\n          ],\n          [\n            [\n              [109.106111, 30.570587],\n              [109.09872, 30.579346],\n              [109.101183, 30.579346],\n              [109.106111, 30.570587],\n            ],\n          ],\n          [\n            [\n              [111.046936, 33.202905],\n              [111.045704, 33.169849],\n              [111.034001, 33.177864],\n              [111.035849, 33.187881],\n              [111.046936, 33.202905],\n            ],\n          ],\n          [\n            [\n              [112.716747, 32.357612],\n              [112.735841, 32.356095],\n              [112.733993, 32.356601],\n              [112.724138, 32.358623],\n              [112.716747, 32.357612],\n            ],\n          ],\n          [\n            [\n              [112.902145, 29.79149],\n              [112.929246, 29.77383],\n              [112.923703, 29.766557],\n              [112.894138, 29.783699],\n              [112.902145, 29.79149],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 430000,\n        name: '湖南省',\n        center: [112.982279, 28.19409],\n        centroid: [111.711649, 27.629221],\n        childrenNum: 14,\n        level: 'province',\n        subFeatureIndex: 17,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [109.48245, 26.029788],\n              [109.452885, 26.055598],\n              [109.449805, 26.101826],\n              [109.502776, 26.096451],\n              [109.513863, 26.128157],\n              [109.47629, 26.148035],\n              [109.439334, 26.238789],\n              [109.467051, 26.313917],\n              [109.442414, 26.289774],\n              [109.369733, 26.277432],\n              [109.351255, 26.264016],\n              [109.325385, 26.29031],\n              [109.285965, 26.295676],\n              [109.271183, 26.327863],\n              [109.29582, 26.350389],\n              [109.319842, 26.418477],\n              [109.38082, 26.454381],\n              [109.362342, 26.472061],\n              [109.385747, 26.493487],\n              [109.381436, 26.518659],\n              [109.407305, 26.533116],\n              [109.390675, 26.598955],\n              [109.35495, 26.658873],\n              [109.334008, 26.646036],\n              [109.306291, 26.661012],\n              [109.283501, 26.698445],\n              [109.35495, 26.693098],\n              [109.407305, 26.719829],\n              [109.447957, 26.759913],\n              [109.486761, 26.759913],\n              [109.52187, 26.749226],\n              [109.528645, 26.743881],\n              [109.568065, 26.726243],\n              [109.597015, 26.756173],\n              [109.554515, 26.73533],\n              [109.528645, 26.743881],\n              [109.522486, 26.749226],\n              [109.497232, 26.815474],\n              [109.513247, 26.84004],\n              [109.509551, 26.877947],\n              [109.486761, 26.895562],\n              [109.452885, 26.861932],\n              [109.436254, 26.892359],\n              [109.555131, 26.946788],\n              [109.520022, 27.058764],\n              [109.497848, 27.079548],\n              [109.486761, 27.053968],\n              [109.454733, 27.069423],\n              [109.472595, 27.134951],\n              [109.441182, 27.117907],\n              [109.415312, 27.154123],\n              [109.358646, 27.153058],\n              [109.33524, 27.139212],\n              [109.264407, 27.131755],\n              [109.239154, 27.14933],\n              [109.21698, 27.114711],\n              [109.165857, 27.066758],\n              [109.101183, 27.06889],\n              [109.128901, 27.122701],\n              [109.032814, 27.104056],\n              [109.007561, 27.08008],\n              [108.940423, 27.044907],\n              [108.942887, 27.017186],\n              [108.942887, 27.017186],\n              [108.877597, 27.01612],\n              [108.79075, 27.084343],\n              [108.878829, 27.106187],\n              [108.926873, 27.160512],\n              [108.907778, 27.204699],\n              [108.963213, 27.235565],\n              [108.983539, 27.26802],\n              [109.053756, 27.293551],\n              [109.044517, 27.331304],\n              [109.103647, 27.336621],\n              [109.142451, 27.418461],\n              [109.141835, 27.448207],\n              [109.167089, 27.41793],\n              [109.202197, 27.450331],\n              [109.245313, 27.41793],\n              [109.300132, 27.423774],\n              [109.303211, 27.47582],\n              [109.404841, 27.55066],\n              [109.461508, 27.567637],\n              [109.451037, 27.586204],\n              [109.470131, 27.62863],\n              [109.45658, 27.673689],\n              [109.470747, 27.680049],\n              [109.414081, 27.725087],\n              [109.366653, 27.721909],\n              [109.37774, 27.736741],\n              [109.332777, 27.782815],\n              [109.346943, 27.838396],\n              [109.32169, 27.868027],\n              [109.30198, 27.956343],\n              [109.319842, 27.988585],\n              [109.362342, 28.007608],\n              [109.378972, 28.034551],\n              [109.335856, 28.063073],\n              [109.298284, 28.036136],\n              [109.314298, 28.103729],\n              [109.33832, 28.141731],\n              [109.340168, 28.19027],\n              [109.367885, 28.254602],\n              [109.388211, 28.268307],\n              [109.33524, 28.293605],\n              [109.317994, 28.277795],\n              [109.275494, 28.313101],\n              [109.268719, 28.33786],\n              [109.289045, 28.373673],\n              [109.264407, 28.392628],\n              [109.260712, 28.46473],\n              [109.274262, 28.494714],\n              [109.273646, 28.53836],\n              [109.319842, 28.579886],\n              [109.306907, 28.62087],\n              [109.252089, 28.606685],\n              [109.235458, 28.61982],\n              [109.201581, 28.597753],\n              [109.192958, 28.636104],\n              [109.271183, 28.671816],\n              [109.252704, 28.691767],\n              [109.294588, 28.722211],\n              [109.2989, 28.7474],\n              [109.241002, 28.776779],\n              [109.246545, 28.80143],\n              [109.235458, 28.882161],\n              [109.261328, 28.952356],\n              [109.292741, 28.987436],\n              [109.294588, 29.015177],\n              [109.319842, 29.042388],\n              [109.312451, 29.066453],\n              [109.240386, 29.086328],\n              [109.232378, 29.119271],\n              [109.274262, 29.121885],\n              [109.261328, 29.161089],\n              [109.275494, 29.202366],\n              [109.257632, 29.222738],\n              [109.312451, 29.25146],\n              [109.352487, 29.284872],\n              [109.343863, 29.369398],\n              [109.391291, 29.372005],\n              [109.368501, 29.413719],\n              [109.418392, 29.453332],\n              [109.415928, 29.497617],\n              [109.436254, 29.488761],\n              [109.433791, 29.530948],\n              [109.458428, 29.513242],\n              [109.467051, 29.560104],\n              [109.488609, 29.553336],\n              [109.516326, 29.626194],\n              [109.558826, 29.606944],\n              [109.578536, 29.629836],\n              [109.651833, 29.625674],\n              [109.664768, 29.599659],\n              [109.717739, 29.615269],\n              [109.701108, 29.636078],\n              [109.714659, 29.673524],\n              [109.760238, 29.689122],\n              [109.755311, 29.733304],\n              [109.779333, 29.757725],\n              [109.869876, 29.774869],\n              [109.908064, 29.763959],\n              [109.941325, 29.774349],\n              [110.02386, 29.769674],\n              [110.113788, 29.789932],\n              [110.160599, 29.753569],\n              [110.219729, 29.746814],\n              [110.289946, 29.6964],\n              [110.302265, 29.661563],\n              [110.339221, 29.668324],\n              [110.372482, 29.633477],\n              [110.447011, 29.664684],\n              [110.467337, 29.713034],\n              [110.507373, 29.692241],\n              [110.562807, 29.712515],\n              [110.642879, 29.775907],\n              [110.60038, 29.839779],\n              [110.549873, 29.848085],\n              [110.538786, 29.895828],\n              [110.49875, 29.91243],\n              [110.517228, 29.961179],\n              [110.557264, 29.988137],\n              [110.491358, 30.019751],\n              [110.497518, 30.055499],\n              [110.531394, 30.061197],\n              [110.600996, 30.054463],\n              [110.650887, 30.07777],\n              [110.712481, 30.033223],\n              [110.756212, 30.054463],\n              [110.746973, 30.112979],\n              [110.851067, 30.126439],\n              [110.924364, 30.111426],\n              [110.929907, 30.063268],\n              [111.031537, 30.048765],\n              [111.242188, 30.040476],\n              [111.266826, 30.01146],\n              [111.3315, 29.970512],\n              [111.342587, 29.944586],\n              [111.382623, 29.95029],\n              [111.394325, 29.912948],\n              [111.436825, 29.930065],\n              [111.475629, 29.918654],\n              [111.527368, 29.925916],\n              [111.553854, 29.894272],\n              [111.669034, 29.888565],\n              [111.669034, 29.888565],\n              [111.705375, 29.890121],\n              [111.723853, 29.909317],\n              [111.723853, 29.909317],\n              [111.75773, 29.92021],\n              [111.8107, 29.901017],\n              [111.861207, 29.856909],\n              [111.899396, 29.855871],\n              [111.899396, 29.855871],\n              [111.925881, 29.836665],\n              [111.965917, 29.832512],\n              [111.95483, 29.796683],\n              [112.008417, 29.778505],\n              [112.07617, 29.743696],\n              [112.065699, 29.681323],\n              [112.089721, 29.685482],\n              [112.111279, 29.659483],\n              [112.178416, 29.656883],\n              [112.202438, 29.633997],\n              [112.244322, 29.659483],\n              [112.233851, 29.61631],\n              [112.303452, 29.585609],\n              [112.281278, 29.536676],\n              [112.291133, 29.517409],\n              [112.333017, 29.545007],\n              [112.368741, 29.541362],\n              [112.424792, 29.598619],\n              [112.439574, 29.633997],\n              [112.499321, 29.629316],\n              [112.54182, 29.60122],\n              [112.572001, 29.624113],\n              [112.640371, 29.607985],\n              [112.650842, 29.592374],\n              [112.693957, 29.601741],\n              [112.714283, 29.648561],\n              [112.733378, 29.645441],\n              [112.788812, 29.681323],\n              [112.79374, 29.735902],\n              [112.861493, 29.78318],\n              [112.894138, 29.783699],\n              [112.923703, 29.766557],\n              [112.926782, 29.692241],\n              [112.944645, 29.682883],\n              [112.974826, 29.732784],\n              [113.025949, 29.772791],\n              [113.005007, 29.693801],\n              [112.915696, 29.620992],\n              [112.912, 29.606944],\n              [112.950188, 29.473132],\n              [113.034572, 29.523658],\n              [113.057362, 29.522616],\n              [113.078304, 29.438218],\n              [113.099861, 29.459585],\n              [113.145441, 29.449163],\n              [113.181781, 29.485636],\n              [113.222433, 29.543965],\n              [113.277252, 29.594976],\n              [113.37765, 29.703158],\n              [113.571671, 29.849123],\n              [113.575367, 29.809147],\n              [113.550729, 29.768115],\n              [113.558736, 29.727067],\n              [113.540258, 29.699519],\n              [113.547033, 29.675603],\n              [113.606164, 29.666764],\n              [113.663446, 29.684443],\n              [113.680692, 29.64336],\n              [113.704098, 29.634518],\n              [113.73859, 29.579363],\n              [113.710257, 29.555419],\n              [113.630801, 29.523137],\n              [113.677613, 29.513763],\n              [113.755221, 29.446557],\n              [113.731199, 29.393907],\n              [113.674533, 29.388172],\n              [113.660982, 29.333405],\n              [113.632033, 29.316186],\n              [113.609859, 29.25146],\n              [113.651743, 29.225872],\n              [113.693011, 29.226394],\n              [113.691779, 29.19662],\n              [113.66283, 29.16945],\n              [113.690547, 29.114566],\n              [113.696091, 29.077437],\n              [113.722576, 29.104631],\n              [113.749677, 29.060699],\n              [113.775547, 29.095219],\n              [113.816199, 29.105154],\n              [113.852539, 29.058606],\n              [113.882104, 29.065407],\n              [113.876561, 29.038202],\n              [113.898119, 29.029307],\n              [113.94185, 29.047097],\n              [113.961561, 28.999476],\n              [113.955401, 28.978536],\n              [113.973879, 28.937692],\n              [114.008988, 28.955498],\n              [114.005292, 28.917788],\n              [114.028082, 28.891069],\n              [114.060111, 28.902596],\n              [114.056415, 28.872204],\n              [114.076741, 28.834464],\n              [114.124784, 28.843376],\n              [114.153734, 28.829221],\n              [114.137719, 28.779926],\n              [114.157429, 28.761566],\n              [114.122321, 28.623497],\n              [114.132176, 28.607211],\n              [114.08598, 28.558337],\n              [114.138335, 28.533629],\n              [114.15435, 28.507337],\n              [114.218407, 28.48472],\n              [114.217175, 28.466308],\n              [114.172212, 28.432632],\n              [114.214712, 28.403157],\n              [114.252284, 28.395787],\n              [114.2529, 28.319423],\n              [114.198081, 28.29097],\n              [114.182067, 28.249858],\n              [114.143879, 28.246694],\n              [114.109386, 28.205038],\n              [114.107538, 28.182885],\n              [114.068734, 28.171806],\n              [114.012068, 28.174972],\n              [113.992357, 28.161255],\n              [114.025002, 28.080499],\n              [114.047176, 28.057263],\n              [114.025618, 28.031382],\n              [113.970184, 28.041418],\n              [113.966488, 28.017646],\n              [113.936307, 28.018703],\n              [113.914133, 27.991227],\n              [113.864242, 28.004966],\n              [113.845148, 27.971672],\n              [113.822974, 27.982243],\n              [113.752141, 27.93361],\n              [113.72812, 27.874904],\n              [113.756453, 27.860091],\n              [113.763228, 27.799228],\n              [113.69917, 27.740979],\n              [113.696707, 27.71979],\n              [113.652359, 27.663619],\n              [113.607395, 27.625449],\n              [113.608627, 27.585143],\n              [113.579062, 27.545354],\n              [113.583374, 27.524657],\n              [113.627105, 27.49971],\n              [113.591381, 27.467855],\n              [113.59754, 27.428554],\n              [113.632033, 27.40518],\n              [113.605548, 27.38924],\n              [113.616635, 27.345658],\n              [113.657902, 27.347253],\n              [113.699786, 27.331836],\n              [113.72812, 27.350442],\n              [113.872865, 27.384988],\n              [113.872865, 27.346721],\n              [113.854387, 27.30525],\n              [113.872865, 27.289828],\n              [113.846996, 27.222262],\n              [113.779242, 27.137081],\n              [113.771851, 27.096598],\n              [113.803264, 27.099261],\n              [113.824206, 27.036378],\n              [113.86301, 27.018252],\n              [113.892575, 26.964925],\n              [113.927068, 26.948922],\n              [113.890112, 26.895562],\n              [113.877177, 26.859262],\n              [113.835909, 26.806394],\n              [113.853771, 26.769532],\n              [113.860546, 26.664221],\n              [113.912901, 26.613938],\n              [113.996669, 26.615543],\n              [114.019459, 26.587182],\n              [114.10877, 26.56952],\n              [114.07243, 26.480096],\n              [114.110002, 26.482775],\n              [114.090292, 26.455988],\n              [114.085364, 26.406149],\n              [114.062575, 26.406149],\n              [114.030546, 26.376664],\n              [114.047792, 26.337518],\n              [114.021307, 26.288701],\n              [114.029314, 26.266163],\n              [113.978807, 26.237716],\n              [113.972647, 26.20604],\n              [113.949242, 26.192616],\n              [113.962792, 26.150722],\n              [114.013299, 26.184023],\n              [114.088444, 26.168448],\n              [114.102611, 26.187783],\n              [114.181451, 26.214631],\n              [114.216559, 26.203355],\n              [114.237501, 26.152333],\n              [114.188842, 26.121172],\n              [114.10569, 26.097526],\n              [114.121089, 26.085702],\n              [114.087828, 26.06635],\n              [114.044096, 26.076564],\n              [114.008372, 26.015806],\n              [114.028082, 25.98138],\n              [114.028082, 25.893119],\n              [113.971416, 25.836036],\n              [113.961561, 25.77731],\n              [113.920293, 25.741197],\n              [113.913517, 25.701299],\n              [113.957249, 25.611749],\n              [113.983118, 25.599336],\n              [113.986198, 25.529153],\n              [113.962792, 25.528072],\n              [113.94493, 25.441635],\n              [113.887032, 25.436772],\n              [113.877177, 25.380552],\n              [113.839605, 25.363248],\n              [113.814967, 25.328634],\n              [113.76446, 25.333502],\n              [113.753373, 25.362707],\n              [113.686852, 25.351891],\n              [113.680076, 25.334584],\n              [113.611707, 25.327552],\n              [113.584606, 25.306453],\n              [113.579062, 25.34432],\n              [113.535946, 25.368656],\n              [113.479896, 25.375145],\n              [113.449715, 25.359463],\n              [113.407215, 25.401637],\n              [113.373338, 25.402719],\n              [113.341926, 25.448661],\n              [113.314208, 25.442716],\n              [113.311129, 25.490264],\n              [113.248919, 25.514031],\n              [113.226129, 25.50971],\n              [113.176854, 25.471355],\n              [113.11834, 25.44704],\n              [113.130658, 25.427043],\n              [113.096782, 25.412449],\n              [113.078304, 25.382174],\n              [113.013014, 25.352432],\n              [112.969898, 25.350269],\n              [112.93479, 25.325929],\n              [112.924319, 25.296714],\n              [112.891058, 25.339993],\n              [112.854718, 25.337829],\n              [112.867036, 25.249632],\n              [112.897833, 25.238264],\n              [112.958195, 25.254503],\n              [112.992688, 25.247467],\n              [113.034572, 25.198199],\n              [112.97421, 25.168412],\n              [112.96805, 25.141869],\n              [113.018557, 25.083344],\n              [112.979137, 25.03401],\n              [113.009934, 24.977604],\n              [113.011782, 24.946136],\n              [112.984681, 24.921172],\n              [112.904609, 24.921715],\n              [112.873812, 24.896747],\n              [112.780805, 24.896747],\n              [112.778341, 24.947764],\n              [112.743233, 24.959701],\n              [112.742001, 24.99876],\n              [112.714899, 25.025876],\n              [112.712436, 25.083344],\n              [112.660081, 25.132658],\n              [112.628052, 25.140785],\n              [112.562762, 25.124531],\n              [112.458053, 25.152162],\n              [112.44327, 25.185744],\n              [112.414937, 25.14241],\n              [112.365046, 25.191701],\n              [112.315771, 25.175453],\n              [112.302836, 25.157037],\n              [112.256025, 25.159204],\n              [112.246785, 25.185202],\n              [112.19751, 25.187368],\n              [112.174105, 25.128866],\n              [112.177184, 25.106649],\n              [112.151931, 25.055698],\n              [112.155626, 25.026419],\n              [112.12175, 24.989538],\n              [112.119902, 24.963499],\n              [112.175337, 24.927685],\n              [112.167329, 24.859828],\n              [112.149467, 24.837019],\n              [112.124214, 24.841364],\n              [112.03367, 24.771286],\n              [112.024431, 24.740308],\n              [111.951135, 24.769655],\n              [111.929577, 24.75607],\n              [111.875374, 24.756613],\n              [111.868599, 24.771829],\n              [111.814396, 24.770199],\n              [111.783599, 24.785957],\n              [111.708455, 24.788673],\n              [111.666571, 24.760961],\n              [111.637621, 24.715303],\n              [111.641933, 24.684856],\n              [111.588962, 24.690837],\n              [111.570484, 24.64461],\n              [111.526752, 24.637538],\n              [111.499035, 24.667997],\n              [111.451608, 24.665822],\n              [111.431282, 24.687574],\n              [111.461463, 24.728894],\n              [111.479325, 24.797366],\n              [111.449144, 24.857113],\n              [111.447296, 24.892947],\n              [111.470086, 24.92877],\n              [111.434977, 24.951562],\n              [111.43313, 24.979774],\n              [111.460231, 24.992793],\n              [111.467622, 25.02208],\n              [111.416499, 25.047566],\n              [111.435593, 25.093642],\n              [111.375231, 25.128324],\n              [111.36784, 25.108817],\n              [111.321645, 25.105023],\n              [111.274833, 25.151078],\n              [111.221862, 25.106649],\n              [111.200921, 25.074672],\n              [111.139943, 25.042144],\n              [111.101754, 25.035095],\n              [111.100522, 24.945593],\n              [111.009363, 24.921172],\n              [110.968711, 24.975434],\n              [110.951465, 25.04377],\n              [110.98411, 25.101772],\n              [110.998892, 25.161371],\n              [111.112841, 25.21715],\n              [111.103602, 25.285351],\n              [111.138711, 25.303748],\n              [111.184906, 25.367034],\n              [111.210776, 25.363248],\n              [111.257587, 25.395691],\n              [111.26313, 25.42326],\n              [111.300087, 25.44812],\n              [111.32842, 25.521592],\n              [111.324724, 25.564249],\n              [111.343202, 25.602574],\n              [111.309942, 25.645203],\n              [111.30871, 25.720171],\n              [111.399869, 25.744431],\n              [111.442369, 25.77192],\n              [111.43313, 25.84627],\n              [111.4861, 25.859196],\n              [111.460231, 25.885042],\n              [111.383239, 25.881812],\n              [111.376463, 25.906039],\n              [111.346282, 25.906577],\n              [111.297007, 25.874274],\n              [111.29208, 25.854349],\n              [111.251428, 25.864581],\n              [111.230486, 25.916267],\n              [111.189834, 25.953402],\n              [111.235413, 26.048071],\n              [111.267442, 26.058824],\n              [111.244652, 26.078177],\n              [111.26621, 26.095914],\n              [111.258203, 26.151796],\n              [111.274833, 26.183486],\n              [111.271754, 26.217316],\n              [111.293311, 26.222148],\n              [111.277913, 26.272066],\n              [111.228022, 26.261333],\n              [111.204616, 26.276359],\n              [111.208928, 26.30426],\n              [111.090667, 26.308016],\n              [111.008132, 26.336982],\n              [111.008747, 26.35897],\n              [110.974255, 26.385778],\n              [110.94469, 26.373447],\n              [110.944074, 26.326791],\n              [110.926212, 26.320354],\n              [110.939762, 26.286554],\n              [110.836284, 26.255966],\n              [110.759292, 26.248451],\n              [110.73835, 26.271529],\n              [110.742046, 26.313917],\n              [110.711249, 26.29192],\n              [110.673676, 26.317135],\n              [110.643495, 26.308552],\n              [110.612083, 26.333764],\n              [110.584365, 26.296749],\n              [110.552952, 26.283335],\n              [110.546793, 26.233421],\n              [110.495054, 26.166299],\n              [110.477808, 26.179727],\n              [110.437772, 26.153945],\n              [110.373098, 26.088927],\n              [110.325671, 25.975462],\n              [110.257301, 25.961473],\n              [110.24991, 26.010965],\n              [110.181541, 26.060437],\n              [110.168606, 26.028713],\n              [110.100853, 26.020108],\n              [110.065128, 26.050221],\n              [110.100853, 26.132455],\n              [110.099005, 26.168985],\n              [110.03002, 26.166299],\n              [109.970274, 26.195301],\n              [109.904368, 26.135679],\n              [109.898825, 26.095377],\n              [109.864332, 26.027637],\n              [109.814441, 26.041081],\n              [109.782412, 25.996981],\n              [109.806434, 25.973848],\n              [109.826144, 25.911422],\n              [109.811361, 25.877504],\n              [109.779333, 25.866196],\n              [109.768246, 25.890427],\n              [109.685094, 25.880197],\n              [109.67955, 25.921649],\n              [109.693717, 25.959321],\n              [109.710963, 25.954478],\n              [109.730057, 25.989988],\n              [109.649369, 26.016882],\n              [109.635203, 26.047533],\n              [109.588391, 26.019571],\n              [109.560058, 26.021184],\n              [109.513247, 25.998056],\n              [109.48245, 26.029788],\n            ],\n          ],\n          [\n            [\n              [109.528645, 26.743881],\n              [109.52187, 26.749226],\n              [109.522486, 26.749226],\n              [109.528645, 26.743881],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 440000,\n        name: '广东省',\n        center: [113.280637, 23.125178],\n        centroid: [113.429915, 23.334652],\n        childrenNum: 21,\n        level: 'province',\n        subFeatureIndex: 18,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [109.785492, 21.45673],\n              [109.788572, 21.490702],\n              [109.754695, 21.556396],\n              [109.742992, 21.616497],\n              [109.778101, 21.670455],\n              [109.786108, 21.637638],\n              [109.839695, 21.636525],\n              [109.888354, 21.652101],\n              [109.888354, 21.652101],\n              [109.916071, 21.668787],\n              [109.940093, 21.769419],\n              [109.94502, 21.84443],\n              [109.999839, 21.881643],\n              [110.050962, 21.857205],\n              [110.101469, 21.86998],\n              [110.12857, 21.902744],\n              [110.196323, 21.899968],\n              [110.212338, 21.886085],\n              [110.212338, 21.886085],\n              [110.224041, 21.882198],\n              [110.224041, 21.882198],\n              [110.283787, 21.892194],\n              [110.290562, 21.917736],\n              [110.337374, 21.887751],\n              [110.391576, 21.89386],\n              [110.378642, 21.939942],\n              [110.378642, 21.939942],\n              [110.374946, 21.967695],\n              [110.374946, 21.967695],\n              [110.352772, 21.97602],\n              [110.359547, 22.015973],\n              [110.35154, 22.097508],\n              [110.364475, 22.125785],\n              [110.326287, 22.152393],\n              [110.34846, 22.195621],\n              [110.378026, 22.164587],\n              [110.414366, 22.208365],\n              [110.456866, 22.189526],\n              [110.505525, 22.14297],\n              [110.55788, 22.196175],\n              [110.602843, 22.18343],\n              [110.598532, 22.162924],\n              [110.629329, 22.149068],\n              [110.678604, 22.172901],\n              [110.646575, 22.220554],\n              [110.687843, 22.249914],\n              [110.725415, 22.29588],\n              [110.759292, 22.274837],\n              [110.787009, 22.28259],\n              [110.749437, 22.329653],\n              [110.74143, 22.361757],\n              [110.711249, 22.369506],\n              [110.712481, 22.440879],\n              [110.688459, 22.477935],\n              [110.74143, 22.464109],\n              [110.740198, 22.498947],\n              [110.762988, 22.518298],\n              [110.749437, 22.556991],\n              [110.778386, 22.585174],\n              [110.812263, 22.576333],\n              [110.897878, 22.591805],\n              [110.896031, 22.613352],\n              [110.950233, 22.61059],\n              [110.958856, 22.636553],\n              [110.997045, 22.631582],\n              [111.055559, 22.648705],\n              [111.089435, 22.695643],\n              [111.058023, 22.729871],\n              [111.118385, 22.744773],\n              [111.185522, 22.735942],\n              [111.218167, 22.748085],\n              [111.358601, 22.889301],\n              [111.374615, 22.938361],\n              [111.362913, 22.967568],\n              [111.403565, 22.99126],\n              [111.389398, 23.005583],\n              [111.433746, 23.036428],\n              [111.43313, 23.073322],\n              [111.402333, 23.066165],\n              [111.377695, 23.082132],\n              [111.365992, 23.14488],\n              [111.38447, 23.16744],\n              [111.388782, 23.210349],\n              [111.36476, 23.240047],\n              [111.353058, 23.284582],\n              [111.376463, 23.30437],\n              [111.363528, 23.340641],\n              [111.389398, 23.375804],\n              [111.383239, 23.399423],\n              [111.399869, 23.469159],\n              [111.428818, 23.466414],\n              [111.479941, 23.532822],\n              [111.487332, 23.626615],\n              [111.555702, 23.64087],\n              [111.615448, 23.639225],\n              [111.614832, 23.65896],\n              [111.666571, 23.718696],\n              [111.621607, 23.725819],\n              [111.627766, 23.78881],\n              [111.654868, 23.833159],\n              [111.683201, 23.822758],\n              [111.683201, 23.822758],\n              [111.722621, 23.823305],\n              [111.8107, 23.80688],\n              [111.824867, 23.832612],\n              [111.812548, 23.887343],\n              [111.845809, 23.904305],\n              [111.854432, 23.947521],\n              [111.911714, 23.943693],\n              [111.940664, 23.987989],\n              [111.92157, 24.012045],\n              [111.878454, 24.109862],\n              [111.886461, 24.163929],\n              [111.871062, 24.176487],\n              [111.877222, 24.227252],\n              [111.912946, 24.221795],\n              [111.958526, 24.263813],\n              [111.986243, 24.25672],\n              [111.990555, 24.279634],\n              [112.026279, 24.294908],\n              [112.05954, 24.339628],\n              [112.057692, 24.387057],\n              [112.025047, 24.438828],\n              [111.985011, 24.467701],\n              [112.009649, 24.503103],\n              [112.007185, 24.534684],\n              [111.972077, 24.578775],\n              [111.936968, 24.595645],\n              [111.927729, 24.629378],\n              [111.953598, 24.64733],\n              [111.939432, 24.686487],\n              [111.961606, 24.721283],\n              [112.024431, 24.740308],\n              [112.03367, 24.771286],\n              [112.124214, 24.841364],\n              [112.149467, 24.837019],\n              [112.167329, 24.859828],\n              [112.175337, 24.927685],\n              [112.119902, 24.963499],\n              [112.12175, 24.989538],\n              [112.155626, 25.026419],\n              [112.151931, 25.055698],\n              [112.177184, 25.106649],\n              [112.174105, 25.128866],\n              [112.19751, 25.187368],\n              [112.246785, 25.185202],\n              [112.256025, 25.159204],\n              [112.302836, 25.157037],\n              [112.315771, 25.175453],\n              [112.365046, 25.191701],\n              [112.414937, 25.14241],\n              [112.44327, 25.185744],\n              [112.458053, 25.152162],\n              [112.562762, 25.124531],\n              [112.628052, 25.140785],\n              [112.660081, 25.132658],\n              [112.712436, 25.083344],\n              [112.714899, 25.025876],\n              [112.742001, 24.99876],\n              [112.743233, 24.959701],\n              [112.778341, 24.947764],\n              [112.780805, 24.896747],\n              [112.873812, 24.896747],\n              [112.904609, 24.921715],\n              [112.984681, 24.921172],\n              [113.011782, 24.946136],\n              [113.009934, 24.977604],\n              [112.979137, 25.03401],\n              [113.018557, 25.083344],\n              [112.96805, 25.141869],\n              [112.97421, 25.168412],\n              [113.034572, 25.198199],\n              [112.992688, 25.247467],\n              [112.958195, 25.254503],\n              [112.897833, 25.238264],\n              [112.867036, 25.249632],\n              [112.854718, 25.337829],\n              [112.891058, 25.339993],\n              [112.924319, 25.296714],\n              [112.93479, 25.325929],\n              [112.969898, 25.350269],\n              [113.013014, 25.352432],\n              [113.078304, 25.382174],\n              [113.096782, 25.412449],\n              [113.130658, 25.427043],\n              [113.11834, 25.44704],\n              [113.176854, 25.471355],\n              [113.226129, 25.50971],\n              [113.248919, 25.514031],\n              [113.311129, 25.490264],\n              [113.314208, 25.442716],\n              [113.341926, 25.448661],\n              [113.373338, 25.402719],\n              [113.407215, 25.401637],\n              [113.449715, 25.359463],\n              [113.479896, 25.375145],\n              [113.535946, 25.368656],\n              [113.579062, 25.34432],\n              [113.584606, 25.306453],\n              [113.611707, 25.327552],\n              [113.680076, 25.334584],\n              [113.686852, 25.351891],\n              [113.753373, 25.362707],\n              [113.76446, 25.333502],\n              [113.814967, 25.328634],\n              [113.839605, 25.363248],\n              [113.877177, 25.380552],\n              [113.887032, 25.436772],\n              [113.94493, 25.441635],\n              [114.003444, 25.442716],\n              [113.983118, 25.415152],\n              [114.050256, 25.36433],\n              [114.029314, 25.328093],\n              [114.017611, 25.273987],\n              [114.039785, 25.250714],\n              [114.055799, 25.277775],\n              [114.083517, 25.275611],\n              [114.115545, 25.302125],\n              [114.190074, 25.316733],\n              [114.204857, 25.29942],\n              [114.260291, 25.291845],\n              [114.2954, 25.299961],\n              [114.31511, 25.33837],\n              [114.382863, 25.317274],\n              [114.43029, 25.343779],\n              [114.438914, 25.376226],\n              [114.477718, 25.37136],\n              [114.541159, 25.416773],\n              [114.599674, 25.385959],\n              [114.63663, 25.324306],\n              [114.714238, 25.315651],\n              [114.743188, 25.274528],\n              [114.73518, 25.225813],\n              [114.693912, 25.213902],\n              [114.685905, 25.173287],\n              [114.73518, 25.155954],\n              [114.735796, 25.121822],\n              [114.664963, 25.10123],\n              [114.640326, 25.074129],\n              [114.604601, 25.083886],\n              [114.561485, 25.077382],\n              [114.532536, 25.022623],\n              [114.506051, 24.999844],\n              [114.45616, 24.99659],\n              [114.454928, 24.977062],\n              [114.395798, 24.951019],\n              [114.403189, 24.877746],\n              [114.378551, 24.861457],\n              [114.342211, 24.807145],\n              [114.336052, 24.749004],\n              [114.281849, 24.724001],\n              [114.27261, 24.700624],\n              [114.169132, 24.689749],\n              [114.19069, 24.656576],\n              [114.258443, 24.641346],\n              [114.289856, 24.619042],\n              [114.300943, 24.578775],\n              [114.363769, 24.582584],\n              [114.391486, 24.563535],\n              [114.403189, 24.497657],\n              [114.429058, 24.48622],\n              [114.534384, 24.559181],\n              [114.589819, 24.537406],\n              [114.627391, 24.576598],\n              [114.664963, 24.583673],\n              [114.704999, 24.525973],\n              [114.73826, 24.565168],\n              [114.729637, 24.608704],\n              [114.781376, 24.613057],\n              [114.827571, 24.588026],\n              [114.846665, 24.602719],\n              [114.868839, 24.562446],\n              [114.893477, 24.582584],\n              [114.909491, 24.661471],\n              [114.940288, 24.650049],\n              [115.00373, 24.679418],\n              [115.024672, 24.669085],\n              [115.057317, 24.703343],\n              [115.083802, 24.699537],\n              [115.104744, 24.667997],\n              [115.1842, 24.711498],\n              [115.258729, 24.728894],\n              [115.269816, 24.749548],\n              [115.306772, 24.758787],\n              [115.358511, 24.735416],\n              [115.372678, 24.774546],\n              [115.412714, 24.79302],\n              [115.476771, 24.762591],\n              [115.522967, 24.702799],\n              [115.555611, 24.683768],\n              [115.569778, 24.622306],\n              [115.605503, 24.62557],\n              [115.671408, 24.604895],\n              [115.68927, 24.545027],\n              [115.752712, 24.546116],\n              [115.785357, 24.567345],\n              [115.843871, 24.562446],\n              [115.840791, 24.584217],\n              [115.797676, 24.628834],\n              [115.780429, 24.663103],\n              [115.801371, 24.705517],\n              [115.769342, 24.708236],\n              [115.756408, 24.749004],\n              [115.776734, 24.774546],\n              [115.764415, 24.791933],\n              [115.790284, 24.856027],\n              [115.807531, 24.862543],\n              [115.824161, 24.909232],\n              [115.863581, 24.891318],\n              [115.861733, 24.863629],\n              [115.907313, 24.879917],\n              [115.885139, 24.898918],\n              [115.89253, 24.936911],\n              [115.907929, 24.923343],\n              [115.985537, 24.899461],\n              [116.015102, 24.905975],\n              [116.068073, 24.850053],\n              [116.153073, 24.846795],\n              [116.191877, 24.877203],\n              [116.221442, 24.829959],\n              [116.251007, 24.82507],\n              [116.244232, 24.793563],\n              [116.297202, 24.801712],\n              [116.345862, 24.828872],\n              [116.363724, 24.87123],\n              [116.395137, 24.877746],\n              [116.417927, 24.840821],\n              [116.381586, 24.82507],\n              [116.375427, 24.803885],\n              [116.419158, 24.767482],\n              [116.416079, 24.744113],\n              [116.44626, 24.714216],\n              [116.485064, 24.720196],\n              [116.517709, 24.652225],\n              [116.506622, 24.621218],\n              [116.530027, 24.604895],\n              [116.570679, 24.621762],\n              [116.600861, 24.654401],\n              [116.623034, 24.64189],\n              [116.667382, 24.658752],\n              [116.777635, 24.679418],\n              [116.815207, 24.654944],\n              [116.761005, 24.583128],\n              [116.759157, 24.545572],\n              [116.796729, 24.502014],\n              [116.83307, 24.496568],\n              [116.860787, 24.460075],\n              [116.839229, 24.442097],\n              [116.903903, 24.369614],\n              [116.895895, 24.350533],\n              [116.919301, 24.321087],\n              [116.914374, 24.287817],\n              [116.938395, 24.28127],\n              [116.933468, 24.220157],\n              [116.956257, 24.216883],\n              [116.998757, 24.179217],\n              [116.9347, 24.126794],\n              [116.930388, 24.064514],\n              [116.953178, 24.008218],\n              [116.981511, 23.999471],\n              [116.976583, 23.931659],\n              [116.955642, 23.922359],\n              [116.981511, 23.855602],\n              [117.012308, 23.855054],\n              [117.019083, 23.801952],\n              [117.048032, 23.758687],\n              [117.055424, 23.694038],\n              [117.123793, 23.647448],\n              [117.147199, 23.654027],\n              [117.192778, 23.629356],\n              [117.192778, 23.5619],\n              [117.085605, 23.536663],\n              [117.044953, 23.539955],\n              [117.01046, 23.502641],\n              [116.963649, 23.507031],\n              [116.92854, 23.530079],\n              [116.888504, 23.501543],\n              [116.895895, 23.476295],\n              [116.874953, 23.447748],\n              [116.874338, 23.447199],\n              [116.871258, 23.416449],\n              [116.871874, 23.4159],\n              [116.782563, 23.313714],\n              [116.798577, 23.244996],\n              [116.821367, 23.240597],\n              [116.806584, 23.200998],\n              [116.74499, 23.215299],\n              [116.701259, 23.198248],\n              [116.665534, 23.158086],\n              [116.566368, 23.134424],\n              [116.550969, 23.109656],\n              [116.566368, 23.088738],\n              [116.557129, 23.056253],\n              [116.576839, 23.014397],\n              [116.542346, 22.995667],\n              [116.50539, 22.930645],\n              [116.449955, 22.936707],\n              [116.382818, 22.91907],\n              [116.317528, 22.95269],\n              [116.226985, 22.91466],\n              [116.191261, 22.874965],\n              [116.104413, 22.816505],\n              [116.05637, 22.844635],\n              [115.99724, 22.826985],\n              [115.965211, 22.800506],\n              [115.931334, 22.802713],\n              [115.883291, 22.78561],\n              [115.829089, 22.734838],\n              [115.796444, 22.739254],\n              [115.788437, 22.809885],\n              [115.760103, 22.834707],\n              [115.696046, 22.84298],\n              [115.654162, 22.865591],\n              [115.583945, 22.82864],\n              [115.570394, 22.786713],\n              [115.541445, 22.755259],\n              [115.609198, 22.753052],\n              [115.565467, 22.684048],\n              [115.575322, 22.650914],\n              [115.471844, 22.697852],\n              [115.430576, 22.684048],\n              [115.381301, 22.684048],\n              [115.349272, 22.712206],\n              [115.338185, 22.776781],\n              [115.319091, 22.783402],\n              [115.230396, 22.776781],\n              [115.236555, 22.82533],\n              [115.190359, 22.818711],\n              [115.190975, 22.77347],\n              [115.154635, 22.80161],\n              [115.061628, 22.783402],\n              [115.053621, 22.747533],\n              [115.02344, 22.726007],\n              [115.039454, 22.713862],\n              [114.945216, 22.645391],\n              [114.927969, 22.621639],\n              [114.922426, 22.549253],\n              [114.88547, 22.538751],\n              [114.866375, 22.591805],\n              [114.746267, 22.581859],\n              [114.743803, 22.632687],\n              [114.728405, 22.651466],\n              [114.73518, 22.724351],\n              [114.749963, 22.764089],\n              [114.709927, 22.787817],\n              [114.689601, 22.7674],\n              [114.601521, 22.730975],\n              [114.591666, 22.690122],\n              [114.567029, 22.685705],\n              [114.51529, 22.655332],\n              [114.579964, 22.661407],\n              [114.603369, 22.638763],\n              [114.559022, 22.583517],\n              [114.568261, 22.560859],\n              [114.614456, 22.545384],\n              [114.628623, 22.513875],\n              [114.611377, 22.481806],\n              [114.549167, 22.465769],\n              [114.506667, 22.438667],\n              [114.476486, 22.459132],\n              [114.472174, 22.522168],\n              [114.427211, 22.589042],\n              [114.381631, 22.60175],\n              [114.321885, 22.587385],\n              [114.294784, 22.563623],\n              [114.232574, 22.539857],\n              [114.222719, 22.553122],\n              [114.166052, 22.559201],\n              [114.156813, 22.543726],\n              [114.095219, 22.534329],\n              [114.082285, 22.512216],\n              [114.031778, 22.503923],\n              [113.976343, 22.510558],\n              [113.954785, 22.491206],\n              [113.952937, 22.486783],\n              [113.893807, 22.442539],\n              [113.869786, 22.459685],\n              [113.856851, 22.539857],\n              [113.803264, 22.593463],\n              [113.773083, 22.643182],\n              [113.751525, 22.715518],\n              [113.733663, 22.736494],\n              [113.678228, 22.726007],\n              [113.717033, 22.645391],\n              [113.740438, 22.534329],\n              [113.691779, 22.514981],\n              [113.668373, 22.4807],\n              [113.631417, 22.475723],\n              [113.573519, 22.41156],\n              [113.608627, 22.408793],\n              [113.624642, 22.443092],\n              [113.66591, 22.438667],\n              [113.669605, 22.416539],\n              [113.627721, 22.349027],\n              [113.604932, 22.339617],\n              [113.617866, 22.315259],\n              [113.595693, 22.304186],\n              [113.594461, 22.228864],\n              [113.558736, 22.212244],\n              [113.53841, 22.209473],\n              [113.534715, 22.174009],\n              [113.554425, 22.142416],\n              [113.554425, 22.107489],\n              [113.567359, 22.075327],\n              [113.527939, 22.073663],\n              [113.45957, 22.043711],\n              [113.442324, 22.009315],\n              [113.330223, 21.96159],\n              [113.319752, 21.909407],\n              [113.266781, 21.871646],\n              [113.235368, 21.887751],\n              [113.1516, 21.979905],\n              [113.142977, 22.012089],\n              [113.091854, 22.065344],\n              [113.086927, 22.12634],\n              [113.045659, 22.088636],\n              [113.032108, 22.04593],\n              [113.053666, 22.012089],\n              [113.047507, 21.956595],\n              [112.989608, 21.869424],\n              [112.929862, 21.838875],\n              [112.893522, 21.84443],\n              [112.841167, 21.920512],\n              [112.792508, 21.921067],\n              [112.68595, 21.810541],\n              [112.647146, 21.758302],\n              [112.535661, 21.753856],\n              [112.497473, 21.785535],\n              [112.445734, 21.803317],\n              [112.427256, 21.789981],\n              [112.415553, 21.734956],\n              [112.353343, 21.707157],\n              [112.238778, 21.702153],\n              [112.236315, 21.727173],\n              [112.196894, 21.736624],\n              [112.192583, 21.789425],\n              [112.136532, 21.793871],\n              [112.036134, 21.761637],\n              [111.956062, 21.710494],\n              [111.954214, 21.667674],\n              [111.997946, 21.657107],\n              [112.026895, 21.633744],\n              [111.972692, 21.603144],\n              [111.941896, 21.607039],\n              [111.887693, 21.578659],\n              [111.810084, 21.555283],\n              [111.832258, 21.578659],\n              [111.794686, 21.61149],\n              [111.736788, 21.609821],\n              [111.693672, 21.590345],\n              [111.677658, 21.529677],\n              [111.650556, 21.512418],\n              [111.609904, 21.530234],\n              [111.560629, 21.50518],\n              [111.521825, 21.517429],\n              [111.494724, 21.501282],\n              [111.444217, 21.514088],\n              [111.382623, 21.495714],\n              [111.353058, 21.464528],\n              [111.28592, 21.41885],\n              [111.258819, 21.412165],\n              [111.253275, 21.452831],\n              [111.276065, 21.443362],\n              [111.28284, 21.485691],\n              [111.171355, 21.458401],\n              [111.103602, 21.455616],\n              [111.034617, 21.438906],\n              [110.929291, 21.375945],\n              [110.888639, 21.367585],\n              [110.796248, 21.37483],\n              [110.768531, 21.364799],\n              [110.713097, 21.3124],\n              [110.65951, 21.239902],\n              [110.626249, 21.215915],\n              [110.534474, 21.204198],\n              [110.501213, 21.217588],\n              [110.451322, 21.186343],\n              [110.422373, 21.190807],\n              [110.39096, 21.124949],\n              [110.296722, 21.093684],\n              [110.24991, 21.045098],\n              [110.241903, 21.016051],\n              [110.208642, 21.050684],\n              [110.204947, 21.003202],\n              [110.180925, 20.98197],\n              [110.184005, 20.891979],\n              [110.209874, 20.860106],\n              [110.269004, 20.839972],\n              [110.327519, 20.847802],\n              [110.393424, 20.816479],\n              [110.407591, 20.731987],\n              [110.392192, 20.682724],\n              [110.411286, 20.670966],\n              [110.466105, 20.680485],\n              [110.487047, 20.640167],\n              [110.499982, 20.572386],\n              [110.550489, 20.47262],\n              [110.54125, 20.42047],\n              [110.491358, 20.373912],\n              [110.452554, 20.311064],\n              [110.425453, 20.291419],\n              [110.384185, 20.293103],\n              [110.349076, 20.258859],\n              [110.296722, 20.249314],\n              [110.220345, 20.25156],\n              [110.168606, 20.219553],\n              [110.118099, 20.219553],\n              [110.082375, 20.258859],\n              [109.993679, 20.254368],\n              [109.929006, 20.211691],\n              [109.909296, 20.236961],\n              [109.916071, 20.316677],\n              [109.861252, 20.376717],\n              [109.864948, 20.40196],\n              [109.895745, 20.42776],\n              [109.888354, 20.475423],\n              [109.839695, 20.489439],\n              [109.811977, 20.541566],\n              [109.813825, 20.574627],\n              [109.793499, 20.615522],\n              [109.74484, 20.621124],\n              [109.730057, 20.719673],\n              [109.711579, 20.774519],\n              [109.664768, 20.862343],\n              [109.655529, 20.929435],\n              [109.674007, 21.067997],\n              [109.674623, 21.136671],\n              [109.763934, 21.226514],\n              [109.757775, 21.346963],\n              [109.770709, 21.359783],\n              [109.868644, 21.365913],\n              [109.904368, 21.429992],\n              [109.894513, 21.442248],\n              [109.819369, 21.445033],\n              [109.785492, 21.45673],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 450000,\n        name: '广西壮族自治区',\n        center: [108.320004, 22.82402],\n        centroid: [108.7944, 23.833381],\n        childrenNum: 14,\n        level: 'province',\n        subFeatureIndex: 19,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [112.024431, 24.740308],\n              [111.961606, 24.721283],\n              [111.939432, 24.686487],\n              [111.953598, 24.64733],\n              [111.927729, 24.629378],\n              [111.936968, 24.595645],\n              [111.972077, 24.578775],\n              [112.007185, 24.534684],\n              [112.009649, 24.503103],\n              [111.985011, 24.467701],\n              [112.025047, 24.438828],\n              [112.057692, 24.387057],\n              [112.05954, 24.339628],\n              [112.026279, 24.294908],\n              [111.990555, 24.279634],\n              [111.986243, 24.25672],\n              [111.958526, 24.263813],\n              [111.912946, 24.221795],\n              [111.877222, 24.227252],\n              [111.871062, 24.176487],\n              [111.886461, 24.163929],\n              [111.878454, 24.109862],\n              [111.92157, 24.012045],\n              [111.940664, 23.987989],\n              [111.911714, 23.943693],\n              [111.854432, 23.947521],\n              [111.845809, 23.904305],\n              [111.812548, 23.887343],\n              [111.824867, 23.832612],\n              [111.8107, 23.80688],\n              [111.722621, 23.823305],\n              [111.683201, 23.822758],\n              [111.683201, 23.822758],\n              [111.654868, 23.833159],\n              [111.627766, 23.78881],\n              [111.621607, 23.725819],\n              [111.666571, 23.718696],\n              [111.614832, 23.65896],\n              [111.615448, 23.639225],\n              [111.555702, 23.64087],\n              [111.487332, 23.626615],\n              [111.479941, 23.532822],\n              [111.428818, 23.466414],\n              [111.399869, 23.469159],\n              [111.383239, 23.399423],\n              [111.389398, 23.375804],\n              [111.363528, 23.340641],\n              [111.376463, 23.30437],\n              [111.353058, 23.284582],\n              [111.36476, 23.240047],\n              [111.388782, 23.210349],\n              [111.38447, 23.16744],\n              [111.365992, 23.14488],\n              [111.377695, 23.082132],\n              [111.402333, 23.066165],\n              [111.43313, 23.073322],\n              [111.433746, 23.036428],\n              [111.389398, 23.005583],\n              [111.403565, 22.99126],\n              [111.362913, 22.967568],\n              [111.374615, 22.938361],\n              [111.358601, 22.889301],\n              [111.218167, 22.748085],\n              [111.185522, 22.735942],\n              [111.118385, 22.744773],\n              [111.058023, 22.729871],\n              [111.089435, 22.695643],\n              [111.055559, 22.648705],\n              [110.997045, 22.631582],\n              [110.958856, 22.636553],\n              [110.950233, 22.61059],\n              [110.896031, 22.613352],\n              [110.897878, 22.591805],\n              [110.812263, 22.576333],\n              [110.778386, 22.585174],\n              [110.749437, 22.556991],\n              [110.762988, 22.518298],\n              [110.740198, 22.498947],\n              [110.74143, 22.464109],\n              [110.688459, 22.477935],\n              [110.712481, 22.440879],\n              [110.711249, 22.369506],\n              [110.74143, 22.361757],\n              [110.749437, 22.329653],\n              [110.787009, 22.28259],\n              [110.759292, 22.274837],\n              [110.725415, 22.29588],\n              [110.687843, 22.249914],\n              [110.646575, 22.220554],\n              [110.678604, 22.172901],\n              [110.629329, 22.149068],\n              [110.598532, 22.162924],\n              [110.602843, 22.18343],\n              [110.55788, 22.196175],\n              [110.505525, 22.14297],\n              [110.456866, 22.189526],\n              [110.414366, 22.208365],\n              [110.378026, 22.164587],\n              [110.34846, 22.195621],\n              [110.326287, 22.152393],\n              [110.364475, 22.125785],\n              [110.35154, 22.097508],\n              [110.359547, 22.015973],\n              [110.352772, 21.97602],\n              [110.374946, 21.967695],\n              [110.374946, 21.967695],\n              [110.378642, 21.939942],\n              [110.378642, 21.939942],\n              [110.391576, 21.89386],\n              [110.337374, 21.887751],\n              [110.290562, 21.917736],\n              [110.283787, 21.892194],\n              [110.224041, 21.882198],\n              [110.224041, 21.882198],\n              [110.212338, 21.886085],\n              [110.212338, 21.886085],\n              [110.196323, 21.899968],\n              [110.12857, 21.902744],\n              [110.101469, 21.86998],\n              [110.050962, 21.857205],\n              [109.999839, 21.881643],\n              [109.94502, 21.84443],\n              [109.940093, 21.769419],\n              [109.916071, 21.668787],\n              [109.888354, 21.652101],\n              [109.888354, 21.652101],\n              [109.839695, 21.636525],\n              [109.786108, 21.637638],\n              [109.778101, 21.670455],\n              [109.742992, 21.616497],\n              [109.754695, 21.556396],\n              [109.788572, 21.490702],\n              [109.785492, 21.45673],\n              [109.704188, 21.462857],\n              [109.654913, 21.493487],\n              [109.612413, 21.556953],\n              [109.604406, 21.523553],\n              [109.576689, 21.493487],\n              [109.540964, 21.466199],\n              [109.529877, 21.437234],\n              [109.484914, 21.453388],\n              [109.41716, 21.438906],\n              [109.245929, 21.425536],\n              [109.186183, 21.390991],\n              [109.138756, 21.388762],\n              [109.095024, 21.419407],\n              [109.046365, 21.424421],\n              [109.039589, 21.457844],\n              [109.074698, 21.489589],\n              [109.142451, 21.511861],\n              [109.138756, 21.567528],\n              [109.110422, 21.568085],\n              [109.09872, 21.571424],\n              [109.093792, 21.579215],\n              [108.937959, 21.589789],\n              [108.881293, 21.627068],\n              [108.83325, 21.610933],\n              [108.801837, 21.626512],\n              [108.745786, 21.602587],\n              [108.710062, 21.646538],\n              [108.705134, 21.622061],\n              [108.678033, 21.659331],\n              [108.658939, 21.643757],\n              [108.626294, 21.67991],\n              [108.591802, 21.677129],\n              [108.492635, 21.554727],\n              [108.397781, 21.533017],\n              [108.330027, 21.540254],\n              [108.230245, 21.491259],\n              [108.210535, 21.505737],\n              [108.249955, 21.561406],\n              [108.241332, 21.599805],\n              [108.205608, 21.597579],\n              [108.156332, 21.55083],\n              [108.193905, 21.519656],\n              [108.108289, 21.508521],\n              [108.041768, 21.544151],\n              [107.958, 21.534131],\n              [107.929051, 21.585893],\n              [107.893942, 21.596466],\n              [107.892095, 21.622617],\n              [107.863761, 21.650988],\n              [107.837892, 21.640419],\n              [107.807711, 21.655438],\n              [107.712856, 21.616497],\n              [107.603219, 21.597579],\n              [107.584741, 21.614828],\n              [107.547168, 21.58645],\n              [107.486806, 21.59591],\n              [107.500973, 21.613715],\n              [107.477567, 21.659888],\n              [107.431372, 21.642088],\n              [107.388256, 21.594241],\n              [107.363619, 21.602031],\n              [107.356843, 21.667674],\n              [107.310648, 21.733844],\n              [107.271844, 21.727173],\n              [107.242279, 21.703265],\n              [107.199163, 21.718833],\n              [107.194851, 21.736624],\n              [107.148656, 21.758858],\n              [107.093837, 21.803317],\n              [107.018077, 21.81943],\n              [107.018693, 21.859427],\n              [107.058729, 21.887196],\n              [107.05996, 21.914959],\n              [106.999598, 21.947714],\n              [106.974345, 21.923288],\n              [106.935541, 21.933836],\n              [106.926302, 21.967695],\n              [106.859164, 21.986009],\n              [106.802498, 21.98157],\n              [106.790179, 22.004876],\n              [106.73844, 22.008205],\n              [106.698404, 21.959925],\n              [106.683006, 21.999882],\n              [106.706411, 22.021521],\n              [106.71565, 22.089745],\n              [106.691629, 22.13521],\n              [106.706411, 22.160707],\n              [106.673151, 22.182322],\n              [106.7021, 22.207257],\n              [106.688549, 22.260438],\n              [106.670071, 22.283144],\n              [106.663296, 22.33076],\n              [106.562897, 22.345706],\n              [106.588767, 22.374486],\n              [106.560434, 22.455813],\n              [106.588151, 22.472958],\n              [106.585071, 22.517192],\n              [106.61402, 22.602303],\n              [106.652825, 22.57357],\n              [106.711955, 22.575228],\n              [106.756302, 22.68957],\n              [106.780324, 22.708894],\n              [106.768621, 22.739254],\n              [106.820976, 22.768504],\n              [106.838838, 22.803265],\n              [106.813585, 22.817608],\n              [106.808657, 22.817608],\n              [106.804346, 22.816505],\n              [106.801882, 22.815401],\n              [106.776012, 22.813746],\n              [106.709491, 22.866142],\n              [106.716882, 22.881582],\n              [106.674998, 22.891506],\n              [106.657136, 22.863385],\n              [106.631267, 22.88103],\n              [106.606013, 22.925684],\n              [106.562282, 22.923479],\n              [106.525941, 22.946628],\n              [106.504383, 22.91025],\n              [106.41384, 22.877171],\n              [106.37134, 22.878273],\n              [106.366413, 22.857871],\n              [106.286957, 22.867245],\n              [106.258007, 22.889852],\n              [106.270326, 22.907494],\n              [106.206885, 22.978588],\n              [106.153914, 22.988505],\n              [106.106486, 22.980792],\n              [106.08616, 22.996218],\n              [106.019639, 22.990709],\n              [105.994385, 22.93781],\n              [105.959277, 22.948832],\n              [105.893987, 22.936707],\n              [105.879205, 22.916865],\n              [105.839169, 22.987403],\n              [105.805908, 22.994565],\n              [105.780039, 23.022659],\n              [105.74185, 23.030921],\n              [105.724604, 23.06231],\n              [105.648844, 23.078828],\n              [105.625438, 23.064513],\n              [105.574931, 23.066165],\n              [105.558916, 23.177893],\n              [105.542902, 23.184495],\n              [105.526272, 23.234548],\n              [105.560148, 23.257093],\n              [105.593409, 23.312614],\n              [105.649459, 23.346136],\n              [105.699966, 23.327453],\n              [105.694423, 23.363168],\n              [105.637757, 23.404366],\n              [105.699966, 23.40162],\n              [105.758481, 23.459826],\n              [105.805908, 23.467512],\n              [105.815763, 23.507031],\n              [105.852103, 23.526786],\n              [105.89214, 23.52514],\n              [105.913081, 23.499348],\n              [105.935871, 23.508678],\n              [105.986378, 23.489469],\n              [105.999929, 23.447748],\n              [106.039965, 23.484529],\n              [106.071994, 23.495506],\n              [106.08616, 23.524043],\n              [106.141595, 23.569579],\n              [106.120653, 23.605229],\n              [106.149602, 23.665538],\n              [106.157609, 23.724175],\n              [106.136667, 23.795381],\n              [106.192102, 23.824947],\n              [106.173008, 23.861622],\n              [106.192718, 23.879135],\n              [106.157609, 23.891174],\n              [106.128044, 23.956819],\n              [106.091088, 23.998924],\n              [106.096631, 24.018058],\n              [106.053516, 24.051399],\n              [106.04982, 24.089649],\n              [106.011632, 24.099482],\n              [105.998081, 24.120786],\n              [105.963589, 24.110954],\n              [105.919241, 24.122425],\n              [105.901995, 24.099482],\n              [105.908154, 24.069432],\n              [105.89214, 24.040468],\n              [105.859495, 24.056864],\n              [105.841633, 24.03063],\n              [105.796669, 24.023524],\n              [105.802212, 24.051945],\n              [105.765256, 24.073804],\n              [105.739387, 24.059596],\n              [105.704278, 24.0667],\n              [105.649459, 24.032816],\n              [105.628518, 24.126794],\n              [105.594641, 24.137718],\n              [105.533663, 24.130071],\n              [105.493011, 24.016965],\n              [105.406163, 24.043748],\n              [105.395692, 24.065607],\n              [105.334099, 24.094566],\n              [105.320548, 24.116416],\n              [105.273121, 24.092927],\n              [105.292831, 24.074896],\n              [105.260186, 24.061236],\n              [105.20044, 24.105491],\n              [105.182577, 24.167205],\n              [105.229389, 24.165567],\n              [105.24294, 24.208695],\n              [105.215222, 24.214699],\n              [105.164715, 24.288362],\n              [105.196744, 24.326541],\n              [105.188121, 24.347261],\n              [105.138846, 24.376701],\n              [105.111744, 24.37234],\n              [105.106817, 24.414853],\n              [105.042759, 24.442097],\n              [104.979933, 24.412673],\n              [104.930042, 24.411038],\n              [104.914028, 24.426296],\n              [104.83642, 24.446456],\n              [104.784681, 24.443732],\n              [104.765587, 24.45953],\n              [104.74834, 24.435559],\n              [104.715695, 24.441552],\n              [104.703377, 24.419757],\n              [104.721239, 24.340173],\n              [104.70892, 24.321087],\n              [104.641783, 24.367979],\n              [104.610986, 24.377246],\n              [104.63008, 24.397958],\n              [104.616529, 24.421937],\n              [104.575877, 24.424661],\n              [104.550008, 24.518894],\n              [104.520443, 24.535228],\n              [104.489646, 24.653313],\n              [104.529682, 24.731611],\n              [104.595587, 24.709323],\n              [104.628848, 24.660927],\n              [104.703377, 24.645698],\n              [104.729246, 24.617953],\n              [104.771746, 24.659839],\n              [104.841963, 24.676155],\n              [104.865985, 24.730524],\n              [104.899245, 24.752809],\n              [105.03352, 24.787586],\n              [105.026745, 24.815836],\n              [105.039064, 24.872859],\n              [105.077868, 24.918459],\n              [105.082179, 24.915745],\n              [105.096346, 24.928228],\n              [105.09573, 24.92877],\n              [105.131454, 24.959701],\n              [105.157324, 24.958616],\n              [105.178266, 24.985199],\n              [105.212758, 24.995505],\n              [105.251563, 24.967296],\n              [105.267577, 24.929313],\n              [105.334099, 24.9266],\n              [105.365511, 24.943423],\n              [105.428337, 24.930941],\n              [105.457286, 24.87123],\n              [105.493011, 24.833217],\n              [105.497322, 24.809318],\n              [105.573083, 24.797366],\n              [105.607576, 24.803885],\n              [105.617431, 24.78161],\n              [105.70551, 24.768569],\n              [105.767104, 24.719109],\n              [105.827466, 24.702799],\n              [105.863806, 24.729437],\n              [105.942031, 24.725088],\n              [105.961741, 24.677786],\n              [106.024566, 24.633186],\n              [106.047356, 24.684312],\n              [106.113878, 24.714216],\n              [106.150218, 24.762591],\n              [106.173008, 24.760417],\n              [106.206269, 24.851139],\n              [106.197645, 24.885889],\n              [106.145291, 24.954275],\n              [106.191486, 24.95319],\n              [106.215508, 24.981944],\n              [106.253696, 24.971094],\n              [106.304819, 24.973807],\n              [106.332536, 24.988454],\n              [106.442173, 25.019369],\n              [106.450181, 25.033468],\n              [106.519782, 25.054072],\n              [106.551195, 25.082802],\n              [106.590615, 25.08768],\n              [106.63989, 25.132658],\n              [106.644817, 25.164621],\n              [106.691013, 25.179245],\n              [106.732281, 25.162454],\n              [106.764926, 25.183036],\n              [106.787715, 25.17112],\n              [106.853005, 25.186827],\n              [106.888113, 25.181953],\n              [106.904128, 25.231768],\n              [106.933077, 25.250714],\n              [106.975577, 25.232851],\n              [107.013765, 25.275611],\n              [107.012533, 25.352973],\n              [106.987896, 25.358922],\n              [106.963874, 25.437852],\n              [106.996519, 25.442716],\n              [107.015613, 25.495666],\n              [107.066736, 25.50917],\n              [107.064272, 25.559391],\n              [107.185612, 25.578825],\n              [107.205322, 25.607971],\n              [107.228728, 25.604733],\n              [107.232423, 25.556691],\n              [107.263836, 25.543193],\n              [107.336517, 25.461089],\n              [107.308184, 25.432988],\n              [107.318039, 25.401637],\n              [107.358691, 25.393528],\n              [107.375937, 25.411908],\n              [107.420901, 25.392987],\n              [107.409198, 25.347024],\n              [107.432604, 25.289139],\n              [107.481263, 25.299961],\n              [107.489886, 25.276693],\n              [107.472024, 25.213902],\n              [107.512676, 25.209029],\n              [107.576734, 25.256668],\n              [107.599523, 25.250714],\n              [107.632168, 25.310241],\n              [107.659885, 25.316192],\n              [107.661733, 25.258833],\n              [107.696226, 25.219858],\n              [107.700537, 25.194408],\n              [107.741805, 25.24043],\n              [107.762131, 25.229061],\n              [107.760283, 25.188451],\n              [107.789233, 25.15487],\n              [107.762747, 25.125073],\n              [107.839124, 25.115861],\n              [107.872384, 25.141327],\n              [107.928435, 25.155954],\n              [108.001732, 25.196574],\n              [108.080572, 25.193867],\n              [108.115065, 25.210112],\n              [108.143398, 25.269658],\n              [108.152021, 25.324306],\n              [108.142782, 25.390825],\n              [108.193289, 25.405421],\n              [108.162492, 25.444878],\n              [108.192673, 25.458928],\n              [108.251803, 25.430286],\n              [108.241332, 25.46217],\n              [108.280752, 25.48],\n              [108.308469, 25.525912],\n              [108.348506, 25.536173],\n              [108.359592, 25.513491],\n              [108.400244, 25.491344],\n              [108.418723, 25.443257],\n              [108.471693, 25.458928],\n              [108.585642, 25.365952],\n              [108.589338, 25.335125],\n              [108.625062, 25.308076],\n              [108.62999, 25.335666],\n              [108.600425, 25.432448],\n              [108.6072, 25.491885],\n              [108.634917, 25.520512],\n              [108.68912, 25.533473],\n              [108.658323, 25.550212],\n              [108.660787, 25.584763],\n              [108.68604, 25.587462],\n              [108.68912, 25.623081],\n              [108.724844, 25.634952],\n              [108.783975, 25.628477],\n              [108.799989, 25.576666],\n              [108.781511, 25.554531],\n              [108.814772, 25.526992],\n              [108.826474, 25.550212],\n              [108.890532, 25.556151],\n              [108.8893, 25.543193],\n              [108.949046, 25.557231],\n              [109.024807, 25.51241],\n              [109.088249, 25.550752],\n              [109.051908, 25.566949],\n              [109.030966, 25.629556],\n              [109.075314, 25.693749],\n              [109.07901, 25.72071],\n              [109.043285, 25.738502],\n              [109.007561, 25.734728],\n              [108.953974, 25.686738],\n              [108.953974, 25.686738],\n              [108.900387, 25.682423],\n              [108.896076, 25.71424],\n              [108.940423, 25.740119],\n              [108.963829, 25.732572],\n              [108.999553, 25.765453],\n              [108.989698, 25.778926],\n              [109.048213, 25.790781],\n              [109.077778, 25.776771],\n              [109.095024, 25.80533],\n              [109.143683, 25.795092],\n              [109.13198, 25.762758],\n              [109.147995, 25.741736],\n              [109.206509, 25.788087],\n              [109.207125, 25.740119],\n              [109.296436, 25.71424],\n              [109.340168, 25.731493],\n              [109.327849, 25.76168],\n              [109.339552, 25.83442],\n              [109.359262, 25.836036],\n              [109.396834, 25.900117],\n              [109.435022, 25.93349],\n              [109.408537, 25.967392],\n              [109.462124, 25.995367],\n              [109.48245, 26.029788],\n              [109.513247, 25.998056],\n              [109.560058, 26.021184],\n              [109.588391, 26.019571],\n              [109.635203, 26.047533],\n              [109.649369, 26.016882],\n              [109.730057, 25.989988],\n              [109.710963, 25.954478],\n              [109.693717, 25.959321],\n              [109.67955, 25.921649],\n              [109.685094, 25.880197],\n              [109.768246, 25.890427],\n              [109.779333, 25.866196],\n              [109.811361, 25.877504],\n              [109.826144, 25.911422],\n              [109.806434, 25.973848],\n              [109.782412, 25.996981],\n              [109.814441, 26.041081],\n              [109.864332, 26.027637],\n              [109.898825, 26.095377],\n              [109.904368, 26.135679],\n              [109.970274, 26.195301],\n              [110.03002, 26.166299],\n              [110.099005, 26.168985],\n              [110.100853, 26.132455],\n              [110.065128, 26.050221],\n              [110.100853, 26.020108],\n              [110.168606, 26.028713],\n              [110.181541, 26.060437],\n              [110.24991, 26.010965],\n              [110.257301, 25.961473],\n              [110.325671, 25.975462],\n              [110.373098, 26.088927],\n              [110.437772, 26.153945],\n              [110.477808, 26.179727],\n              [110.495054, 26.166299],\n              [110.546793, 26.233421],\n              [110.552952, 26.283335],\n              [110.584365, 26.296749],\n              [110.612083, 26.333764],\n              [110.643495, 26.308552],\n              [110.673676, 26.317135],\n              [110.711249, 26.29192],\n              [110.742046, 26.313917],\n              [110.73835, 26.271529],\n              [110.759292, 26.248451],\n              [110.836284, 26.255966],\n              [110.939762, 26.286554],\n              [110.926212, 26.320354],\n              [110.944074, 26.326791],\n              [110.94469, 26.373447],\n              [110.974255, 26.385778],\n              [111.008747, 26.35897],\n              [111.008132, 26.336982],\n              [111.090667, 26.308016],\n              [111.208928, 26.30426],\n              [111.204616, 26.276359],\n              [111.228022, 26.261333],\n              [111.277913, 26.272066],\n              [111.293311, 26.222148],\n              [111.271754, 26.217316],\n              [111.274833, 26.183486],\n              [111.258203, 26.151796],\n              [111.26621, 26.095914],\n              [111.244652, 26.078177],\n              [111.267442, 26.058824],\n              [111.235413, 26.048071],\n              [111.189834, 25.953402],\n              [111.230486, 25.916267],\n              [111.251428, 25.864581],\n              [111.29208, 25.854349],\n              [111.297007, 25.874274],\n              [111.346282, 25.906577],\n              [111.376463, 25.906039],\n              [111.383239, 25.881812],\n              [111.460231, 25.885042],\n              [111.4861, 25.859196],\n              [111.43313, 25.84627],\n              [111.442369, 25.77192],\n              [111.399869, 25.744431],\n              [111.30871, 25.720171],\n              [111.309942, 25.645203],\n              [111.343202, 25.602574],\n              [111.324724, 25.564249],\n              [111.32842, 25.521592],\n              [111.300087, 25.44812],\n              [111.26313, 25.42326],\n              [111.257587, 25.395691],\n              [111.210776, 25.363248],\n              [111.184906, 25.367034],\n              [111.138711, 25.303748],\n              [111.103602, 25.285351],\n              [111.112841, 25.21715],\n              [110.998892, 25.161371],\n              [110.98411, 25.101772],\n              [110.951465, 25.04377],\n              [110.968711, 24.975434],\n              [111.009363, 24.921172],\n              [111.100522, 24.945593],\n              [111.101754, 25.035095],\n              [111.139943, 25.042144],\n              [111.200921, 25.074672],\n              [111.221862, 25.106649],\n              [111.274833, 25.151078],\n              [111.321645, 25.105023],\n              [111.36784, 25.108817],\n              [111.375231, 25.128324],\n              [111.435593, 25.093642],\n              [111.416499, 25.047566],\n              [111.467622, 25.02208],\n              [111.460231, 24.992793],\n              [111.43313, 24.979774],\n              [111.434977, 24.951562],\n              [111.470086, 24.92877],\n              [111.447296, 24.892947],\n              [111.449144, 24.857113],\n              [111.479325, 24.797366],\n              [111.461463, 24.728894],\n              [111.431282, 24.687574],\n              [111.451608, 24.665822],\n              [111.499035, 24.667997],\n              [111.526752, 24.637538],\n              [111.570484, 24.64461],\n              [111.588962, 24.690837],\n              [111.641933, 24.684856],\n              [111.637621, 24.715303],\n              [111.666571, 24.760961],\n              [111.708455, 24.788673],\n              [111.783599, 24.785957],\n              [111.814396, 24.770199],\n              [111.868599, 24.771829],\n              [111.875374, 24.756613],\n              [111.929577, 24.75607],\n              [111.951135, 24.769655],\n              [112.024431, 24.740308],\n            ],\n          ],\n          [\n            [\n              [105.096346, 24.928228],\n              [105.082179, 24.915745],\n              [105.077868, 24.918459],\n              [105.09573, 24.92877],\n              [105.096346, 24.928228],\n            ],\n          ],\n          [\n            [\n              [109.088249, 21.014934],\n              [109.088865, 21.031134],\n              [109.09256, 21.057386],\n              [109.138756, 21.067439],\n              [109.144299, 21.041189],\n              [109.117814, 21.017727],\n              [109.11227, 21.02499],\n              [109.088249, 21.014934],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 460000,\n        name: '海南省',\n        center: [110.33119, 20.031971],\n        centroid: [109.754859, 19.189767],\n        childrenNum: 19,\n        level: 'province',\n        subFeatureIndex: 20,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [110.106396, 20.026812],\n              [110.144585, 20.074598],\n              [110.243135, 20.077408],\n              [110.28933, 20.056047],\n              [110.318279, 20.108882],\n              [110.387265, 20.113378],\n              [110.495054, 20.077408],\n              [110.526467, 20.07516],\n              [110.562191, 20.110006],\n              [110.655814, 20.134169],\n              [110.687843, 20.163947],\n              [110.717408, 20.148778],\n              [110.744509, 20.074036],\n              [110.778386, 20.068415],\n              [110.808567, 20.035808],\n              [110.871393, 20.01163],\n              [110.940994, 20.028499],\n              [110.966248, 20.018377],\n              [111.013675, 19.850159],\n              [111.043856, 19.763448],\n              [111.071573, 19.628784],\n              [111.061718, 19.612436],\n              [111.008747, 19.60398],\n              [110.920668, 19.552668],\n              [110.888023, 19.518827],\n              [110.844292, 19.449996],\n              [110.787009, 19.399765],\n              [110.729727, 19.378878],\n              [110.706321, 19.320153],\n              [110.676756, 19.286264],\n              [110.619474, 19.152334],\n              [110.585597, 18.88075],\n              [110.590525, 18.838841],\n              [110.578206, 18.784458],\n              [110.499366, 18.751592],\n              [110.499366, 18.651824],\n              [110.367555, 18.631977],\n              [110.329366, 18.642185],\n              [110.246215, 18.609859],\n              [110.214186, 18.578662],\n              [110.116867, 18.506602],\n              [110.090382, 18.399309],\n              [110.070672, 18.376025],\n              [110.022629, 18.360121],\n              [109.919767, 18.375457],\n              [109.785492, 18.339672],\n              [109.749767, 18.193618],\n              [109.726362, 18.177698],\n              [109.661688, 18.175424],\n              [109.584696, 18.143579],\n              [109.527413, 18.169169],\n              [109.467051, 18.173718],\n              [109.441182, 18.199303],\n              [109.355566, 18.215221],\n              [109.287813, 18.264671],\n              [109.17448, 18.260125],\n              [109.138756, 18.268081],\n              [109.108575, 18.323766],\n              [109.006329, 18.323198],\n              [108.944735, 18.314107],\n              [108.905315, 18.389087],\n              [108.881293, 18.416344],\n              [108.776583, 18.441894],\n              [108.68912, 18.447571],\n              [108.644772, 18.486738],\n              [108.641077, 18.565614],\n              [108.663866, 18.67337],\n              [108.65278, 18.740258],\n              [108.593033, 18.809386],\n              [108.595497, 18.872256],\n              [108.637997, 18.924346],\n              [108.630606, 19.003017],\n              [108.598577, 19.055633],\n              [108.591186, 19.141592],\n              [108.609048, 19.276661],\n              [108.644772, 19.349518],\n              [108.694047, 19.387346],\n              [108.765496, 19.400894],\n              [108.806148, 19.450561],\n              [108.855424, 19.469182],\n              [108.92872, 19.524468],\n              [108.993394, 19.587065],\n              [109.048829, 19.619764],\n              [109.093792, 19.68965],\n              [109.147379, 19.704863],\n              [109.169553, 19.736411],\n              [109.159082, 19.79048],\n              [109.231147, 19.863105],\n              [109.255784, 19.867045],\n              [109.25948, 19.898561],\n              [109.300748, 19.917693],\n              [109.349407, 19.898561],\n              [109.411001, 19.895184],\n              [109.498464, 19.873236],\n              [109.526797, 19.943573],\n              [109.585312, 19.98801],\n              [109.657993, 20.01163],\n              [109.712195, 20.017253],\n              [109.76147, 19.981261],\n              [109.814441, 19.993072],\n              [109.855093, 19.984073],\n              [109.898825, 19.994196],\n              [109.965346, 19.993634],\n              [109.997375, 19.980136],\n              [110.042339, 19.991384],\n              [110.106396, 20.026812],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 500000,\n        name: '重庆市',\n        center: [106.504962, 29.533155],\n        centroid: [107.883899, 30.067297],\n        childrenNum: 38,\n        level: 'province',\n        subFeatureIndex: 21,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [106.37442, 28.525742],\n              [106.33192, 28.55308],\n              [106.346703, 28.583565],\n              [106.304203, 28.64976],\n              [106.305435, 28.704365],\n              [106.27279, 28.741103],\n              [106.267863, 28.779402],\n              [106.245689, 28.817686],\n              [106.264783, 28.845997],\n              [106.206885, 28.904691],\n              [106.173008, 28.920407],\n              [106.14837, 28.901548],\n              [106.101559, 28.898928],\n              [106.070762, 28.919884],\n              [106.049204, 28.906263],\n              [106.040581, 28.955498],\n              [106.001161, 28.973824],\n              [105.969132, 28.965971],\n              [105.910002, 28.920407],\n              [105.852719, 28.927217],\n              [105.830546, 28.944501],\n              [105.797285, 28.936121],\n              [105.801596, 28.958116],\n              [105.762176, 28.9911],\n              [105.766488, 29.013607],\n              [105.74185, 29.039249],\n              [105.757865, 29.069068],\n              [105.728916, 29.1062],\n              [105.752321, 29.129727],\n              [105.728916, 29.134432],\n              [105.703662, 29.176766],\n              [105.712285, 29.219082],\n              [105.695039, 29.287482],\n              [105.647612, 29.253027],\n              [105.631597, 29.280174],\n              [105.557684, 29.278608],\n              [105.521344, 29.264513],\n              [105.513337, 29.283306],\n              [105.459134, 29.288526],\n              [105.465294, 29.322969],\n              [105.42033, 29.31149],\n              [105.418482, 29.352185],\n              [105.441888, 29.400686],\n              [105.426489, 29.419454],\n              [105.372903, 29.421018],\n              [105.387069, 29.455416],\n              [105.387069, 29.455416],\n              [105.334099, 29.441345],\n              [105.337794, 29.459064],\n              [105.305149, 29.53199],\n              [105.296526, 29.571035],\n              [105.332867, 29.592374],\n              [105.347649, 29.621512],\n              [105.38091, 29.628275],\n              [105.419714, 29.688082],\n              [105.476996, 29.674564],\n              [105.481924, 29.718232],\n              [105.529351, 29.707836],\n              [105.574931, 29.744216],\n              [105.582938, 29.819013],\n              [105.610655, 29.837184],\n              [105.707974, 29.840818],\n              [105.738771, 29.891159],\n              [105.717213, 29.893753],\n              [105.70243, 29.924879],\n              [105.730763, 29.95755],\n              [105.723372, 29.975177],\n              [105.753553, 30.018196],\n              [105.719677, 30.042548],\n              [105.687032, 30.038922],\n              [105.676561, 30.06793],\n              [105.638988, 30.076216],\n              [105.642068, 30.101072],\n              [105.582938, 30.12385],\n              [105.582938, 30.127474],\n              [105.580474, 30.129544],\n              [105.574315, 30.130579],\n              [105.596489, 30.159043],\n              [105.536127, 30.152834],\n              [105.550909, 30.179222],\n              [105.56138, 30.183878],\n              [105.642684, 30.186464],\n              [105.662394, 30.210258],\n              [105.619894, 30.234045],\n              [105.624822, 30.275918],\n              [105.670401, 30.254208],\n              [105.720292, 30.252657],\n              [105.720292, 30.252657],\n              [105.714749, 30.322939],\n              [105.754785, 30.342567],\n              [105.760329, 30.384393],\n              [105.792357, 30.427234],\n              [105.825618, 30.436006],\n              [105.84656, 30.410203],\n              [105.900763, 30.405042],\n              [105.943263, 30.372002],\n              [106.031958, 30.373551],\n              [106.07261, 30.333786],\n              [106.132972, 30.30279],\n              [106.132356, 30.323972],\n              [106.168696, 30.303823],\n              [106.180399, 30.233011],\n              [106.232754, 30.185947],\n              [106.260471, 30.19681],\n              [106.264167, 30.20974],\n              [106.296196, 30.205603],\n              [106.306667, 30.238182],\n              [106.334384, 30.225772],\n              [106.349167, 30.24542],\n              [106.401521, 30.242318],\n              [106.428623, 30.254725],\n              [106.43971, 30.308473],\n              [106.49884, 30.295556],\n              [106.545035, 30.296589],\n              [106.560434, 30.31519],\n              [106.611557, 30.292455],\n              [106.642354, 30.246454],\n              [106.612789, 30.235596],\n              [106.612789, 30.235596],\n              [106.612173, 30.235596],\n              [106.612173, 30.235596],\n              [106.611557, 30.235596],\n              [106.612173, 30.235596],\n              [106.611557, 30.235596],\n              [106.631883, 30.186464],\n              [106.677462, 30.156974],\n              [106.672535, 30.122297],\n              [106.700252, 30.111944],\n              [106.699636, 30.074145],\n              [106.724274, 30.058607],\n              [106.732281, 30.027005],\n              [106.785252, 30.01716],\n              [106.825904, 30.03115],\n              [106.825904, 30.03115],\n              [106.83699, 30.049801],\n              [106.862244, 30.033223],\n              [106.913367, 30.025451],\n              [106.94478, 30.037367],\n              [106.976193, 30.083467],\n              [106.981736, 30.08502],\n              [107.02054, 30.036849],\n              [107.053801, 30.043584],\n              [107.054417, 30.040994],\n              [107.055649, 30.040476],\n              [107.058113, 30.043066],\n              [107.084598, 30.063786],\n              [107.080286, 30.094341],\n              [107.103076, 30.090198],\n              [107.221337, 30.213878],\n              [107.257677, 30.267131],\n              [107.288474, 30.337402],\n              [107.338981, 30.386459],\n              [107.368546, 30.468508],\n              [107.408582, 30.521623],\n              [107.443075, 30.53348],\n              [107.427676, 30.547397],\n              [107.485575, 30.598408],\n              [107.516987, 30.644759],\n              [107.477567, 30.664837],\n              [107.458473, 30.704981],\n              [107.424597, 30.74048],\n              [107.454162, 30.771851],\n              [107.454162, 30.771851],\n              [107.498509, 30.809381],\n              [107.483111, 30.838675],\n              [107.515756, 30.854603],\n              [107.57735, 30.847924],\n              [107.645103, 30.821202],\n              [107.693146, 30.875665],\n              [107.739957, 30.884396],\n              [107.760899, 30.862823],\n              [107.763979, 30.817091],\n              [107.788001, 30.81966],\n              [107.851443, 30.792931],\n              [107.956152, 30.882855],\n              [107.994956, 30.908533],\n              [107.948145, 30.918802],\n              [107.942602, 30.989114],\n              [107.983254, 30.983983],\n              [108.00358, 31.025533],\n              [108.060246, 31.052197],\n              [108.026985, 31.061938],\n              [108.009123, 31.109602],\n              [108.025753, 31.116263],\n              [108.089811, 31.204859],\n              [108.07626, 31.231985],\n              [108.031297, 31.217144],\n              [108.038688, 31.252964],\n              [108.095354, 31.268311],\n              [108.185898, 31.336831],\n              [108.153869, 31.371073],\n              [108.216079, 31.41041],\n              [108.224086, 31.464024],\n              [108.193289, 31.467598],\n              [108.191441, 31.492096],\n              [108.233941, 31.506894],\n              [108.254883, 31.49873],\n              [108.344194, 31.512506],\n              [108.34789, 31.545664],\n              [108.386078, 31.544134],\n              [108.390389, 31.591555],\n              [108.442744, 31.633856],\n              [108.468614, 31.636404],\n              [108.519121, 31.665952],\n              [108.546838, 31.665442],\n              [108.514809, 31.693963],\n              [108.50557, 31.734182],\n              [108.535135, 31.757592],\n              [108.462454, 31.780488],\n              [108.455063, 31.814059],\n              [108.429194, 31.809482],\n              [108.391005, 31.829822],\n              [108.386078, 31.854226],\n              [108.343578, 31.860834],\n              [108.259194, 31.967006],\n              [108.307238, 31.997463],\n              [108.351585, 31.971575],\n              [108.370063, 31.988835],\n              [108.329411, 32.020299],\n              [108.362056, 32.035521],\n              [108.344194, 32.067477],\n              [108.372527, 32.077112],\n              [108.42981, 32.061391],\n              [108.452599, 32.090296],\n              [108.399628, 32.147065],\n              [108.379303, 32.153652],\n              [108.379303, 32.153652],\n              [108.379918, 32.154158],\n              [108.379918, 32.154158],\n              [108.370063, 32.172397],\n              [108.399013, 32.194176],\n              [108.480317, 32.182527],\n              [108.509882, 32.201266],\n              [108.543758, 32.177969],\n              [108.585026, 32.17189],\n              [108.676801, 32.10297],\n              [108.734084, 32.106519],\n              [108.75133, 32.076098],\n              [108.78767, 32.04871],\n              [108.837561, 32.039072],\n              [108.902235, 31.984774],\n              [108.986619, 31.980205],\n              [109.085785, 31.929428],\n              [109.123357, 31.892851],\n              [109.191111, 31.85575],\n              [109.195422, 31.817618],\n              [109.27611, 31.79931],\n              [109.279806, 31.776418],\n              [109.253936, 31.759628],\n              [109.282885, 31.743343],\n              [109.281654, 31.716874],\n              [109.381436, 31.705165],\n              [109.446109, 31.722983],\n              [109.502776, 31.716365],\n              [109.549587, 31.73011],\n              [109.585928, 31.726546],\n              [109.622268, 31.711783],\n              [109.683246, 31.719929],\n              [109.731289, 31.700582],\n              [109.737449, 31.628761],\n              [109.76455, 31.602769],\n              [109.745456, 31.598182],\n              [109.727594, 31.548214],\n              [109.837847, 31.555354],\n              [109.894513, 31.519139],\n              [109.969658, 31.508935],\n              [109.94502, 31.47066],\n              [109.98752, 31.474744],\n              [110.036795, 31.436966],\n              [110.054042, 31.410921],\n              [110.118715, 31.409899],\n              [110.161831, 31.314338],\n              [110.155671, 31.279564],\n              [110.180309, 31.179774],\n              [110.200019, 31.158779],\n              [110.180309, 31.121899],\n              [110.147048, 31.116776],\n              [110.119947, 31.088592],\n              [110.120563, 31.0322],\n              [110.140273, 31.030661],\n              [110.140889, 30.987062],\n              [110.172918, 30.978853],\n              [110.153824, 30.953708],\n              [110.151976, 30.911613],\n              [110.082375, 30.799614],\n              [110.048498, 30.800642],\n              [110.019549, 30.829425],\n              [110.008462, 30.883369],\n              [109.943788, 30.878746],\n              [109.894513, 30.899803],\n              [109.828608, 30.864364],\n              [109.780564, 30.848437],\n              [109.701724, 30.783677],\n              [109.656761, 30.760538],\n              [109.661072, 30.738936],\n              [109.625348, 30.702923],\n              [109.590855, 30.69366],\n              [109.574225, 30.646818],\n              [109.543428, 30.63961],\n              [109.535421, 30.664837],\n              [109.435638, 30.595832],\n              [109.418392, 30.559766],\n              [109.35495, 30.487076],\n              [109.337088, 30.521623],\n              [109.36111, 30.551004],\n              [109.314298, 30.599953],\n              [109.299516, 30.630341],\n              [109.245313, 30.580892],\n              [109.191726, 30.545851],\n              [109.191726, 30.545851],\n              [109.143683, 30.521108],\n              [109.103647, 30.565949],\n              [109.106111, 30.570587],\n              [109.101183, 30.579346],\n              [109.102415, 30.580377],\n              [109.105495, 30.585529],\n              [109.106111, 30.61077],\n              [109.111654, 30.646303],\n              [109.071002, 30.640125],\n              [109.042669, 30.655571],\n              [109.006329, 30.626736],\n              [108.971836, 30.627766],\n              [108.893612, 30.565434],\n              [108.838793, 30.503062],\n              [108.808612, 30.491202],\n              [108.789518, 30.513374],\n              [108.743939, 30.494812],\n              [108.698975, 30.54482],\n              [108.688504, 30.58759],\n              [108.642925, 30.578831],\n              [108.6497, 30.53915],\n              [108.56778, 30.468508],\n              [108.556077, 30.487592],\n              [108.512961, 30.501515],\n              [108.472925, 30.487076],\n              [108.42673, 30.492233],\n              [108.411331, 30.438586],\n              [108.430425, 30.416397],\n              [108.402092, 30.376649],\n              [108.431041, 30.354446],\n              [108.460606, 30.35961],\n              [108.501258, 30.314673],\n              [108.524048, 30.309506],\n              [108.54499, 30.269716],\n              [108.581947, 30.255759],\n              [108.551766, 30.1637],\n              [108.56778, 30.157491],\n              [108.546222, 30.104178],\n              [108.513577, 30.057571],\n              [108.532055, 30.051873],\n              [108.536367, 29.983472],\n              [108.517889, 29.9394],\n              [108.516041, 29.885451],\n              [108.467998, 29.864175],\n              [108.433505, 29.880262],\n              [108.371295, 29.841337],\n              [108.424266, 29.815897],\n              [108.422418, 29.772791],\n              [108.442744, 29.778505],\n              [108.437201, 29.741098],\n              [108.460606, 29.741098],\n              [108.504338, 29.707836],\n              [108.504954, 29.728626],\n              [108.548686, 29.749412],\n              [108.52528, 29.770713],\n              [108.556077, 29.818493],\n              [108.601041, 29.863656],\n              [108.658939, 29.854833],\n              [108.680497, 29.800319],\n              [108.676801, 29.749412],\n              [108.690968, 29.689642],\n              [108.752562, 29.649082],\n              [108.786438, 29.691721],\n              [108.797525, 29.660003],\n              [108.781511, 29.635558],\n              [108.844337, 29.658443],\n              [108.888068, 29.628795],\n              [108.870206, 29.596537],\n              [108.901003, 29.604863],\n              [108.913322, 29.574679],\n              [108.878213, 29.539279],\n              [108.888684, 29.502305],\n              [108.866511, 29.470527],\n              [108.884373, 29.440824],\n              [108.927488, 29.435612],\n              [108.934264, 29.399643],\n              [108.919481, 29.3261],\n              [108.983539, 29.332883],\n              [108.999553, 29.36366],\n              [109.034662, 29.360531],\n              [109.060531, 29.403292],\n              [109.11227, 29.361053],\n              [109.106727, 29.288526],\n              [109.141835, 29.270256],\n              [109.110422, 29.21647],\n              [109.139372, 29.168927],\n              [109.162777, 29.180946],\n              [109.215748, 29.145409],\n              [109.232378, 29.119271],\n              [109.240386, 29.086328],\n              [109.312451, 29.066453],\n              [109.319842, 29.042388],\n              [109.294588, 29.015177],\n              [109.292741, 28.987436],\n              [109.261328, 28.952356],\n              [109.235458, 28.882161],\n              [109.246545, 28.80143],\n              [109.241002, 28.776779],\n              [109.2989, 28.7474],\n              [109.294588, 28.722211],\n              [109.252704, 28.691767],\n              [109.271183, 28.671816],\n              [109.192958, 28.636104],\n              [109.201581, 28.597753],\n              [109.235458, 28.61982],\n              [109.252089, 28.606685],\n              [109.306907, 28.62087],\n              [109.319842, 28.579886],\n              [109.273646, 28.53836],\n              [109.274262, 28.494714],\n              [109.23361, 28.474726],\n              [109.191726, 28.471043],\n              [109.153538, 28.417369],\n              [109.152306, 28.349975],\n              [109.117198, 28.277795],\n              [109.081473, 28.247749],\n              [109.101799, 28.202401],\n              [109.086401, 28.184467],\n              [109.026655, 28.220331],\n              [109.005713, 28.162837],\n              [108.929952, 28.19027],\n              [108.923793, 28.217167],\n              [108.89546, 28.219804],\n              [108.855424, 28.199764],\n              [108.821547, 28.245113],\n              [108.772888, 28.212949],\n              [108.738395, 28.228241],\n              [108.726692, 28.282011],\n              [108.761801, 28.304143],\n              [108.783359, 28.380518],\n              [108.759953, 28.389995],\n              [108.780279, 28.42579],\n              [108.746402, 28.45105],\n              [108.709446, 28.501026],\n              [108.700207, 28.48209],\n              [108.657091, 28.47683],\n              [108.640461, 28.456838],\n              [108.688504, 28.422106],\n              [108.697127, 28.401051],\n              [108.656475, 28.359981],\n              [108.667562, 28.334173],\n              [108.611512, 28.324691],\n              [108.580099, 28.343128],\n              [108.576403, 28.38631],\n              [108.609048, 28.407368],\n              [108.609664, 28.43579],\n              [108.586874, 28.463678],\n              [108.573939, 28.531],\n              [108.610896, 28.539412],\n              [108.604736, 28.590922],\n              [108.636149, 28.621396],\n              [108.575787, 28.659738],\n              [108.50249, 28.63768],\n              [108.501258, 28.626649],\n              [108.439049, 28.634003],\n              [108.332491, 28.679166],\n              [108.347274, 28.736381],\n              [108.385462, 28.772058],\n              [108.386078, 28.803003],\n              [108.352817, 28.815589],\n              [108.346658, 28.859625],\n              [108.357745, 28.893165],\n              [108.345426, 28.943453],\n              [108.319556, 28.961258],\n              [108.297999, 29.045527],\n              [108.306622, 29.079006],\n              [108.277673, 29.091558],\n              [108.256115, 29.040295],\n              [108.193289, 29.072207],\n              [108.150173, 29.053375],\n              [108.070717, 29.086328],\n              [108.026369, 29.039772],\n              [107.925971, 29.032446],\n              [107.908725, 29.007327],\n              [107.882855, 29.00628],\n              [107.867457, 28.960211],\n              [107.810175, 28.984295],\n              [107.823725, 29.034016],\n              [107.784921, 29.048143],\n              [107.810791, 29.139137],\n              [107.749197, 29.199754],\n              [107.700537, 29.141228],\n              [107.659885, 29.162656],\n              [107.605683, 29.164747],\n              [107.589052, 29.150113],\n              [107.570574, 29.218037],\n              [107.486806, 29.174153],\n              [107.441227, 29.203934],\n              [107.401807, 29.184603],\n              [107.408582, 29.138091],\n              [107.427676, 29.128682],\n              [107.412278, 29.094696],\n              [107.369778, 29.091558],\n              [107.395647, 29.041341],\n              [107.364235, 29.00942],\n              [107.396879, 28.993718],\n              [107.412894, 28.960211],\n              [107.441227, 28.943977],\n              [107.41351, 28.911502],\n              [107.383945, 28.848618],\n              [107.339597, 28.845997],\n              [107.327894, 28.810869],\n              [107.261373, 28.792514],\n              [107.24659, 28.76209],\n              [107.219489, 28.772582],\n              [107.210866, 28.817686],\n              [107.227496, 28.836037],\n              [107.194851, 28.838134],\n              [107.206554, 28.868535],\n              [107.14188, 28.887925],\n              [107.016229, 28.882685],\n              [107.019308, 28.861722],\n              [106.983584, 28.851239],\n              [106.988512, 28.776254],\n              [106.951555, 28.766812],\n              [106.923222, 28.809821],\n              [106.872099, 28.777304],\n              [106.845614, 28.780975],\n              [106.824056, 28.756319],\n              [106.86594, 28.690192],\n              [106.889345, 28.695966],\n              [106.866556, 28.624548],\n              [106.830831, 28.623497],\n              [106.807425, 28.589346],\n              [106.784636, 28.626649],\n              [106.756918, 28.607211],\n              [106.77786, 28.563068],\n              [106.73844, 28.554657],\n              [106.726121, 28.51838],\n              [106.747063, 28.467361],\n              [106.708259, 28.450524],\n              [106.697788, 28.47683],\n              [106.632499, 28.503655],\n              [106.564745, 28.485247],\n              [106.567825, 28.523638],\n              [106.615252, 28.549401],\n              [106.606629, 28.593024],\n              [106.63681, 28.622972],\n              [106.618332, 28.645033],\n              [106.651593, 28.649235],\n              [106.617716, 28.66709],\n              [106.6171, 28.691242],\n              [106.587535, 28.691767],\n              [106.56105, 28.719062],\n              [106.561666, 28.756319],\n              [106.474202, 28.832891],\n              [106.45326, 28.817162],\n              [106.461883, 28.761041],\n              [106.492064, 28.742153],\n              [106.528405, 28.677591],\n              [106.502535, 28.661313],\n              [106.49268, 28.591448],\n              [106.466811, 28.586193],\n              [106.504999, 28.544669],\n              [106.477282, 28.530474],\n              [106.403369, 28.569901],\n              [106.37442, 28.525742],\n            ],\n          ],\n          [\n            [\n              [109.105495, 30.585529],\n              [109.102415, 30.580377],\n              [109.101183, 30.579346],\n              [109.09872, 30.579346],\n              [109.09256, 30.578831],\n              [109.106111, 30.61077],\n              [109.105495, 30.585529],\n            ],\n          ],\n          [\n            [\n              [105.582938, 30.12385],\n              [105.574315, 30.130579],\n              [105.580474, 30.129544],\n              [105.582938, 30.127474],\n              [105.582938, 30.12385],\n            ],\n          ],\n          [\n            [\n              [109.09872, 30.579346],\n              [109.106111, 30.570587],\n              [109.103647, 30.565949],\n              [109.09256, 30.578831],\n              [109.09872, 30.579346],\n            ],\n          ],\n          [\n            [\n              [107.058113, 30.043066],\n              [107.055649, 30.040476],\n              [107.054417, 30.040994],\n              [107.053801, 30.043584],\n              [107.058113, 30.043066],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 510000,\n        name: '四川省',\n        center: [104.065735, 30.659462],\n        centroid: [102.693453, 30.674545],\n        childrenNum: 21,\n        level: 'province',\n        subFeatureIndex: 22,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [101.167885, 27.198311],\n              [101.167885, 27.198311],\n              [101.119226, 27.208957],\n              [101.071798, 27.194585],\n              [101.042233, 27.22173],\n              [101.026219, 27.270679],\n              [101.021907, 27.332899],\n              [100.95169, 27.426961],\n              [100.936908, 27.469448],\n              [100.901183, 27.453517],\n              [100.91227, 27.521473],\n              [100.854988, 27.623858],\n              [100.827886, 27.615904],\n              [100.848212, 27.672099],\n              [100.782307, 27.691708],\n              [100.775532, 27.743098],\n              [100.757053, 27.770107],\n              [100.707162, 27.800816],\n              [100.719481, 27.858503],\n              [100.681293, 27.923035],\n              [100.634482, 27.915631],\n              [100.609228, 27.859033],\n              [100.54517, 27.809286],\n              [100.511294, 27.827811],\n              [100.504518, 27.852154],\n              [100.442924, 27.86644],\n              [100.412127, 27.816167],\n              [100.350534, 27.755809],\n              [100.327744, 27.72032],\n              [100.311729, 27.724028],\n              [100.304954, 27.788639],\n              [100.28586, 27.80611],\n              [100.30865, 27.830457],\n              [100.30865, 27.861149],\n              [100.210715, 27.87702],\n              [100.170063, 27.907699],\n              [100.196549, 27.936254],\n              [100.120788, 28.018703],\n              [100.088759, 28.029269],\n              [100.05673, 28.097922],\n              [100.021006, 28.147008],\n              [100.033325, 28.184467],\n              [100.062274, 28.193962],\n              [100.091223, 28.181302],\n              [100.102926, 28.201873],\n              [100.153433, 28.208202],\n              [100.188541, 28.252493],\n              [100.147274, 28.288862],\n              [100.176223, 28.325218],\n              [100.136803, 28.349975],\n              [100.057346, 28.368934],\n              [100.073977, 28.426317],\n              [99.990209, 28.47683],\n              [99.985281, 28.529422],\n              [99.91876, 28.599329],\n              [99.875644, 28.611939],\n              [99.873181, 28.631902],\n              [99.834376, 28.628225],\n              [99.834992, 28.660788],\n              [99.79434, 28.699116],\n              [99.755536, 28.701216],\n              [99.722275, 28.757369],\n              [99.717964, 28.846521],\n              [99.676696, 28.810345],\n              [99.625573, 28.81454],\n              [99.609559, 28.784122],\n              [99.614486, 28.740054],\n              [99.553508, 28.710664],\n              [99.53195, 28.677591],\n              [99.540573, 28.623497],\n              [99.504233, 28.619294],\n              [99.466045, 28.579886],\n              [99.463581, 28.549401],\n              [99.403219, 28.546246],\n              [99.396444, 28.491032],\n              [99.426625, 28.454207],\n              [99.404451, 28.44421],\n              [99.437095, 28.398419],\n              [99.392748, 28.318369],\n              [99.412458, 28.295186],\n              [99.374886, 28.18183],\n              [99.306516, 28.227714],\n              [99.28927, 28.286227],\n              [99.237531, 28.317842],\n              [99.229524, 28.350502],\n              [99.200575, 28.365774],\n              [99.16485, 28.425264],\n              [99.187024, 28.44],\n              [99.191952, 28.494714],\n              [99.170394, 28.566221],\n              [99.183944, 28.58882],\n              [99.147604, 28.640831],\n              [99.126662, 28.698066],\n              [99.134053, 28.734806],\n              [99.114343, 28.765763],\n              [99.103872, 28.841803],\n              [99.123582, 28.890021],\n              [99.132206, 28.94869],\n              [99.113727, 29.07273],\n              [99.118039, 29.100971],\n              [99.105104, 29.162656],\n              [99.113727, 29.221171],\n              [99.114343, 29.243628],\n              [99.075539, 29.316186],\n              [99.058909, 29.417368],\n              [99.066916, 29.421018],\n              [99.044742, 29.520013],\n              [99.052133, 29.563748],\n              [99.014561, 29.607464],\n              [98.992387, 29.677163],\n              [99.018873, 29.792009],\n              [99.0238, 29.846009],\n              [99.068148, 29.931621],\n              [99.055213, 29.958587],\n              [99.036735, 30.053945],\n              [99.044742, 30.079842],\n              [98.989308, 30.151799],\n              [98.9813, 30.182843],\n              [98.993003, 30.215429],\n              [98.970829, 30.260928],\n              [98.986844, 30.280569],\n              [98.967134, 30.33482],\n              [98.965286, 30.449937],\n              [98.932025, 30.521623],\n              [98.926482, 30.569556],\n              [98.939417, 30.598923],\n              [98.92217, 30.609225],\n              [98.907388, 30.698292],\n              [98.963438, 30.728134],\n              [98.957895, 30.765166],\n              [98.904924, 30.782649],\n              [98.850105, 30.849465],\n              [98.797135, 30.87926],\n              [98.774345, 30.908019],\n              [98.797135, 30.948575],\n              [98.806374, 30.995783],\n              [98.774961, 31.031174],\n              [98.736772, 31.049121],\n              [98.712135, 31.082954],\n              [98.710287, 31.1178],\n              [98.675179, 31.15417],\n              [98.602498, 31.192062],\n              [98.62344, 31.221238],\n              [98.60373, 31.257568],\n              [98.616048, 31.3036],\n              [98.643766, 31.338876],\n              [98.691809, 31.333253],\n              [98.773113, 31.249382],\n              [98.805758, 31.279052],\n              [98.810685, 31.306668],\n              [98.887062, 31.37465],\n              [98.84333, 31.416028],\n              [98.844562, 31.429817],\n              [98.714599, 31.508935],\n              [98.696736, 31.538523],\n              [98.651157, 31.57881],\n              [98.619128, 31.591555],\n              [98.553839, 31.660349],\n              [98.545831, 31.717383],\n              [98.516882, 31.717383],\n              [98.508875, 31.751995],\n              [98.461448, 31.800327],\n              [98.414636, 31.832365],\n              [98.426339, 31.856767],\n              [98.399238, 31.895899],\n              [98.432498, 31.922825],\n              [98.434962, 32.007613],\n              [98.402933, 32.026896],\n              [98.404781, 32.045159],\n              [98.357354, 32.087253],\n              [98.303151, 32.121726],\n              [98.260035, 32.208862],\n              [98.218768, 32.234683],\n              [98.23047, 32.262521],\n              [98.208913, 32.318171],\n              [98.218768, 32.342444],\n              [98.125145, 32.401077],\n              [98.107283, 32.391476],\n              [98.079565, 32.415224],\n              [97.940363, 32.482393],\n              [97.880001, 32.486431],\n              [97.863986, 32.499051],\n              [97.80732, 32.50006],\n              [97.795617, 32.521257],\n              [97.730944, 32.527312],\n              [97.700763, 32.53488],\n              [97.616995, 32.586329],\n              [97.607756, 32.614059],\n              [97.543698, 32.62162],\n              [97.535075, 32.638252],\n              [97.48272, 32.654377],\n              [97.42359, 32.70475],\n              [97.429133, 32.714318],\n              [97.386018, 32.77925],\n              [97.392793, 32.828546],\n              [97.376163, 32.886359],\n              [97.347829, 32.895907],\n              [97.375547, 32.956689],\n              [97.438372, 32.976271],\n              [97.523988, 32.988822],\n              [97.499966, 33.011408],\n              [97.542466, 33.035995],\n              [97.517213, 33.097683],\n              [97.487032, 33.107209],\n              [97.498119, 33.137783],\n              [97.487648, 33.168346],\n              [97.548626, 33.203907],\n              [97.607756, 33.263976],\n              [97.622538, 33.337005],\n              [97.676125, 33.341004],\n              [97.754349, 33.409972],\n              [97.674893, 33.432949],\n              [97.625618, 33.461412],\n              [97.552321, 33.465906],\n              [97.511669, 33.520805],\n              [97.523372, 33.577166],\n              [97.450075, 33.582152],\n              [97.415583, 33.605582],\n              [97.435293, 33.682307],\n              [97.418046, 33.728608],\n              [97.422974, 33.754984],\n              [97.406344, 33.795278],\n              [97.373083, 33.817655],\n              [97.371851, 33.842015],\n              [97.398336, 33.848477],\n              [97.395257, 33.889224],\n              [97.460546, 33.887236],\n              [97.503662, 33.912073],\n              [97.52214, 33.903133],\n              [97.601596, 33.929951],\n              [97.629314, 33.919523],\n              [97.660111, 33.956264],\n              [97.652719, 33.998448],\n              [97.70261, 34.036644],\n              [97.665654, 34.126855],\n              [97.766668, 34.158555],\n              [97.789458, 34.182818],\n              [97.789458, 34.182818],\n              [97.796849, 34.199154],\n              [97.796849, 34.199154],\n              [97.898479, 34.209548],\n              [97.95453, 34.190739],\n              [98.051848, 34.11546],\n              [98.098043, 34.122892],\n              [98.157174, 34.107532],\n              [98.206449, 34.08424],\n              [98.258188, 34.083249],\n              [98.344419, 34.094648],\n              [98.392462, 34.089196],\n              [98.396774, 34.053008],\n              [98.428187, 34.029204],\n              [98.440506, 33.981577],\n              [98.415252, 33.956761],\n              [98.425723, 33.913066],\n              [98.407245, 33.867362],\n              [98.434962, 33.843009],\n              [98.463295, 33.848477],\n              [98.492861, 33.796272],\n              [98.494092, 33.768915],\n              [98.51873, 33.77389],\n              [98.537824, 33.74752],\n              [98.582788, 33.731595],\n              [98.610505, 33.682805],\n              [98.6567, 33.64744],\n              [98.61728, 33.637476],\n              [98.622824, 33.610067],\n              [98.652389, 33.595114],\n              [98.648077, 33.548741],\n              [98.678258, 33.522801],\n              [98.725686, 33.503341],\n              [98.742316, 33.477887],\n              [98.736157, 33.406975],\n              [98.779888, 33.370497],\n              [98.759562, 33.276985],\n              [98.802062, 33.270481],\n              [98.804526, 33.219428],\n              [98.858728, 33.150811],\n              [98.92217, 33.118738],\n              [98.967134, 33.115229],\n              [98.971445, 33.098185],\n              [99.014561, 33.081137],\n              [99.024416, 33.094675],\n              [99.090322, 33.079131],\n              [99.124814, 33.046028],\n              [99.196263, 33.035493],\n              [99.214741, 32.991332],\n              [99.235067, 32.982296],\n              [99.24677, 32.924043],\n              [99.268944, 32.878318],\n              [99.353944, 32.885354],\n              [99.376118, 32.899927],\n              [99.45311, 32.862233],\n              [99.558436, 32.839106],\n              [99.589233, 32.789312],\n              [99.640355, 32.790822],\n              [99.646515, 32.774721],\n              [99.705029, 32.76516],\n              [99.717964, 32.732443],\n              [99.760464, 32.769689],\n              [99.766623, 32.826032],\n              [99.791877, 32.883344],\n              [99.764159, 32.924545],\n              [99.788181, 32.956689],\n              [99.805427, 32.940619],\n              [99.851007, 32.941623],\n              [99.877492, 32.993339],\n              [99.877492, 33.045527],\n              [99.947709, 32.986814],\n              [99.956332, 32.948152],\n              [100.038252, 32.929066],\n              [100.029629, 32.895907],\n              [100.064738, 32.895907],\n              [100.123252, 32.837095],\n              [100.117093, 32.802392],\n              [100.139266, 32.724388],\n              [100.088143, 32.668988],\n              [100.109701, 32.640268],\n              [100.189773, 32.630692],\n              [100.208252, 32.606497],\n              [100.229809, 32.650346],\n              [100.231041, 32.696189],\n              [100.258759, 32.742511],\n              [100.339447, 32.719353],\n              [100.399193, 32.756101],\n              [100.378251, 32.698707],\n              [100.420135, 32.73194],\n              [100.450932, 32.694678],\n              [100.470026, 32.694678],\n              [100.516837, 32.632204],\n              [100.54517, 32.569687],\n              [100.603069, 32.553547],\n              [100.645568, 32.526303],\n              [100.657887, 32.546484],\n              [100.661583, 32.616075],\n              [100.673286, 32.628172],\n              [100.710242, 32.610026],\n              [100.71209, 32.645307],\n              [100.690532, 32.678056],\n              [100.77122, 32.643795],\n              [100.834046, 32.648835],\n              [100.887633, 32.632708],\n              [100.93198, 32.600447],\n              [100.956618, 32.621116],\n              [100.99727, 32.627668],\n              [101.030531, 32.660424],\n              [101.077342, 32.68259],\n              [101.124769, 32.658408],\n              [101.157414, 32.661431],\n              [101.22332, 32.725898],\n              [101.237486, 32.825026],\n              [101.223935, 32.855698],\n              [101.178356, 32.892892],\n              [101.124153, 32.909976],\n              [101.134624, 32.95217],\n              [101.129081, 32.989324],\n              [101.183899, 32.984304],\n              [101.171581, 33.009902],\n              [101.184515, 33.041514],\n              [101.146327, 33.056563],\n              [101.143863, 33.086151],\n              [101.169733, 33.10019],\n              [101.11553, 33.194893],\n              [101.124769, 33.221431],\n              [101.156798, 33.236449],\n              [101.182668, 33.26948],\n              [101.217776, 33.256469],\n              [101.297232, 33.262475],\n              [101.381616, 33.153316],\n              [101.393935, 33.157826],\n              [101.386543, 33.207412],\n              [101.403174, 33.225436],\n              [101.487557, 33.226938],\n              [101.515275, 33.192889],\n              [101.557775, 33.167344],\n              [101.633535, 33.101193],\n              [101.661252, 33.135778],\n              [101.653861, 33.162835],\n              [101.709912, 33.21292],\n              [101.735781, 33.279987],\n              [101.677883, 33.297497],\n              [101.64955, 33.323004],\n              [101.663716, 33.383991],\n              [101.695745, 33.433948],\n              [101.769042, 33.45592],\n              [101.777665, 33.533776],\n              [101.769042, 33.538765],\n              [101.783208, 33.556721],\n              [101.831252, 33.554726],\n              [101.844186, 33.602591],\n              [101.884222, 33.578163],\n              [101.907012, 33.539264],\n              [101.906396, 33.48188],\n              [101.946432, 33.442937],\n              [101.915635, 33.425957],\n              [101.887302, 33.383991],\n              [101.877447, 33.314502],\n              [101.769658, 33.26898],\n              [101.770274, 33.248962],\n              [101.83002, 33.213921],\n              [101.841723, 33.184876],\n              [101.825708, 33.119239],\n              [101.865744, 33.103198],\n              [101.887302, 33.135778],\n              [101.921795, 33.153817],\n              [101.935345, 33.186879],\n              [101.99386, 33.1999],\n              [102.054838, 33.189884],\n              [102.08933, 33.204908],\n              [102.08933, 33.227439],\n              [102.117047, 33.288492],\n              [102.144765, 33.273983],\n              [102.160163, 33.242956],\n              [102.200815, 33.223434],\n              [102.217446, 33.247961],\n              [102.192192, 33.337005],\n              [102.218062, 33.349503],\n              [102.258098, 33.409472],\n              [102.296286, 33.413969],\n              [102.310452, 33.397982],\n              [102.368967, 33.41247],\n              [102.392988, 33.404477],\n              [102.447807, 33.454922],\n              [102.462589, 33.449429],\n              [102.461358, 33.501345],\n              [102.446575, 33.53228],\n              [102.477988, 33.543254],\n              [102.440416, 33.574673],\n              [102.346793, 33.605582],\n              [102.31538, 33.665374],\n              [102.342481, 33.725622],\n              [102.284583, 33.719151],\n              [102.324619, 33.754486],\n              [102.296286, 33.783838],\n              [102.243315, 33.786823],\n              [102.261177, 33.821136],\n              [102.25317, 33.861399],\n              [102.136142, 33.965199],\n              [102.16817, 33.983066],\n              [102.226069, 33.963214],\n              [102.248858, 33.98654],\n              [102.287047, 33.977607],\n              [102.315996, 33.993983],\n              [102.345561, 33.969666],\n              [102.392372, 33.971651],\n              [102.406539, 34.033172],\n              [102.437336, 34.087214],\n              [102.471213, 34.072839],\n              [102.511865, 34.086222],\n              [102.615958, 34.099604],\n              [102.649219, 34.080275],\n              [102.655994, 34.113478],\n              [102.598712, 34.14766],\n              [102.651067, 34.165983],\n              [102.664002, 34.192719],\n              [102.694799, 34.198659],\n              [102.728675, 34.235774],\n              [102.779798, 34.236764],\n              [102.798276, 34.272874],\n              [102.856791, 34.270895],\n              [102.85987, 34.301058],\n              [102.911609, 34.312923],\n              [102.949181, 34.292159],\n              [102.977515, 34.252595],\n              [102.973203, 34.205588],\n              [103.005848, 34.184798],\n              [103.052043, 34.195194],\n              [103.100087, 34.181828],\n              [103.124108, 34.162022],\n              [103.121644, 34.112487],\n              [103.178927, 34.079779],\n              [103.129652, 34.065899],\n              [103.119797, 34.03466],\n              [103.147514, 34.036644],\n              [103.157369, 33.998944],\n              [103.120413, 33.953286],\n              [103.1315, 33.931937],\n              [103.16476, 33.929454],\n              [103.181391, 33.900649],\n              [103.153673, 33.819147],\n              [103.165376, 33.805721],\n              [103.228202, 33.79478],\n              [103.24976, 33.814175],\n              [103.284868, 33.80224],\n              [103.278709, 33.774387],\n              [103.35447, 33.743539],\n              [103.434542, 33.752993],\n              [103.464723, 33.80224],\n              [103.518309, 33.807213],\n              [103.545411, 33.719649],\n              [103.520157, 33.678323],\n              [103.552186, 33.671351],\n              [103.563889, 33.699735],\n              [103.593454, 33.716164],\n              [103.645809, 33.708697],\n              [103.667983, 33.685793],\n              [103.690772, 33.69376],\n              [103.778236, 33.658898],\n              [103.861388, 33.682307],\n              [103.980264, 33.670852],\n              [104.046169, 33.686291],\n              [104.103452, 33.663381],\n              [104.176749, 33.5996],\n              [104.155191, 33.542755],\n              [104.180444, 33.472895],\n              [104.213089, 33.446932],\n              [104.22048, 33.404477],\n              [104.272219, 33.391486],\n              [104.292545, 33.336505],\n              [104.373849, 33.345004],\n              [104.420045, 33.327004],\n              [104.386168, 33.298497],\n              [104.333813, 33.315502],\n              [104.303632, 33.304499],\n              [104.323958, 33.26898],\n              [104.32827, 33.223934],\n              [104.351059, 33.158828],\n              [104.378161, 33.109214],\n              [104.337509, 33.038002],\n              [104.391711, 33.035493],\n              [104.426204, 33.010906],\n              [104.383704, 32.994343],\n              [104.378161, 32.953174],\n              [104.345516, 32.940117],\n              [104.288234, 32.942628],\n              [104.277147, 32.90244],\n              [104.294393, 32.835586],\n              [104.363994, 32.822511],\n              [104.458849, 32.748551],\n              [104.51182, 32.753585],\n              [104.526602, 32.728416],\n              [104.582653, 32.722374],\n              [104.592508, 32.695685],\n              [104.643015, 32.661935],\n              [104.696601, 32.673522],\n              [104.739717, 32.635228],\n              [104.795768, 32.643292],\n              [104.820405, 32.662943],\n              [104.845659, 32.653873],\n              [104.881999, 32.600951],\n              [104.925115, 32.607505],\n              [105.026745, 32.650346],\n              [105.0791, 32.637244],\n              [105.111128, 32.593893],\n              [105.185041, 32.617587],\n              [105.215222, 32.63674],\n              [105.219534, 32.666469],\n              [105.263265, 32.652362],\n              [105.297758, 32.656897],\n              [105.347033, 32.68259],\n              [105.368591, 32.712807],\n              [105.448663, 32.732946],\n              [105.454207, 32.767173],\n              [105.427721, 32.784281],\n              [105.396308, 32.85067],\n              [105.396308, 32.85067],\n              [105.38091, 32.876307],\n              [105.408011, 32.885857],\n              [105.414171, 32.922034],\n              [105.467757, 32.930071],\n              [105.49917, 32.911986],\n              [105.495475, 32.873292],\n              [105.524424, 32.847654],\n              [105.534279, 32.790822],\n              [105.555221, 32.794343],\n              [105.563844, 32.724891],\n              [105.585402, 32.728919],\n              [105.596489, 32.69921],\n              [105.677793, 32.726402],\n              [105.719061, 32.759624],\n              [105.768952, 32.767676],\n              [105.779423, 32.750061],\n              [105.822538, 32.770192],\n              [105.825002, 32.824523],\n              [105.849024, 32.817985],\n              [105.893371, 32.838603],\n              [105.93156, 32.826032],\n              [105.969132, 32.849162],\n              [106.011632, 32.829552],\n              [106.044277, 32.864747],\n              [106.071378, 32.828546],\n              [106.093552, 32.82402],\n              [106.07261, 32.76365],\n              [106.071378, 32.758114],\n              [106.120037, 32.719856],\n              [106.17424, 32.6977],\n              [106.254928, 32.693671],\n              [106.267863, 32.673522],\n              [106.301123, 32.680071],\n              [106.347935, 32.671003],\n              [106.389203, 32.62666],\n              [106.421231, 32.616579],\n              [106.451412, 32.65992],\n              [106.498224, 32.649338],\n              [106.517934, 32.668485],\n              [106.585687, 32.68813],\n              [106.626955, 32.682086],\n              [106.670071, 32.694678],\n              [106.733513, 32.739491],\n              [106.783404, 32.735967],\n              [106.793259, 32.712807],\n              [106.82344, 32.705254],\n              [106.854853, 32.724388],\n              [106.903512, 32.721367],\n              [106.912751, 32.704247],\n              [107.012533, 32.721367],\n              [107.066736, 32.708779],\n              [107.05996, 32.686115],\n              [107.098765, 32.649338],\n              [107.108004, 32.600951],\n              [107.080286, 32.542448],\n              [107.127098, 32.482393],\n              [107.189924, 32.468256],\n              [107.212097, 32.428864],\n              [107.263836, 32.403099],\n              [107.287858, 32.457147],\n              [107.313727, 32.489965],\n              [107.356843, 32.506622],\n              [107.382097, 32.54043],\n              [107.436299, 32.529835],\n              [107.438763, 32.465732],\n              [107.460937, 32.453612],\n              [107.456625, 32.41775],\n              [107.489886, 32.425328],\n              [107.527458, 32.38238],\n              [107.598291, 32.411688],\n              [107.648183, 32.413709],\n              [107.680827, 32.397035],\n              [107.707929, 32.331826],\n              [107.753508, 32.338399],\n              [107.812022, 32.247844],\n              [107.864377, 32.201266],\n              [107.890247, 32.214432],\n              [107.924739, 32.197215],\n              [107.979558, 32.146051],\n              [108.024521, 32.177462],\n              [108.018362, 32.2119],\n              [108.086731, 32.233165],\n              [108.143398, 32.219495],\n              [108.156948, 32.239239],\n              [108.179738, 32.221521],\n              [108.240716, 32.274666],\n              [108.310933, 32.232152],\n              [108.389773, 32.263533],\n              [108.414411, 32.252399],\n              [108.469846, 32.270618],\n              [108.507418, 32.245819],\n              [108.509882, 32.201266],\n              [108.480317, 32.182527],\n              [108.399013, 32.194176],\n              [108.370063, 32.172397],\n              [108.379918, 32.154158],\n              [108.379918, 32.154158],\n              [108.379303, 32.153652],\n              [108.379303, 32.153652],\n              [108.399628, 32.147065],\n              [108.452599, 32.090296],\n              [108.42981, 32.061391],\n              [108.372527, 32.077112],\n              [108.344194, 32.067477],\n              [108.362056, 32.035521],\n              [108.329411, 32.020299],\n              [108.370063, 31.988835],\n              [108.351585, 31.971575],\n              [108.307238, 31.997463],\n              [108.259194, 31.967006],\n              [108.343578, 31.860834],\n              [108.386078, 31.854226],\n              [108.391005, 31.829822],\n              [108.429194, 31.809482],\n              [108.455063, 31.814059],\n              [108.462454, 31.780488],\n              [108.535135, 31.757592],\n              [108.50557, 31.734182],\n              [108.514809, 31.693963],\n              [108.546838, 31.665442],\n              [108.519121, 31.665952],\n              [108.468614, 31.636404],\n              [108.442744, 31.633856],\n              [108.390389, 31.591555],\n              [108.386078, 31.544134],\n              [108.34789, 31.545664],\n              [108.344194, 31.512506],\n              [108.254883, 31.49873],\n              [108.233941, 31.506894],\n              [108.191441, 31.492096],\n              [108.193289, 31.467598],\n              [108.224086, 31.464024],\n              [108.216079, 31.41041],\n              [108.153869, 31.371073],\n              [108.185898, 31.336831],\n              [108.095354, 31.268311],\n              [108.038688, 31.252964],\n              [108.031297, 31.217144],\n              [108.07626, 31.231985],\n              [108.089811, 31.204859],\n              [108.025753, 31.116263],\n              [108.009123, 31.109602],\n              [108.026985, 31.061938],\n              [108.060246, 31.052197],\n              [108.00358, 31.025533],\n              [107.983254, 30.983983],\n              [107.942602, 30.989114],\n              [107.948145, 30.918802],\n              [107.994956, 30.908533],\n              [107.956152, 30.882855],\n              [107.851443, 30.792931],\n              [107.788001, 30.81966],\n              [107.763979, 30.817091],\n              [107.760899, 30.862823],\n              [107.739957, 30.884396],\n              [107.693146, 30.875665],\n              [107.645103, 30.821202],\n              [107.57735, 30.847924],\n              [107.515756, 30.854603],\n              [107.483111, 30.838675],\n              [107.498509, 30.809381],\n              [107.454162, 30.771851],\n              [107.454162, 30.771851],\n              [107.424597, 30.74048],\n              [107.458473, 30.704981],\n              [107.477567, 30.664837],\n              [107.516987, 30.644759],\n              [107.485575, 30.598408],\n              [107.427676, 30.547397],\n              [107.443075, 30.53348],\n              [107.408582, 30.521623],\n              [107.368546, 30.468508],\n              [107.338981, 30.386459],\n              [107.288474, 30.337402],\n              [107.257677, 30.267131],\n              [107.221337, 30.213878],\n              [107.103076, 30.090198],\n              [107.080286, 30.094341],\n              [107.084598, 30.063786],\n              [107.058113, 30.043066],\n              [107.053801, 30.043584],\n              [107.02054, 30.036849],\n              [106.981736, 30.08502],\n              [106.980504, 30.087609],\n              [106.979888, 30.088127],\n              [106.978656, 30.087609],\n              [106.977425, 30.087609],\n              [106.976809, 30.088127],\n              [106.975577, 30.088127],\n              [106.976193, 30.083467],\n              [106.94478, 30.037367],\n              [106.913367, 30.025451],\n              [106.862244, 30.033223],\n              [106.83699, 30.049801],\n              [106.825904, 30.03115],\n              [106.825904, 30.03115],\n              [106.785252, 30.01716],\n              [106.732281, 30.027005],\n              [106.724274, 30.058607],\n              [106.699636, 30.074145],\n              [106.700252, 30.111944],\n              [106.672535, 30.122297],\n              [106.677462, 30.156974],\n              [106.631883, 30.186464],\n              [106.611557, 30.235596],\n              [106.612173, 30.235596],\n              [106.611557, 30.235596],\n              [106.612173, 30.235596],\n              [106.612173, 30.235596],\n              [106.612789, 30.235596],\n              [106.612789, 30.235596],\n              [106.642354, 30.246454],\n              [106.611557, 30.292455],\n              [106.560434, 30.31519],\n              [106.545035, 30.296589],\n              [106.49884, 30.295556],\n              [106.43971, 30.308473],\n              [106.428623, 30.254725],\n              [106.401521, 30.242318],\n              [106.349167, 30.24542],\n              [106.334384, 30.225772],\n              [106.306667, 30.238182],\n              [106.296196, 30.205603],\n              [106.264167, 30.20974],\n              [106.260471, 30.207672],\n              [106.260471, 30.204051],\n              [106.260471, 30.19681],\n              [106.232754, 30.185947],\n              [106.180399, 30.233011],\n              [106.168696, 30.303823],\n              [106.132356, 30.323972],\n              [106.132972, 30.30279],\n              [106.07261, 30.333786],\n              [106.031958, 30.373551],\n              [105.943263, 30.372002],\n              [105.900763, 30.405042],\n              [105.84656, 30.410203],\n              [105.825618, 30.436006],\n              [105.792357, 30.427234],\n              [105.760329, 30.384393],\n              [105.754785, 30.342567],\n              [105.714749, 30.322939],\n              [105.720292, 30.252657],\n              [105.720292, 30.252657],\n              [105.670401, 30.254208],\n              [105.624822, 30.275918],\n              [105.619894, 30.234045],\n              [105.662394, 30.210258],\n              [105.642684, 30.186464],\n              [105.56138, 30.183878],\n              [105.558916, 30.18543],\n              [105.556453, 30.187499],\n              [105.550909, 30.179222],\n              [105.536127, 30.152834],\n              [105.596489, 30.159043],\n              [105.574315, 30.130579],\n              [105.582938, 30.12385],\n              [105.642068, 30.101072],\n              [105.638988, 30.076216],\n              [105.676561, 30.06793],\n              [105.687032, 30.038922],\n              [105.719677, 30.042548],\n              [105.753553, 30.018196],\n              [105.723372, 29.975177],\n              [105.730763, 29.95755],\n              [105.70243, 29.924879],\n              [105.717213, 29.893753],\n              [105.738771, 29.891159],\n              [105.707974, 29.840818],\n              [105.610655, 29.837184],\n              [105.582938, 29.819013],\n              [105.574931, 29.744216],\n              [105.529351, 29.707836],\n              [105.481924, 29.718232],\n              [105.476996, 29.674564],\n              [105.419714, 29.688082],\n              [105.38091, 29.628275],\n              [105.347649, 29.621512],\n              [105.332867, 29.592374],\n              [105.296526, 29.571035],\n              [105.305149, 29.53199],\n              [105.337794, 29.459064],\n              [105.334099, 29.441345],\n              [105.387069, 29.455416],\n              [105.387069, 29.455416],\n              [105.372903, 29.421018],\n              [105.426489, 29.419454],\n              [105.441888, 29.400686],\n              [105.418482, 29.352185],\n              [105.42033, 29.31149],\n              [105.465294, 29.322969],\n              [105.459134, 29.288526],\n              [105.513337, 29.283306],\n              [105.521344, 29.264513],\n              [105.557684, 29.278608],\n              [105.631597, 29.280174],\n              [105.647612, 29.253027],\n              [105.695039, 29.287482],\n              [105.712285, 29.219082],\n              [105.703662, 29.176766],\n              [105.728916, 29.134432],\n              [105.752321, 29.129727],\n              [105.728916, 29.1062],\n              [105.757865, 29.069068],\n              [105.74185, 29.039249],\n              [105.766488, 29.013607],\n              [105.762176, 28.9911],\n              [105.801596, 28.958116],\n              [105.797285, 28.936121],\n              [105.830546, 28.944501],\n              [105.852719, 28.927217],\n              [105.910002, 28.920407],\n              [105.969132, 28.965971],\n              [106.001161, 28.973824],\n              [106.040581, 28.955498],\n              [106.049204, 28.906263],\n              [106.070762, 28.919884],\n              [106.101559, 28.898928],\n              [106.14837, 28.901548],\n              [106.173008, 28.920407],\n              [106.206885, 28.904691],\n              [106.264783, 28.845997],\n              [106.245689, 28.817686],\n              [106.267863, 28.779402],\n              [106.27279, 28.741103],\n              [106.305435, 28.704365],\n              [106.304203, 28.64976],\n              [106.346703, 28.583565],\n              [106.33192, 28.55308],\n              [106.37442, 28.525742],\n              [106.379348, 28.479986],\n              [106.349167, 28.473674],\n              [106.304819, 28.505233],\n              [106.2925, 28.537309],\n              [106.254928, 28.539412],\n              [106.184711, 28.58882],\n              [106.17116, 28.629275],\n              [106.14837, 28.642932],\n              [106.103407, 28.636104],\n              [106.085544, 28.681792],\n              [106.030726, 28.694917],\n              [106.001161, 28.743727],\n              [105.966668, 28.761041],\n              [105.937719, 28.686517],\n              [105.889676, 28.670765],\n              [105.884748, 28.595126],\n              [105.808372, 28.599855],\n              [105.78435, 28.610889],\n              [105.757249, 28.590397],\n              [105.74493, 28.616668],\n              [105.712901, 28.586718],\n              [105.693191, 28.58882],\n              [105.68272, 28.534154],\n              [105.62359, 28.517854],\n              [105.612503, 28.438947],\n              [105.643916, 28.431053],\n              [105.655003, 28.362615],\n              [105.639604, 28.324164],\n              [105.68888, 28.284119],\n              [105.730147, 28.271997],\n              [105.737539, 28.30309],\n              [105.76464, 28.308359],\n              [105.76464, 28.308359],\n              [105.78743, 28.335753],\n              [105.824386, 28.306251],\n              [105.848408, 28.255656],\n              [105.889676, 28.237732],\n              [105.860727, 28.159672],\n              [105.895219, 28.119565],\n              [105.943878, 28.143314],\n              [105.975907, 28.107952],\n              [106.093552, 28.162837],\n              [106.145291, 28.162837],\n              [106.206885, 28.134343],\n              [106.266631, 28.066769],\n              [106.246305, 28.011835],\n              [106.286341, 28.007079],\n              [106.328225, 27.952643],\n              [106.307899, 27.936782],\n              [106.304819, 27.899237],\n              [106.325145, 27.898708],\n              [106.337464, 27.859033],\n              [106.306667, 27.808756],\n              [106.242609, 27.767459],\n              [106.193334, 27.75422],\n              [106.120653, 27.779638],\n              [106.063987, 27.776991],\n              [106.023335, 27.746805],\n              [105.985146, 27.749983],\n              [105.92848, 27.729855],\n              [105.922937, 27.746805],\n              [105.868118, 27.732504],\n              [105.848408, 27.707074],\n              [105.76772, 27.7182],\n              [105.722756, 27.706015],\n              [105.720292, 27.683759],\n              [105.664242, 27.683759],\n              [105.62359, 27.666269],\n              [105.605112, 27.715552],\n              [105.560148, 27.71979],\n              [105.508409, 27.769048],\n              [105.44004, 27.775402],\n              [105.353809, 27.748924],\n              [105.308229, 27.704955],\n              [105.290367, 27.712373],\n              [105.293447, 27.770637],\n              [105.273736, 27.794992],\n              [105.313157, 27.810874],\n              [105.25957, 27.827811],\n              [105.233084, 27.895534],\n              [105.284823, 27.935725],\n              [105.270657, 27.99704],\n              [105.247867, 28.009193],\n              [105.218302, 27.990698],\n              [105.186273, 27.995454],\n              [105.167795, 28.021345],\n              [105.186889, 28.054623],\n              [105.168411, 28.071522],\n              [105.119752, 28.07205],\n              [105.061853, 28.096866],\n              [105.002107, 28.064129],\n              [104.980549, 28.063073],\n              [104.975006, 28.020816],\n              [104.903557, 27.962158],\n              [104.918339, 27.938897],\n              [104.888158, 27.914574],\n              [104.842579, 27.900294],\n              [104.796999, 27.901352],\n              [104.761891, 27.884426],\n              [104.743413, 27.901881],\n              [104.676275, 27.880723],\n              [104.63316, 27.850567],\n              [104.607906, 27.857974],\n              [104.573413, 27.840512],\n              [104.52537, 27.889187],\n              [104.508124, 27.878078],\n              [104.44961, 27.927794],\n              [104.40095, 27.952114],\n              [104.362762, 28.012891],\n              [104.30856, 28.036136],\n              [104.304248, 28.050926],\n              [104.373233, 28.051454],\n              [104.40095, 28.091586],\n              [104.448994, 28.113758],\n              [104.444682, 28.16231],\n              [104.406494, 28.173389],\n              [104.402182, 28.202928],\n              [104.442834, 28.211366],\n              [104.462544, 28.241422],\n              [104.44961, 28.269889],\n              [104.420045, 28.269889],\n              [104.392943, 28.291497],\n              [104.384936, 28.329959],\n              [104.343052, 28.334173],\n              [104.314103, 28.306778],\n              [104.282074, 28.343128],\n              [104.254357, 28.403683],\n              [104.267908, 28.499448],\n              [104.260516, 28.536257],\n              [104.323342, 28.540989],\n              [104.355987, 28.555183],\n              [104.375697, 28.5946],\n              [104.417581, 28.598279],\n              [104.425588, 28.626649],\n              [104.372617, 28.649235],\n              [104.314719, 28.615617],\n              [104.277147, 28.631902],\n              [104.252509, 28.660788],\n              [104.230951, 28.635579],\n              [104.170589, 28.642932],\n              [104.117618, 28.634003],\n              [104.09606, 28.603533],\n              [104.05972, 28.6277],\n              [103.953779, 28.600906],\n              [103.910047, 28.631377],\n              [103.887873, 28.61982],\n              [103.850917, 28.66709],\n              [103.833054, 28.605109],\n              [103.838598, 28.587244],\n              [103.802873, 28.563068],\n              [103.781931, 28.525216],\n              [103.829975, 28.459995],\n              [103.828743, 28.44],\n              [103.860156, 28.383677],\n              [103.85338, 28.356822],\n              [103.877402, 28.316262],\n              [103.828743, 28.285173],\n              [103.770845, 28.233514],\n              [103.740048, 28.23615],\n              [103.701859, 28.198709],\n              [103.692004, 28.232459],\n              [103.643961, 28.260401],\n              [103.573128, 28.230877],\n              [103.533092, 28.168641],\n              [103.470266, 28.122204],\n              [103.430846, 28.044587],\n              [103.459179, 28.021345],\n              [103.486281, 28.033495],\n              [103.515846, 27.965329],\n              [103.55465, 27.978543],\n              [103.502295, 27.910343],\n              [103.509686, 27.843687],\n              [103.487512, 27.794992],\n              [103.461027, 27.779638],\n              [103.393274, 27.709194],\n              [103.369868, 27.708664],\n              [103.349542, 27.678459],\n              [103.29226, 27.632872],\n              [103.2861, 27.561802],\n              [103.232514, 27.56976],\n              [103.19063, 27.523596],\n              [103.144434, 27.450331],\n              [103.141355, 27.420586],\n              [103.080992, 27.396679],\n              [103.055739, 27.40943],\n              [102.989833, 27.367983],\n              [102.941174, 27.405711],\n              [102.899906, 27.317481],\n              [102.883892, 27.299401],\n              [102.883276, 27.258444],\n              [102.904218, 27.227584],\n              [102.913457, 27.133886],\n              [102.870957, 27.026782],\n              [102.894979, 27.001724],\n              [102.896211, 26.91264],\n              [102.949181, 26.843244],\n              [102.966428, 26.837904],\n              [102.991681, 26.775409],\n              [102.983674, 26.76686],\n              [103.008312, 26.710741],\n              [103.005232, 26.679195],\n              [103.026174, 26.664221],\n              [103.035413, 26.556673],\n              [103.052659, 26.555602],\n              [103.052659, 26.514374],\n              [103.030485, 26.485989],\n              [102.989833, 26.482775],\n              [102.988602, 26.413117],\n              [102.998457, 26.371839],\n              [102.975667, 26.340736],\n              [102.893131, 26.338591],\n              [102.878964, 26.364332],\n              [102.833385, 26.306406],\n              [102.785342, 26.298895],\n              [102.739762, 26.268846],\n              [102.709581, 26.210336],\n              [102.659074, 26.221611],\n              [102.60056, 26.250598],\n              [102.638748, 26.307479],\n              [102.629509, 26.336982],\n              [102.570995, 26.362723],\n              [102.542046, 26.338591],\n              [102.440416, 26.300505],\n              [102.392372, 26.296749],\n              [102.349257, 26.244694],\n              [102.245163, 26.212483],\n              [102.242699, 26.190468],\n              [102.174946, 26.146961],\n              [102.152156, 26.10935],\n              [102.107808, 26.068501],\n              [102.080091, 26.065275],\n              [102.020961, 26.096451],\n              [101.954439, 26.084627],\n              [101.929186, 26.105588],\n              [101.899621, 26.099139],\n              [101.857737, 26.049146],\n              [101.835563, 26.04592],\n              [101.839875, 26.082477],\n              [101.796759, 26.114723],\n              [101.807846, 26.156093],\n              [101.773353, 26.168448],\n              [101.737013, 26.219463],\n              [101.690202, 26.241473],\n              [101.630455, 26.224832],\n              [101.586108, 26.279579],\n              [101.597195, 26.303187],\n              [101.64031, 26.318745],\n              [101.660636, 26.346635],\n              [101.635383, 26.357361],\n              [101.637847, 26.388995],\n              [101.565782, 26.454381],\n              [101.530057, 26.467239],\n              [101.506652, 26.499915],\n              [101.458608, 26.49563],\n              [101.422884, 26.53151],\n              [101.395783, 26.591998],\n              [101.402558, 26.604841],\n              [101.461688, 26.606447],\n              [101.461072, 26.640687],\n              [101.481398, 26.673313],\n              [101.453065, 26.692563],\n              [101.513427, 26.768463],\n              [101.466, 26.786629],\n              [101.445674, 26.77434],\n              [101.458608, 26.731054],\n              [101.435819, 26.740675],\n              [101.389623, 26.723036],\n              [101.387159, 26.753501],\n              [101.358826, 26.771669],\n              [101.399478, 26.841642],\n              [101.365602, 26.883819],\n              [101.311399, 26.903034],\n              [101.267667, 26.903034],\n              [101.264587, 26.955323],\n              [101.227015, 26.959057],\n              [101.228863, 26.981992],\n              [101.136472, 27.023584],\n              [101.157414, 27.094999],\n              [101.145095, 27.103523],\n              [101.170349, 27.175421],\n              [101.167885, 27.198311],\n            ],\n          ],\n          [\n            [\n              [106.264167, 30.20974],\n              [106.260471, 30.19681],\n              [106.260471, 30.204051],\n              [106.260471, 30.207672],\n              [106.264167, 30.20974],\n            ],\n          ],\n          [\n            [\n              [106.976809, 30.088127],\n              [106.977425, 30.087609],\n              [106.978656, 30.087609],\n              [106.979888, 30.088127],\n              [106.980504, 30.087609],\n              [106.981736, 30.08502],\n              [106.976193, 30.083467],\n              [106.975577, 30.088127],\n              [106.976809, 30.088127],\n            ],\n          ],\n          [\n            [\n              [105.558916, 30.18543],\n              [105.56138, 30.183878],\n              [105.550909, 30.179222],\n              [105.556453, 30.187499],\n              [105.558916, 30.18543],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 520000,\n        name: '贵州省',\n        center: [106.713478, 26.578343],\n        centroid: [106.880457, 26.826368],\n        childrenNum: 9,\n        level: 'province',\n        subFeatureIndex: 23,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [109.274262, 28.494714],\n              [109.260712, 28.46473],\n              [109.264407, 28.392628],\n              [109.289045, 28.373673],\n              [109.268719, 28.33786],\n              [109.275494, 28.313101],\n              [109.317994, 28.277795],\n              [109.33524, 28.293605],\n              [109.388211, 28.268307],\n              [109.367885, 28.254602],\n              [109.340168, 28.19027],\n              [109.33832, 28.141731],\n              [109.314298, 28.103729],\n              [109.298284, 28.036136],\n              [109.335856, 28.063073],\n              [109.378972, 28.034551],\n              [109.362342, 28.007608],\n              [109.319842, 27.988585],\n              [109.30198, 27.956343],\n              [109.32169, 27.868027],\n              [109.346943, 27.838396],\n              [109.332777, 27.782815],\n              [109.37774, 27.736741],\n              [109.366653, 27.721909],\n              [109.414081, 27.725087],\n              [109.470747, 27.680049],\n              [109.45658, 27.673689],\n              [109.470131, 27.62863],\n              [109.451037, 27.586204],\n              [109.461508, 27.567637],\n              [109.404841, 27.55066],\n              [109.303211, 27.47582],\n              [109.300132, 27.423774],\n              [109.245313, 27.41793],\n              [109.202197, 27.450331],\n              [109.167089, 27.41793],\n              [109.141835, 27.448207],\n              [109.142451, 27.418461],\n              [109.103647, 27.336621],\n              [109.044517, 27.331304],\n              [109.053756, 27.293551],\n              [108.983539, 27.26802],\n              [108.963213, 27.235565],\n              [108.907778, 27.204699],\n              [108.926873, 27.160512],\n              [108.878829, 27.106187],\n              [108.79075, 27.084343],\n              [108.877597, 27.01612],\n              [108.942887, 27.017186],\n              [108.942887, 27.017186],\n              [108.940423, 27.044907],\n              [109.007561, 27.08008],\n              [109.032814, 27.104056],\n              [109.128901, 27.122701],\n              [109.101183, 27.06889],\n              [109.165857, 27.066758],\n              [109.21698, 27.114711],\n              [109.239154, 27.14933],\n              [109.264407, 27.131755],\n              [109.33524, 27.139212],\n              [109.358646, 27.153058],\n              [109.415312, 27.154123],\n              [109.441182, 27.117907],\n              [109.472595, 27.134951],\n              [109.454733, 27.069423],\n              [109.486761, 27.053968],\n              [109.497848, 27.079548],\n              [109.520022, 27.058764],\n              [109.555131, 26.946788],\n              [109.436254, 26.892359],\n              [109.452885, 26.861932],\n              [109.467051, 26.83203],\n              [109.47629, 26.829894],\n              [109.486761, 26.759913],\n              [109.447957, 26.759913],\n              [109.407305, 26.719829],\n              [109.35495, 26.693098],\n              [109.283501, 26.698445],\n              [109.306291, 26.661012],\n              [109.334008, 26.646036],\n              [109.35495, 26.658873],\n              [109.390675, 26.598955],\n              [109.407305, 26.533116],\n              [109.381436, 26.518659],\n              [109.385747, 26.493487],\n              [109.362342, 26.472061],\n              [109.38082, 26.454381],\n              [109.319842, 26.418477],\n              [109.29582, 26.350389],\n              [109.271183, 26.327863],\n              [109.285965, 26.295676],\n              [109.325385, 26.29031],\n              [109.351255, 26.264016],\n              [109.369733, 26.277432],\n              [109.442414, 26.289774],\n              [109.467051, 26.313917],\n              [109.439334, 26.238789],\n              [109.47629, 26.148035],\n              [109.513863, 26.128157],\n              [109.502776, 26.096451],\n              [109.449805, 26.101826],\n              [109.452885, 26.055598],\n              [109.48245, 26.029788],\n              [109.462124, 25.995367],\n              [109.408537, 25.967392],\n              [109.435022, 25.93349],\n              [109.396834, 25.900117],\n              [109.359262, 25.836036],\n              [109.339552, 25.83442],\n              [109.327849, 25.76168],\n              [109.340168, 25.731493],\n              [109.296436, 25.71424],\n              [109.207125, 25.740119],\n              [109.206509, 25.788087],\n              [109.147995, 25.741736],\n              [109.13198, 25.762758],\n              [109.143683, 25.795092],\n              [109.095024, 25.80533],\n              [109.077778, 25.776771],\n              [109.048213, 25.790781],\n              [108.989698, 25.778926],\n              [108.999553, 25.765453],\n              [108.963829, 25.732572],\n              [108.940423, 25.740119],\n              [108.896076, 25.71424],\n              [108.900387, 25.682423],\n              [108.953974, 25.686738],\n              [108.953974, 25.686738],\n              [109.007561, 25.734728],\n              [109.043285, 25.738502],\n              [109.07901, 25.72071],\n              [109.075314, 25.693749],\n              [109.030966, 25.629556],\n              [109.051908, 25.566949],\n              [109.088249, 25.550752],\n              [109.024807, 25.51241],\n              [108.949046, 25.557231],\n              [108.8893, 25.543193],\n              [108.890532, 25.556151],\n              [108.826474, 25.550212],\n              [108.814772, 25.526992],\n              [108.781511, 25.554531],\n              [108.799989, 25.576666],\n              [108.783975, 25.628477],\n              [108.724844, 25.634952],\n              [108.68912, 25.623081],\n              [108.68604, 25.587462],\n              [108.660787, 25.584763],\n              [108.658323, 25.550212],\n              [108.68912, 25.533473],\n              [108.634917, 25.520512],\n              [108.6072, 25.491885],\n              [108.600425, 25.432448],\n              [108.62999, 25.335666],\n              [108.625062, 25.308076],\n              [108.589338, 25.335125],\n              [108.585642, 25.365952],\n              [108.471693, 25.458928],\n              [108.418723, 25.443257],\n              [108.400244, 25.491344],\n              [108.359592, 25.513491],\n              [108.348506, 25.536173],\n              [108.308469, 25.525912],\n              [108.280752, 25.48],\n              [108.241332, 25.46217],\n              [108.251803, 25.430286],\n              [108.192673, 25.458928],\n              [108.162492, 25.444878],\n              [108.193289, 25.405421],\n              [108.142782, 25.390825],\n              [108.152021, 25.324306],\n              [108.143398, 25.269658],\n              [108.115065, 25.210112],\n              [108.080572, 25.193867],\n              [108.001732, 25.196574],\n              [107.928435, 25.155954],\n              [107.872384, 25.141327],\n              [107.839124, 25.115861],\n              [107.762747, 25.125073],\n              [107.789233, 25.15487],\n              [107.760283, 25.188451],\n              [107.762131, 25.229061],\n              [107.741805, 25.24043],\n              [107.700537, 25.194408],\n              [107.696226, 25.219858],\n              [107.661733, 25.258833],\n              [107.659885, 25.316192],\n              [107.632168, 25.310241],\n              [107.599523, 25.250714],\n              [107.576734, 25.256668],\n              [107.512676, 25.209029],\n              [107.472024, 25.213902],\n              [107.489886, 25.276693],\n              [107.481263, 25.299961],\n              [107.432604, 25.289139],\n              [107.409198, 25.347024],\n              [107.420901, 25.392987],\n              [107.375937, 25.411908],\n              [107.358691, 25.393528],\n              [107.318039, 25.401637],\n              [107.308184, 25.432988],\n              [107.336517, 25.461089],\n              [107.263836, 25.543193],\n              [107.232423, 25.556691],\n              [107.228728, 25.604733],\n              [107.205322, 25.607971],\n              [107.185612, 25.578825],\n              [107.064272, 25.559391],\n              [107.066736, 25.50917],\n              [107.015613, 25.495666],\n              [106.996519, 25.442716],\n              [106.963874, 25.437852],\n              [106.987896, 25.358922],\n              [107.012533, 25.352973],\n              [107.013765, 25.275611],\n              [106.975577, 25.232851],\n              [106.933077, 25.250714],\n              [106.904128, 25.231768],\n              [106.888113, 25.181953],\n              [106.853005, 25.186827],\n              [106.787715, 25.17112],\n              [106.764926, 25.183036],\n              [106.732281, 25.162454],\n              [106.691013, 25.179245],\n              [106.644817, 25.164621],\n              [106.63989, 25.132658],\n              [106.590615, 25.08768],\n              [106.551195, 25.082802],\n              [106.519782, 25.054072],\n              [106.450181, 25.033468],\n              [106.442173, 25.019369],\n              [106.332536, 24.988454],\n              [106.304819, 24.973807],\n              [106.253696, 24.971094],\n              [106.215508, 24.981944],\n              [106.191486, 24.95319],\n              [106.145291, 24.954275],\n              [106.197645, 24.885889],\n              [106.206269, 24.851139],\n              [106.173008, 24.760417],\n              [106.150218, 24.762591],\n              [106.113878, 24.714216],\n              [106.047356, 24.684312],\n              [106.024566, 24.633186],\n              [105.961741, 24.677786],\n              [105.942031, 24.725088],\n              [105.863806, 24.729437],\n              [105.827466, 24.702799],\n              [105.767104, 24.719109],\n              [105.70551, 24.768569],\n              [105.617431, 24.78161],\n              [105.607576, 24.803885],\n              [105.573083, 24.797366],\n              [105.497322, 24.809318],\n              [105.493011, 24.833217],\n              [105.457286, 24.87123],\n              [105.428337, 24.930941],\n              [105.365511, 24.943423],\n              [105.334099, 24.9266],\n              [105.267577, 24.929313],\n              [105.251563, 24.967296],\n              [105.212758, 24.995505],\n              [105.178266, 24.985199],\n              [105.157324, 24.958616],\n              [105.131454, 24.959701],\n              [105.09573, 24.92877],\n              [105.077868, 24.918459],\n              [105.039064, 24.872859],\n              [105.026745, 24.815836],\n              [105.03352, 24.787586],\n              [104.899245, 24.752809],\n              [104.865985, 24.730524],\n              [104.841963, 24.676155],\n              [104.771746, 24.659839],\n              [104.729246, 24.617953],\n              [104.703377, 24.645698],\n              [104.628848, 24.660927],\n              [104.595587, 24.709323],\n              [104.529682, 24.731611],\n              [104.542616, 24.75607],\n              [104.539537, 24.813663],\n              [104.586964, 24.872859],\n              [104.635623, 24.903803],\n              [104.663957, 24.964584],\n              [104.713232, 24.996048],\n              [104.684898, 25.054072],\n              [104.619609, 25.060577],\n              [104.685514, 25.078466],\n              [104.695369, 25.122364],\n              [104.732326, 25.167871],\n              [104.724319, 25.195491],\n              [104.753884, 25.214443],\n              [104.801927, 25.163537],\n              [104.822869, 25.170037],\n              [104.806854, 25.224189],\n              [104.826565, 25.235558],\n              [104.816094, 25.262622],\n              [104.736021, 25.268034],\n              [104.689826, 25.296173],\n              [104.639935, 25.295632],\n              [104.646094, 25.356759],\n              [104.615913, 25.364871],\n              [104.566638, 25.402719],\n              [104.543232, 25.400556],\n              [104.556783, 25.524832],\n              [104.524138, 25.526992],\n              [104.483486, 25.494585],\n              [104.44961, 25.495126],\n              [104.434827, 25.472436],\n              [104.418813, 25.499447],\n              [104.436059, 25.520512],\n              [104.428668, 25.576126],\n              [104.389248, 25.595558],\n              [104.332581, 25.598796],\n              [104.310407, 25.647901],\n              [104.328886, 25.760602],\n              [104.370769, 25.730415],\n              [104.397871, 25.76168],\n              [104.42374, 25.841961],\n              [104.441602, 25.868889],\n              [104.414501, 25.909807],\n              [104.438523, 25.92757],\n              [104.470552, 26.009352],\n              [104.460081, 26.085702],\n              [104.499501, 26.070651],\n              [104.52845, 26.114186],\n              [104.518595, 26.165762],\n              [104.548776, 26.226979],\n              [104.542616, 26.253282],\n              [104.592508, 26.317672],\n              [104.659645, 26.335373],\n              [104.684283, 26.3772],\n              [104.664572, 26.397572],\n              [104.665804, 26.434019],\n              [104.631928, 26.451702],\n              [104.638703, 26.477954],\n              [104.598667, 26.520801],\n              [104.57095, 26.524549],\n              [104.579573, 26.568449],\n              [104.556783, 26.590393],\n              [104.488414, 26.579689],\n              [104.459465, 26.602701],\n              [104.468088, 26.644431],\n              [104.424356, 26.709137],\n              [104.398487, 26.686147],\n              [104.353523, 26.620893],\n              [104.313487, 26.612867],\n              [104.274683, 26.633733],\n              [104.268524, 26.617683],\n              [104.222328, 26.620358],\n              [104.160734, 26.646571],\n              [104.121314, 26.638012],\n              [104.068343, 26.573266],\n              [104.067727, 26.51491],\n              [104.008597, 26.511697],\n              [103.953163, 26.521336],\n              [103.865699, 26.512232],\n              [103.819504, 26.529903],\n              [103.815808, 26.55239],\n              [103.763453, 26.585041],\n              [103.748671, 26.623568],\n              [103.759142, 26.689355],\n              [103.773308, 26.716621],\n              [103.725265, 26.742812],\n              [103.705555, 26.794642],\n              [103.722185, 26.851253],\n              [103.779468, 26.87421],\n              [103.763453, 26.905702],\n              [103.775156, 26.951056],\n              [103.753598, 26.963858],\n              [103.73204, 27.018785],\n              [103.704939, 27.049171],\n              [103.675374, 27.051836],\n              [103.623019, 27.007056],\n              [103.623635, 27.035312],\n              [103.601461, 27.061962],\n              [103.614396, 27.079548],\n              [103.659975, 27.065692],\n              [103.652584, 27.092868],\n              [103.620555, 27.096598],\n              [103.63349, 27.12057],\n              [103.696316, 27.126429],\n              [103.748671, 27.210021],\n              [103.801641, 27.250464],\n              [103.80041, 27.26536],\n              [103.865699, 27.28185],\n              [103.874322, 27.331304],\n              [103.903271, 27.347785],\n              [103.905119, 27.38552],\n              [103.932221, 27.443958],\n              [103.956242, 27.425367],\n              [104.015372, 27.429086],\n              [104.01722, 27.383926],\n              [104.084358, 27.330773],\n              [104.113923, 27.338216],\n              [104.173053, 27.263232],\n              [104.210625, 27.297273],\n              [104.248813, 27.291955],\n              [104.247582, 27.336621],\n              [104.295625, 27.37436],\n              [104.30856, 27.407305],\n              [104.363378, 27.467855],\n              [104.467472, 27.414211],\n              [104.497037, 27.414743],\n              [104.539537, 27.327583],\n              [104.570334, 27.331836],\n              [104.611602, 27.306846],\n              [104.7545, 27.345658],\n              [104.77113, 27.317481],\n              [104.824717, 27.3531],\n              [104.856746, 27.332368],\n              [104.851818, 27.299401],\n              [104.871528, 27.290891],\n              [104.913412, 27.327051],\n              [105.01073, 27.379143],\n              [105.068013, 27.418461],\n              [105.120984, 27.418461],\n              [105.184425, 27.392959],\n              [105.182577, 27.367451],\n              [105.233084, 27.436522],\n              [105.234316, 27.489093],\n              [105.260186, 27.514573],\n              [105.232469, 27.546945],\n              [105.25649, 27.582491],\n              [105.304533, 27.611661],\n              [105.29591, 27.631811],\n              [105.308229, 27.704955],\n              [105.353809, 27.748924],\n              [105.44004, 27.775402],\n              [105.508409, 27.769048],\n              [105.560148, 27.71979],\n              [105.605112, 27.715552],\n              [105.62359, 27.666269],\n              [105.664242, 27.683759],\n              [105.720292, 27.683759],\n              [105.722756, 27.706015],\n              [105.76772, 27.7182],\n              [105.848408, 27.707074],\n              [105.868118, 27.732504],\n              [105.922937, 27.746805],\n              [105.92848, 27.729855],\n              [105.985146, 27.749983],\n              [106.023335, 27.746805],\n              [106.063987, 27.776991],\n              [106.120653, 27.779638],\n              [106.193334, 27.75422],\n              [106.242609, 27.767459],\n              [106.306667, 27.808756],\n              [106.337464, 27.859033],\n              [106.325145, 27.898708],\n              [106.304819, 27.899237],\n              [106.307899, 27.936782],\n              [106.328225, 27.952643],\n              [106.286341, 28.007079],\n              [106.246305, 28.011835],\n              [106.266631, 28.066769],\n              [106.206885, 28.134343],\n              [106.145291, 28.162837],\n              [106.093552, 28.162837],\n              [105.975907, 28.107952],\n              [105.943878, 28.143314],\n              [105.895219, 28.119565],\n              [105.860727, 28.159672],\n              [105.889676, 28.237732],\n              [105.848408, 28.255656],\n              [105.824386, 28.306251],\n              [105.78743, 28.335753],\n              [105.76464, 28.308359],\n              [105.76464, 28.308359],\n              [105.737539, 28.30309],\n              [105.730147, 28.271997],\n              [105.68888, 28.284119],\n              [105.639604, 28.324164],\n              [105.655003, 28.362615],\n              [105.643916, 28.431053],\n              [105.612503, 28.438947],\n              [105.62359, 28.517854],\n              [105.68272, 28.534154],\n              [105.693191, 28.58882],\n              [105.712901, 28.586718],\n              [105.74493, 28.616668],\n              [105.757249, 28.590397],\n              [105.78435, 28.610889],\n              [105.808372, 28.599855],\n              [105.884748, 28.595126],\n              [105.889676, 28.670765],\n              [105.937719, 28.686517],\n              [105.966668, 28.761041],\n              [106.001161, 28.743727],\n              [106.030726, 28.694917],\n              [106.085544, 28.681792],\n              [106.103407, 28.636104],\n              [106.14837, 28.642932],\n              [106.17116, 28.629275],\n              [106.184711, 28.58882],\n              [106.254928, 28.539412],\n              [106.2925, 28.537309],\n              [106.304819, 28.505233],\n              [106.349167, 28.473674],\n              [106.379348, 28.479986],\n              [106.37442, 28.525742],\n              [106.403369, 28.569901],\n              [106.477282, 28.530474],\n              [106.504999, 28.544669],\n              [106.466811, 28.586193],\n              [106.49268, 28.591448],\n              [106.502535, 28.661313],\n              [106.528405, 28.677591],\n              [106.492064, 28.742153],\n              [106.461883, 28.761041],\n              [106.45326, 28.817162],\n              [106.474202, 28.832891],\n              [106.561666, 28.756319],\n              [106.56105, 28.719062],\n              [106.587535, 28.691767],\n              [106.6171, 28.691242],\n              [106.617716, 28.66709],\n              [106.651593, 28.649235],\n              [106.618332, 28.645033],\n              [106.63681, 28.622972],\n              [106.606629, 28.593024],\n              [106.615252, 28.549401],\n              [106.567825, 28.523638],\n              [106.564745, 28.485247],\n              [106.632499, 28.503655],\n              [106.697788, 28.47683],\n              [106.708259, 28.450524],\n              [106.747063, 28.467361],\n              [106.726121, 28.51838],\n              [106.73844, 28.554657],\n              [106.77786, 28.563068],\n              [106.756918, 28.607211],\n              [106.784636, 28.626649],\n              [106.807425, 28.589346],\n              [106.830831, 28.623497],\n              [106.866556, 28.624548],\n              [106.889345, 28.695966],\n              [106.86594, 28.690192],\n              [106.824056, 28.756319],\n              [106.845614, 28.780975],\n              [106.872099, 28.777304],\n              [106.923222, 28.809821],\n              [106.951555, 28.766812],\n              [106.988512, 28.776254],\n              [106.983584, 28.851239],\n              [107.019308, 28.861722],\n              [107.016229, 28.882685],\n              [107.14188, 28.887925],\n              [107.206554, 28.868535],\n              [107.194851, 28.838134],\n              [107.227496, 28.836037],\n              [107.210866, 28.817686],\n              [107.219489, 28.772582],\n              [107.24659, 28.76209],\n              [107.261373, 28.792514],\n              [107.327894, 28.810869],\n              [107.339597, 28.845997],\n              [107.383945, 28.848618],\n              [107.41351, 28.911502],\n              [107.441227, 28.943977],\n              [107.412894, 28.960211],\n              [107.396879, 28.993718],\n              [107.364235, 29.00942],\n              [107.395647, 29.041341],\n              [107.369778, 29.091558],\n              [107.412278, 29.094696],\n              [107.427676, 29.128682],\n              [107.408582, 29.138091],\n              [107.401807, 29.184603],\n              [107.441227, 29.203934],\n              [107.486806, 29.174153],\n              [107.570574, 29.218037],\n              [107.589052, 29.150113],\n              [107.605683, 29.164747],\n              [107.659885, 29.162656],\n              [107.700537, 29.141228],\n              [107.749197, 29.199754],\n              [107.810791, 29.139137],\n              [107.784921, 29.048143],\n              [107.823725, 29.034016],\n              [107.810175, 28.984295],\n              [107.867457, 28.960211],\n              [107.882855, 29.00628],\n              [107.908725, 29.007327],\n              [107.925971, 29.032446],\n              [108.026369, 29.039772],\n              [108.070717, 29.086328],\n              [108.150173, 29.053375],\n              [108.193289, 29.072207],\n              [108.256115, 29.040295],\n              [108.277673, 29.091558],\n              [108.306622, 29.079006],\n              [108.297999, 29.045527],\n              [108.319556, 28.961258],\n              [108.345426, 28.943453],\n              [108.357745, 28.893165],\n              [108.346658, 28.859625],\n              [108.352817, 28.815589],\n              [108.386078, 28.803003],\n              [108.385462, 28.772058],\n              [108.347274, 28.736381],\n              [108.332491, 28.679166],\n              [108.439049, 28.634003],\n              [108.501258, 28.626649],\n              [108.50249, 28.63768],\n              [108.575787, 28.659738],\n              [108.636149, 28.621396],\n              [108.604736, 28.590922],\n              [108.610896, 28.539412],\n              [108.573939, 28.531],\n              [108.586874, 28.463678],\n              [108.609664, 28.43579],\n              [108.609048, 28.407368],\n              [108.576403, 28.38631],\n              [108.580099, 28.343128],\n              [108.611512, 28.324691],\n              [108.667562, 28.334173],\n              [108.656475, 28.359981],\n              [108.697127, 28.401051],\n              [108.688504, 28.422106],\n              [108.640461, 28.456838],\n              [108.657091, 28.47683],\n              [108.700207, 28.48209],\n              [108.709446, 28.501026],\n              [108.746402, 28.45105],\n              [108.780279, 28.42579],\n              [108.759953, 28.389995],\n              [108.783359, 28.380518],\n              [108.761801, 28.304143],\n              [108.726692, 28.282011],\n              [108.738395, 28.228241],\n              [108.772888, 28.212949],\n              [108.821547, 28.245113],\n              [108.855424, 28.199764],\n              [108.89546, 28.219804],\n              [108.923793, 28.217167],\n              [108.929952, 28.19027],\n              [109.005713, 28.162837],\n              [109.026655, 28.220331],\n              [109.086401, 28.184467],\n              [109.101799, 28.202401],\n              [109.081473, 28.247749],\n              [109.117198, 28.277795],\n              [109.152306, 28.349975],\n              [109.153538, 28.417369],\n              [109.191726, 28.471043],\n              [109.23361, 28.474726],\n              [109.274262, 28.494714],\n            ],\n          ],\n          [\n            [\n              [109.47629, 26.829894],\n              [109.467051, 26.83203],\n              [109.452885, 26.861932],\n              [109.486761, 26.895562],\n              [109.509551, 26.877947],\n              [109.513247, 26.84004],\n              [109.497232, 26.815474],\n              [109.522486, 26.749226],\n              [109.52187, 26.749226],\n              [109.486761, 26.759913],\n              [109.47629, 26.829894],\n            ],\n          ],\n          [\n            [\n              [109.528645, 26.743881],\n              [109.554515, 26.73533],\n              [109.597015, 26.756173],\n              [109.568065, 26.726243],\n              [109.528645, 26.743881],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 530000,\n        name: '云南省',\n        center: [102.712251, 25.040609],\n        centroid: [101.485106, 25.008644],\n        childrenNum: 16,\n        level: 'province',\n        subFeatureIndex: 24,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [105.308229, 27.704955],\n              [105.29591, 27.631811],\n              [105.304533, 27.611661],\n              [105.25649, 27.582491],\n              [105.232469, 27.546945],\n              [105.260186, 27.514573],\n              [105.234316, 27.489093],\n              [105.233084, 27.436522],\n              [105.182577, 27.367451],\n              [105.184425, 27.392959],\n              [105.120984, 27.418461],\n              [105.068013, 27.418461],\n              [105.01073, 27.379143],\n              [104.913412, 27.327051],\n              [104.871528, 27.290891],\n              [104.851818, 27.299401],\n              [104.856746, 27.332368],\n              [104.824717, 27.3531],\n              [104.77113, 27.317481],\n              [104.7545, 27.345658],\n              [104.611602, 27.306846],\n              [104.570334, 27.331836],\n              [104.539537, 27.327583],\n              [104.497037, 27.414743],\n              [104.467472, 27.414211],\n              [104.363378, 27.467855],\n              [104.30856, 27.407305],\n              [104.295625, 27.37436],\n              [104.247582, 27.336621],\n              [104.248813, 27.291955],\n              [104.210625, 27.297273],\n              [104.173053, 27.263232],\n              [104.113923, 27.338216],\n              [104.084358, 27.330773],\n              [104.01722, 27.383926],\n              [104.015372, 27.429086],\n              [103.956242, 27.425367],\n              [103.932221, 27.443958],\n              [103.905119, 27.38552],\n              [103.903271, 27.347785],\n              [103.874322, 27.331304],\n              [103.865699, 27.28185],\n              [103.80041, 27.26536],\n              [103.801641, 27.250464],\n              [103.748671, 27.210021],\n              [103.696316, 27.126429],\n              [103.63349, 27.12057],\n              [103.620555, 27.096598],\n              [103.652584, 27.092868],\n              [103.659975, 27.065692],\n              [103.614396, 27.079548],\n              [103.601461, 27.061962],\n              [103.623635, 27.035312],\n              [103.623019, 27.007056],\n              [103.675374, 27.051836],\n              [103.704939, 27.049171],\n              [103.73204, 27.018785],\n              [103.753598, 26.963858],\n              [103.775156, 26.951056],\n              [103.763453, 26.905702],\n              [103.779468, 26.87421],\n              [103.722185, 26.851253],\n              [103.705555, 26.794642],\n              [103.725265, 26.742812],\n              [103.773308, 26.716621],\n              [103.759142, 26.689355],\n              [103.748671, 26.623568],\n              [103.763453, 26.585041],\n              [103.815808, 26.55239],\n              [103.819504, 26.529903],\n              [103.865699, 26.512232],\n              [103.953163, 26.521336],\n              [104.008597, 26.511697],\n              [104.067727, 26.51491],\n              [104.068343, 26.573266],\n              [104.121314, 26.638012],\n              [104.160734, 26.646571],\n              [104.222328, 26.620358],\n              [104.268524, 26.617683],\n              [104.274683, 26.633733],\n              [104.313487, 26.612867],\n              [104.353523, 26.620893],\n              [104.398487, 26.686147],\n              [104.424356, 26.709137],\n              [104.468088, 26.644431],\n              [104.459465, 26.602701],\n              [104.488414, 26.579689],\n              [104.556783, 26.590393],\n              [104.579573, 26.568449],\n              [104.57095, 26.524549],\n              [104.598667, 26.520801],\n              [104.638703, 26.477954],\n              [104.631928, 26.451702],\n              [104.665804, 26.434019],\n              [104.664572, 26.397572],\n              [104.684283, 26.3772],\n              [104.659645, 26.335373],\n              [104.592508, 26.317672],\n              [104.542616, 26.253282],\n              [104.548776, 26.226979],\n              [104.518595, 26.165762],\n              [104.52845, 26.114186],\n              [104.499501, 26.070651],\n              [104.460081, 26.085702],\n              [104.470552, 26.009352],\n              [104.438523, 25.92757],\n              [104.414501, 25.909807],\n              [104.441602, 25.868889],\n              [104.42374, 25.841961],\n              [104.397871, 25.76168],\n              [104.370769, 25.730415],\n              [104.328886, 25.760602],\n              [104.310407, 25.647901],\n              [104.332581, 25.598796],\n              [104.389248, 25.595558],\n              [104.428668, 25.576126],\n              [104.436059, 25.520512],\n              [104.418813, 25.499447],\n              [104.434827, 25.472436],\n              [104.44961, 25.495126],\n              [104.483486, 25.494585],\n              [104.524138, 25.526992],\n              [104.556783, 25.524832],\n              [104.543232, 25.400556],\n              [104.566638, 25.402719],\n              [104.615913, 25.364871],\n              [104.646094, 25.356759],\n              [104.639935, 25.295632],\n              [104.689826, 25.296173],\n              [104.736021, 25.268034],\n              [104.816094, 25.262622],\n              [104.826565, 25.235558],\n              [104.806854, 25.224189],\n              [104.822869, 25.170037],\n              [104.801927, 25.163537],\n              [104.753884, 25.214443],\n              [104.724319, 25.195491],\n              [104.732326, 25.167871],\n              [104.695369, 25.122364],\n              [104.685514, 25.078466],\n              [104.619609, 25.060577],\n              [104.684898, 25.054072],\n              [104.713232, 24.996048],\n              [104.663957, 24.964584],\n              [104.635623, 24.903803],\n              [104.586964, 24.872859],\n              [104.539537, 24.813663],\n              [104.542616, 24.75607],\n              [104.529682, 24.731611],\n              [104.489646, 24.653313],\n              [104.520443, 24.535228],\n              [104.550008, 24.518894],\n              [104.575877, 24.424661],\n              [104.616529, 24.421937],\n              [104.63008, 24.397958],\n              [104.610986, 24.377246],\n              [104.641783, 24.367979],\n              [104.70892, 24.321087],\n              [104.721239, 24.340173],\n              [104.703377, 24.419757],\n              [104.715695, 24.441552],\n              [104.74834, 24.435559],\n              [104.765587, 24.45953],\n              [104.784681, 24.443732],\n              [104.83642, 24.446456],\n              [104.914028, 24.426296],\n              [104.930042, 24.411038],\n              [104.979933, 24.412673],\n              [105.042759, 24.442097],\n              [105.106817, 24.414853],\n              [105.111744, 24.37234],\n              [105.138846, 24.376701],\n              [105.188121, 24.347261],\n              [105.196744, 24.326541],\n              [105.164715, 24.288362],\n              [105.215222, 24.214699],\n              [105.24294, 24.208695],\n              [105.229389, 24.165567],\n              [105.182577, 24.167205],\n              [105.20044, 24.105491],\n              [105.260186, 24.061236],\n              [105.292831, 24.074896],\n              [105.273121, 24.092927],\n              [105.320548, 24.116416],\n              [105.334099, 24.094566],\n              [105.395692, 24.065607],\n              [105.406163, 24.043748],\n              [105.493011, 24.016965],\n              [105.533663, 24.130071],\n              [105.594641, 24.137718],\n              [105.628518, 24.126794],\n              [105.649459, 24.032816],\n              [105.704278, 24.0667],\n              [105.739387, 24.059596],\n              [105.765256, 24.073804],\n              [105.802212, 24.051945],\n              [105.796669, 24.023524],\n              [105.841633, 24.03063],\n              [105.859495, 24.056864],\n              [105.89214, 24.040468],\n              [105.908154, 24.069432],\n              [105.901995, 24.099482],\n              [105.919241, 24.122425],\n              [105.963589, 24.110954],\n              [105.998081, 24.120786],\n              [106.011632, 24.099482],\n              [106.04982, 24.089649],\n              [106.053516, 24.051399],\n              [106.096631, 24.018058],\n              [106.091088, 23.998924],\n              [106.128044, 23.956819],\n              [106.157609, 23.891174],\n              [106.192718, 23.879135],\n              [106.173008, 23.861622],\n              [106.192102, 23.824947],\n              [106.136667, 23.795381],\n              [106.157609, 23.724175],\n              [106.149602, 23.665538],\n              [106.120653, 23.605229],\n              [106.141595, 23.569579],\n              [106.08616, 23.524043],\n              [106.071994, 23.495506],\n              [106.039965, 23.484529],\n              [105.999929, 23.447748],\n              [105.986378, 23.489469],\n              [105.935871, 23.508678],\n              [105.913081, 23.499348],\n              [105.89214, 23.52514],\n              [105.852103, 23.526786],\n              [105.815763, 23.507031],\n              [105.805908, 23.467512],\n              [105.758481, 23.459826],\n              [105.699966, 23.40162],\n              [105.637757, 23.404366],\n              [105.694423, 23.363168],\n              [105.699966, 23.327453],\n              [105.649459, 23.346136],\n              [105.593409, 23.312614],\n              [105.560148, 23.257093],\n              [105.526272, 23.234548],\n              [105.542902, 23.184495],\n              [105.50225, 23.202648],\n              [105.445584, 23.292827],\n              [105.416018, 23.283482],\n              [105.372903, 23.317561],\n              [105.353809, 23.362069],\n              [105.325475, 23.390086],\n              [105.260186, 23.31811],\n              [105.238012, 23.26424],\n              [105.181962, 23.279084],\n              [105.122215, 23.247745],\n              [105.093266, 23.260942],\n              [104.958991, 23.188896],\n              [104.949136, 23.152033],\n              [104.912796, 23.175693],\n              [104.882615, 23.163589],\n              [104.874608, 23.123417],\n              [104.804391, 23.110207],\n              [104.821021, 23.032022],\n              [104.860441, 22.970874],\n              [104.846275, 22.926235],\n              [104.772362, 22.893711],\n              [104.760659, 22.862282],\n              [104.732942, 22.852356],\n              [104.737869, 22.825882],\n              [104.674428, 22.817056],\n              [104.596203, 22.846289],\n              [104.527834, 22.814298],\n              [104.498885, 22.774574],\n              [104.422508, 22.734838],\n              [104.375697, 22.690122],\n              [104.323342, 22.728767],\n              [104.272835, 22.73815],\n              [104.256821, 22.77347],\n              [104.274067, 22.828088],\n              [104.261748, 22.841877],\n              [104.224176, 22.826434],\n              [104.117618, 22.808781],\n              [104.089901, 22.768504],\n              [104.045553, 22.728215],\n              [104.04309, 22.67687],\n              [104.022148, 22.593463],\n              [104.009213, 22.575228],\n              [104.009213, 22.517745],\n              [103.964865, 22.502265],\n              [103.894032, 22.564728],\n              [103.875554, 22.565833],\n              [103.863851, 22.584069],\n              [103.825047, 22.615562],\n              [103.766533, 22.688465],\n              [103.669215, 22.766297],\n              [103.642113, 22.794989],\n              [103.567585, 22.701164],\n              [103.580519, 22.66693],\n              [103.529396, 22.59291],\n              [103.50907, 22.601198],\n              [103.457947, 22.658646],\n              [103.436389, 22.6973],\n              [103.441317, 22.753052],\n              [103.375411, 22.794989],\n              [103.323057, 22.807678],\n              [103.321209, 22.777885],\n              [103.288564, 22.732078],\n              [103.283021, 22.678526],\n              [103.220195, 22.643734],\n              [103.195557, 22.648153],\n              [103.161065, 22.590147],\n              [103.183238, 22.558649],\n              [103.119181, 22.518298],\n              [103.085304, 22.509452],\n              [103.071753, 22.445304],\n              [103.030485, 22.441432],\n              [102.986754, 22.477935],\n              [102.930703, 22.482359],\n              [102.892515, 22.533223],\n              [102.880196, 22.586832],\n              [102.82353, 22.623296],\n              [102.80074, 22.620534],\n              [102.688639, 22.70006],\n              [102.657226, 22.687913],\n              [102.607335, 22.730975],\n              [102.569763, 22.701164],\n              [102.551285, 22.743669],\n              [102.498314, 22.777885],\n              [102.45951, 22.762986],\n              [102.43672, 22.699508],\n              [102.384365, 22.679631],\n              [102.404691, 22.629925],\n              [102.356648, 22.563623],\n              [102.322771, 22.554227],\n              [102.25625, 22.457473],\n              [102.270416, 22.419858],\n              [102.179257, 22.430369],\n              [102.145381, 22.397727],\n              [102.131214, 22.430922],\n              [102.046214, 22.458026],\n              [101.978461, 22.427603],\n              [101.907628, 22.437007],\n              [101.901469, 22.384447],\n              [101.862665, 22.389427],\n              [101.823244, 22.42705],\n              [101.824476, 22.45692],\n              [101.774585, 22.506135],\n              [101.715455, 22.477935],\n              [101.672339, 22.47517],\n              [101.648318, 22.400494],\n              [101.671723, 22.372826],\n              [101.625528, 22.28259],\n              [101.56455, 22.269299],\n              [101.547304, 22.238282],\n              [101.596579, 22.161262],\n              [101.602738, 22.131883],\n              [101.573789, 22.115251],\n              [101.626144, 22.005986],\n              [101.606434, 21.967695],\n              [101.666796, 21.934391],\n              [101.701288, 21.938832],\n              [101.700057, 21.897191],\n              [101.735165, 21.875534],\n              [101.740093, 21.845541],\n              [101.771506, 21.833319],\n              [101.747484, 21.729953],\n              [101.76781, 21.716054],\n              [101.780129, 21.640975],\n              [101.807846, 21.644313],\n              [101.828788, 21.617054],\n              [101.804766, 21.577546],\n              [101.754875, 21.58478],\n              [101.755491, 21.538027],\n              [101.772737, 21.512975],\n              [101.741324, 21.482906],\n              [101.749948, 21.409379],\n              [101.730238, 21.336929],\n              [101.745636, 21.297345],\n              [101.791832, 21.285636],\n              [101.833715, 21.252731],\n              [101.834331, 21.204756],\n              [101.794911, 21.208104],\n              [101.76473, 21.147835],\n              [101.703136, 21.14616],\n              [101.672339, 21.194713],\n              [101.605818, 21.172392],\n              [101.588572, 21.191365],\n              [101.601506, 21.233208],\n              [101.532521, 21.252174],\n              [101.439514, 21.227072],\n              [101.387775, 21.225956],\n              [101.290457, 21.17853],\n              [101.222088, 21.234324],\n              [101.246725, 21.275598],\n              [101.244877, 21.302364],\n              [101.183899, 21.334699],\n              [101.142631, 21.409379],\n              [101.194986, 21.424979],\n              [101.193138, 21.473996],\n              [101.225167, 21.499055],\n              [101.210385, 21.509077],\n              [101.209153, 21.55751],\n              [101.146943, 21.560293],\n              [101.169117, 21.590345],\n              [101.153102, 21.669343],\n              [101.116762, 21.691032],\n              [101.111835, 21.746074],\n              [101.123537, 21.771642],\n              [101.089661, 21.773865],\n              [101.015132, 21.707157],\n              [100.940603, 21.697149],\n              [100.870386, 21.67268],\n              [100.847597, 21.634856],\n              [100.804481, 21.609821],\n              [100.789082, 21.570867],\n              [100.753358, 21.555283],\n              [100.730568, 21.518542],\n              [100.691764, 21.510748],\n              [100.579047, 21.451717],\n              [100.526692, 21.471211],\n              [100.48296, 21.458958],\n              [100.437381, 21.533017],\n              [100.350534, 21.52912],\n              [100.298795, 21.477894],\n              [100.235353, 21.466756],\n              [100.206404, 21.509634],\n              [100.180534, 21.514088],\n              [100.168831, 21.482906],\n              [100.131259, 21.504066],\n              [100.123252, 21.565302],\n              [100.107853, 21.585337],\n              [100.169447, 21.663225],\n              [100.131875, 21.699929],\n              [100.094303, 21.702709],\n              [100.049339, 21.669899],\n              [99.991441, 21.703821],\n              [99.944014, 21.821097],\n              [99.960028, 21.907186],\n              [99.982202, 21.919401],\n              [100.000064, 21.973245],\n              [99.965571, 22.014309],\n              [99.972347, 22.053141],\n              [99.871333, 22.067007],\n              [99.870101, 22.029288],\n              [99.762927, 22.068117],\n              [99.696406, 22.067562],\n              [99.648979, 22.100835],\n              [99.581841, 22.103053],\n              [99.578762, 22.098617],\n              [99.562747, 22.113034],\n              [99.516552, 22.099726],\n              [99.486987, 22.128557],\n              [99.400139, 22.100281],\n              [99.35456, 22.095845],\n              [99.294814, 22.109152],\n              [99.219669, 22.110816],\n              [99.156227, 22.159599],\n              [99.188256, 22.162924],\n              [99.175321, 22.185647],\n              [99.207966, 22.232188],\n              [99.235683, 22.250468],\n              [99.233836, 22.296434],\n              [99.278183, 22.34626],\n              [99.251698, 22.393301],\n              [99.297277, 22.41156],\n              [99.382277, 22.493418],\n              [99.359487, 22.535435],\n              [99.385973, 22.57136],\n              [99.339777, 22.708894],\n              [99.31514, 22.737598],\n              [99.326842, 22.751396],\n              [99.385357, 22.761882],\n              [99.401371, 22.826434],\n              [99.462965, 22.844635],\n              [99.43648, 22.913557],\n              [99.446951, 22.934503],\n              [99.531334, 22.897019],\n              [99.563363, 22.925684],\n              [99.533798, 22.961507],\n              [99.517168, 23.006685],\n              [99.528255, 23.065614],\n              [99.477747, 23.083233],\n              [99.440791, 23.079379],\n              [99.380429, 23.099748],\n              [99.3484, 23.12892],\n              [99.281879, 23.101399],\n              [99.255393, 23.077727],\n              [99.187024, 23.100299],\n              [99.106336, 23.086536],\n              [99.048438, 23.11461],\n              [99.057677, 23.164689],\n              [99.002242, 23.160287],\n              [98.906772, 23.185595],\n              [98.889525, 23.209249],\n              [98.928946, 23.26589],\n              [98.936953, 23.309866],\n              [98.906772, 23.331849],\n              [98.872895, 23.329651],\n              [98.920938, 23.360971],\n              [98.912315, 23.426333],\n              [98.874743, 23.483431],\n              [98.826084, 23.470257],\n              [98.80391, 23.540504],\n              [98.844562, 23.578904],\n              [98.882134, 23.595358],\n              [98.882134, 23.620035],\n              [98.847026, 23.632097],\n              [98.835939, 23.683625],\n              [98.811917, 23.703354],\n              [98.824236, 23.727462],\n              [98.784816, 23.781691],\n              [98.696121, 23.784429],\n              [98.669019, 23.800857],\n              [98.701664, 23.834254],\n              [98.68565, 23.90157],\n              [98.701048, 23.946427],\n              [98.673331, 23.960647],\n              [98.701048, 23.981427],\n              [98.727533, 23.970491],\n              [98.773729, 24.022431],\n              [98.807606, 24.025164],\n              [98.895069, 24.098936],\n              [98.876591, 24.15137],\n              [98.841482, 24.126794],\n              [98.818692, 24.133348],\n              [98.71891, 24.127887],\n              [98.681954, 24.100029],\n              [98.646229, 24.106038],\n              [98.593875, 24.08036],\n              [98.547063, 24.128433],\n              [98.487933, 24.123517],\n              [98.48239, 24.122425],\n              [98.37768, 24.114232],\n              [98.343187, 24.098936],\n              [98.219999, 24.113685],\n              [98.19721, 24.09839],\n              [98.132536, 24.09238],\n              [98.125761, 24.092927],\n              [98.123297, 24.092927],\n              [98.096196, 24.08637],\n              [98.091268, 24.085824],\n              [97.995182, 24.04648],\n              [97.984095, 24.031177],\n              [97.902175, 24.014231],\n              [97.896015, 23.974319],\n              [97.863371, 23.978693],\n              [97.8104, 23.943146],\n              [97.795617, 23.951897],\n              [97.763588, 23.907041],\n              [97.72848, 23.895551],\n              [97.718009, 23.867643],\n              [97.684132, 23.876946],\n              [97.647176, 23.840823],\n              [97.640401, 23.866001],\n              [97.633009, 23.879682],\n              [97.5283, 23.926736],\n              [97.529531, 23.943146],\n              [97.572647, 23.983068],\n              [97.628698, 24.004938],\n              [97.637321, 24.04812],\n              [97.730944, 24.113685],\n              [97.753733, 24.168843],\n              [97.72848, 24.183585],\n              [97.729712, 24.227252],\n              [97.767284, 24.258357],\n              [97.721089, 24.295999],\n              [97.665038, 24.296544],\n              [97.662574, 24.339083],\n              [97.716161, 24.358711],\n              [97.679821, 24.401228],\n              [97.669966, 24.452993],\n              [97.588662, 24.435559],\n              [97.530147, 24.443187],\n              [97.554785, 24.490577],\n              [97.570799, 24.602719],\n              [97.569567, 24.708236],\n              [97.547394, 24.739221],\n              [97.569567, 24.765852],\n              [97.652103, 24.790846],\n              [97.680437, 24.827243],\n              [97.765436, 24.823984],\n              [97.797465, 24.845709],\n              [97.785762, 24.876117],\n              [97.729712, 24.908689],\n              [97.716777, 24.978147],\n              [97.727864, 25.042686],\n              [97.719857, 25.080634],\n              [97.743262, 25.078466],\n              [97.796233, 25.155954],\n              [97.839349, 25.27074],\n              [97.875689, 25.25721],\n              [97.904023, 25.216609],\n              [97.940363, 25.214985],\n              [98.0075, 25.279399],\n              [98.006884, 25.298338],\n              [98.06971, 25.311864],\n              [98.099891, 25.354055],\n              [98.101123, 25.388662],\n              [98.137464, 25.381633],\n              [98.15779, 25.457307],\n              [98.131304, 25.51025],\n              [98.163949, 25.524292],\n              [98.189818, 25.569108],\n              [98.170724, 25.620383],\n              [98.247717, 25.607971],\n              [98.314854, 25.543193],\n              [98.326557, 25.566409],\n              [98.402317, 25.593939],\n              [98.409709, 25.664084],\n              [98.457752, 25.682963],\n              [98.461448, 25.735267],\n              [98.476846, 25.77731],\n              [98.529201, 25.840884],\n              [98.553839, 25.845731],\n              [98.640686, 25.798864],\n              [98.677642, 25.816105],\n              [98.705976, 25.855426],\n              [98.686881, 25.925955],\n              [98.637606, 25.971696],\n              [98.614201, 25.968468],\n              [98.602498, 26.054523],\n              [98.575396, 26.118485],\n              [98.632679, 26.145887],\n              [98.656084, 26.139977],\n              [98.661012, 26.087852],\n              [98.720142, 26.127082],\n              [98.712751, 26.156093],\n              [98.735541, 26.185097],\n              [98.713367, 26.231274],\n              [98.672715, 26.239863],\n              [98.681338, 26.308016],\n              [98.733693, 26.350926],\n              [98.750323, 26.424372],\n              [98.741084, 26.432947],\n              [98.757098, 26.491881],\n              [98.753403, 26.559349],\n              [98.773113, 26.578083],\n              [98.781736, 26.620893],\n              [98.762642, 26.660478],\n              [98.770033, 26.690424],\n              [98.746012, 26.696841],\n              [98.762026, 26.798916],\n              [98.730613, 26.851253],\n              [98.757098, 26.877947],\n              [98.732461, 27.002257],\n              [98.762642, 27.018252],\n              [98.765722, 27.05077],\n              [98.712751, 27.075817],\n              [98.713983, 27.139744],\n              [98.696121, 27.211086],\n              [98.723222, 27.221198],\n              [98.717062, 27.271211],\n              [98.734925, 27.287168],\n              [98.741084, 27.330241],\n              [98.706591, 27.362136],\n              [98.702896, 27.412618],\n              [98.686881, 27.425367],\n              [98.704128, 27.463607],\n              [98.685034, 27.484315],\n              [98.706591, 27.553313],\n              [98.662244, 27.586734],\n              [98.650541, 27.567637],\n              [98.583404, 27.571351],\n              [98.587099, 27.587265],\n              [98.554454, 27.646126],\n              [98.53536, 27.620676],\n              [98.474998, 27.634462],\n              [98.444201, 27.665209],\n              [98.430035, 27.653547],\n              [98.429419, 27.549068],\n              [98.388767, 27.515104],\n              [98.337644, 27.508734],\n              [98.317318, 27.51935],\n              [98.310542, 27.583552],\n              [98.283441, 27.654608],\n              [98.234166, 27.690648],\n              [98.215688, 27.810874],\n              [98.169492, 27.851096],\n              [98.205217, 27.889716],\n              [98.187355, 27.939426],\n              [98.143007, 27.948942],\n              [98.133152, 27.990698],\n              [98.160253, 28.101089],\n              [98.139311, 28.142259],\n              [98.17442, 28.163365],\n              [98.169492, 28.206093],\n              [98.21692, 28.212949],\n              [98.266811, 28.242477],\n              [98.231702, 28.314681],\n              [98.207681, 28.330486],\n              [98.208913, 28.358401],\n              [98.301303, 28.384204],\n              [98.317934, 28.324691],\n              [98.353042, 28.293078],\n              [98.37768, 28.246167],\n              [98.370289, 28.18394],\n              [98.389999, 28.16442],\n              [98.389383, 28.114814],\n              [98.428803, 28.104785],\n              [98.464527, 28.151229],\n              [98.494092, 28.141203],\n              [98.559382, 28.182885],\n              [98.625903, 28.165475],\n              [98.649925, 28.200291],\n              [98.712135, 28.229296],\n              [98.710287, 28.288862],\n              [98.746628, 28.321003],\n              [98.740468, 28.348395],\n              [98.693041, 28.43158],\n              [98.673947, 28.478934],\n              [98.625903, 28.489455],\n              [98.619128, 28.50944],\n              [98.637606, 28.552029],\n              [98.594491, 28.667615],\n              [98.666555, 28.712239],\n              [98.683802, 28.740054],\n              [98.652389, 28.817162],\n              [98.668403, 28.843376],\n              [98.643766, 28.895261],\n              [98.6567, 28.910454],\n              [98.624056, 28.95864],\n              [98.655469, 28.976966],\n              [98.70228, 28.9644],\n              [98.757714, 29.004186],\n              [98.786048, 28.998952],\n              [98.821772, 28.920931],\n              [98.827932, 28.821356],\n              [98.852569, 28.798283],\n              [98.912931, 28.800906],\n              [98.922786, 28.823978],\n              [98.972677, 28.832367],\n              [98.973909, 28.864867],\n              [98.917859, 28.886877],\n              [98.925866, 28.978536],\n              [99.013329, 29.036632],\n              [98.991771, 29.105677],\n              [98.967134, 29.128159],\n              [98.960974, 29.165792],\n              [98.9813, 29.204978],\n              [99.024416, 29.188783],\n              [99.037351, 29.20759],\n              [99.113727, 29.221171],\n              [99.105104, 29.162656],\n              [99.118039, 29.100971],\n              [99.113727, 29.07273],\n              [99.132206, 28.94869],\n              [99.123582, 28.890021],\n              [99.103872, 28.841803],\n              [99.114343, 28.765763],\n              [99.134053, 28.734806],\n              [99.126662, 28.698066],\n              [99.147604, 28.640831],\n              [99.183944, 28.58882],\n              [99.170394, 28.566221],\n              [99.191952, 28.494714],\n              [99.187024, 28.44],\n              [99.16485, 28.425264],\n              [99.200575, 28.365774],\n              [99.229524, 28.350502],\n              [99.237531, 28.317842],\n              [99.28927, 28.286227],\n              [99.306516, 28.227714],\n              [99.374886, 28.18183],\n              [99.412458, 28.295186],\n              [99.392748, 28.318369],\n              [99.437095, 28.398419],\n              [99.404451, 28.44421],\n              [99.426625, 28.454207],\n              [99.396444, 28.491032],\n              [99.403219, 28.546246],\n              [99.463581, 28.549401],\n              [99.466045, 28.579886],\n              [99.504233, 28.619294],\n              [99.540573, 28.623497],\n              [99.53195, 28.677591],\n              [99.553508, 28.710664],\n              [99.614486, 28.740054],\n              [99.609559, 28.784122],\n              [99.625573, 28.81454],\n              [99.676696, 28.810345],\n              [99.717964, 28.846521],\n              [99.722275, 28.757369],\n              [99.755536, 28.701216],\n              [99.79434, 28.699116],\n              [99.834992, 28.660788],\n              [99.834376, 28.628225],\n              [99.873181, 28.631902],\n              [99.875644, 28.611939],\n              [99.91876, 28.599329],\n              [99.985281, 28.529422],\n              [99.990209, 28.47683],\n              [100.073977, 28.426317],\n              [100.057346, 28.368934],\n              [100.136803, 28.349975],\n              [100.176223, 28.325218],\n              [100.147274, 28.288862],\n              [100.188541, 28.252493],\n              [100.153433, 28.208202],\n              [100.102926, 28.201873],\n              [100.091223, 28.181302],\n              [100.062274, 28.193962],\n              [100.033325, 28.184467],\n              [100.021006, 28.147008],\n              [100.05673, 28.097922],\n              [100.088759, 28.029269],\n              [100.120788, 28.018703],\n              [100.196549, 27.936254],\n              [100.170063, 27.907699],\n              [100.210715, 27.87702],\n              [100.30865, 27.861149],\n              [100.30865, 27.830457],\n              [100.28586, 27.80611],\n              [100.304954, 27.788639],\n              [100.311729, 27.724028],\n              [100.327744, 27.72032],\n              [100.350534, 27.755809],\n              [100.412127, 27.816167],\n              [100.442924, 27.86644],\n              [100.504518, 27.852154],\n              [100.511294, 27.827811],\n              [100.54517, 27.809286],\n              [100.609228, 27.859033],\n              [100.634482, 27.915631],\n              [100.681293, 27.923035],\n              [100.719481, 27.858503],\n              [100.707162, 27.800816],\n              [100.757053, 27.770107],\n              [100.775532, 27.743098],\n              [100.782307, 27.691708],\n              [100.848212, 27.672099],\n              [100.827886, 27.615904],\n              [100.854988, 27.623858],\n              [100.91227, 27.521473],\n              [100.901183, 27.453517],\n              [100.936908, 27.469448],\n              [100.95169, 27.426961],\n              [101.021907, 27.332899],\n              [101.026219, 27.270679],\n              [101.042233, 27.22173],\n              [101.071798, 27.194585],\n              [101.119226, 27.208957],\n              [101.167885, 27.198311],\n              [101.167885, 27.198311],\n              [101.170349, 27.175421],\n              [101.145095, 27.103523],\n              [101.157414, 27.094999],\n              [101.136472, 27.023584],\n              [101.228863, 26.981992],\n              [101.227015, 26.959057],\n              [101.264587, 26.955323],\n              [101.267667, 26.903034],\n              [101.311399, 26.903034],\n              [101.365602, 26.883819],\n              [101.399478, 26.841642],\n              [101.358826, 26.771669],\n              [101.387159, 26.753501],\n              [101.389623, 26.723036],\n              [101.435819, 26.740675],\n              [101.458608, 26.731054],\n              [101.445674, 26.77434],\n              [101.466, 26.786629],\n              [101.513427, 26.768463],\n              [101.453065, 26.692563],\n              [101.481398, 26.673313],\n              [101.461072, 26.640687],\n              [101.461688, 26.606447],\n              [101.402558, 26.604841],\n              [101.395783, 26.591998],\n              [101.422884, 26.53151],\n              [101.458608, 26.49563],\n              [101.506652, 26.499915],\n              [101.530057, 26.467239],\n              [101.565782, 26.454381],\n              [101.637847, 26.388995],\n              [101.635383, 26.357361],\n              [101.660636, 26.346635],\n              [101.64031, 26.318745],\n              [101.597195, 26.303187],\n              [101.586108, 26.279579],\n              [101.630455, 26.224832],\n              [101.690202, 26.241473],\n              [101.737013, 26.219463],\n              [101.773353, 26.168448],\n              [101.807846, 26.156093],\n              [101.796759, 26.114723],\n              [101.839875, 26.082477],\n              [101.835563, 26.04592],\n              [101.857737, 26.049146],\n              [101.899621, 26.099139],\n              [101.929186, 26.105588],\n              [101.954439, 26.084627],\n              [102.020961, 26.096451],\n              [102.080091, 26.065275],\n              [102.107808, 26.068501],\n              [102.152156, 26.10935],\n              [102.174946, 26.146961],\n              [102.242699, 26.190468],\n              [102.245163, 26.212483],\n              [102.349257, 26.244694],\n              [102.392372, 26.296749],\n              [102.440416, 26.300505],\n              [102.542046, 26.338591],\n              [102.570995, 26.362723],\n              [102.629509, 26.336982],\n              [102.638748, 26.307479],\n              [102.60056, 26.250598],\n              [102.659074, 26.221611],\n              [102.709581, 26.210336],\n              [102.739762, 26.268846],\n              [102.785342, 26.298895],\n              [102.833385, 26.306406],\n              [102.878964, 26.364332],\n              [102.893131, 26.338591],\n              [102.975667, 26.340736],\n              [102.998457, 26.371839],\n              [102.988602, 26.413117],\n              [102.989833, 26.482775],\n              [103.030485, 26.485989],\n              [103.052659, 26.514374],\n              [103.052659, 26.555602],\n              [103.035413, 26.556673],\n              [103.026174, 26.664221],\n              [103.005232, 26.679195],\n              [103.008312, 26.710741],\n              [102.983674, 26.76686],\n              [102.991681, 26.775409],\n              [102.966428, 26.837904],\n              [102.949181, 26.843244],\n              [102.896211, 26.91264],\n              [102.894979, 27.001724],\n              [102.870957, 27.026782],\n              [102.913457, 27.133886],\n              [102.904218, 27.227584],\n              [102.883276, 27.258444],\n              [102.883892, 27.299401],\n              [102.899906, 27.317481],\n              [102.941174, 27.405711],\n              [102.989833, 27.367983],\n              [103.055739, 27.40943],\n              [103.080992, 27.396679],\n              [103.141355, 27.420586],\n              [103.144434, 27.450331],\n              [103.19063, 27.523596],\n              [103.232514, 27.56976],\n              [103.2861, 27.561802],\n              [103.29226, 27.632872],\n              [103.349542, 27.678459],\n              [103.369868, 27.708664],\n              [103.393274, 27.709194],\n              [103.461027, 27.779638],\n              [103.487512, 27.794992],\n              [103.509686, 27.843687],\n              [103.502295, 27.910343],\n              [103.55465, 27.978543],\n              [103.515846, 27.965329],\n              [103.486281, 28.033495],\n              [103.459179, 28.021345],\n              [103.430846, 28.044587],\n              [103.470266, 28.122204],\n              [103.533092, 28.168641],\n              [103.573128, 28.230877],\n              [103.643961, 28.260401],\n              [103.692004, 28.232459],\n              [103.701859, 28.198709],\n              [103.740048, 28.23615],\n              [103.770845, 28.233514],\n              [103.828743, 28.285173],\n              [103.877402, 28.316262],\n              [103.85338, 28.356822],\n              [103.860156, 28.383677],\n              [103.828743, 28.44],\n              [103.829975, 28.459995],\n              [103.781931, 28.525216],\n              [103.802873, 28.563068],\n              [103.838598, 28.587244],\n              [103.833054, 28.605109],\n              [103.850917, 28.66709],\n              [103.887873, 28.61982],\n              [103.910047, 28.631377],\n              [103.953779, 28.600906],\n              [104.05972, 28.6277],\n              [104.09606, 28.603533],\n              [104.117618, 28.634003],\n              [104.170589, 28.642932],\n              [104.230951, 28.635579],\n              [104.252509, 28.660788],\n              [104.277147, 28.631902],\n              [104.314719, 28.615617],\n              [104.372617, 28.649235],\n              [104.425588, 28.626649],\n              [104.417581, 28.598279],\n              [104.375697, 28.5946],\n              [104.355987, 28.555183],\n              [104.323342, 28.540989],\n              [104.260516, 28.536257],\n              [104.267908, 28.499448],\n              [104.254357, 28.403683],\n              [104.282074, 28.343128],\n              [104.314103, 28.306778],\n              [104.343052, 28.334173],\n              [104.384936, 28.329959],\n              [104.392943, 28.291497],\n              [104.420045, 28.269889],\n              [104.44961, 28.269889],\n              [104.462544, 28.241422],\n              [104.442834, 28.211366],\n              [104.402182, 28.202928],\n              [104.406494, 28.173389],\n              [104.444682, 28.16231],\n              [104.448994, 28.113758],\n              [104.40095, 28.091586],\n              [104.373233, 28.051454],\n              [104.304248, 28.050926],\n              [104.30856, 28.036136],\n              [104.362762, 28.012891],\n              [104.40095, 27.952114],\n              [104.44961, 27.927794],\n              [104.508124, 27.878078],\n              [104.52537, 27.889187],\n              [104.573413, 27.840512],\n              [104.607906, 27.857974],\n              [104.63316, 27.850567],\n              [104.676275, 27.880723],\n              [104.743413, 27.901881],\n              [104.761891, 27.884426],\n              [104.796999, 27.901352],\n              [104.842579, 27.900294],\n              [104.888158, 27.914574],\n              [104.918339, 27.938897],\n              [104.903557, 27.962158],\n              [104.975006, 28.020816],\n              [104.980549, 28.063073],\n              [105.002107, 28.064129],\n              [105.061853, 28.096866],\n              [105.119752, 28.07205],\n              [105.168411, 28.071522],\n              [105.186889, 28.054623],\n              [105.167795, 28.021345],\n              [105.186273, 27.995454],\n              [105.218302, 27.990698],\n              [105.247867, 28.009193],\n              [105.270657, 27.99704],\n              [105.284823, 27.935725],\n              [105.233084, 27.895534],\n              [105.25957, 27.827811],\n              [105.313157, 27.810874],\n              [105.273736, 27.794992],\n              [105.293447, 27.770637],\n              [105.290367, 27.712373],\n              [105.308229, 27.704955],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 540000,\n        name: '西藏自治区',\n        center: [91.132212, 29.660361],\n        centroid: [88.388277, 31.56375],\n        childrenNum: 7,\n        level: 'province',\n        subFeatureIndex: 25,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [89.711414, 36.093272],\n              [89.688624, 36.091337],\n              [89.605472, 36.038123],\n              [89.474893, 36.022151],\n              [89.417611, 36.044897],\n              [89.404676, 36.016827],\n              [89.434857, 35.992136],\n              [89.428082, 35.917531],\n              [89.489676, 35.903475],\n              [89.554965, 35.873414],\n              [89.550654, 35.856924],\n              [89.62395, 35.859349],\n              [89.654747, 35.848193],\n              [89.707718, 35.849163],\n              [89.778551, 35.861775],\n              [89.801957, 35.848193],\n              [89.767464, 35.799183],\n              [89.782863, 35.773453],\n              [89.747138, 35.7516],\n              [89.748986, 35.66267],\n              [89.726196, 35.648082],\n              [89.765616, 35.599922],\n              [89.75145, 35.580942],\n              [89.71203, 35.581915],\n              [89.699711, 35.544916],\n              [89.720037, 35.501566],\n              [89.740979, 35.507412],\n              [89.765, 35.482563],\n              [89.739131, 35.468429],\n              [89.685544, 35.416259],\n              [89.658443, 35.425526],\n              [89.619639, 35.412357],\n              [89.58761, 35.383575],\n              [89.497067, 35.361128],\n              [89.516161, 35.330862],\n              [89.494603, 35.298632],\n              [89.531559, 35.276161],\n              [89.48598, 35.256616],\n              [89.450255, 35.223867],\n              [89.46935, 35.214577],\n              [89.519241, 35.133862],\n              [89.579603, 35.118688],\n              [89.593153, 35.104491],\n              [89.59069, 35.057965],\n              [89.560509, 34.938836],\n              [89.578987, 34.895162],\n              [89.670146, 34.887798],\n              [89.707102, 34.919701],\n              [89.747138, 34.903506],\n              [89.78779, 34.921664],\n              [89.821051, 34.902033],\n              [89.814891, 34.86816],\n              [89.838913, 34.865705],\n              [89.867862, 34.81069],\n              [89.825978, 34.796931],\n              [89.799493, 34.743838],\n              [89.732356, 34.732035],\n              [89.72558, 34.660689],\n              [89.74837, 34.641981],\n              [89.798877, 34.628686],\n              [89.777935, 34.574499],\n              [89.814891, 34.548871],\n              [89.823515, 34.455657],\n              [89.819819, 34.420614],\n              [89.799493, 34.39642],\n              [89.820435, 34.369255],\n              [89.858623, 34.359375],\n              [89.86663, 34.324785],\n              [89.825362, 34.293642],\n              [89.838297, 34.263477],\n              [89.816739, 34.16945],\n              [89.789638, 34.150632],\n              [89.760073, 34.152613],\n              [89.756993, 34.124874],\n              [89.71203, 34.131809],\n              [89.655979, 34.097126],\n              [89.656595, 34.057966],\n              [89.635037, 34.049537],\n              [89.684928, 33.990013],\n              [89.688008, 33.959739],\n              [89.718805, 33.946832],\n              [89.73174, 33.921509],\n              [89.795181, 33.865374],\n              [89.837065, 33.868853],\n              [89.899891, 33.80771],\n              [89.942391, 33.801246],\n              [89.902355, 33.758467],\n              [89.907282, 33.741051],\n              [89.983659, 33.725622],\n              [89.981195, 33.70322],\n              [90.008296, 33.687785],\n              [89.984275, 33.612061],\n              [90.01076, 33.553728],\n              [90.083441, 33.525295],\n              [90.088984, 33.478885],\n              [90.107463, 33.460913],\n              [90.22018, 33.437943],\n              [90.246665, 33.423959],\n              [90.332896, 33.310501],\n              [90.363077, 33.279487],\n              [90.405577, 33.260473],\n              [90.490577, 33.264977],\n              [90.562642, 33.229441],\n              [90.627315, 33.180368],\n              [90.704308, 33.135778],\n              [90.740032, 33.142293],\n              [90.803474, 33.114227],\n              [90.88293, 33.120241],\n              [90.902024, 33.083143],\n              [90.927894, 33.120241],\n              [91.001807, 33.11573],\n              [91.037531, 33.098686],\n              [91.072024, 33.113224],\n              [91.147784, 33.07211],\n              [91.161335, 33.108712],\n              [91.18782, 33.106206],\n              [91.226624, 33.141792],\n              [91.261733, 33.141291],\n              [91.311624, 33.108211],\n              [91.370138, 33.100691],\n              [91.436044, 33.066092],\n              [91.49579, 33.109214],\n              [91.535826, 33.10019],\n              [91.55492, 33.060074],\n              [91.583253, 33.0375],\n              [91.664557, 33.012913],\n              [91.685499, 32.989324],\n              [91.752637, 32.969242],\n              [91.799448, 32.942126],\n              [91.839484, 32.948152],\n              [91.857962, 32.90244],\n              [91.896766, 32.907967],\n              [91.955897, 32.8205],\n              [92.018722, 32.829552],\n              [92.038432, 32.860725],\n              [92.101874, 32.860222],\n              [92.145606, 32.885857],\n              [92.205352, 32.866255],\n              [92.227526, 32.821003],\n              [92.193649, 32.801889],\n              [92.211511, 32.788306],\n              [92.198577, 32.754591],\n              [92.255243, 32.720863],\n              [92.310062, 32.751571],\n              [92.343938, 32.738484],\n              [92.355641, 32.764657],\n              [92.411076, 32.748048],\n              [92.459119, 32.76365],\n              [92.484372, 32.745028],\n              [92.56814, 32.73194],\n              [92.574916, 32.741001],\n              [92.634662, 32.720863],\n              [92.667922, 32.73194],\n              [92.686401, 32.76516],\n              [92.756618, 32.743014],\n              [92.789262, 32.719856],\n              [92.822523, 32.729926],\n              [92.866871, 32.698203],\n              [92.933392, 32.719353],\n              [92.964189, 32.714821],\n              [93.00053, 32.741001],\n              [93.019624, 32.737477],\n              [93.023935, 32.703239],\n              [93.069515, 32.626156],\n              [93.087993, 32.63674],\n              [93.159442, 32.644803],\n              [93.176688, 32.6705],\n              [93.210565, 32.655385],\n              [93.239514, 32.662439],\n              [93.260456, 32.62666],\n              [93.300492, 32.619604],\n              [93.308499, 32.580278],\n              [93.33868, 32.5712],\n              [93.385492, 32.525294],\n              [93.411977, 32.558086],\n              [93.4631, 32.556069],\n              [93.476651, 32.504603],\n              [93.501904, 32.503593],\n              [93.516687, 32.47583],\n              [93.618933, 32.522771],\n              [93.651577, 32.571705],\n              [93.721795, 32.578261],\n              [93.75136, 32.56313],\n              [93.820345, 32.549511],\n              [93.851142, 32.50965],\n              [93.861613, 32.466237],\n              [93.90904, 32.463207],\n              [93.960163, 32.484917],\n              [93.978641, 32.459672],\n              [94.03038, 32.448057],\n              [94.049474, 32.469771],\n              [94.091974, 32.463207],\n              [94.137554, 32.433915],\n              [94.176974, 32.454117],\n              [94.196684, 32.51621],\n              [94.250886, 32.51722],\n              [94.292154, 32.502584],\n              [94.294002, 32.519743],\n              [94.350053, 32.533871],\n              [94.371611, 32.524789],\n              [94.395016, 32.594397],\n              [94.435052, 32.562626],\n              [94.463386, 32.572209],\n              [94.459074, 32.599439],\n              [94.522516, 32.595909],\n              [94.591501, 32.640772],\n              [94.614291, 32.673522],\n              [94.638312, 32.645307],\n              [94.737479, 32.587338],\n              [94.762116, 32.526303],\n              [94.78737, 32.522266],\n              [94.80708, 32.486431],\n              [94.852043, 32.463712],\n              [94.889616, 32.472295],\n              [94.912405, 32.41573],\n              [94.944434, 32.404109],\n              [94.988166, 32.422802],\n              [95.057151, 32.395014],\n              [95.075013, 32.376315],\n              [95.075013, 32.376315],\n              [95.081789, 32.384907],\n              [95.153853, 32.386423],\n              [95.218527, 32.397035],\n              [95.228382, 32.363678],\n              [95.261643, 32.348006],\n              [95.193274, 32.332331],\n              [95.096571, 32.322217],\n              [95.079325, 32.279726],\n              [95.10581, 32.258979],\n              [95.20744, 32.297433],\n              [95.214216, 32.321712],\n              [95.241317, 32.3207],\n              [95.239469, 32.287315],\n              [95.270266, 32.194683],\n              [95.270266, 32.194683],\n              [95.31523, 32.148585],\n              [95.366968, 32.151118],\n              [95.367584, 32.178982],\n              [95.406389, 32.182021],\n              [95.440265, 32.157705],\n              [95.454432, 32.061898],\n              [95.421171, 32.033999],\n              [95.454432, 32.007613],\n              [95.395918, 32.001523],\n              [95.360809, 31.95939],\n              [95.3682, 31.92892],\n              [95.408852, 31.918761],\n              [95.406389, 31.896915],\n              [95.456896, 31.801853],\n              [95.480301, 31.795749],\n              [95.511714, 31.750468],\n              [95.546823, 31.73978],\n              [95.580083, 31.76726],\n              [95.634286, 31.782523],\n              [95.779648, 31.748941],\n              [95.823995, 31.68225],\n              [95.853561, 31.714329],\n              [95.846169, 31.736218],\n              [95.89914, 31.81711],\n              [95.983524, 31.816601],\n              [95.989067, 31.78761],\n              [96.064828, 31.720438],\n              [96.135661, 31.70211],\n              [96.148595, 31.686324],\n              [96.156603, 31.602769],\n              [96.207726, 31.598691],\n              [96.221892, 31.647613],\n              [96.245298, 31.657802],\n              [96.252073, 31.697527],\n              [96.222508, 31.733164],\n              [96.231131, 31.749959],\n              [96.178161, 31.775401],\n              [96.183088, 31.835924],\n              [96.202798, 31.841008],\n              [96.214501, 31.876589],\n              [96.188632, 31.904028],\n              [96.220044, 31.905553],\n              [96.253305, 31.929936],\n              [96.288414, 31.919777],\n              [96.389428, 31.919777],\n              [96.407906, 31.845583],\n              [96.435623, 31.796258],\n              [96.468884, 31.769804],\n              [96.519391, 31.74945],\n              [96.56805, 31.711783],\n              [96.615477, 31.737236],\n              [96.661057, 31.705674],\n              [96.691854, 31.722474],\n              [96.722651, 31.686833],\n              [96.778701, 31.675629],\n              [96.790404, 31.698545],\n              [96.840295, 31.720438],\n              [96.799027, 31.792188],\n              [96.765767, 31.819144],\n              [96.760223, 31.860325],\n              [96.794716, 31.869474],\n              [96.81073, 31.894375],\n              [96.776238, 31.935015],\n              [96.753448, 31.944156],\n              [96.742977, 32.001016],\n              [96.722651, 32.013195],\n              [96.824281, 32.007613],\n              [96.868629, 31.964975],\n              [96.863085, 31.996448],\n              [96.894498, 32.013703],\n              [96.941925, 31.986297],\n              [96.965947, 32.008628],\n              [96.935766, 32.048203],\n              [97.006599, 32.067984],\n              [97.028773, 32.04871],\n              [97.127323, 32.044145],\n              [97.169823, 32.032984],\n              [97.188301, 32.055304],\n              [97.214786, 32.042623],\n              [97.233881, 32.063927],\n              [97.201852, 32.090296],\n              [97.219714, 32.109054],\n              [97.258518, 32.072041],\n              [97.308409, 32.076605],\n              [97.293011, 32.096887],\n              [97.313953, 32.130342],\n              [97.271453, 32.139971],\n              [97.264062, 32.182527],\n              [97.299786, 32.294904],\n              [97.32196, 32.303503],\n              [97.371235, 32.273148],\n              [97.415583, 32.296421],\n              [97.424822, 32.322723],\n              [97.387865, 32.427349],\n              [97.341054, 32.440987],\n              [97.388481, 32.501575],\n              [97.334895, 32.514192],\n              [97.332431, 32.542448],\n              [97.3583, 32.563635],\n              [97.374315, 32.546484],\n              [97.411887, 32.575235],\n              [97.448843, 32.586833],\n              [97.463626, 32.55506],\n              [97.50243, 32.530844],\n              [97.540618, 32.536899],\n              [97.670582, 32.51722],\n              [97.684132, 32.530339],\n              [97.730944, 32.527312],\n              [97.795617, 32.521257],\n              [97.80732, 32.50006],\n              [97.863986, 32.499051],\n              [97.880001, 32.486431],\n              [97.940363, 32.482393],\n              [98.079565, 32.415224],\n              [98.107283, 32.391476],\n              [98.125145, 32.401077],\n              [98.218768, 32.342444],\n              [98.208913, 32.318171],\n              [98.23047, 32.262521],\n              [98.218768, 32.234683],\n              [98.260035, 32.208862],\n              [98.303151, 32.121726],\n              [98.357354, 32.087253],\n              [98.404781, 32.045159],\n              [98.402933, 32.026896],\n              [98.434962, 32.007613],\n              [98.432498, 31.922825],\n              [98.399238, 31.895899],\n              [98.426339, 31.856767],\n              [98.414636, 31.832365],\n              [98.461448, 31.800327],\n              [98.508875, 31.751995],\n              [98.516882, 31.717383],\n              [98.545831, 31.717383],\n              [98.553839, 31.660349],\n              [98.619128, 31.591555],\n              [98.651157, 31.57881],\n              [98.696736, 31.538523],\n              [98.714599, 31.508935],\n              [98.844562, 31.429817],\n              [98.84333, 31.416028],\n              [98.887062, 31.37465],\n              [98.810685, 31.306668],\n              [98.805758, 31.279052],\n              [98.773113, 31.249382],\n              [98.691809, 31.333253],\n              [98.643766, 31.338876],\n              [98.616048, 31.3036],\n              [98.60373, 31.257568],\n              [98.62344, 31.221238],\n              [98.602498, 31.192062],\n              [98.675179, 31.15417],\n              [98.710287, 31.1178],\n              [98.712135, 31.082954],\n              [98.736772, 31.049121],\n              [98.774961, 31.031174],\n              [98.806374, 30.995783],\n              [98.797135, 30.948575],\n              [98.774345, 30.908019],\n              [98.797135, 30.87926],\n              [98.850105, 30.849465],\n              [98.904924, 30.782649],\n              [98.957895, 30.765166],\n              [98.963438, 30.728134],\n              [98.907388, 30.698292],\n              [98.92217, 30.609225],\n              [98.939417, 30.598923],\n              [98.926482, 30.569556],\n              [98.932025, 30.521623],\n              [98.965286, 30.449937],\n              [98.967134, 30.33482],\n              [98.986844, 30.280569],\n              [98.970829, 30.260928],\n              [98.993003, 30.215429],\n              [98.9813, 30.182843],\n              [98.989308, 30.151799],\n              [99.044742, 30.079842],\n              [99.036735, 30.053945],\n              [99.055213, 29.958587],\n              [99.068148, 29.931621],\n              [99.0238, 29.846009],\n              [99.018873, 29.792009],\n              [98.992387, 29.677163],\n              [99.014561, 29.607464],\n              [99.052133, 29.563748],\n              [99.044742, 29.520013],\n              [99.066916, 29.421018],\n              [99.058909, 29.417368],\n              [99.075539, 29.316186],\n              [99.114343, 29.243628],\n              [99.113727, 29.221171],\n              [99.037351, 29.20759],\n              [99.024416, 29.188783],\n              [98.9813, 29.204978],\n              [98.960974, 29.165792],\n              [98.967134, 29.128159],\n              [98.991771, 29.105677],\n              [99.013329, 29.036632],\n              [98.925866, 28.978536],\n              [98.917859, 28.886877],\n              [98.973909, 28.864867],\n              [98.972677, 28.832367],\n              [98.922786, 28.823978],\n              [98.912931, 28.800906],\n              [98.852569, 28.798283],\n              [98.827932, 28.821356],\n              [98.821772, 28.920931],\n              [98.786048, 28.998952],\n              [98.757714, 29.004186],\n              [98.70228, 28.9644],\n              [98.655469, 28.976966],\n              [98.624056, 28.95864],\n              [98.6567, 28.910454],\n              [98.643766, 28.895261],\n              [98.668403, 28.843376],\n              [98.652389, 28.817162],\n              [98.683802, 28.740054],\n              [98.666555, 28.712239],\n              [98.594491, 28.667615],\n              [98.637606, 28.552029],\n              [98.619128, 28.50944],\n              [98.625903, 28.489455],\n              [98.673947, 28.478934],\n              [98.693041, 28.43158],\n              [98.740468, 28.348395],\n              [98.746628, 28.321003],\n              [98.710287, 28.288862],\n              [98.712135, 28.229296],\n              [98.649925, 28.200291],\n              [98.625903, 28.165475],\n              [98.559382, 28.182885],\n              [98.494092, 28.141203],\n              [98.464527, 28.151229],\n              [98.428803, 28.104785],\n              [98.389383, 28.114814],\n              [98.389999, 28.16442],\n              [98.370289, 28.18394],\n              [98.37768, 28.246167],\n              [98.353042, 28.293078],\n              [98.317934, 28.324691],\n              [98.301303, 28.384204],\n              [98.208913, 28.358401],\n              [98.207681, 28.330486],\n              [98.231702, 28.314681],\n              [98.266811, 28.242477],\n              [98.21692, 28.212949],\n              [98.169492, 28.206093],\n              [98.17442, 28.163365],\n              [98.139311, 28.142259],\n              [98.097427, 28.166531],\n              [98.090036, 28.195544],\n              [98.056775, 28.202401],\n              [98.03337, 28.187105],\n              [98.008116, 28.214003],\n              [98.020435, 28.253548],\n              [97.907718, 28.363141],\n              [97.871378, 28.361561],\n              [97.842429, 28.326798],\n              [97.801161, 28.326798],\n              [97.769748, 28.3742],\n              [97.738335, 28.396313],\n              [97.737103, 28.465782],\n              [97.68598, 28.519958],\n              [97.634857, 28.532051],\n              [97.60406, 28.515225],\n              [97.569567, 28.541515],\n              [97.521524, 28.495766],\n              [97.507974, 28.46473],\n              [97.521524, 28.444736],\n              [97.499966, 28.428948],\n              [97.485184, 28.38631],\n              [97.488879, 28.347341],\n              [97.518445, 28.327852],\n              [97.469169, 28.30309],\n              [97.461162, 28.26778],\n              [97.422358, 28.297293],\n              [97.402032, 28.279903],\n              [97.398336, 28.238786],\n              [97.349677, 28.235623],\n              [97.362612, 28.199236],\n              [97.352757, 28.149646],\n              [97.326887, 28.132759],\n              [97.340438, 28.104785],\n              [97.305945, 28.071522],\n              [97.320728, 28.054095],\n              [97.375547, 28.062545],\n              [97.378626, 28.031382],\n              [97.413119, 28.01342],\n              [97.379242, 27.970087],\n              [97.372467, 27.907699],\n              [97.386634, 27.882839],\n              [97.324424, 27.880723],\n              [97.303482, 27.913516],\n              [97.253591, 27.891832],\n              [97.167975, 27.811932],\n              [97.103301, 27.780697],\n              [97.097758, 27.740979],\n              [97.062649, 27.742568],\n              [97.049099, 27.81405],\n              [97.008447, 27.807698],\n              [96.972722, 27.861149],\n              [96.908049, 27.884426],\n              [96.849534, 27.874375],\n              [96.810114, 27.890245],\n              [96.784245, 27.931495],\n              [96.711564, 27.9574],\n              [96.690622, 27.948942],\n              [96.635188, 27.994926],\n              [96.623485, 28.024514],\n              [96.538485, 28.075218],\n              [96.499681, 28.067297],\n              [96.46334, 28.143314],\n              [96.426384, 28.161782],\n              [96.395587, 28.143842],\n              [96.398667, 28.118509],\n              [96.367254, 28.118509],\n              [96.298269, 28.140148],\n              [96.275479, 28.228241],\n              [96.194175, 28.212949],\n              [96.098088, 28.212421],\n              [96.074683, 28.193434],\n              [95.989067, 28.198181],\n              [95.936096, 28.240368],\n              [95.907763, 28.241422],\n              [95.899756, 28.278322],\n              [95.874502, 28.29782],\n              [95.832003, 28.295186],\n              [95.787655, 28.270416],\n              [95.740228, 28.275159],\n              [95.674322, 28.254075],\n              [95.528345, 28.182885],\n              [95.437802, 28.161782],\n              [95.39715, 28.142259],\n              [95.371896, 28.110063],\n              [95.352802, 28.04089],\n              [95.32878, 28.017646],\n              [95.28628, 27.939955],\n              [95.067006, 27.840512],\n              [95.015267, 27.82887],\n              [94.947514, 27.792345],\n              [94.88592, 27.743098],\n              [94.836645, 27.728796],\n              [94.78121, 27.699127],\n              [94.722696, 27.683759],\n              [94.660486, 27.650367],\n              [94.524979, 27.596282],\n              [94.478168, 27.602116],\n              [94.443675, 27.585143],\n              [94.399944, 27.589386],\n              [94.353132, 27.578778],\n              [94.277372, 27.58143],\n              [94.220705, 27.536333],\n              [94.147409, 27.458297],\n              [94.056866, 27.375423],\n              [93.970634, 27.30525],\n              [93.849294, 27.168499],\n              [93.841903, 27.045973],\n              [93.817265, 27.025183],\n              [93.747048, 27.015587],\n              [93.625092, 26.955323],\n              [93.56781, 26.938252],\n              [93.232739, 26.906769],\n              [93.111399, 26.880082],\n              [93.050421, 26.883819],\n              [92.909371, 26.914241],\n              [92.802813, 26.895028],\n              [92.682089, 26.947855],\n              [92.64698, 26.952656],\n              [92.549046, 26.941453],\n              [92.496691, 26.921711],\n              [92.404916, 26.9025],\n              [92.28604, 26.892359],\n              [92.197961, 26.86994],\n              [92.109265, 26.854991],\n              [92.124664, 26.960124],\n              [92.076005, 27.041175],\n              [92.043976, 27.052902],\n              [92.02673, 27.108318],\n              [92.032273, 27.167967],\n              [92.061222, 27.190327],\n              [92.071077, 27.237694],\n              [92.091403, 27.264296],\n              [92.125896, 27.273339],\n              [92.064918, 27.391365],\n              [92.021802, 27.444489],\n              [92.010715, 27.474758],\n              [91.946657, 27.464138],\n              [91.839484, 27.489624],\n              [91.753868, 27.462545],\n              [91.71876, 27.467324],\n              [91.663325, 27.507142],\n              [91.626985, 27.509265],\n              [91.585101, 27.540578],\n              [91.564775, 27.58196],\n              [91.582637, 27.598933],\n              [91.562311, 27.627569],\n              [91.570934, 27.650897],\n              [91.622673, 27.692238],\n              [91.642383, 27.7664],\n              [91.610355, 27.819343],\n              [91.544449, 27.820401],\n              [91.561079, 27.855329],\n              [91.618978, 27.856916],\n              [91.611586, 27.891303],\n              [91.552456, 27.90717],\n              [91.486551, 27.937311],\n              [91.490246, 27.971672],\n              [91.464993, 28.002852],\n              [91.309776, 28.057791],\n              [91.251878, 27.970615],\n              [91.216153, 27.989113],\n              [91.162567, 27.968501],\n              [91.147784, 27.927794],\n              [91.155175, 27.894476],\n              [91.113292, 27.846333],\n              [91.025828, 27.857445],\n              [90.96485, 27.900294],\n              [90.976553, 27.935725],\n              [90.96177, 27.9537],\n              [90.896481, 27.946299],\n              [90.853365, 27.969029],\n              [90.806554, 28.015005],\n              [90.802242, 28.040362],\n              [90.741264, 28.053038],\n              [90.701844, 28.076274],\n              [90.591591, 28.021345],\n              [90.569417, 28.044059],\n              [90.513983, 28.062016],\n              [90.47949, 28.044587],\n              [90.43699, 28.063073],\n              [90.384019, 28.06096],\n              [90.367389, 28.088946],\n              [90.297172, 28.153868],\n              [90.231882, 28.144897],\n              [90.189999, 28.161782],\n              [90.166593, 28.187632],\n              [90.124709, 28.190797],\n              [90.103151, 28.141731],\n              [90.07297, 28.155451],\n              [90.03355, 28.136981],\n              [90.017536, 28.162837],\n              [89.976268, 28.189215],\n              [89.901739, 28.18183],\n              [89.869094, 28.221386],\n              [89.789638, 28.240895],\n              [89.779167, 28.197127],\n              [89.720037, 28.170224],\n              [89.605472, 28.161782],\n              [89.541414, 28.088418],\n              [89.511233, 28.086307],\n              [89.461958, 28.03191],\n              [89.44348, 27.968501],\n              [89.375727, 27.875962],\n              [89.295655, 27.84845],\n              [89.238988, 27.796581],\n              [89.184786, 27.673689],\n              [89.131815, 27.633402],\n              [89.128735, 27.611131],\n              [89.163228, 27.574534],\n              [89.109025, 27.537925],\n              [89.095474, 27.471572],\n              [89.132431, 27.441302],\n              [89.182938, 27.373829],\n              [89.152757, 27.319076],\n              [89.077612, 27.287168],\n              [89.067757, 27.240354],\n              [88.984605, 27.208957],\n              [88.942105, 27.261636],\n              [88.911924, 27.272807],\n              [88.920548, 27.325456],\n              [88.901453, 27.327583],\n              [88.867577, 27.3818],\n              [88.838012, 27.37808],\n              [88.809063, 27.405711],\n              [88.783193, 27.467324],\n              [88.797976, 27.521473],\n              [88.770874, 27.563924],\n              [88.813374, 27.606889],\n              [88.816454, 27.641354],\n              [88.852178, 27.671039],\n              [88.850331, 27.710783],\n              [88.870657, 27.743098],\n              [88.863265, 27.811932],\n              [88.888519, 27.846863],\n              [88.864497, 27.921448],\n              [88.846635, 27.921448],\n              [88.842939, 28.006023],\n              [88.812142, 28.018175],\n              [88.764099, 28.068353],\n              [88.67602, 28.068353],\n              [88.645223, 28.111119],\n              [88.620585, 28.091586],\n              [88.565151, 28.083139],\n              [88.554064, 28.027684],\n              [88.498013, 28.04089],\n              [88.469064, 28.009721],\n              [88.43334, 28.002852],\n              [88.401311, 27.976958],\n              [88.357579, 27.986471],\n              [88.254101, 27.939426],\n              [88.242398, 27.967444],\n              [88.203594, 27.943127],\n              [88.156783, 27.957929],\n              [88.120442, 27.915103],\n              [88.137689, 27.878607],\n              [88.111819, 27.864852],\n              [88.090877, 27.885484],\n              [88.037291, 27.901881],\n              [87.982472, 27.884426],\n              [87.930733, 27.909285],\n              [87.826639, 27.927794],\n              [87.782292, 27.890774],\n              [87.77798, 27.860091],\n              [87.727473, 27.802933],\n              [87.668343, 27.809815],\n              [87.670191, 27.832045],\n              [87.598126, 27.814579],\n              [87.58088, 27.859562],\n              [87.45954, 27.820931],\n              [87.418272, 27.825694],\n              [87.421967, 27.856916],\n              [87.364069, 27.824106],\n              [87.317258, 27.826753],\n              [87.280917, 27.845275],\n              [87.249504, 27.839454],\n              [87.227946, 27.812991],\n              [87.173744, 27.818284],\n              [87.118309, 27.840512],\n              [87.080737, 27.910872],\n              [87.035157, 27.946299],\n              [86.935375, 27.955286],\n              [86.926752, 27.985942],\n              [86.885484, 27.995983],\n              [86.864542, 28.022401],\n              [86.827586, 28.012363],\n              [86.756753, 28.032967],\n              [86.768456, 28.06941],\n              [86.74813, 28.089474],\n              [86.700086, 28.101617],\n              [86.662514, 28.092114],\n              [86.647732, 28.06941],\n              [86.611391, 28.069938],\n              [86.60092, 28.097922],\n              [86.568891, 28.103201],\n              [86.55842, 28.047757],\n              [86.537478, 28.044587],\n              [86.513457, 27.996511],\n              [86.514689, 27.954757],\n              [86.475884, 27.944713],\n              [86.450015, 27.908757],\n              [86.414906, 27.904526],\n              [86.393349, 27.926736],\n              [86.308965, 27.950528],\n              [86.27324, 27.976958],\n              [86.231972, 27.974315],\n              [86.206103, 28.084195],\n              [86.223965, 28.092642],\n              [86.19132, 28.167058],\n              [86.140198, 28.114814],\n              [86.128495, 28.086835],\n              [86.086611, 28.090002],\n              [86.082915, 28.018175],\n              [86.125415, 27.923035],\n              [86.053966, 27.900823],\n              [86.002227, 27.90717],\n              [85.949256, 27.937311],\n              [85.980053, 27.984357],\n              [85.901213, 28.053566],\n              [85.898749, 28.101617],\n              [85.871648, 28.124843],\n              [85.854402, 28.172334],\n              [85.791576, 28.195544],\n              [85.753388, 28.227714],\n              [85.720743, 28.372093],\n              [85.682555, 28.375779],\n              [85.650526, 28.283592],\n              [85.601251, 28.254075],\n              [85.602483, 28.295712],\n              [85.520563, 28.326798],\n              [85.458969, 28.332593],\n              [85.415853, 28.321003],\n              [85.379512, 28.274105],\n              [85.349947, 28.298347],\n              [85.272339, 28.282538],\n              [85.209513, 28.338914],\n              [85.179948, 28.324164],\n              [85.113427, 28.344708],\n              [85.129441, 28.377885],\n              [85.108499, 28.461047],\n              [85.160238, 28.49261],\n              [85.189803, 28.544669],\n              [85.18426, 28.587244],\n              [85.195963, 28.624022],\n              [85.155926, 28.643983],\n              [85.126361, 28.676016],\n              [85.05676, 28.674441],\n              [84.995782, 28.611414],\n              [84.981616, 28.586193],\n              [84.896616, 28.587244],\n              [84.857196, 28.567798],\n              [84.773428, 28.610363],\n              [84.698284, 28.633478],\n              [84.699515, 28.671816],\n              [84.669334, 28.680742],\n              [84.650856, 28.714338],\n              [84.620059, 28.732182],\n              [84.557233, 28.74635],\n              [84.483321, 28.735331],\n              [84.445133, 28.764189],\n              [84.434046, 28.823978],\n              [84.404481, 28.828173],\n              [84.408176, 28.85386],\n              [84.340423, 28.866963],\n              [84.330568, 28.859101],\n              [84.268358, 28.895261],\n              [84.234481, 28.889497],\n              [84.228322, 28.949738],\n              [84.248648, 29.030353],\n              [84.224626, 29.049189],\n              [84.194445, 29.045004],\n              [84.192597, 29.084236],\n              [84.20738, 29.118749],\n              [84.176583, 29.133909],\n              [84.17104, 29.19453],\n              [84.197525, 29.210202],\n              [84.203068, 29.239972],\n              [84.130388, 29.239972],\n              [84.116837, 29.286438],\n              [84.052163, 29.296877],\n              [84.002272, 29.291658],\n              [83.986874, 29.325057],\n              [83.949301, 29.312533],\n              [83.911729, 29.323491],\n              [83.851367, 29.294789],\n              [83.82057, 29.294267],\n              [83.800244, 29.249372],\n              [83.727563, 29.244672],\n              [83.667201, 29.200277],\n              [83.656114, 29.16736],\n              [83.596368, 29.174153],\n              [83.57789, 29.203934],\n              [83.548941, 29.201322],\n              [83.492274, 29.280174],\n              [83.463941, 29.285916],\n              [83.450391, 29.332883],\n              [83.423289, 29.361053],\n              [83.415898, 29.420496],\n              [83.383253, 29.42206],\n              [83.325355, 29.502826],\n              [83.27608, 29.505951],\n              [83.266841, 29.571035],\n              [83.217565, 29.60018],\n              [83.164595, 29.595496],\n              [83.159667, 29.61735],\n              [83.12887, 29.623593],\n              [83.088834, 29.604863],\n              [83.011226, 29.667804],\n              [82.966878, 29.658963],\n              [82.9484, 29.704718],\n              [82.885574, 29.689122],\n              [82.830756, 29.687562],\n              [82.816589, 29.717192],\n              [82.774089, 29.726548],\n              [82.757459, 29.761881],\n              [82.691553, 29.766037],\n              [82.737749, 29.80655],\n              [82.703872, 29.847566],\n              [82.6238, 29.834588],\n              [82.64351, 29.868846],\n              [82.609017, 29.886489],\n              [82.560974, 29.955476],\n              [82.498148, 29.947698],\n              [82.474743, 29.973622],\n              [82.431011, 29.989692],\n              [82.412533, 30.011978],\n              [82.368185, 30.014051],\n              [82.333693, 30.045138],\n              [82.311519, 30.035813],\n              [82.246845, 30.071555],\n              [82.17786, 30.06793],\n              [82.183403, 30.12178],\n              [82.207425, 30.143519],\n              [82.188947, 30.18543],\n              [82.142135, 30.200948],\n              [82.114418, 30.226806],\n              [82.11873, 30.279019],\n              [82.132896, 30.30434],\n              [82.104563, 30.346182],\n              [82.060215, 30.332237],\n              [82.022027, 30.339468],\n              [81.99123, 30.322939],\n              [81.954274, 30.355995],\n              [81.939491, 30.344633],\n              [81.872354, 30.373035],\n              [81.759021, 30.385426],\n              [81.723913, 30.407623],\n              [81.63029, 30.446842],\n              [81.613044, 30.412784],\n              [81.566232, 30.428782],\n              [81.555761, 30.369421],\n              [81.494783, 30.381296],\n              [81.454131, 30.412268],\n              [81.418407, 30.420525],\n              [81.406704, 30.40401],\n              [81.432573, 30.379231],\n              [81.406088, 30.369421],\n              [81.399929, 30.319323],\n              [81.427646, 30.305373],\n              [81.406088, 30.291938],\n              [81.419023, 30.270232],\n              [81.397465, 30.240767],\n              [81.393769, 30.199396],\n              [81.335871, 30.149729],\n              [81.269349, 30.153351],\n              [81.293371, 30.094859],\n              [81.2829, 30.061197],\n              [81.247792, 30.032705],\n              [81.256415, 30.011978],\n              [81.225618, 30.005759],\n              [81.131995, 30.016124],\n              [81.09627, 30.052909],\n              [81.110437, 30.085538],\n              [81.085799, 30.100554],\n              [81.082104, 30.151281],\n              [81.038372, 30.205086],\n              [81.034677, 30.246971],\n              [80.996488, 30.267648],\n              [80.933662, 30.266614],\n              [80.910873, 30.30279],\n              [80.81725, 30.321389],\n              [80.719316, 30.414848],\n              [80.692214, 30.416913],\n              [80.633084, 30.458707],\n              [80.585041, 30.463866],\n              [80.549316, 30.448905],\n              [80.504969, 30.483466],\n              [80.446454, 30.495327],\n              [80.43044, 30.515952],\n              [80.357759, 30.520592],\n              [80.322035, 30.564403],\n              [80.261673, 30.566465],\n              [80.214245, 30.586044],\n              [80.143412, 30.55822],\n              [80.04363, 30.603559],\n              [80.014065, 30.661748],\n              [79.970333, 30.685941],\n              [79.955551, 30.738422],\n              [79.961094, 30.771337],\n              [79.900732, 30.7991],\n              [79.913051, 30.833022],\n              [79.890877, 30.855116],\n              [79.835443, 30.851006],\n              [79.75845, 30.936769],\n              [79.729501, 30.941389],\n              [79.668523, 30.980392],\n              [79.660516, 30.956787],\n              [79.59769, 30.925989],\n              [79.550879, 30.957813],\n              [79.505915, 31.027584],\n              [79.427075, 31.018353],\n              [79.424611, 31.061425],\n              [79.404901, 31.071678],\n              [79.35809, 31.031174],\n              [79.316206, 31.01784],\n              [79.33222, 30.969103],\n              [79.227511, 30.949088],\n              [79.205953, 31.0004],\n              [79.181931, 31.015788],\n              [79.096931, 30.992192],\n              [79.059359, 31.028097],\n              [79.010084, 31.043994],\n              [78.97436, 31.115751],\n              [78.997765, 31.158779],\n              [78.930628, 31.220726],\n              [78.923852, 31.246824],\n              [78.884432, 31.277006],\n              [78.865338, 31.312804],\n              [78.859179, 31.289281],\n              [78.795121, 31.301043],\n              [78.755085, 31.355742],\n              [78.760013, 31.392531],\n              [78.792041, 31.435944],\n              [78.755701, 31.478316],\n              [78.729832, 31.478316],\n              [78.740303, 31.532912],\n              [78.779723, 31.545154],\n              [78.833925, 31.584927],\n              [78.845628, 31.609905],\n              [78.806824, 31.64099],\n              [78.798817, 31.675629],\n              [78.763092, 31.668499],\n              [78.706426, 31.778453],\n              [78.654687, 31.819144],\n              [78.665158, 31.851684],\n              [78.739687, 31.885228],\n              [78.768636, 31.92638],\n              [78.762476, 31.947203],\n              [78.705194, 31.988835],\n              [78.60726, 32.023851],\n              [78.609107, 32.052768],\n              [78.527188, 32.11463],\n              [78.509941, 32.147065],\n              [78.469905, 32.127808],\n              [78.429869, 32.194683],\n              [78.430485, 32.212407],\n              [78.475449, 32.236708],\n              [78.508709, 32.297939],\n              [78.480992, 32.329297],\n              [78.483456, 32.357106],\n              [78.458818, 32.379853],\n              [78.472985, 32.435431],\n              [78.426174, 32.502584],\n              [78.395377, 32.530339],\n              [78.424942, 32.565652],\n              [78.500086, 32.580782],\n              [78.518564, 32.605993],\n              [78.577695, 32.615067],\n              [78.588782, 32.637748],\n              [78.628202, 32.630188],\n              [78.675013, 32.658408],\n              [78.6861, 32.680071],\n              [78.741534, 32.703743],\n              [78.74215, 32.654881],\n              [78.781571, 32.608009],\n              [78.760629, 32.563635],\n              [78.782186, 32.480373],\n              [78.81052, 32.436441],\n              [78.87273, 32.40512],\n              [78.904142, 32.374798],\n              [78.970664, 32.331826],\n              [79.005772, 32.375304],\n              [79.067982, 32.380863],\n              [79.103091, 32.369744],\n              [79.124649, 32.416235],\n              [79.135736, 32.472295],\n              [79.180083, 32.492994],\n              [79.190554, 32.511669],\n              [79.252148, 32.516715],\n              [79.272474, 32.561113],\n              [79.308199, 32.596918],\n              [79.299575, 32.637244],\n              [79.27309, 32.678056],\n              [79.301423, 32.728919],\n              [79.275554, 32.778746],\n              [79.225047, 32.784281],\n              [79.237982, 32.846145],\n              [79.227511, 32.89038],\n              [79.255844, 32.942628],\n              [79.204721, 32.964724],\n              [79.162837, 33.01191],\n              [79.139431, 33.117735],\n              [79.162221, 33.165841],\n              [79.152366, 33.184375],\n              [79.10925, 33.200401],\n              [79.072294, 33.22844],\n              [79.083997, 33.245459],\n              [79.041497, 33.268479],\n              [79.022403, 33.323504],\n              [78.9682, 33.334505],\n              [78.949722, 33.376495],\n              [78.896751, 33.41247],\n              [78.84994, 33.419963],\n              [78.816679, 33.480882],\n              [78.74215, 33.55323],\n              [78.755085, 33.623025],\n              [78.713201, 33.623025],\n              [78.684868, 33.654415],\n              [78.692259, 33.676331],\n              [78.779723, 33.73259],\n              [78.758165, 33.790802],\n              [78.766172, 33.823124],\n              [78.756317, 33.8773],\n              [78.762476, 33.90959],\n              [78.734143, 33.918529],\n              [78.744614, 33.980585],\n              [78.736607, 33.999937],\n              [78.656535, 34.030196],\n              [78.661462, 34.086718],\n              [78.737223, 34.089692],\n              [78.801897, 34.137258],\n              [78.828998, 34.125369],\n              [78.878273, 34.163012],\n              [78.910302, 34.143202],\n              [78.9257, 34.155584],\n              [78.941099, 34.212022],\n              [78.958345, 34.230827],\n              [78.981751, 34.31836],\n              [79.019939, 34.313417],\n              [79.039649, 34.33467],\n              [79.048888, 34.348506],\n              [79.0107, 34.399877],\n              [79.039033, 34.421601],\n              [79.072294, 34.412714],\n              [79.161605, 34.441345],\n              [79.179467, 34.422588],\n              [79.241677, 34.415183],\n              [79.274322, 34.435916],\n              [79.326677, 34.44332],\n              [79.363017, 34.428018],\n              [79.435082, 34.447761],\n              [79.504683, 34.45467],\n              [79.545335, 34.476381],\n              [79.58106, 34.456151],\n              [79.675914, 34.451216],\n              [79.699936, 34.477861],\n              [79.735661, 34.471447],\n              [79.801566, 34.478847],\n              [79.861312, 34.528166],\n              [79.84345, 34.55725],\n              [79.88595, 34.642965],\n              [79.866856, 34.671517],\n              [79.906892, 34.683821],\n              [79.898268, 34.732035],\n              [79.947544, 34.821008],\n              [79.926602, 34.849499],\n              [79.961094, 34.862759],\n              [79.996819, 34.856375],\n              [80.003594, 34.895162],\n              [80.034391, 34.902033],\n              [80.041782, 34.943252],\n              [80.02392, 34.971209],\n              [80.04363, 35.022196],\n              [80.031311, 35.034447],\n              [80.078123, 35.076578],\n              [80.118159, 35.066293],\n              [80.23026, 35.147565],\n              [80.223484, 35.177409],\n              [80.257977, 35.203331],\n              [80.362687, 35.20871],\n              [80.267832, 35.295701],\n              [80.286926, 35.35283],\n              [80.321419, 35.38699],\n              [80.375006, 35.387966],\n              [80.432904, 35.449418],\n              [80.444607, 35.417235],\n              [80.514824, 35.391869],\n              [80.532686, 35.404553],\n              [80.56841, 35.391381],\n              [80.599823, 35.409431],\n              [80.65649, 35.393821],\n              [80.690982, 35.364544],\n              [80.689135, 35.339162],\n              [80.759968, 35.334768],\n              [80.844351, 35.345508],\n              [80.894242, 35.324027],\n              [80.924423, 35.330862],\n              [80.963844, 35.310842],\n              [81.026053, 35.31133],\n              [81.002648, 35.334768],\n              [81.030981, 35.337209],\n              [81.031597, 35.380648],\n              [81.054387, 35.402602],\n              [81.09935, 35.40748],\n              [81.103662, 35.386015],\n              [81.142466, 35.365032],\n              [81.191741, 35.36552],\n              [81.219458, 35.319144],\n              [81.26627, 35.322562],\n              [81.285364, 35.345508],\n              [81.314313, 35.337209],\n              [81.363588, 35.354783],\n              [81.385762, 35.335256],\n              [81.441196, 35.333303],\n              [81.447972, 35.318167],\n              [81.504638, 35.279092],\n              [81.513261, 35.23511],\n              [81.68634, 35.235599],\n              [81.736847, 35.26248],\n              [81.804601, 35.270786],\n              [81.853876, 35.25857],\n              [81.927789, 35.271275],\n              [81.955506, 35.307423],\n              [81.99123, 35.30547],\n              [82.030034, 35.321585],\n              [82.05344, 35.35039],\n              [82.029419, 35.426013],\n              [82.034346, 35.451855],\n              [82.071302, 35.450393],\n              [82.086701, 35.467454],\n              [82.164925, 35.495719],\n              [82.189563, 35.513258],\n              [82.234526, 35.520565],\n              [82.263475, 35.547837],\n              [82.2992, 35.544916],\n              [82.328149, 35.559523],\n              [82.350323, 35.611113],\n              [82.336156, 35.651486],\n              [82.392823, 35.656349],\n              [82.424852, 35.712736],\n              [82.468583, 35.717595],\n              [82.501844, 35.701073],\n              [82.546192, 35.708362],\n              [82.628727, 35.692324],\n              [82.652133, 35.67288],\n              [82.731589, 35.637868],\n              [82.780249, 35.666073],\n              [82.795031, 35.688436],\n              [82.873871, 35.688922],\n              [82.894813, 35.673852],\n              [82.967494, 35.667532],\n              [82.956407, 35.636409],\n              [82.981661, 35.599922],\n              [82.971806, 35.548324],\n              [82.998907, 35.484512],\n              [83.067892, 35.46258],\n              [83.088834, 35.425526],\n              [83.127022, 35.398699],\n              [83.178145, 35.38943],\n              [83.251442, 35.417722],\n              [83.280391, 35.401138],\n              [83.333978, 35.397236],\n              [83.405427, 35.380648],\n              [83.449159, 35.382111],\n              [83.502745, 35.360639],\n              [83.540318, 35.364056],\n              [83.54155, 35.341603],\n              [83.599448, 35.351366],\n              [83.622238, 35.335256],\n              [83.677672, 35.361128],\n              [83.785462, 35.36308],\n              [83.79778, 35.354783],\n              [83.885244, 35.367472],\n              [83.906186, 35.40309],\n              [84.005968, 35.422599],\n              [84.077417, 35.400163],\n              [84.095895, 35.362592],\n              [84.140859, 35.379184],\n              [84.160569, 35.359663],\n              [84.200605, 35.381135],\n              [84.274517, 35.404065],\n              [84.333032, 35.413821],\n              [84.424191, 35.466479],\n              [84.45314, 35.473303],\n              [84.475929, 35.516181],\n              [84.448828, 35.550272],\n              [84.513502, 35.564391],\n              [84.570168, 35.588242],\n              [84.628067, 35.595055],\n              [84.704443, 35.616951],\n              [84.729081, 35.613546],\n              [84.798066, 35.647595],\n              [84.920022, 35.696213],\n              [84.973608, 35.709334],\n              [84.99455, 35.737028],\n              [85.053065, 35.752086],\n              [85.146071, 35.742371],\n              [85.271107, 35.788989],\n              [85.341324, 35.753543],\n              [85.373969, 35.700101],\n              [85.518715, 35.680658],\n              [85.566142, 35.6403],\n              [85.612953, 35.651486],\n              [85.65299, 35.731199],\n              [85.691178, 35.751114],\n              [85.811286, 35.778794],\n              [85.835308, 35.771996],\n              [85.903677, 35.78462],\n              [85.949256, 35.778794],\n              [86.035488, 35.846738],\n              [86.05335, 35.842857],\n              [86.090306, 35.876809],\n              [86.093386, 35.906868],\n              [86.129111, 35.941761],\n              [86.150668, 36.00424],\n              [86.173458, 36.008113],\n              [86.199944, 36.047801],\n              [86.182081, 36.064734],\n              [86.187625, 36.130983],\n              [86.248603, 36.141616],\n              [86.2794, 36.170608],\n              [86.35824, 36.168676],\n              [86.392733, 36.206834],\n              [86.454943, 36.221319],\n              [86.515305, 36.205385],\n              [86.531935, 36.227113],\n              [86.599072, 36.222285],\n              [86.69947, 36.24449],\n              [86.746282, 36.291777],\n              [86.836209, 36.291294],\n              [86.86331, 36.299977],\n              [86.887332, 36.262829],\n              [86.931064, 36.265242],\n              [86.943998, 36.284058],\n              [86.996353, 36.308658],\n              [87.051788, 36.2966],\n              [87.08628, 36.310587],\n              [87.149106, 36.297565],\n              [87.161425, 36.325535],\n              [87.193454, 36.349158],\n              [87.292004, 36.358797],\n              [87.348055, 36.393008],\n              [87.363453, 36.420463],\n              [87.386859, 36.412757],\n              [87.426895, 36.42576],\n              [87.460155, 36.409868],\n              [87.470626, 36.354459],\n              [87.570409, 36.342409],\n              [87.6203, 36.360243],\n              [87.731785, 36.384818],\n              [87.767509, 36.3747],\n              [87.826023, 36.391563],\n              [87.838342, 36.383855],\n              [87.919646, 36.39349],\n              [87.95845, 36.408423],\n              [87.983088, 36.437797],\n              [88.006494, 36.430575],\n              [88.092109, 36.43539],\n              [88.134609, 36.427205],\n              [88.182652, 36.452721],\n              [88.222688, 36.447426],\n              [88.241782, 36.468605],\n              [88.282434, 36.470049],\n              [88.366202, 36.458016],\n              [88.356963, 36.477268],\n              [88.41055, 36.473418],\n              [88.470912, 36.48208],\n              [88.498629, 36.446463],\n              [88.573158, 36.461386],\n              [88.618121, 36.428168],\n              [88.623665, 36.389636],\n              [88.690186, 36.367954],\n              [88.766563, 36.292259],\n              [88.783809, 36.291777],\n              [88.802903, 36.33807],\n              [88.838628, 36.353496],\n              [88.870657, 36.348193],\n              [88.926091, 36.36458],\n              [88.964279, 36.318785],\n              [89.013554, 36.315409],\n              [89.054822, 36.291777],\n              [89.10225, 36.281164],\n              [89.126887, 36.254626],\n              [89.198952, 36.260417],\n              [89.232213, 36.295636],\n              [89.292575, 36.231457],\n              [89.335075, 36.23725],\n              [89.375727, 36.228078],\n              [89.490291, 36.151281],\n              [89.594385, 36.126632],\n              [89.614711, 36.109712],\n              [89.711414, 36.093272],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 610000,\n        name: '陕西省',\n        center: [108.948024, 34.263161],\n        centroid: [108.887304, 35.263625],\n        childrenNum: 10,\n        level: 'province',\n        subFeatureIndex: 26,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [110.398352, 33.176862],\n              [110.398352, 33.176862],\n              [110.372482, 33.186379],\n              [110.33799, 33.160331],\n              [110.285635, 33.171352],\n              [110.218497, 33.163336],\n              [110.164911, 33.209415],\n              [110.031252, 33.191888],\n              [109.999223, 33.212419],\n              [109.973353, 33.203907],\n              [109.916687, 33.229942],\n              [109.852013, 33.247961],\n              [109.813209, 33.236449],\n              [109.732521, 33.231443],\n              [109.693101, 33.254468],\n              [109.649985, 33.251465],\n              [109.619804, 33.275484],\n              [109.60687, 33.235949],\n              [109.514479, 33.237951],\n              [109.498464, 33.207412],\n              [109.438718, 33.152314],\n              [109.468283, 33.140288],\n              [109.522486, 33.138785],\n              [109.576073, 33.110216],\n              [109.688174, 33.116733],\n              [109.704188, 33.101694],\n              [109.794731, 33.067095],\n              [109.785492, 32.987316],\n              [109.76455, 32.909474],\n              [109.789804, 32.882339],\n              [109.847702, 32.893395],\n              [109.856941, 32.910479],\n              [109.907448, 32.903947],\n              [109.927158, 32.887364],\n              [109.988752, 32.886359],\n              [110.051578, 32.851676],\n              [110.105164, 32.832569],\n              [110.142121, 32.802895],\n              [110.127338, 32.77774],\n              [110.159367, 32.767173],\n              [110.156903, 32.683093],\n              [110.206179, 32.633212],\n              [110.153824, 32.593388],\n              [110.124259, 32.616579],\n              [110.090382, 32.617083],\n              [110.084223, 32.580782],\n              [110.017701, 32.546989],\n              [109.97089, 32.577756],\n              [109.910528, 32.592884],\n              [109.816905, 32.577252],\n              [109.746072, 32.594901],\n              [109.726978, 32.608513],\n              [109.631507, 32.599943],\n              [109.619804, 32.56767],\n              [109.637051, 32.540935],\n              [109.575457, 32.506622],\n              [109.526797, 32.43341],\n              [109.529877, 32.405625],\n              [109.502776, 32.38895],\n              [109.513247, 32.342444],\n              [109.495385, 32.300468],\n              [109.528645, 32.270112],\n              [109.550203, 32.225065],\n              [109.592703, 32.219495],\n              [109.604406, 32.199241],\n              [109.58716, 32.161251],\n              [109.621652, 32.106519],\n              [109.590855, 32.047696],\n              [109.590855, 32.012688],\n              [109.631507, 31.962436],\n              [109.62042, 31.928412],\n              [109.584696, 31.900472],\n              [109.60379, 31.885737],\n              [109.633971, 31.824738],\n              [109.633971, 31.804396],\n              [109.592087, 31.789136],\n              [109.585928, 31.726546],\n              [109.549587, 31.73011],\n              [109.502776, 31.716365],\n              [109.446109, 31.722983],\n              [109.381436, 31.705165],\n              [109.281654, 31.716874],\n              [109.282885, 31.743343],\n              [109.253936, 31.759628],\n              [109.279806, 31.776418],\n              [109.27611, 31.79931],\n              [109.195422, 31.817618],\n              [109.191111, 31.85575],\n              [109.123357, 31.892851],\n              [109.085785, 31.929428],\n              [108.986619, 31.980205],\n              [108.902235, 31.984774],\n              [108.837561, 32.039072],\n              [108.78767, 32.04871],\n              [108.75133, 32.076098],\n              [108.734084, 32.106519],\n              [108.676801, 32.10297],\n              [108.585026, 32.17189],\n              [108.543758, 32.177969],\n              [108.509882, 32.201266],\n              [108.507418, 32.245819],\n              [108.469846, 32.270618],\n              [108.414411, 32.252399],\n              [108.389773, 32.263533],\n              [108.310933, 32.232152],\n              [108.240716, 32.274666],\n              [108.179738, 32.221521],\n              [108.156948, 32.239239],\n              [108.143398, 32.219495],\n              [108.086731, 32.233165],\n              [108.018362, 32.2119],\n              [108.024521, 32.177462],\n              [107.979558, 32.146051],\n              [107.924739, 32.197215],\n              [107.890247, 32.214432],\n              [107.864377, 32.201266],\n              [107.812022, 32.247844],\n              [107.753508, 32.338399],\n              [107.707929, 32.331826],\n              [107.680827, 32.397035],\n              [107.648183, 32.413709],\n              [107.598291, 32.411688],\n              [107.527458, 32.38238],\n              [107.489886, 32.425328],\n              [107.456625, 32.41775],\n              [107.460937, 32.453612],\n              [107.438763, 32.465732],\n              [107.436299, 32.529835],\n              [107.382097, 32.54043],\n              [107.356843, 32.506622],\n              [107.313727, 32.489965],\n              [107.287858, 32.457147],\n              [107.263836, 32.403099],\n              [107.212097, 32.428864],\n              [107.189924, 32.468256],\n              [107.127098, 32.482393],\n              [107.080286, 32.542448],\n              [107.108004, 32.600951],\n              [107.098765, 32.649338],\n              [107.05996, 32.686115],\n              [107.066736, 32.708779],\n              [107.012533, 32.721367],\n              [106.912751, 32.704247],\n              [106.903512, 32.721367],\n              [106.854853, 32.724388],\n              [106.82344, 32.705254],\n              [106.793259, 32.712807],\n              [106.783404, 32.735967],\n              [106.733513, 32.739491],\n              [106.670071, 32.694678],\n              [106.626955, 32.682086],\n              [106.585687, 32.68813],\n              [106.517934, 32.668485],\n              [106.498224, 32.649338],\n              [106.451412, 32.65992],\n              [106.421231, 32.616579],\n              [106.389203, 32.62666],\n              [106.347935, 32.671003],\n              [106.301123, 32.680071],\n              [106.267863, 32.673522],\n              [106.254928, 32.693671],\n              [106.17424, 32.6977],\n              [106.120037, 32.719856],\n              [106.071378, 32.758114],\n              [106.076305, 32.759121],\n              [106.076921, 32.76365],\n              [106.07261, 32.76365],\n              [106.093552, 32.82402],\n              [106.071378, 32.828546],\n              [106.044277, 32.864747],\n              [106.011632, 32.829552],\n              [105.969132, 32.849162],\n              [105.93156, 32.826032],\n              [105.893371, 32.838603],\n              [105.849024, 32.817985],\n              [105.825002, 32.824523],\n              [105.822538, 32.770192],\n              [105.779423, 32.750061],\n              [105.768952, 32.767676],\n              [105.719061, 32.759624],\n              [105.677793, 32.726402],\n              [105.596489, 32.69921],\n              [105.585402, 32.728919],\n              [105.563844, 32.724891],\n              [105.555221, 32.794343],\n              [105.534279, 32.790822],\n              [105.524424, 32.847654],\n              [105.495475, 32.873292],\n              [105.49917, 32.911986],\n              [105.528119, 32.919019],\n              [105.565692, 32.906962],\n              [105.590329, 32.87681],\n              [105.638373, 32.879323],\n              [105.656851, 32.895405],\n              [105.735691, 32.905454],\n              [105.82685, 32.950663],\n              [105.861959, 32.939112],\n              [105.917393, 32.993841],\n              [105.926632, 33.042517],\n              [105.914929, 33.066092],\n              [105.934639, 33.112221],\n              [105.923552, 33.147805],\n              [105.897067, 33.146803],\n              [105.93156, 33.178365],\n              [105.968516, 33.154318],\n              [105.965436, 33.204407],\n              [105.917393, 33.237951],\n              [105.862574, 33.234447],\n              [105.799133, 33.258471],\n              [105.791741, 33.278486],\n              [105.752937, 33.291994],\n              [105.755401, 33.329004],\n              [105.709822, 33.382991],\n              [105.827466, 33.379993],\n              [105.837937, 33.410971],\n              [105.831162, 33.451926],\n              [105.842248, 33.489866],\n              [105.871198, 33.511325],\n              [105.902611, 33.556222],\n              [105.940183, 33.570684],\n              [105.971596, 33.613058],\n              [106.047356, 33.610067],\n              [106.086776, 33.617045],\n              [106.117573, 33.602591],\n              [106.108334, 33.569686],\n              [106.187174, 33.546746],\n              [106.237681, 33.564201],\n              [106.303587, 33.604585],\n              [106.35163, 33.587137],\n              [106.384891, 33.612061],\n              [106.447101, 33.613058],\n              [106.456956, 33.532779],\n              [106.540108, 33.512822],\n              [106.58076, 33.576169],\n              [106.575832, 33.631497],\n              [106.534564, 33.695254],\n              [106.482825, 33.707203],\n              [106.488369, 33.757969],\n              [106.461883, 33.789807],\n              [106.491448, 33.834559],\n              [106.475434, 33.875809],\n              [106.428007, 33.866368],\n              [106.41076, 33.909093],\n              [106.474202, 33.970659],\n              [106.471738, 34.024244],\n              [106.505615, 34.056479],\n              [106.501919, 34.105055],\n              [106.560434, 34.109514],\n              [106.585071, 34.149641],\n              [106.55797, 34.229837],\n              [106.5321, 34.254079],\n              [106.496376, 34.238248],\n              [106.526557, 34.292159],\n              [106.577064, 34.280786],\n              [106.589383, 34.253584],\n              [106.63373, 34.260014],\n              [106.652825, 34.24369],\n              [106.68239, 34.256057],\n              [106.705179, 34.299575],\n              [106.691013, 34.337635],\n              [106.717498, 34.369255],\n              [106.638042, 34.391481],\n              [106.610941, 34.454177],\n              [106.558586, 34.48822],\n              [106.513622, 34.498085],\n              [106.514238, 34.511894],\n              [106.455108, 34.531617],\n              [106.334384, 34.517811],\n              [106.341159, 34.568093],\n              [106.314058, 34.578934],\n              [106.419384, 34.643458],\n              [106.471122, 34.634102],\n              [106.442173, 34.675455],\n              [106.456956, 34.703996],\n              [106.487137, 34.715311],\n              [106.505615, 34.746789],\n              [106.539492, 34.745805],\n              [106.575216, 34.769897],\n              [106.550579, 34.82936],\n              [106.556122, 34.861285],\n              [106.527789, 34.876507],\n              [106.493296, 34.941289],\n              [106.484673, 34.983959],\n              [106.494528, 35.006021],\n              [106.494528, 35.006021],\n              [106.52163, 35.027587],\n              [106.541956, 35.083925],\n              [106.577064, 35.089312],\n              [106.615252, 35.071191],\n              [106.706411, 35.081966],\n              [106.710723, 35.100574],\n              [106.838222, 35.080007],\n              [106.901664, 35.094698],\n              [106.950323, 35.066782],\n              [106.990975, 35.068252],\n              [107.012533, 35.029547],\n              [107.08275, 35.024156],\n              [107.089526, 34.976604],\n              [107.119707, 34.950119],\n              [107.162206, 34.944233],\n              [107.189308, 34.893198],\n              [107.252749, 34.880925],\n              [107.286626, 34.931968],\n              [107.350068, 34.93393],\n              [107.369162, 34.917738],\n              [107.400575, 34.932949],\n              [107.455394, 34.916757],\n              [107.523763, 34.909886],\n              [107.564415, 34.968757],\n              [107.619849, 34.964834],\n              [107.638943, 34.935402],\n              [107.675284, 34.9511],\n              [107.741805, 34.953553],\n              [107.842203, 34.979056],\n              [107.863145, 34.999158],\n              [107.846515, 35.024646],\n              [107.814486, 35.024646],\n              [107.773218, 35.060904],\n              [107.773218, 35.060904],\n              [107.769523, 35.064333],\n              [107.769523, 35.064333],\n              [107.727639, 35.120157],\n              [107.715936, 35.168114],\n              [107.686371, 35.218],\n              [107.652494, 35.244886],\n              [107.667277, 35.257104],\n              [107.737494, 35.267366],\n              [107.745501, 35.311819],\n              [107.841587, 35.276649],\n              [107.867457, 35.256127],\n              [107.960464, 35.263457],\n              [107.949993, 35.245375],\n              [108.049159, 35.253683],\n              [108.094739, 35.280069],\n              [108.174811, 35.304981],\n              [108.221622, 35.296678],\n              [108.239484, 35.256127],\n              [108.296767, 35.267855],\n              [108.345426, 35.300586],\n              [108.36144, 35.279581],\n              [108.48894, 35.275184],\n              [108.547454, 35.304981],\n              [108.583178, 35.294724],\n              [108.614591, 35.328909],\n              [108.61028, 35.355271],\n              [108.631222, 35.418698],\n              [108.605968, 35.503028],\n              [108.625678, 35.537124],\n              [108.618287, 35.557088],\n              [108.539447, 35.605761],\n              [108.517889, 35.699615],\n              [108.533903, 35.746257],\n              [108.527744, 35.82442],\n              [108.499411, 35.872444],\n              [108.518505, 35.905414],\n              [108.562852, 35.921409],\n              [108.593649, 35.950967],\n              [108.652164, 35.94806],\n              [108.659555, 35.990683],\n              [108.688504, 36.021183],\n              [108.682345, 36.062316],\n              [108.712526, 36.138716],\n              [108.646004, 36.254143],\n              [108.641693, 36.359279],\n              [108.651548, 36.384818],\n              [108.618903, 36.433946],\n              [108.562852, 36.43876],\n              [108.510498, 36.47438],\n              [108.514809, 36.445501],\n              [108.495099, 36.422389],\n              [108.460606, 36.422871],\n              [108.408252, 36.45946],\n              [108.391621, 36.505654],\n              [108.365136, 36.519603],\n              [108.340498, 36.559032],\n              [108.262274, 36.549417],\n              [108.245644, 36.571048],\n              [108.210535, 36.577296],\n              [108.204992, 36.606607],\n              [108.204992, 36.606607],\n              [108.222854, 36.631105],\n              [108.1976, 36.630144],\n              [108.163724, 36.563839],\n              [108.092891, 36.587388],\n              [108.079956, 36.614294],\n              [108.060862, 36.592194],\n              [108.001732, 36.639269],\n              [108.02329, 36.647912],\n              [108.006659, 36.683435],\n              [107.938906, 36.655594],\n              [107.940754, 36.694953],\n              [107.914268, 36.720861],\n              [107.907493, 36.750118],\n              [107.866841, 36.766899],\n              [107.768291, 36.792783],\n              [107.742421, 36.811951],\n              [107.722095, 36.802367],\n              [107.670356, 36.83303],\n              [107.642023, 36.819137],\n              [107.5909, 36.836382],\n              [107.540393, 36.828718],\n              [107.533618, 36.867031],\n              [107.478183, 36.908196],\n              [107.365466, 36.905324],\n              [107.336517, 36.925899],\n              [107.310032, 36.912502],\n              [107.291554, 36.979463],\n              [107.291554, 36.979463],\n              [107.288474, 37.008143],\n              [107.288474, 37.008143],\n              [107.28601, 37.054963],\n              [107.268764, 37.099367],\n              [107.281083, 37.127047],\n              [107.306952, 37.100799],\n              [107.334669, 37.138975],\n              [107.336517, 37.165687],\n              [107.317423, 37.200017],\n              [107.270612, 37.229089],\n              [107.309416, 37.239095],\n              [107.273075, 37.29101],\n              [107.257677, 37.337179],\n              [107.282931, 37.437036],\n              [107.284162, 37.481691],\n              [107.345756, 37.518725],\n              [107.369162, 37.58752],\n              [107.330358, 37.584201],\n              [107.311264, 37.609806],\n              [107.361155, 37.613125],\n              [107.422133, 37.665254],\n              [107.389488, 37.671413],\n              [107.387024, 37.691305],\n              [107.425828, 37.684201],\n              [107.484959, 37.706458],\n              [107.499125, 37.765619],\n              [107.57119, 37.776499],\n              [107.599523, 37.791162],\n              [107.620465, 37.776026],\n              [107.646335, 37.805349],\n              [107.659269, 37.844112],\n              [107.65003, 37.86443],\n              [107.684523, 37.888522],\n              [107.732566, 37.84931],\n              [107.842819, 37.828987],\n              [107.884703, 37.808186],\n              [107.982022, 37.787378],\n              [107.993109, 37.735335],\n              [108.025753, 37.696041],\n              [108.012819, 37.66857],\n              [108.025137, 37.649619],\n              [108.055318, 37.652462],\n              [108.134159, 37.622131],\n              [108.193905, 37.638246],\n              [108.205608, 37.655779],\n              [108.24626, 37.665728],\n              [108.293071, 37.656726],\n              [108.301078, 37.640616],\n              [108.422418, 37.648672],\n              [108.485244, 37.678044],\n              [108.532671, 37.690832],\n              [108.628142, 37.651988],\n              [108.699591, 37.669518],\n              [108.720533, 37.683728],\n              [108.777815, 37.683728],\n              [108.791982, 37.700303],\n              [108.784591, 37.764673],\n              [108.799989, 37.784068],\n              [108.791982, 37.872934],\n              [108.798141, 37.93385],\n              [108.82709, 37.989056],\n              [108.797525, 38.04799],\n              [108.830786, 38.049875],\n              [108.883141, 38.01405],\n              [108.893612, 37.978207],\n              [108.93488, 37.922521],\n              [108.9743, 37.931962],\n              [108.982923, 37.964053],\n              [109.018648, 37.971602],\n              [109.037742, 38.021593],\n              [109.06977, 38.023008],\n              [109.050676, 38.055059],\n              [109.069155, 38.091336],\n              [108.964445, 38.154894],\n              [108.938575, 38.207582],\n              [108.976148, 38.245192],\n              [108.961981, 38.26493],\n              [109.007561, 38.359316],\n              [109.051292, 38.385122],\n              [109.054372, 38.433892],\n              [109.128901, 38.480288],\n              [109.175712, 38.518694],\n              [109.196654, 38.552867],\n              [109.276726, 38.623035],\n              [109.331545, 38.597783],\n              [109.367269, 38.627711],\n              [109.329081, 38.66043],\n              [109.338936, 38.701542],\n              [109.404226, 38.720689],\n              [109.444262, 38.782763],\n              [109.511399, 38.833595],\n              [109.549587, 38.805618],\n              [109.624116, 38.85457],\n              [109.672159, 38.928167],\n              [109.685094, 38.968195],\n              [109.665384, 38.981687],\n              [109.72513, 39.018429],\n              [109.762086, 39.057476],\n              [109.793499, 39.074204],\n              [109.851397, 39.122971],\n              [109.890818, 39.103932],\n              [109.92223, 39.107183],\n              [109.893897, 39.141075],\n              [109.961035, 39.191651],\n              [109.871723, 39.243581],\n              [109.90252, 39.271848],\n              [109.962267, 39.212056],\n              [110.041107, 39.21623],\n              [110.109476, 39.249606],\n              [110.217881, 39.281113],\n              [110.184005, 39.355192],\n              [110.161831, 39.387115],\n              [110.136577, 39.39174],\n              [110.12549, 39.432891],\n              [110.152592, 39.45415],\n              [110.243751, 39.423645],\n              [110.257917, 39.407001],\n              [110.385417, 39.310291],\n              [110.429764, 39.341308],\n              [110.434692, 39.381101],\n              [110.482735, 39.360745],\n              [110.524003, 39.382952],\n              [110.559728, 39.351027],\n              [110.566503, 39.320014],\n              [110.596684, 39.282966],\n              [110.626249, 39.266751],\n              [110.702626, 39.273701],\n              [110.731575, 39.30705],\n              [110.73835, 39.348713],\n              [110.782698, 39.38804],\n              [110.869545, 39.494341],\n              [110.891103, 39.509118],\n              [110.958856, 39.519275],\n              [111.017371, 39.552045],\n              [111.101138, 39.559428],\n              [111.136863, 39.587106],\n              [111.154725, 39.569116],\n              [111.148566, 39.531277],\n              [111.10545, 39.497573],\n              [111.10545, 39.472631],\n              [111.058639, 39.447681],\n              [111.064182, 39.400989],\n              [111.098059, 39.401914],\n              [111.087588, 39.376013],\n              [111.125776, 39.366297],\n              [111.159037, 39.362596],\n              [111.155341, 39.338531],\n              [111.186138, 39.35149],\n              [111.179363, 39.326959],\n              [111.202152, 39.305197],\n              [111.247732, 39.302419],\n              [111.213239, 39.257021],\n              [111.219399, 39.244044],\n              [111.163348, 39.152678],\n              [111.173819, 39.135041],\n              [111.147334, 39.100681],\n              [111.138095, 39.064447],\n              [111.094363, 39.030053],\n              [111.038313, 39.020289],\n              [110.998276, 38.998433],\n              [110.980414, 38.970056],\n              [111.009979, 38.932823],\n              [111.016755, 38.889981],\n              [110.995813, 38.868084],\n              [111.009363, 38.847579],\n              [110.965016, 38.755699],\n              [110.915125, 38.704345],\n              [110.916357, 38.673981],\n              [110.880632, 38.626776],\n              [110.898494, 38.587024],\n              [110.920052, 38.581878],\n              [110.907733, 38.521035],\n              [110.870777, 38.510265],\n              [110.874473, 38.453579],\n              [110.840596, 38.439986],\n              [110.796864, 38.453579],\n              [110.77777, 38.440924],\n              [110.746973, 38.366355],\n              [110.701394, 38.353215],\n              [110.661358, 38.308617],\n              [110.601612, 38.308147],\n              [110.57759, 38.297345],\n              [110.565887, 38.215105],\n              [110.528315, 38.211814],\n              [110.509221, 38.192061],\n              [110.519692, 38.130889],\n              [110.501829, 38.097929],\n              [110.507989, 38.013107],\n              [110.528315, 37.990471],\n              [110.522771, 37.955088],\n              [110.59422, 37.922049],\n              [110.680452, 37.790216],\n              [110.735886, 37.77035],\n              [110.750669, 37.736281],\n              [110.716792, 37.728708],\n              [110.706321, 37.705511],\n              [110.775306, 37.680886],\n              [110.793169, 37.650567],\n              [110.763604, 37.639668],\n              [110.771611, 37.594634],\n              [110.795017, 37.558586],\n              [110.770995, 37.538184],\n              [110.759292, 37.474567],\n              [110.740198, 37.44939],\n              [110.644111, 37.435135],\n              [110.630561, 37.372858],\n              [110.641648, 37.360015],\n              [110.695234, 37.34955],\n              [110.678604, 37.317668],\n              [110.690307, 37.287201],\n              [110.660126, 37.281011],\n              [110.651503, 37.256722],\n              [110.590525, 37.187145],\n              [110.53509, 37.138021],\n              [110.535706, 37.115118],\n              [110.49567, 37.086956],\n              [110.460561, 37.044932],\n              [110.417446, 37.027257],\n              [110.426685, 37.008621],\n              [110.382953, 37.022001],\n              [110.381721, 37.002408],\n              [110.424221, 36.963685],\n              [110.408823, 36.892403],\n              [110.376178, 36.882351],\n              [110.424221, 36.855539],\n              [110.406975, 36.824886],\n              [110.423605, 36.818179],\n              [110.407591, 36.776007],\n              [110.447011, 36.737649],\n              [110.438388, 36.685835],\n              [110.402663, 36.697352],\n              [110.394656, 36.676716],\n              [110.426685, 36.657514],\n              [110.447627, 36.621018],\n              [110.496902, 36.582102],\n              [110.488895, 36.556628],\n              [110.503677, 36.488335],\n              [110.47288, 36.453203],\n              [110.489511, 36.430094],\n              [110.487047, 36.393972],\n              [110.459946, 36.327946],\n              [110.474112, 36.306729],\n              [110.474112, 36.248352],\n              [110.45625, 36.22663],\n              [110.447011, 36.164328],\n              [110.467953, 36.074893],\n              [110.491974, 36.034735],\n              [110.49259, 35.994073],\n              [110.516612, 35.971796],\n              [110.502445, 35.947575],\n              [110.516612, 35.918501],\n              [110.511684, 35.879718],\n              [110.549257, 35.877778],\n              [110.550489, 35.838005],\n              [110.571431, 35.800639],\n              [110.57759, 35.701559],\n              [110.609619, 35.632031],\n              [110.567735, 35.539559],\n              [110.531394, 35.511309],\n              [110.477808, 35.413821],\n              [110.45009, 35.327933],\n              [110.374946, 35.251728],\n              [110.369402, 35.158329],\n              [110.325671, 35.014844],\n              [110.272084, 34.942761],\n              [110.257301, 34.934912],\n              [110.259149, 34.884853],\n              [110.233896, 34.83722],\n              [110.232664, 34.80332],\n              [110.259149, 34.737937],\n              [110.231432, 34.701044],\n              [110.23636, 34.670533],\n              [110.29549, 34.610956],\n              [110.379257, 34.600612],\n              [110.366939, 34.566614],\n              [110.404511, 34.557743],\n              [110.372482, 34.544435],\n              [110.360779, 34.516825],\n              [110.403279, 34.433448],\n              [110.403279, 34.433448],\n              [110.473496, 34.393457],\n              [110.503677, 34.33714],\n              [110.451938, 34.292653],\n              [110.428533, 34.288203],\n              [110.43962, 34.243196],\n              [110.507989, 34.217466],\n              [110.55172, 34.213012],\n              [110.55788, 34.193214],\n              [110.621938, 34.177372],\n              [110.642264, 34.161032],\n              [110.61393, 34.113478],\n              [110.591757, 34.101586],\n              [110.587445, 34.023252],\n              [110.620706, 34.035652],\n              [110.671213, 33.966192],\n              [110.665669, 33.937895],\n              [110.627481, 33.925482],\n              [110.628713, 33.910086],\n              [110.587445, 33.887733],\n              [110.612083, 33.852453],\n              [110.66259, 33.85295],\n              [110.712481, 33.833564],\n              [110.74143, 33.798759],\n              [110.782082, 33.796272],\n              [110.81719, 33.751003],\n              [110.831973, 33.713675],\n              [110.823966, 33.685793],\n              [110.878784, 33.634486],\n              [110.966864, 33.609071],\n              [111.00382, 33.578662],\n              [111.002588, 33.535772],\n              [111.02661, 33.478386],\n              [111.021682, 33.476389],\n              [111.021066, 33.471397],\n              [111.02661, 33.467903],\n              [110.996429, 33.435946],\n              [111.025994, 33.375495],\n              [111.025994, 33.330504],\n              [110.984726, 33.255469],\n              [110.960704, 33.253967],\n              [110.9219, 33.203907],\n              [110.865234, 33.213921],\n              [110.828893, 33.201403],\n              [110.824582, 33.158327],\n              [110.753133, 33.15031],\n              [110.702626, 33.097182],\n              [110.650887, 33.157324],\n              [110.623785, 33.143796],\n              [110.59422, 33.168346],\n              [110.57759, 33.250464],\n              [110.54125, 33.255469],\n              [110.471032, 33.171352],\n              [110.398352, 33.176862],\n            ],\n          ],\n          [\n            [\n              [111.02661, 33.478386],\n              [111.02661, 33.467903],\n              [111.021066, 33.471397],\n              [111.021682, 33.476389],\n              [111.02661, 33.478386],\n            ],\n          ],\n          [\n            [\n              [106.076921, 32.76365],\n              [106.076305, 32.759121],\n              [106.071378, 32.758114],\n              [106.07261, 32.76365],\n              [106.076921, 32.76365],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 620000,\n        name: '甘肃省',\n        center: [103.823557, 36.058039],\n        childrenNum: 14,\n        level: 'province',\n        subFeatureIndex: 27,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [106.506231, 35.737514],\n              [106.566593, 35.738971],\n              [106.595542, 35.727312],\n              [106.620796, 35.743829],\n              [106.633115, 35.714679],\n              [106.66268, 35.70739],\n              [106.674998, 35.728284],\n              [106.750759, 35.689408],\n              [106.750759, 35.725369],\n              [106.806193, 35.70982],\n              [106.819128, 35.7448],\n              [106.867171, 35.738485],\n              [106.868403, 35.771996],\n              [106.897353, 35.759856],\n              [106.927534, 35.810346],\n              [106.849925, 35.887476],\n              [106.912751, 35.93207],\n              [106.940468, 35.931101],\n              [106.93862, 35.952905],\n              [106.90228, 35.943699],\n              [106.94786, 35.988262],\n              [106.928149, 36.011502],\n              [106.940468, 36.064734],\n              [106.957715, 36.091337],\n              [106.925686, 36.115997],\n              [106.930613, 36.138716],\n              [106.873947, 36.178338],\n              [106.873947, 36.178338],\n              [106.858548, 36.206834],\n              [106.858548, 36.206834],\n              [106.833295, 36.229044],\n              [106.808657, 36.21118],\n              [106.772933, 36.212628],\n              [106.735976, 36.23725],\n              [106.698404, 36.244008],\n              [106.685469, 36.273445],\n              [106.647897, 36.259451],\n              [106.559202, 36.292259],\n              [106.54134, 36.25366],\n              [106.504383, 36.266207],\n              [106.470507, 36.306246],\n              [106.497608, 36.31348],\n              [106.510543, 36.379037],\n              [106.492064, 36.422389],\n              [106.523477, 36.468605],\n              [106.494528, 36.494589],\n              [106.455724, 36.496995],\n              [106.39721, 36.548455],\n              [106.37134, 36.549417],\n              [106.363949, 36.577296],\n              [106.392282, 36.556628],\n              [106.397826, 36.576816],\n              [106.444637, 36.557109],\n              [106.465579, 36.583063],\n              [106.444637, 36.624861],\n              [106.491448, 36.628703],\n              [106.490833, 36.685835],\n              [106.530869, 36.690154],\n              [106.519782, 36.708868],\n              [106.519782, 36.708868],\n              [106.514238, 36.715584],\n              [106.59431, 36.750118],\n              [106.644817, 36.72278],\n              [106.627571, 36.752995],\n              [106.657752, 36.820575],\n              [106.637426, 36.867031],\n              [106.637426, 36.867031],\n              [106.626955, 36.892403],\n              [106.609709, 36.878521],\n              [106.609709, 36.878521],\n              [106.601702, 36.918244],\n              [106.549347, 36.941685],\n              [106.540108, 36.984244],\n              [106.595542, 36.94025],\n              [106.594926, 36.967988],\n              [106.64297, 36.962729],\n              [106.646665, 37.000496],\n              [106.666991, 37.016745],\n              [106.645433, 37.064992],\n              [106.605397, 37.127524],\n              [106.6171, 37.135158],\n              [106.673151, 37.1113],\n              [106.687933, 37.12991],\n              [106.728585, 37.121321],\n              [106.750143, 37.09889],\n              [106.772933, 37.120367],\n              [106.776012, 37.158056],\n              [106.818512, 37.141838],\n              [106.891193, 37.098413],\n              [106.912135, 37.110345],\n              [106.905976, 37.151378],\n              [106.998367, 37.106527],\n              [107.031011, 37.108436],\n              [107.030395, 37.140883],\n              [107.095685, 37.115595],\n              [107.133873, 37.134681],\n              [107.181916, 37.143269],\n              [107.234887, 37.096503],\n              [107.268764, 37.099367],\n              [107.28601, 37.054963],\n              [107.288474, 37.008143],\n              [107.288474, 37.008143],\n              [107.291554, 36.979463],\n              [107.291554, 36.979463],\n              [107.310032, 36.912502],\n              [107.336517, 36.925899],\n              [107.365466, 36.905324],\n              [107.478183, 36.908196],\n              [107.533618, 36.867031],\n              [107.540393, 36.828718],\n              [107.5909, 36.836382],\n              [107.642023, 36.819137],\n              [107.670356, 36.83303],\n              [107.722095, 36.802367],\n              [107.742421, 36.811951],\n              [107.768291, 36.792783],\n              [107.866841, 36.766899],\n              [107.907493, 36.750118],\n              [107.914268, 36.720861],\n              [107.940754, 36.694953],\n              [107.938906, 36.655594],\n              [108.006659, 36.683435],\n              [108.02329, 36.647912],\n              [108.001732, 36.639269],\n              [108.060862, 36.592194],\n              [108.079956, 36.614294],\n              [108.092891, 36.587388],\n              [108.163724, 36.563839],\n              [108.1976, 36.630144],\n              [108.222854, 36.631105],\n              [108.204992, 36.606607],\n              [108.204992, 36.606607],\n              [108.210535, 36.577296],\n              [108.245644, 36.571048],\n              [108.262274, 36.549417],\n              [108.340498, 36.559032],\n              [108.365136, 36.519603],\n              [108.391621, 36.505654],\n              [108.408252, 36.45946],\n              [108.460606, 36.422871],\n              [108.495099, 36.422389],\n              [108.514809, 36.445501],\n              [108.510498, 36.47438],\n              [108.562852, 36.43876],\n              [108.618903, 36.433946],\n              [108.651548, 36.384818],\n              [108.641693, 36.359279],\n              [108.646004, 36.254143],\n              [108.712526, 36.138716],\n              [108.682345, 36.062316],\n              [108.688504, 36.021183],\n              [108.659555, 35.990683],\n              [108.652164, 35.94806],\n              [108.593649, 35.950967],\n              [108.562852, 35.921409],\n              [108.518505, 35.905414],\n              [108.499411, 35.872444],\n              [108.527744, 35.82442],\n              [108.533903, 35.746257],\n              [108.517889, 35.699615],\n              [108.539447, 35.605761],\n              [108.618287, 35.557088],\n              [108.625678, 35.537124],\n              [108.605968, 35.503028],\n              [108.631222, 35.418698],\n              [108.61028, 35.355271],\n              [108.614591, 35.328909],\n              [108.583178, 35.294724],\n              [108.547454, 35.304981],\n              [108.48894, 35.275184],\n              [108.36144, 35.279581],\n              [108.345426, 35.300586],\n              [108.296767, 35.267855],\n              [108.239484, 35.256127],\n              [108.221622, 35.296678],\n              [108.174811, 35.304981],\n              [108.094739, 35.280069],\n              [108.049159, 35.253683],\n              [107.949993, 35.245375],\n              [107.960464, 35.263457],\n              [107.867457, 35.256127],\n              [107.841587, 35.276649],\n              [107.745501, 35.311819],\n              [107.737494, 35.267366],\n              [107.667277, 35.257104],\n              [107.652494, 35.244886],\n              [107.686371, 35.218],\n              [107.715936, 35.168114],\n              [107.727639, 35.120157],\n              [107.769523, 35.064333],\n              [107.769523, 35.064333],\n              [107.773218, 35.060904],\n              [107.773218, 35.060904],\n              [107.814486, 35.024646],\n              [107.846515, 35.024646],\n              [107.863145, 34.999158],\n              [107.842203, 34.979056],\n              [107.741805, 34.953553],\n              [107.675284, 34.9511],\n              [107.638943, 34.935402],\n              [107.619849, 34.964834],\n              [107.564415, 34.968757],\n              [107.523763, 34.909886],\n              [107.455394, 34.916757],\n              [107.400575, 34.932949],\n              [107.369162, 34.917738],\n              [107.350068, 34.93393],\n              [107.286626, 34.931968],\n              [107.252749, 34.880925],\n              [107.189308, 34.893198],\n              [107.162206, 34.944233],\n              [107.119707, 34.950119],\n              [107.089526, 34.976604],\n              [107.08275, 35.024156],\n              [107.012533, 35.029547],\n              [106.990975, 35.068252],\n              [106.950323, 35.066782],\n              [106.901664, 35.094698],\n              [106.838222, 35.080007],\n              [106.710723, 35.100574],\n              [106.706411, 35.081966],\n              [106.615252, 35.071191],\n              [106.577064, 35.089312],\n              [106.541956, 35.083925],\n              [106.52163, 35.027587],\n              [106.494528, 35.006021],\n              [106.494528, 35.006021],\n              [106.484673, 34.983959],\n              [106.493296, 34.941289],\n              [106.527789, 34.876507],\n              [106.556122, 34.861285],\n              [106.550579, 34.82936],\n              [106.575216, 34.769897],\n              [106.539492, 34.745805],\n              [106.505615, 34.746789],\n              [106.487137, 34.715311],\n              [106.456956, 34.703996],\n              [106.442173, 34.675455],\n              [106.471122, 34.634102],\n              [106.419384, 34.643458],\n              [106.314058, 34.578934],\n              [106.341159, 34.568093],\n              [106.334384, 34.517811],\n              [106.455108, 34.531617],\n              [106.514238, 34.511894],\n              [106.513622, 34.498085],\n              [106.558586, 34.48822],\n              [106.610941, 34.454177],\n              [106.638042, 34.391481],\n              [106.717498, 34.369255],\n              [106.691013, 34.337635],\n              [106.705179, 34.299575],\n              [106.68239, 34.256057],\n              [106.652825, 34.24369],\n              [106.63373, 34.260014],\n              [106.589383, 34.253584],\n              [106.577064, 34.280786],\n              [106.526557, 34.292159],\n              [106.496376, 34.238248],\n              [106.5321, 34.254079],\n              [106.55797, 34.229837],\n              [106.585071, 34.149641],\n              [106.560434, 34.109514],\n              [106.501919, 34.105055],\n              [106.505615, 34.056479],\n              [106.471738, 34.024244],\n              [106.474202, 33.970659],\n              [106.41076, 33.909093],\n              [106.428007, 33.866368],\n              [106.475434, 33.875809],\n              [106.491448, 33.834559],\n              [106.461883, 33.789807],\n              [106.488369, 33.757969],\n              [106.482825, 33.707203],\n              [106.534564, 33.695254],\n              [106.575832, 33.631497],\n              [106.58076, 33.576169],\n              [106.540108, 33.512822],\n              [106.456956, 33.532779],\n              [106.447101, 33.613058],\n              [106.384891, 33.612061],\n              [106.35163, 33.587137],\n              [106.303587, 33.604585],\n              [106.237681, 33.564201],\n              [106.187174, 33.546746],\n              [106.108334, 33.569686],\n              [106.117573, 33.602591],\n              [106.086776, 33.617045],\n              [106.047356, 33.610067],\n              [105.971596, 33.613058],\n              [105.940183, 33.570684],\n              [105.902611, 33.556222],\n              [105.871198, 33.511325],\n              [105.842248, 33.489866],\n              [105.831162, 33.451926],\n              [105.837937, 33.410971],\n              [105.827466, 33.379993],\n              [105.709822, 33.382991],\n              [105.755401, 33.329004],\n              [105.752937, 33.291994],\n              [105.791741, 33.278486],\n              [105.799133, 33.258471],\n              [105.862574, 33.234447],\n              [105.917393, 33.237951],\n              [105.965436, 33.204407],\n              [105.968516, 33.154318],\n              [105.93156, 33.178365],\n              [105.897067, 33.146803],\n              [105.923552, 33.147805],\n              [105.934639, 33.112221],\n              [105.914929, 33.066092],\n              [105.926632, 33.042517],\n              [105.917393, 32.993841],\n              [105.861959, 32.939112],\n              [105.82685, 32.950663],\n              [105.735691, 32.905454],\n              [105.656851, 32.895405],\n              [105.638373, 32.879323],\n              [105.590329, 32.87681],\n              [105.565692, 32.906962],\n              [105.528119, 32.919019],\n              [105.49917, 32.911986],\n              [105.467757, 32.930071],\n              [105.414171, 32.922034],\n              [105.408011, 32.885857],\n              [105.38091, 32.876307],\n              [105.396308, 32.85067],\n              [105.396308, 32.85067],\n              [105.427721, 32.784281],\n              [105.454207, 32.767173],\n              [105.448663, 32.732946],\n              [105.368591, 32.712807],\n              [105.347033, 32.68259],\n              [105.297758, 32.656897],\n              [105.263265, 32.652362],\n              [105.219534, 32.666469],\n              [105.215222, 32.63674],\n              [105.185041, 32.617587],\n              [105.111128, 32.593893],\n              [105.0791, 32.637244],\n              [105.026745, 32.650346],\n              [104.925115, 32.607505],\n              [104.881999, 32.600951],\n              [104.845659, 32.653873],\n              [104.820405, 32.662943],\n              [104.795768, 32.643292],\n              [104.739717, 32.635228],\n              [104.696601, 32.673522],\n              [104.643015, 32.661935],\n              [104.592508, 32.695685],\n              [104.582653, 32.722374],\n              [104.526602, 32.728416],\n              [104.51182, 32.753585],\n              [104.458849, 32.748551],\n              [104.363994, 32.822511],\n              [104.294393, 32.835586],\n              [104.277147, 32.90244],\n              [104.288234, 32.942628],\n              [104.345516, 32.940117],\n              [104.378161, 32.953174],\n              [104.383704, 32.994343],\n              [104.426204, 33.010906],\n              [104.391711, 33.035493],\n              [104.337509, 33.038002],\n              [104.378161, 33.109214],\n              [104.351059, 33.158828],\n              [104.32827, 33.223934],\n              [104.323958, 33.26898],\n              [104.303632, 33.304499],\n              [104.333813, 33.315502],\n              [104.386168, 33.298497],\n              [104.420045, 33.327004],\n              [104.373849, 33.345004],\n              [104.292545, 33.336505],\n              [104.272219, 33.391486],\n              [104.22048, 33.404477],\n              [104.213089, 33.446932],\n              [104.180444, 33.472895],\n              [104.155191, 33.542755],\n              [104.176749, 33.5996],\n              [104.103452, 33.663381],\n              [104.046169, 33.686291],\n              [103.980264, 33.670852],\n              [103.861388, 33.682307],\n              [103.778236, 33.658898],\n              [103.690772, 33.69376],\n              [103.667983, 33.685793],\n              [103.645809, 33.708697],\n              [103.593454, 33.716164],\n              [103.563889, 33.699735],\n              [103.552186, 33.671351],\n              [103.520157, 33.678323],\n              [103.545411, 33.719649],\n              [103.518309, 33.807213],\n              [103.464723, 33.80224],\n              [103.434542, 33.752993],\n              [103.35447, 33.743539],\n              [103.278709, 33.774387],\n              [103.284868, 33.80224],\n              [103.24976, 33.814175],\n              [103.228202, 33.79478],\n              [103.165376, 33.805721],\n              [103.153673, 33.819147],\n              [103.181391, 33.900649],\n              [103.16476, 33.929454],\n              [103.1315, 33.931937],\n              [103.120413, 33.953286],\n              [103.157369, 33.998944],\n              [103.147514, 34.036644],\n              [103.119797, 34.03466],\n              [103.129652, 34.065899],\n              [103.178927, 34.079779],\n              [103.121644, 34.112487],\n              [103.124108, 34.162022],\n              [103.100087, 34.181828],\n              [103.052043, 34.195194],\n              [103.005848, 34.184798],\n              [102.973203, 34.205588],\n              [102.977515, 34.252595],\n              [102.949181, 34.292159],\n              [102.911609, 34.312923],\n              [102.85987, 34.301058],\n              [102.856791, 34.270895],\n              [102.798276, 34.272874],\n              [102.779798, 34.236764],\n              [102.728675, 34.235774],\n              [102.694799, 34.198659],\n              [102.664002, 34.192719],\n              [102.651067, 34.165983],\n              [102.598712, 34.14766],\n              [102.655994, 34.113478],\n              [102.649219, 34.080275],\n              [102.615958, 34.099604],\n              [102.511865, 34.086222],\n              [102.471213, 34.072839],\n              [102.437336, 34.087214],\n              [102.406539, 34.033172],\n              [102.392372, 33.971651],\n              [102.345561, 33.969666],\n              [102.315996, 33.993983],\n              [102.287047, 33.977607],\n              [102.248858, 33.98654],\n              [102.226069, 33.963214],\n              [102.16817, 33.983066],\n              [102.136142, 33.965199],\n              [102.25317, 33.861399],\n              [102.261177, 33.821136],\n              [102.243315, 33.786823],\n              [102.296286, 33.783838],\n              [102.324619, 33.754486],\n              [102.284583, 33.719151],\n              [102.342481, 33.725622],\n              [102.31538, 33.665374],\n              [102.346793, 33.605582],\n              [102.440416, 33.574673],\n              [102.477988, 33.543254],\n              [102.446575, 33.53228],\n              [102.461358, 33.501345],\n              [102.462589, 33.449429],\n              [102.447807, 33.454922],\n              [102.392988, 33.404477],\n              [102.368967, 33.41247],\n              [102.310452, 33.397982],\n              [102.296286, 33.413969],\n              [102.258098, 33.409472],\n              [102.218062, 33.349503],\n              [102.192192, 33.337005],\n              [102.217446, 33.247961],\n              [102.200815, 33.223434],\n              [102.160163, 33.242956],\n              [102.144765, 33.273983],\n              [102.117047, 33.288492],\n              [102.08933, 33.227439],\n              [102.08933, 33.204908],\n              [102.054838, 33.189884],\n              [101.99386, 33.1999],\n              [101.935345, 33.186879],\n              [101.921795, 33.153817],\n              [101.887302, 33.135778],\n              [101.865744, 33.103198],\n              [101.825708, 33.119239],\n              [101.841723, 33.184876],\n              [101.83002, 33.213921],\n              [101.770274, 33.248962],\n              [101.769658, 33.26898],\n              [101.877447, 33.314502],\n              [101.887302, 33.383991],\n              [101.915635, 33.425957],\n              [101.946432, 33.442937],\n              [101.906396, 33.48188],\n              [101.907012, 33.539264],\n              [101.884222, 33.578163],\n              [101.844186, 33.602591],\n              [101.831252, 33.554726],\n              [101.783208, 33.556721],\n              [101.769042, 33.538765],\n              [101.748716, 33.505337],\n              [101.718535, 33.494857],\n              [101.622448, 33.502343],\n              [101.611977, 33.565199],\n              [101.616905, 33.598603],\n              [101.585492, 33.645448],\n              [101.58426, 33.674339],\n              [101.501724, 33.702723],\n              [101.428427, 33.680315],\n              [101.424732, 33.655411],\n              [101.385312, 33.644949],\n              [101.302776, 33.657902],\n              [101.23687, 33.685793],\n              [101.217776, 33.669856],\n              [101.166653, 33.659894],\n              [101.177124, 33.685295],\n              [101.162957, 33.719649],\n              [101.186363, 33.741051],\n              [101.190675, 33.791796],\n              [101.153102, 33.823124],\n              [101.153718, 33.8445],\n              [101.054552, 33.863386],\n              [101.023139, 33.896178],\n              [100.994806, 33.891707],\n              [100.965857, 33.946832],\n              [100.927669, 33.975126],\n              [100.93506, 33.990013],\n              [100.880857, 34.036644],\n              [100.870386, 34.083744],\n              [100.848828, 34.089692],\n              [100.806329, 34.155584],\n              [100.764445, 34.178857],\n              [100.809408, 34.247153],\n              [100.798321, 34.260014],\n              [100.821727, 34.317371],\n              [100.868538, 34.332693],\n              [100.895024, 34.375183],\n              [100.951074, 34.38358],\n              [100.986799, 34.374689],\n              [101.054552, 34.322808],\n              [101.098284, 34.329233],\n              [101.178356, 34.320831],\n              [101.193754, 34.336646],\n              [101.235022, 34.325279],\n              [101.228863, 34.298586],\n              [101.268899, 34.278808],\n              [101.325565, 34.268423],\n              [101.327413, 34.24468],\n              [101.369913, 34.248143],\n              [101.417956, 34.227858],\n              [101.482014, 34.218951],\n              [101.492485, 34.195689],\n              [101.53868, 34.212022],\n              [101.6206, 34.178857],\n              [101.674187, 34.110506],\n              [101.703136, 34.119424],\n              [101.718535, 34.083249],\n              [101.736397, 34.080275],\n              [101.764114, 34.122892],\n              [101.788136, 34.131809],\n              [101.836795, 34.124378],\n              [101.851578, 34.153108],\n              [101.874367, 34.130323],\n              [101.897773, 34.133791],\n              [101.955055, 34.109514],\n              [101.965526, 34.167469],\n              [102.003099, 34.162022],\n              [102.030816, 34.190739],\n              [102.01357, 34.218456],\n              [102.062229, 34.227858],\n              [102.067772, 34.293642],\n              [102.149692, 34.271885],\n              [102.186649, 34.352952],\n              [102.237156, 34.34307],\n              [102.237156, 34.34307],\n              [102.259329, 34.355917],\n              [102.205743, 34.407777],\n              [102.169402, 34.457631],\n              [102.155852, 34.507456],\n              [102.139837, 34.50351],\n              [102.093026, 34.536547],\n              [102.001867, 34.538519],\n              [101.97415, 34.548871],\n              [101.956287, 34.582876],\n              [101.934729, 34.58731],\n              [101.919947, 34.621791],\n              [101.917483, 34.705964],\n              [101.923027, 34.835746],\n              [101.916867, 34.873561],\n              [101.985852, 34.90007],\n              [102.068388, 34.887798],\n              [102.048062, 34.910868],\n              [102.094874, 34.986901],\n              [102.133678, 35.014844],\n              [102.157699, 35.010923],\n              [102.176178, 35.032977],\n              [102.211286, 35.034937],\n              [102.218062, 35.057475],\n              [102.252554, 35.048657],\n              [102.29567, 35.071681],\n              [102.310452, 35.128967],\n              [102.346793, 35.164201],\n              [102.404075, 35.179366],\n              [102.365887, 35.235599],\n              [102.370199, 35.263946],\n              [102.3123, 35.282512],\n              [102.280887, 35.303028],\n              [102.311684, 35.31426],\n              [102.317844, 35.343067],\n              [102.287663, 35.36552],\n              [102.293822, 35.424063],\n              [102.314764, 35.434303],\n              [102.408387, 35.409431],\n              [102.447807, 35.437229],\n              [102.437952, 35.455268],\n              [102.49893, 35.545403],\n              [102.503241, 35.585322],\n              [102.531575, 35.580455],\n              [102.570995, 35.548324],\n              [102.695414, 35.528358],\n              [102.743458, 35.494745],\n              [102.782878, 35.527871],\n              [102.729291, 35.523487],\n              [102.746537, 35.545403],\n              [102.808747, 35.560496],\n              [102.763168, 35.612086],\n              [102.7644, 35.653431],\n              [102.744074, 35.657807],\n              [102.707733, 35.70496],\n              [102.686175, 35.771996],\n              [102.715125, 35.815685],\n              [102.739146, 35.821023],\n              [102.787189, 35.862745],\n              [102.81737, 35.850133],\n              [102.914073, 35.845282],\n              [102.94487, 35.829757],\n              [102.954725, 35.858864],\n              [102.942406, 35.92674],\n              [102.971971, 35.995525],\n              [102.951645, 36.021667],\n              [102.968276, 36.044414],\n              [102.932551, 36.048285],\n              [102.882044, 36.082632],\n              [102.941174, 36.104877],\n              [102.948566, 36.150798],\n              [102.965812, 36.151765],\n              [102.986754, 36.193312],\n              [103.048964, 36.199107],\n              [103.066826, 36.216974],\n              [103.021246, 36.232906],\n              [103.024942, 36.256556],\n              [102.922696, 36.298047],\n              [102.896827, 36.331803],\n              [102.845704, 36.331803],\n              [102.836465, 36.344819],\n              [102.838928, 36.345783],\n              [102.831537, 36.365544],\n              [102.829689, 36.365544],\n              [102.771791, 36.47438],\n              [102.793349, 36.497957],\n              [102.753313, 36.525855],\n              [102.734219, 36.562396],\n              [102.761936, 36.568645],\n              [102.714509, 36.599401],\n              [102.724364, 36.613813],\n              [102.684328, 36.619097],\n              [102.630741, 36.650793],\n              [102.601176, 36.710307],\n              [102.612879, 36.738129],\n              [102.639364, 36.732853],\n              [102.692335, 36.775528],\n              [102.720052, 36.767858],\n              [102.639364, 36.852666],\n              [102.587009, 36.869904],\n              [102.56114, 36.91968],\n              [102.526031, 36.928291],\n              [102.499546, 36.954599],\n              [102.450271, 36.968467],\n              [102.506321, 37.019134],\n              [102.488459, 37.078362],\n              [102.583314, 37.104618],\n              [102.642444, 37.099845],\n              [102.599944, 37.174748],\n              [102.578386, 37.17284],\n              [102.533422, 37.217176],\n              [102.490307, 37.223371],\n              [102.457662, 37.248147],\n              [102.45335, 37.271487],\n              [102.419474, 37.294343],\n              [102.428097, 37.308624],\n              [102.368351, 37.327662],\n              [102.29875, 37.370004],\n              [102.299981, 37.391404],\n              [102.19712, 37.420403],\n              [102.176794, 37.458892],\n              [102.125055, 37.48549],\n              [102.103497, 37.482641],\n              [102.131214, 37.54625],\n              [102.102265, 37.582304],\n              [102.035128, 37.627819],\n              [102.048678, 37.651515],\n              [102.036359, 37.685149],\n              [101.998787, 37.724921],\n              [101.946432, 37.728235],\n              [101.873135, 37.686569],\n              [101.854657, 37.664781],\n              [101.815853, 37.654357],\n              [101.791832, 37.696041],\n              [101.659405, 37.733441],\n              [101.670491, 37.754264],\n              [101.598427, 37.827569],\n              [101.551615, 37.835604],\n              [101.459224, 37.86632],\n              [101.382848, 37.822369],\n              [101.362522, 37.791162],\n              [101.276906, 37.83655],\n              [101.202994, 37.84742],\n              [101.159262, 37.86821],\n              [101.152486, 37.891356],\n              [101.114298, 37.92016],\n              [101.103211, 37.946593],\n              [101.077342, 37.941874],\n              [100.964009, 38.011221],\n              [100.91843, 37.999432],\n              [100.895024, 38.013107],\n              [100.888864, 38.056001],\n              [100.922125, 38.084741],\n              [100.91843, 38.129006],\n              [100.93814, 38.16007],\n              [100.913502, 38.17889],\n              [100.860531, 38.148305],\n              [100.825423, 38.158658],\n              [100.752126, 38.238612],\n              [100.71517, 38.253652],\n              [100.619083, 38.26587],\n              [100.595061, 38.242372],\n              [100.545786, 38.247072],\n              [100.516837, 38.272448],\n              [100.474953, 38.288891],\n              [100.459555, 38.2654],\n              [100.432453, 38.275267],\n              [100.424446, 38.307208],\n              [100.396729, 38.293118],\n              [100.318505, 38.329276],\n              [100.331439, 38.337257],\n              [100.301874, 38.388405],\n              [100.259374, 38.366355],\n              [100.24028, 38.441861],\n              [100.163288, 38.461546],\n              [100.113397, 38.497151],\n              [100.086911, 38.492936],\n              [100.064122, 38.518694],\n              [100.025933, 38.507923],\n              [100.001296, 38.467169],\n              [100.022238, 38.432017],\n              [100.093071, 38.407166],\n              [100.136803, 38.33444],\n              [100.163904, 38.328337],\n              [100.159592, 38.291239],\n              [100.182998, 38.222158],\n              [100.126332, 38.231561],\n              [100.117093, 38.253652],\n              [100.071513, 38.284663],\n              [100.049955, 38.283254],\n              [100.001912, 38.315191],\n              [99.960028, 38.320825],\n              [99.826985, 38.370109],\n              [99.758, 38.410449],\n              [99.727203, 38.415607],\n              [99.65945, 38.449361],\n              [99.63974, 38.474666],\n              [99.585537, 38.498556],\n              [99.52887, 38.546314],\n              [99.501769, 38.612281],\n              [99.450646, 38.60433],\n              [99.412458, 38.665571],\n              [99.375502, 38.684727],\n              [99.361951, 38.718354],\n              [99.291118, 38.765966],\n              [99.222133, 38.788827],\n              [99.141445, 38.852706],\n              [99.068764, 38.896968],\n              [99.071843, 38.921184],\n              [99.107568, 38.951907],\n              [99.054597, 38.97657],\n              [98.951735, 38.987735],\n              [98.903076, 39.012384],\n              [98.886446, 39.040744],\n              [98.818076, 39.064911],\n              [98.816845, 39.085818],\n              [98.743548, 39.086747],\n              [98.730613, 39.057011],\n              [98.70536, 39.043533],\n              [98.661628, 38.993782],\n              [98.612353, 38.977035],\n              [98.624056, 38.959353],\n              [98.584635, 38.93003],\n              [98.526737, 38.95563],\n              [98.457752, 38.952838],\n              [98.428187, 38.976104],\n              [98.432498, 38.996107],\n              [98.401086, 39.001688],\n              [98.383839, 39.029588],\n              [98.316702, 39.040744],\n              [98.280977, 39.027263],\n              [98.287753, 38.992386],\n              [98.276666, 38.963541],\n              [98.235398, 38.918855],\n              [98.242173, 38.880664],\n              [98.167645, 38.840121],\n              [98.091884, 38.786495],\n              [98.068478, 38.816344],\n              [98.029058, 38.834061],\n              [98.009348, 38.85923],\n              [97.875689, 38.898365],\n              [97.828878, 38.93003],\n              [97.701379, 38.963076],\n              [97.679205, 39.010524],\n              [97.58127, 39.052364],\n              [97.504894, 39.076527],\n              [97.458698, 39.117863],\n              [97.401416, 39.146645],\n              [97.371235, 39.140611],\n              [97.347213, 39.167528],\n              [97.315185, 39.164744],\n              [97.220946, 39.193042],\n              [97.14149, 39.199999],\n              [97.060186, 39.19768],\n              [97.017686, 39.208347],\n              [96.962251, 39.198144],\n              [97.012142, 39.142004],\n              [96.969643, 39.097895],\n              [96.95794, 39.041674],\n              [96.965331, 39.017034],\n              [96.938846, 38.95563],\n              [96.940693, 38.90768],\n              [96.983809, 38.869016],\n              [96.993664, 38.834993],\n              [96.987505, 38.793025],\n              [97.00044, 38.7613],\n              [97.023229, 38.755699],\n              [97.009063, 38.702477],\n              [97.057722, 38.67258],\n              [97.047251, 38.653888],\n              [97.055874, 38.594508],\n              [96.961019, 38.558015],\n              [96.876636, 38.580475],\n              [96.847071, 38.599186],\n              [96.7941, 38.608072],\n              [96.808882, 38.582346],\n              [96.767614, 38.552399],\n              [96.800259, 38.52759],\n              [96.780549, 38.504177],\n              [96.706637, 38.505582],\n              [96.6666, 38.483567],\n              [96.707868, 38.459203],\n              [96.698013, 38.422172],\n              [96.626564, 38.356031],\n              [96.638883, 38.307208],\n              [96.655514, 38.295936],\n              [96.665369, 38.23015],\n              [96.46334, 38.277616],\n              [96.378341, 38.277146],\n              [96.335841, 38.246132],\n              [96.301964, 38.183124],\n              [96.313051, 38.161952],\n              [96.264392, 38.145952],\n              [96.252689, 38.167599],\n              [96.221892, 38.149246],\n              [96.109175, 38.187358],\n              [96.06606, 38.173245],\n              [96.006929, 38.207582],\n              [95.93856, 38.237202],\n              [95.932401, 38.259291],\n              [95.89606, 38.2903],\n              [95.852945, 38.287481],\n              [95.83693, 38.344298],\n              [95.775952, 38.356031],\n              [95.723597, 38.378554],\n              [95.703887, 38.400131],\n              [95.671858, 38.388405],\n              [95.608417, 38.339134],\n              [95.585011, 38.343359],\n              [95.51849, 38.294997],\n              [95.487693, 38.314721],\n              [95.455664, 38.291709],\n              [95.440881, 38.310965],\n              [95.408236, 38.300163],\n              [95.315846, 38.318947],\n              [95.259179, 38.302981],\n              [95.229614, 38.330685],\n              [95.209904, 38.327868],\n              [95.185266, 38.379492],\n              [95.140919, 38.392158],\n              [95.122441, 38.417014],\n              [95.072549, 38.402476],\n              [95.045448, 38.418889],\n              [94.973999, 38.430142],\n              [94.884072, 38.414669],\n              [94.861282, 38.393565],\n              [94.812623, 38.385591],\n              [94.672805, 38.386998],\n              [94.582878, 38.36917],\n              [94.56132, 38.351807],\n              [94.527443, 38.365416],\n              [94.527443, 38.425922],\n              [94.511429, 38.445142],\n              [94.370379, 38.7627],\n              [94.281067, 38.7599],\n              [93.973098, 38.724891],\n              [93.95154, 38.715086],\n              [93.885018, 38.720689],\n              [93.800019, 38.750566],\n              [93.773533, 38.771099],\n              [93.756287, 38.807484],\n              [93.769838, 38.821007],\n              [93.884403, 38.826136],\n              [93.884403, 38.867618],\n              [93.834511, 38.867618],\n              [93.729186, 38.924443],\n              [93.453245, 38.915596],\n              [93.274007, 38.896036],\n              [93.237666, 38.916062],\n              [93.179152, 38.923977],\n              [93.198246, 39.045857],\n              [93.165601, 39.090928],\n              [93.131725, 39.108112],\n              [93.142196, 39.160567],\n              [93.115094, 39.17959],\n              [93.043029, 39.146645],\n              [92.978356, 39.143396],\n              [92.938936, 39.169848],\n              [92.889045, 39.160103],\n              [92.866871, 39.138754],\n              [92.765857, 39.136898],\n              [92.659299, 39.109969],\n              [92.545966, 39.111362],\n              [92.489916, 39.099753],\n              [92.459119, 39.063982],\n              [92.459119, 39.042604],\n              [92.41046, 39.03842],\n              [92.366728, 39.059335],\n              [92.366112, 39.096037],\n              [92.343938, 39.146181],\n              [92.339011, 39.236628],\n              [92.378431, 39.258411],\n              [92.52564, 39.368611],\n              [92.639589, 39.514196],\n              [92.687632, 39.657174],\n              [92.745531, 39.868331],\n              [92.796654, 40.153897],\n              [92.906907, 40.310609],\n              [92.920458, 40.391792],\n              [92.928465, 40.572504],\n              [93.506216, 40.648376],\n              [93.760599, 40.664721],\n              [93.820961, 40.793519],\n              [93.809874, 40.879548],\n              [93.908424, 40.983539],\n              [94.01067, 41.114875],\n              [94.184365, 41.268444],\n              [94.534219, 41.505966],\n              [94.750413, 41.538227],\n              [94.809543, 41.619256],\n              [94.861898, 41.668451],\n              [94.969072, 41.718948],\n              [95.011572, 41.726541],\n              [95.110738, 41.768513],\n              [95.135991, 41.772976],\n              [95.16494, 41.735474],\n              [95.199433, 41.719395],\n              [95.194505, 41.694821],\n              [95.247476, 41.61344],\n              [95.299831, 41.565994],\n              [95.335556, 41.644305],\n              [95.39407, 41.693481],\n              [95.445193, 41.719841],\n              [95.57146, 41.796181],\n              [95.65646, 41.826067],\n              [95.759322, 41.835878],\n              [95.801206, 41.848361],\n              [95.855408, 41.849699],\n              [95.998306, 41.906289],\n              [96.054973, 41.936124],\n              [96.117183, 41.985966],\n              [96.137509, 42.019765],\n              [96.13874, 42.05399],\n              [96.077147, 42.149457],\n              [96.178161, 42.21775],\n              [96.040806, 42.326688],\n              [96.042038, 42.352787],\n              [96.06606, 42.414674],\n              [95.978596, 42.436762],\n              [96.0174, 42.482239],\n              [96.02356, 42.542675],\n              [96.072219, 42.569566],\n              [96.103632, 42.604375],\n              [96.166458, 42.623314],\n              [96.386348, 42.727592],\n              [96.742361, 42.75704],\n              [96.968411, 42.756161],\n              [97.172903, 42.795257],\n              [97.371235, 42.457076],\n              [97.500582, 42.243894],\n              [97.653335, 41.986856],\n              [97.84674, 41.656379],\n              [97.613915, 41.477276],\n              [97.629314, 41.440498],\n              [97.903407, 41.168057],\n              [97.971776, 41.09774],\n              [98.142391, 41.001607],\n              [98.184891, 40.988056],\n              [98.25018, 40.93925],\n              [98.333332, 40.918903],\n              [98.344419, 40.568413],\n              [98.627751, 40.677884],\n              [98.569853, 40.746836],\n              [98.668403, 40.773128],\n              [98.689345, 40.691952],\n              [98.72199, 40.657911],\n              [98.762642, 40.639748],\n              [98.802678, 40.607043],\n              [98.80699, 40.660181],\n              [98.790975, 40.705564],\n              [98.984996, 40.782644],\n              [99.041662, 40.693767],\n              [99.102025, 40.676522],\n              [99.12543, 40.715091],\n              [99.172858, 40.747289],\n              [99.174705, 40.858278],\n              [99.565827, 40.846961],\n              [99.673, 40.93292],\n              [99.985897, 40.909858],\n              [100.057346, 40.908049],\n              [100.107853, 40.875475],\n              [100.224882, 40.727337],\n              [100.237201, 40.716905],\n              [100.242744, 40.618855],\n              [100.169447, 40.541131],\n              [100.169447, 40.277743],\n              [100.007455, 40.20008],\n              [99.955716, 40.150695],\n              [99.927383, 40.063727],\n              [99.841152, 40.013326],\n              [99.751225, 40.006909],\n              [99.714268, 39.972061],\n              [99.533182, 39.891753],\n              [99.491298, 39.884406],\n              [99.459885, 39.898181],\n              [99.440791, 39.885783],\n              [99.469124, 39.875221],\n              [99.672384, 39.888079],\n              [99.822058, 39.860063],\n              [99.904593, 39.785601],\n              [99.958796, 39.769504],\n              [100.040716, 39.757083],\n              [100.128179, 39.702312],\n              [100.250135, 39.685274],\n              [100.314193, 39.606935],\n              [100.301258, 39.572345],\n              [100.326512, 39.509118],\n              [100.44354, 39.485565],\n              [100.500823, 39.481408],\n              [100.498975, 39.400527],\n              [100.606764, 39.387577],\n              [100.707778, 39.404689],\n              [100.842053, 39.405614],\n              [100.842669, 39.199999],\n              [100.864227, 39.106719],\n              [100.829118, 39.075133],\n              [100.835278, 39.025869],\n              [100.875314, 39.002619],\n              [100.901799, 39.030053],\n              [100.961545, 39.005874],\n              [100.969553, 38.946788],\n              [101.117378, 38.975174],\n              [101.228863, 39.020754],\n              [101.198682, 38.943064],\n              [101.237486, 38.907214],\n              [101.24303, 38.860628],\n              [101.33542, 38.847113],\n              [101.34158, 38.822406],\n              [101.307087, 38.80282],\n              [101.331109, 38.777164],\n              [101.412413, 38.764099],\n              [101.562702, 38.713218],\n              [101.601506, 38.65529],\n              [101.672955, 38.6908],\n              [101.777049, 38.66043],\n              [101.873751, 38.733761],\n              [101.941505, 38.808883],\n              [102.075164, 38.891378],\n              [102.045599, 38.904885],\n              [101.955055, 38.985874],\n              [101.926106, 39.000758],\n              [101.833715, 39.08907],\n              [101.902701, 39.111827],\n              [102.012338, 39.127149],\n              [102.050526, 39.141075],\n              [102.276576, 39.188868],\n              [102.3548, 39.231993],\n              [102.45335, 39.255167],\n              [102.579002, 39.183301],\n              [102.616574, 39.171703],\n              [102.883892, 39.120649],\n              [103.007696, 39.099753],\n              [103.133347, 39.192579],\n              [103.188166, 39.215302],\n              [103.259615, 39.263971],\n              [103.344615, 39.331588],\n              [103.428998, 39.353341],\n              [103.595302, 39.386652],\n              [103.728961, 39.430117],\n              [103.85338, 39.461543],\n              [103.955626, 39.456923],\n              [104.089901, 39.419947],\n              [104.073271, 39.351953],\n              [104.047401, 39.297788],\n              [104.171205, 39.160567],\n              [104.207546, 39.083495],\n              [104.190915, 39.042139],\n              [104.196459, 38.9882],\n              [104.173053, 38.94446],\n              [104.044322, 38.895105],\n              [104.011677, 38.85923],\n              [103.85954, 38.64454],\n              [103.416063, 38.404821],\n              [103.465339, 38.353215],\n              [103.507838, 38.280905],\n              [103.53494, 38.156776],\n              [103.368636, 38.08898],\n              [103.362477, 38.037621],\n              [103.40744, 37.860651],\n              [103.627947, 37.797783],\n              [103.683381, 37.777919],\n              [103.841062, 37.64725],\n              [103.874938, 37.604117],\n              [103.935916, 37.572818],\n              [104.089285, 37.465067],\n              [104.183524, 37.406618],\n              [104.237727, 37.411847],\n              [104.287002, 37.428007],\n              [104.298705, 37.414223],\n              [104.365226, 37.418026],\n              [104.437907, 37.445589],\n              [104.448994, 37.42468],\n              [104.499501, 37.421353],\n              [104.521059, 37.43466],\n              [104.679971, 37.408044],\n              [104.662109, 37.367626],\n              [104.713848, 37.329566],\n              [104.673812, 37.317668],\n              [104.651022, 37.290534],\n              [104.624536, 37.298627],\n              [104.600515, 37.242907],\n              [104.638087, 37.201923],\n              [104.717543, 37.208597],\n              [104.776673, 37.246718],\n              [104.85613, 37.211933],\n              [104.864753, 37.17284],\n              [104.888158, 37.15901],\n              [104.914644, 37.097935],\n              [104.954064, 37.077407],\n              [104.95468, 37.040156],\n              [105.004571, 37.035378],\n              [105.03968, 37.007187],\n              [105.05939, 37.022956],\n              [105.128991, 36.996194],\n              [105.165331, 36.99476],\n              [105.185657, 36.942164],\n              [105.178882, 36.892403],\n              [105.244787, 36.894796],\n              [105.279896, 36.86751],\n              [105.303302, 36.820575],\n              [105.334714, 36.80093],\n              [105.340874, 36.764502],\n              [105.319932, 36.742924],\n              [105.275584, 36.752515],\n              [105.272505, 36.739567],\n              [105.218302, 36.730455],\n              [105.201056, 36.700711],\n              [105.225693, 36.664716],\n              [105.22015, 36.631105],\n              [105.261418, 36.602764],\n              [105.2762, 36.563358],\n              [105.252179, 36.553263],\n              [105.281744, 36.522489],\n              [105.322396, 36.535954],\n              [105.362432, 36.496514],\n              [105.363048, 36.443093],\n              [105.398156, 36.430575],\n              [105.401236, 36.369881],\n              [105.425873, 36.330357],\n              [105.455439, 36.321678],\n              [105.476381, 36.293224],\n              [105.45975, 36.268137],\n              [105.460366, 36.223733],\n              [105.478844, 36.213111],\n              [105.515185, 36.147415],\n              [105.491163, 36.101009],\n              [105.430801, 36.10391],\n              [105.406163, 36.074409],\n              [105.343954, 36.033767],\n              [105.324859, 35.941761],\n              [105.350113, 35.875839],\n              [105.39754, 35.857409],\n              [105.371055, 35.844312],\n              [105.38091, 35.792873],\n              [105.408627, 35.822479],\n              [105.428953, 35.819082],\n              [105.432033, 35.787533],\n              [105.457286, 35.771511],\n              [105.481924, 35.727312],\n              [105.595873, 35.715651],\n              [105.667322, 35.749657],\n              [105.70243, 35.733142],\n              [105.759097, 35.724883],\n              [105.740618, 35.698643],\n              [105.723988, 35.725854],\n              [105.690727, 35.698643],\n              [105.722756, 35.673366],\n              [105.713517, 35.650513],\n              [105.759097, 35.634464],\n              [105.762176, 35.602841],\n              [105.800365, 35.564878],\n              [105.816379, 35.575101],\n              [105.847176, 35.490359],\n              [105.868734, 35.540046],\n              [105.900147, 35.54735],\n              [106.017175, 35.519103],\n              [106.023335, 35.49377],\n              [106.047356, 35.498155],\n              [106.048588, 35.488898],\n              [105.897683, 35.451368],\n              [105.894603, 35.413821],\n              [106.002393, 35.438692],\n              [106.034422, 35.469404],\n              [106.054132, 35.45478],\n              [106.071994, 35.463555],\n              [106.06953, 35.458193],\n              [106.071378, 35.449418],\n              [106.073226, 35.447468],\n              [106.067682, 35.436254],\n              [106.073226, 35.420649],\n              [106.083081, 35.421624],\n              [106.113262, 35.361616],\n              [106.129892, 35.393333],\n              [106.173008, 35.437716],\n              [106.196414, 35.409919],\n              [106.237681, 35.409431],\n              [106.241377, 35.358687],\n              [106.319601, 35.265411],\n              [106.363333, 35.238532],\n              [106.368261, 35.273718],\n              [106.415688, 35.276161],\n              [106.472354, 35.310842],\n              [106.501304, 35.364056],\n              [106.503767, 35.415284],\n              [106.483441, 35.450393],\n              [106.490217, 35.480613],\n              [106.465579, 35.481101],\n              [106.440941, 35.52641],\n              [106.460036, 35.578995],\n              [106.47913, 35.575101],\n              [106.460036, 35.643705],\n              [106.434782, 35.688436],\n              [106.49268, 35.732656],\n              [106.498224, 35.732656],\n              [106.504383, 35.736057],\n              [106.506231, 35.737514],\n            ],\n          ],\n          [\n            [\n              [106.047356, 35.498155],\n              [106.078769, 35.509848],\n              [106.071994, 35.463555],\n              [106.054132, 35.45478],\n              [106.048588, 35.488898],\n              [106.047356, 35.498155],\n            ],\n          ],\n          [\n            [\n              [102.831537, 36.365544],\n              [102.838928, 36.345783],\n              [102.836465, 36.344819],\n              [102.829689, 36.365544],\n              [102.831537, 36.365544],\n            ],\n          ],\n          [\n            [\n              [106.073226, 35.447468],\n              [106.083081, 35.421624],\n              [106.073226, 35.420649],\n              [106.067682, 35.436254],\n              [106.073226, 35.447468],\n            ],\n          ],\n          [\n            [\n              [106.504383, 35.736057],\n              [106.498224, 35.732656],\n              [106.49268, 35.732656],\n              [106.506231, 35.737514],\n              [106.504383, 35.736057],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 630000,\n        name: '青海省',\n        center: [101.778916, 36.623178],\n        centroid: [96.043533, 35.726403],\n        childrenNum: 8,\n        level: 'province',\n        subFeatureIndex: 28,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [102.829689, 36.365544],\n              [102.836465, 36.344819],\n              [102.845704, 36.331803],\n              [102.896827, 36.331803],\n              [102.922696, 36.298047],\n              [103.024942, 36.256556],\n              [103.021246, 36.232906],\n              [103.066826, 36.216974],\n              [103.048964, 36.199107],\n              [102.986754, 36.193312],\n              [102.965812, 36.151765],\n              [102.948566, 36.150798],\n              [102.941174, 36.104877],\n              [102.882044, 36.082632],\n              [102.932551, 36.048285],\n              [102.968276, 36.044414],\n              [102.951645, 36.021667],\n              [102.971971, 35.995525],\n              [102.942406, 35.92674],\n              [102.954725, 35.858864],\n              [102.94487, 35.829757],\n              [102.914073, 35.845282],\n              [102.81737, 35.850133],\n              [102.787189, 35.862745],\n              [102.739146, 35.821023],\n              [102.715125, 35.815685],\n              [102.686175, 35.771996],\n              [102.707733, 35.70496],\n              [102.744074, 35.657807],\n              [102.7644, 35.653431],\n              [102.763168, 35.612086],\n              [102.808747, 35.560496],\n              [102.746537, 35.545403],\n              [102.729291, 35.523487],\n              [102.782878, 35.527871],\n              [102.743458, 35.494745],\n              [102.695414, 35.528358],\n              [102.570995, 35.548324],\n              [102.531575, 35.580455],\n              [102.503241, 35.585322],\n              [102.49893, 35.545403],\n              [102.437952, 35.455268],\n              [102.447807, 35.437229],\n              [102.408387, 35.409431],\n              [102.314764, 35.434303],\n              [102.293822, 35.424063],\n              [102.287663, 35.36552],\n              [102.317844, 35.343067],\n              [102.311684, 35.31426],\n              [102.280887, 35.303028],\n              [102.3123, 35.282512],\n              [102.370199, 35.263946],\n              [102.365887, 35.235599],\n              [102.404075, 35.179366],\n              [102.346793, 35.164201],\n              [102.310452, 35.128967],\n              [102.29567, 35.071681],\n              [102.252554, 35.048657],\n              [102.218062, 35.057475],\n              [102.211286, 35.034937],\n              [102.176178, 35.032977],\n              [102.157699, 35.010923],\n              [102.133678, 35.014844],\n              [102.094874, 34.986901],\n              [102.048062, 34.910868],\n              [102.068388, 34.887798],\n              [101.985852, 34.90007],\n              [101.916867, 34.873561],\n              [101.923027, 34.835746],\n              [101.917483, 34.705964],\n              [101.919947, 34.621791],\n              [101.934729, 34.58731],\n              [101.956287, 34.582876],\n              [101.97415, 34.548871],\n              [102.001867, 34.538519],\n              [102.093026, 34.536547],\n              [102.139837, 34.50351],\n              [102.155852, 34.507456],\n              [102.169402, 34.457631],\n              [102.205743, 34.407777],\n              [102.259329, 34.355917],\n              [102.237156, 34.34307],\n              [102.237156, 34.34307],\n              [102.186649, 34.352952],\n              [102.149692, 34.271885],\n              [102.067772, 34.293642],\n              [102.062229, 34.227858],\n              [102.01357, 34.218456],\n              [102.030816, 34.190739],\n              [102.003099, 34.162022],\n              [101.965526, 34.167469],\n              [101.955055, 34.109514],\n              [101.897773, 34.133791],\n              [101.874367, 34.130323],\n              [101.851578, 34.153108],\n              [101.836795, 34.124378],\n              [101.788136, 34.131809],\n              [101.764114, 34.122892],\n              [101.736397, 34.080275],\n              [101.718535, 34.083249],\n              [101.703136, 34.119424],\n              [101.674187, 34.110506],\n              [101.6206, 34.178857],\n              [101.53868, 34.212022],\n              [101.492485, 34.195689],\n              [101.482014, 34.218951],\n              [101.417956, 34.227858],\n              [101.369913, 34.248143],\n              [101.327413, 34.24468],\n              [101.325565, 34.268423],\n              [101.268899, 34.278808],\n              [101.228863, 34.298586],\n              [101.235022, 34.325279],\n              [101.193754, 34.336646],\n              [101.178356, 34.320831],\n              [101.098284, 34.329233],\n              [101.054552, 34.322808],\n              [100.986799, 34.374689],\n              [100.951074, 34.38358],\n              [100.895024, 34.375183],\n              [100.868538, 34.332693],\n              [100.821727, 34.317371],\n              [100.798321, 34.260014],\n              [100.809408, 34.247153],\n              [100.764445, 34.178857],\n              [100.806329, 34.155584],\n              [100.848828, 34.089692],\n              [100.870386, 34.083744],\n              [100.880857, 34.036644],\n              [100.93506, 33.990013],\n              [100.927669, 33.975126],\n              [100.965857, 33.946832],\n              [100.994806, 33.891707],\n              [101.023139, 33.896178],\n              [101.054552, 33.863386],\n              [101.153718, 33.8445],\n              [101.153102, 33.823124],\n              [101.190675, 33.791796],\n              [101.186363, 33.741051],\n              [101.162957, 33.719649],\n              [101.177124, 33.685295],\n              [101.166653, 33.659894],\n              [101.217776, 33.669856],\n              [101.23687, 33.685793],\n              [101.302776, 33.657902],\n              [101.385312, 33.644949],\n              [101.424732, 33.655411],\n              [101.428427, 33.680315],\n              [101.501724, 33.702723],\n              [101.58426, 33.674339],\n              [101.585492, 33.645448],\n              [101.616905, 33.598603],\n              [101.611977, 33.565199],\n              [101.622448, 33.502343],\n              [101.718535, 33.494857],\n              [101.748716, 33.505337],\n              [101.769042, 33.538765],\n              [101.777665, 33.533776],\n              [101.769042, 33.45592],\n              [101.695745, 33.433948],\n              [101.663716, 33.383991],\n              [101.64955, 33.323004],\n              [101.677883, 33.297497],\n              [101.735781, 33.279987],\n              [101.709912, 33.21292],\n              [101.653861, 33.162835],\n              [101.661252, 33.135778],\n              [101.633535, 33.101193],\n              [101.557775, 33.167344],\n              [101.515275, 33.192889],\n              [101.487557, 33.226938],\n              [101.403174, 33.225436],\n              [101.386543, 33.207412],\n              [101.393935, 33.157826],\n              [101.381616, 33.153316],\n              [101.297232, 33.262475],\n              [101.217776, 33.256469],\n              [101.182668, 33.26948],\n              [101.156798, 33.236449],\n              [101.124769, 33.221431],\n              [101.11553, 33.194893],\n              [101.169733, 33.10019],\n              [101.143863, 33.086151],\n              [101.146327, 33.056563],\n              [101.184515, 33.041514],\n              [101.171581, 33.009902],\n              [101.183899, 32.984304],\n              [101.129081, 32.989324],\n              [101.134624, 32.95217],\n              [101.124153, 32.909976],\n              [101.178356, 32.892892],\n              [101.223935, 32.855698],\n              [101.237486, 32.825026],\n              [101.22332, 32.725898],\n              [101.157414, 32.661431],\n              [101.124769, 32.658408],\n              [101.077342, 32.68259],\n              [101.030531, 32.660424],\n              [100.99727, 32.627668],\n              [100.956618, 32.621116],\n              [100.93198, 32.600447],\n              [100.887633, 32.632708],\n              [100.834046, 32.648835],\n              [100.77122, 32.643795],\n              [100.690532, 32.678056],\n              [100.71209, 32.645307],\n              [100.710242, 32.610026],\n              [100.673286, 32.628172],\n              [100.661583, 32.616075],\n              [100.657887, 32.546484],\n              [100.645568, 32.526303],\n              [100.603069, 32.553547],\n              [100.54517, 32.569687],\n              [100.516837, 32.632204],\n              [100.470026, 32.694678],\n              [100.450932, 32.694678],\n              [100.420135, 32.73194],\n              [100.378251, 32.698707],\n              [100.399193, 32.756101],\n              [100.339447, 32.719353],\n              [100.258759, 32.742511],\n              [100.231041, 32.696189],\n              [100.229809, 32.650346],\n              [100.208252, 32.606497],\n              [100.189773, 32.630692],\n              [100.109701, 32.640268],\n              [100.088143, 32.668988],\n              [100.139266, 32.724388],\n              [100.117093, 32.802392],\n              [100.123252, 32.837095],\n              [100.064738, 32.895907],\n              [100.029629, 32.895907],\n              [100.038252, 32.929066],\n              [99.956332, 32.948152],\n              [99.947709, 32.986814],\n              [99.877492, 33.045527],\n              [99.877492, 32.993339],\n              [99.851007, 32.941623],\n              [99.805427, 32.940619],\n              [99.788181, 32.956689],\n              [99.764159, 32.924545],\n              [99.791877, 32.883344],\n              [99.766623, 32.826032],\n              [99.760464, 32.769689],\n              [99.717964, 32.732443],\n              [99.705029, 32.76516],\n              [99.646515, 32.774721],\n              [99.640355, 32.790822],\n              [99.589233, 32.789312],\n              [99.558436, 32.839106],\n              [99.45311, 32.862233],\n              [99.376118, 32.899927],\n              [99.353944, 32.885354],\n              [99.268944, 32.878318],\n              [99.24677, 32.924043],\n              [99.235067, 32.982296],\n              [99.214741, 32.991332],\n              [99.196263, 33.035493],\n              [99.124814, 33.046028],\n              [99.090322, 33.079131],\n              [99.024416, 33.094675],\n              [99.014561, 33.081137],\n              [98.971445, 33.098185],\n              [98.967134, 33.115229],\n              [98.92217, 33.118738],\n              [98.858728, 33.150811],\n              [98.804526, 33.219428],\n              [98.802062, 33.270481],\n              [98.759562, 33.276985],\n              [98.779888, 33.370497],\n              [98.736157, 33.406975],\n              [98.742316, 33.477887],\n              [98.725686, 33.503341],\n              [98.678258, 33.522801],\n              [98.648077, 33.548741],\n              [98.652389, 33.595114],\n              [98.622824, 33.610067],\n              [98.61728, 33.637476],\n              [98.6567, 33.64744],\n              [98.610505, 33.682805],\n              [98.582788, 33.731595],\n              [98.537824, 33.74752],\n              [98.51873, 33.77389],\n              [98.494092, 33.768915],\n              [98.492861, 33.796272],\n              [98.463295, 33.848477],\n              [98.434962, 33.843009],\n              [98.407245, 33.867362],\n              [98.425723, 33.913066],\n              [98.415252, 33.956761],\n              [98.440506, 33.981577],\n              [98.428187, 34.029204],\n              [98.396774, 34.053008],\n              [98.392462, 34.089196],\n              [98.344419, 34.094648],\n              [98.258188, 34.083249],\n              [98.206449, 34.08424],\n              [98.157174, 34.107532],\n              [98.098043, 34.122892],\n              [98.051848, 34.11546],\n              [97.95453, 34.190739],\n              [97.898479, 34.209548],\n              [97.796849, 34.199154],\n              [97.796849, 34.199154],\n              [97.789458, 34.182818],\n              [97.789458, 34.182818],\n              [97.766668, 34.158555],\n              [97.665654, 34.126855],\n              [97.70261, 34.036644],\n              [97.652719, 33.998448],\n              [97.660111, 33.956264],\n              [97.629314, 33.919523],\n              [97.601596, 33.929951],\n              [97.52214, 33.903133],\n              [97.503662, 33.912073],\n              [97.460546, 33.887236],\n              [97.395257, 33.889224],\n              [97.398336, 33.848477],\n              [97.371851, 33.842015],\n              [97.373083, 33.817655],\n              [97.406344, 33.795278],\n              [97.422974, 33.754984],\n              [97.418046, 33.728608],\n              [97.435293, 33.682307],\n              [97.415583, 33.605582],\n              [97.450075, 33.582152],\n              [97.523372, 33.577166],\n              [97.511669, 33.520805],\n              [97.552321, 33.465906],\n              [97.625618, 33.461412],\n              [97.674893, 33.432949],\n              [97.754349, 33.409972],\n              [97.676125, 33.341004],\n              [97.622538, 33.337005],\n              [97.607756, 33.263976],\n              [97.548626, 33.203907],\n              [97.487648, 33.168346],\n              [97.498119, 33.137783],\n              [97.487032, 33.107209],\n              [97.517213, 33.097683],\n              [97.542466, 33.035995],\n              [97.499966, 33.011408],\n              [97.523988, 32.988822],\n              [97.438372, 32.976271],\n              [97.375547, 32.956689],\n              [97.347829, 32.895907],\n              [97.376163, 32.886359],\n              [97.392793, 32.828546],\n              [97.386018, 32.77925],\n              [97.429133, 32.714318],\n              [97.42359, 32.70475],\n              [97.48272, 32.654377],\n              [97.535075, 32.638252],\n              [97.543698, 32.62162],\n              [97.607756, 32.614059],\n              [97.616995, 32.586329],\n              [97.700763, 32.53488],\n              [97.730944, 32.527312],\n              [97.684132, 32.530339],\n              [97.670582, 32.51722],\n              [97.540618, 32.536899],\n              [97.50243, 32.530844],\n              [97.463626, 32.55506],\n              [97.448843, 32.586833],\n              [97.411887, 32.575235],\n              [97.374315, 32.546484],\n              [97.3583, 32.563635],\n              [97.332431, 32.542448],\n              [97.334895, 32.514192],\n              [97.388481, 32.501575],\n              [97.341054, 32.440987],\n              [97.387865, 32.427349],\n              [97.424822, 32.322723],\n              [97.415583, 32.296421],\n              [97.371235, 32.273148],\n              [97.32196, 32.303503],\n              [97.299786, 32.294904],\n              [97.264062, 32.182527],\n              [97.271453, 32.139971],\n              [97.313953, 32.130342],\n              [97.293011, 32.096887],\n              [97.308409, 32.076605],\n              [97.258518, 32.072041],\n              [97.219714, 32.109054],\n              [97.201852, 32.090296],\n              [97.233881, 32.063927],\n              [97.214786, 32.042623],\n              [97.188301, 32.055304],\n              [97.169823, 32.032984],\n              [97.127323, 32.044145],\n              [97.028773, 32.04871],\n              [97.006599, 32.067984],\n              [96.935766, 32.048203],\n              [96.965947, 32.008628],\n              [96.941925, 31.986297],\n              [96.894498, 32.013703],\n              [96.863085, 31.996448],\n              [96.868629, 31.964975],\n              [96.824281, 32.007613],\n              [96.722651, 32.013195],\n              [96.742977, 32.001016],\n              [96.753448, 31.944156],\n              [96.776238, 31.935015],\n              [96.81073, 31.894375],\n              [96.794716, 31.869474],\n              [96.760223, 31.860325],\n              [96.765767, 31.819144],\n              [96.799027, 31.792188],\n              [96.840295, 31.720438],\n              [96.790404, 31.698545],\n              [96.778701, 31.675629],\n              [96.722651, 31.686833],\n              [96.691854, 31.722474],\n              [96.661057, 31.705674],\n              [96.615477, 31.737236],\n              [96.56805, 31.711783],\n              [96.519391, 31.74945],\n              [96.468884, 31.769804],\n              [96.435623, 31.796258],\n              [96.407906, 31.845583],\n              [96.389428, 31.919777],\n              [96.288414, 31.919777],\n              [96.253305, 31.929936],\n              [96.220044, 31.905553],\n              [96.188632, 31.904028],\n              [96.214501, 31.876589],\n              [96.202798, 31.841008],\n              [96.183088, 31.835924],\n              [96.178161, 31.775401],\n              [96.231131, 31.749959],\n              [96.222508, 31.733164],\n              [96.252073, 31.697527],\n              [96.245298, 31.657802],\n              [96.221892, 31.647613],\n              [96.207726, 31.598691],\n              [96.156603, 31.602769],\n              [96.148595, 31.686324],\n              [96.135661, 31.70211],\n              [96.064828, 31.720438],\n              [95.989067, 31.78761],\n              [95.983524, 31.816601],\n              [95.89914, 31.81711],\n              [95.846169, 31.736218],\n              [95.853561, 31.714329],\n              [95.823995, 31.68225],\n              [95.779648, 31.748941],\n              [95.634286, 31.782523],\n              [95.580083, 31.76726],\n              [95.546823, 31.73978],\n              [95.511714, 31.750468],\n              [95.480301, 31.795749],\n              [95.456896, 31.801853],\n              [95.406389, 31.896915],\n              [95.408852, 31.918761],\n              [95.3682, 31.92892],\n              [95.360809, 31.95939],\n              [95.395918, 32.001523],\n              [95.454432, 32.007613],\n              [95.421171, 32.033999],\n              [95.454432, 32.061898],\n              [95.440265, 32.157705],\n              [95.406389, 32.182021],\n              [95.367584, 32.178982],\n              [95.366968, 32.151118],\n              [95.31523, 32.148585],\n              [95.270266, 32.194683],\n              [95.270266, 32.194683],\n              [95.239469, 32.287315],\n              [95.241317, 32.3207],\n              [95.214216, 32.321712],\n              [95.20744, 32.297433],\n              [95.10581, 32.258979],\n              [95.079325, 32.279726],\n              [95.096571, 32.322217],\n              [95.193274, 32.332331],\n              [95.261643, 32.348006],\n              [95.228382, 32.363678],\n              [95.218527, 32.397035],\n              [95.153853, 32.386423],\n              [95.081789, 32.384907],\n              [95.075013, 32.376315],\n              [95.075013, 32.376315],\n              [95.057151, 32.395014],\n              [94.988166, 32.422802],\n              [94.944434, 32.404109],\n              [94.912405, 32.41573],\n              [94.889616, 32.472295],\n              [94.852043, 32.463712],\n              [94.80708, 32.486431],\n              [94.78737, 32.522266],\n              [94.762116, 32.526303],\n              [94.737479, 32.587338],\n              [94.638312, 32.645307],\n              [94.614291, 32.673522],\n              [94.591501, 32.640772],\n              [94.522516, 32.595909],\n              [94.459074, 32.599439],\n              [94.463386, 32.572209],\n              [94.435052, 32.562626],\n              [94.395016, 32.594397],\n              [94.371611, 32.524789],\n              [94.350053, 32.533871],\n              [94.294002, 32.519743],\n              [94.292154, 32.502584],\n              [94.250886, 32.51722],\n              [94.196684, 32.51621],\n              [94.176974, 32.454117],\n              [94.137554, 32.433915],\n              [94.091974, 32.463207],\n              [94.049474, 32.469771],\n              [94.03038, 32.448057],\n              [93.978641, 32.459672],\n              [93.960163, 32.484917],\n              [93.90904, 32.463207],\n              [93.861613, 32.466237],\n              [93.851142, 32.50965],\n              [93.820345, 32.549511],\n              [93.75136, 32.56313],\n              [93.721795, 32.578261],\n              [93.651577, 32.571705],\n              [93.618933, 32.522771],\n              [93.516687, 32.47583],\n              [93.501904, 32.503593],\n              [93.476651, 32.504603],\n              [93.4631, 32.556069],\n              [93.411977, 32.558086],\n              [93.385492, 32.525294],\n              [93.33868, 32.5712],\n              [93.308499, 32.580278],\n              [93.300492, 32.619604],\n              [93.260456, 32.62666],\n              [93.239514, 32.662439],\n              [93.210565, 32.655385],\n              [93.176688, 32.6705],\n              [93.159442, 32.644803],\n              [93.087993, 32.63674],\n              [93.069515, 32.626156],\n              [93.023935, 32.703239],\n              [93.019624, 32.737477],\n              [93.00053, 32.741001],\n              [92.964189, 32.714821],\n              [92.933392, 32.719353],\n              [92.866871, 32.698203],\n              [92.822523, 32.729926],\n              [92.789262, 32.719856],\n              [92.756618, 32.743014],\n              [92.686401, 32.76516],\n              [92.667922, 32.73194],\n              [92.634662, 32.720863],\n              [92.574916, 32.741001],\n              [92.56814, 32.73194],\n              [92.484372, 32.745028],\n              [92.459119, 32.76365],\n              [92.411076, 32.748048],\n              [92.355641, 32.764657],\n              [92.343938, 32.738484],\n              [92.310062, 32.751571],\n              [92.255243, 32.720863],\n              [92.198577, 32.754591],\n              [92.211511, 32.788306],\n              [92.193649, 32.801889],\n              [92.227526, 32.821003],\n              [92.205352, 32.866255],\n              [92.145606, 32.885857],\n              [92.101874, 32.860222],\n              [92.038432, 32.860725],\n              [92.018722, 32.829552],\n              [91.955897, 32.8205],\n              [91.896766, 32.907967],\n              [91.857962, 32.90244],\n              [91.839484, 32.948152],\n              [91.799448, 32.942126],\n              [91.752637, 32.969242],\n              [91.685499, 32.989324],\n              [91.664557, 33.012913],\n              [91.583253, 33.0375],\n              [91.55492, 33.060074],\n              [91.535826, 33.10019],\n              [91.49579, 33.109214],\n              [91.436044, 33.066092],\n              [91.370138, 33.100691],\n              [91.311624, 33.108211],\n              [91.261733, 33.141291],\n              [91.226624, 33.141792],\n              [91.18782, 33.106206],\n              [91.161335, 33.108712],\n              [91.147784, 33.07211],\n              [91.072024, 33.113224],\n              [91.037531, 33.098686],\n              [91.001807, 33.11573],\n              [90.927894, 33.120241],\n              [90.902024, 33.083143],\n              [90.88293, 33.120241],\n              [90.803474, 33.114227],\n              [90.740032, 33.142293],\n              [90.704308, 33.135778],\n              [90.627315, 33.180368],\n              [90.562642, 33.229441],\n              [90.490577, 33.264977],\n              [90.405577, 33.260473],\n              [90.363077, 33.279487],\n              [90.332896, 33.310501],\n              [90.246665, 33.423959],\n              [90.22018, 33.437943],\n              [90.107463, 33.460913],\n              [90.088984, 33.478885],\n              [90.083441, 33.525295],\n              [90.01076, 33.553728],\n              [89.984275, 33.612061],\n              [90.008296, 33.687785],\n              [89.981195, 33.70322],\n              [89.983659, 33.725622],\n              [89.907282, 33.741051],\n              [89.902355, 33.758467],\n              [89.942391, 33.801246],\n              [89.899891, 33.80771],\n              [89.837065, 33.868853],\n              [89.795181, 33.865374],\n              [89.73174, 33.921509],\n              [89.718805, 33.946832],\n              [89.688008, 33.959739],\n              [89.684928, 33.990013],\n              [89.635037, 34.049537],\n              [89.656595, 34.057966],\n              [89.655979, 34.097126],\n              [89.71203, 34.131809],\n              [89.756993, 34.124874],\n              [89.760073, 34.152613],\n              [89.789638, 34.150632],\n              [89.816739, 34.16945],\n              [89.838297, 34.263477],\n              [89.825362, 34.293642],\n              [89.86663, 34.324785],\n              [89.858623, 34.359375],\n              [89.820435, 34.369255],\n              [89.799493, 34.39642],\n              [89.819819, 34.420614],\n              [89.823515, 34.455657],\n              [89.814891, 34.548871],\n              [89.777935, 34.574499],\n              [89.798877, 34.628686],\n              [89.74837, 34.641981],\n              [89.72558, 34.660689],\n              [89.732356, 34.732035],\n              [89.799493, 34.743838],\n              [89.825978, 34.796931],\n              [89.867862, 34.81069],\n              [89.838913, 34.865705],\n              [89.814891, 34.86816],\n              [89.821051, 34.902033],\n              [89.78779, 34.921664],\n              [89.747138, 34.903506],\n              [89.707102, 34.919701],\n              [89.670146, 34.887798],\n              [89.578987, 34.895162],\n              [89.560509, 34.938836],\n              [89.59069, 35.057965],\n              [89.593153, 35.104491],\n              [89.579603, 35.118688],\n              [89.519241, 35.133862],\n              [89.46935, 35.214577],\n              [89.450255, 35.223867],\n              [89.48598, 35.256616],\n              [89.531559, 35.276161],\n              [89.494603, 35.298632],\n              [89.516161, 35.330862],\n              [89.497067, 35.361128],\n              [89.58761, 35.383575],\n              [89.619639, 35.412357],\n              [89.658443, 35.425526],\n              [89.685544, 35.416259],\n              [89.739131, 35.468429],\n              [89.765, 35.482563],\n              [89.740979, 35.507412],\n              [89.720037, 35.501566],\n              [89.699711, 35.544916],\n              [89.71203, 35.581915],\n              [89.75145, 35.580942],\n              [89.765616, 35.599922],\n              [89.726196, 35.648082],\n              [89.748986, 35.66267],\n              [89.747138, 35.7516],\n              [89.782863, 35.773453],\n              [89.767464, 35.799183],\n              [89.801957, 35.848193],\n              [89.778551, 35.861775],\n              [89.707718, 35.849163],\n              [89.654747, 35.848193],\n              [89.62395, 35.859349],\n              [89.550654, 35.856924],\n              [89.554965, 35.873414],\n              [89.489676, 35.903475],\n              [89.428082, 35.917531],\n              [89.434857, 35.992136],\n              [89.404676, 36.016827],\n              [89.417611, 36.044897],\n              [89.474893, 36.022151],\n              [89.605472, 36.038123],\n              [89.688624, 36.091337],\n              [89.711414, 36.093272],\n              [89.766848, 36.073925],\n              [89.819819, 36.080697],\n              [89.914058, 36.079246],\n              [89.941159, 36.067637],\n              [89.944855, 36.140649],\n              [89.997825, 36.168193],\n              [90.019999, 36.213594],\n              [90.028006, 36.258486],\n              [90.003369, 36.278752],\n              [90.043405, 36.276822],\n              [90.058188, 36.255591],\n              [90.145651, 36.239181],\n              [90.130252, 36.2078],\n              [90.198006, 36.187516],\n              [90.23681, 36.160462],\n              [90.325505, 36.159496],\n              [90.424055, 36.133883],\n              [90.478258, 36.13195],\n              [90.534925, 36.147899],\n              [90.613149, 36.126632],\n              [90.659344, 36.13485],\n              [90.776373, 36.086501],\n              [90.815793, 36.035703],\n              [90.850285, 36.016827],\n              [90.922966, 36.028927],\n              [90.979017, 36.106811],\n              [91.081263, 36.088436],\n              [91.124994, 36.115514],\n              [91.09235, 36.163844],\n              [91.096045, 36.219871],\n              [91.051698, 36.238215],\n              [91.07264, 36.299012],\n              [91.026444, 36.323607],\n              [91.051698, 36.433946],\n              [91.028292, 36.443093],\n              [91.039995, 36.474861],\n              [91.035683, 36.529703],\n              [91.011662, 36.539801],\n              [90.905104, 36.560474],\n              [90.831191, 36.55807],\n              [90.810865, 36.585466],\n              [90.741264, 36.585947],\n              [90.72217, 36.620058],\n              [90.730793, 36.655594],\n              [90.706156, 36.658955],\n              [90.720938, 36.708868],\n              [90.754815, 36.721341],\n              [90.727098, 36.755872],\n              [90.732025, 36.825844],\n              [90.758511, 36.825844],\n              [90.853981, 36.915373],\n              [90.924198, 36.921115],\n              [90.983944, 36.913459],\n              [91.036915, 36.929727],\n              [91.051698, 36.96751],\n              [91.126842, 36.978507],\n              [91.133618, 37.007665],\n              [91.181045, 37.025345],\n              [91.216153, 37.010054],\n              [91.303617, 37.012444],\n              [91.291298, 37.042544],\n              [91.303617, 37.083136],\n              [91.286371, 37.105095],\n              [91.280211, 37.163779],\n              [91.1909, 37.205737],\n              [91.194596, 37.273868],\n              [91.134849, 37.324331],\n              [91.136081, 37.355734],\n              [91.113292, 37.387124],\n              [91.099741, 37.447965],\n              [91.073256, 37.475992],\n              [91.019669, 37.493088],\n              [90.958075, 37.477891],\n              [90.911879, 37.519674],\n              [90.865684, 37.53059],\n              [90.882314, 37.575664],\n              [90.854597, 37.604117],\n              [90.820104, 37.613599],\n              [90.777605, 37.648672],\n              [90.643946, 37.696988],\n              [90.586663, 37.703144],\n              [90.579272, 37.720661],\n              [90.519526, 37.730601],\n              [90.516446, 38.207111],\n              [90.531229, 38.319886],\n              [90.401882, 38.311434],\n              [90.361846, 38.300163],\n              [90.352607, 38.233441],\n              [90.280542, 38.238142],\n              [90.137644, 38.340543],\n              [90.179528, 38.396848],\n              [90.129636, 38.400131],\n              [90.111774, 38.418889],\n              [90.111774, 38.477945],\n              [90.130868, 38.494341],\n              [90.248513, 38.491531],\n              [90.315034, 38.501835],\n              [90.353222, 38.482162],\n              [90.427135, 38.493873],\n              [90.465323, 38.521971],\n              [90.463476, 38.556611],\n              [90.525685, 38.561291],\n              [90.560794, 38.593573],\n              [90.608837, 38.594508],\n              [90.606374, 38.610878],\n              [90.645794, 38.635191],\n              [90.619308, 38.664636],\n              [90.65996, 38.674449],\n              [90.724634, 38.658094],\n              [90.899561, 38.679588],\n              [90.970394, 38.697806],\n              [90.992567, 38.695003],\n              [91.188436, 38.73096],\n              [91.242639, 38.752433],\n              [91.298689, 38.746365],\n              [91.446515, 38.813546],\n              [91.501333, 38.815411],\n              [91.681188, 38.852706],\n              [91.694738, 38.86622],\n              [91.806223, 38.872744],\n              [91.87952, 38.884391],\n              [91.880752, 38.899297],\n              [91.966368, 38.930961],\n              [92.10865, 38.963541],\n              [92.173323, 38.960749],\n              [92.197961, 38.983548],\n              [92.263866, 39.002153],\n              [92.380279, 38.999828],\n              [92.416003, 39.010524],\n              [92.41046, 39.03842],\n              [92.459119, 39.042604],\n              [92.459119, 39.063982],\n              [92.489916, 39.099753],\n              [92.545966, 39.111362],\n              [92.659299, 39.109969],\n              [92.765857, 39.136898],\n              [92.866871, 39.138754],\n              [92.889045, 39.160103],\n              [92.938936, 39.169848],\n              [92.978356, 39.143396],\n              [93.043029, 39.146645],\n              [93.115094, 39.17959],\n              [93.142196, 39.160567],\n              [93.131725, 39.108112],\n              [93.165601, 39.090928],\n              [93.198246, 39.045857],\n              [93.179152, 38.923977],\n              [93.237666, 38.916062],\n              [93.274007, 38.896036],\n              [93.453245, 38.915596],\n              [93.729186, 38.924443],\n              [93.834511, 38.867618],\n              [93.884403, 38.867618],\n              [93.884403, 38.826136],\n              [93.769838, 38.821007],\n              [93.756287, 38.807484],\n              [93.773533, 38.771099],\n              [93.800019, 38.750566],\n              [93.885018, 38.720689],\n              [93.95154, 38.715086],\n              [93.973098, 38.724891],\n              [94.281067, 38.7599],\n              [94.370379, 38.7627],\n              [94.511429, 38.445142],\n              [94.527443, 38.425922],\n              [94.527443, 38.365416],\n              [94.56132, 38.351807],\n              [94.582878, 38.36917],\n              [94.672805, 38.386998],\n              [94.812623, 38.385591],\n              [94.861282, 38.393565],\n              [94.884072, 38.414669],\n              [94.973999, 38.430142],\n              [95.045448, 38.418889],\n              [95.072549, 38.402476],\n              [95.122441, 38.417014],\n              [95.140919, 38.392158],\n              [95.185266, 38.379492],\n              [95.209904, 38.327868],\n              [95.229614, 38.330685],\n              [95.259179, 38.302981],\n              [95.315846, 38.318947],\n              [95.408236, 38.300163],\n              [95.440881, 38.310965],\n              [95.455664, 38.291709],\n              [95.487693, 38.314721],\n              [95.51849, 38.294997],\n              [95.585011, 38.343359],\n              [95.608417, 38.339134],\n              [95.671858, 38.388405],\n              [95.703887, 38.400131],\n              [95.723597, 38.378554],\n              [95.775952, 38.356031],\n              [95.83693, 38.344298],\n              [95.852945, 38.287481],\n              [95.89606, 38.2903],\n              [95.932401, 38.259291],\n              [95.93856, 38.237202],\n              [96.006929, 38.207582],\n              [96.06606, 38.173245],\n              [96.109175, 38.187358],\n              [96.221892, 38.149246],\n              [96.252689, 38.167599],\n              [96.264392, 38.145952],\n              [96.313051, 38.161952],\n              [96.301964, 38.183124],\n              [96.335841, 38.246132],\n              [96.378341, 38.277146],\n              [96.46334, 38.277616],\n              [96.665369, 38.23015],\n              [96.655514, 38.295936],\n              [96.638883, 38.307208],\n              [96.626564, 38.356031],\n              [96.698013, 38.422172],\n              [96.707868, 38.459203],\n              [96.6666, 38.483567],\n              [96.706637, 38.505582],\n              [96.780549, 38.504177],\n              [96.800259, 38.52759],\n              [96.767614, 38.552399],\n              [96.808882, 38.582346],\n              [96.7941, 38.608072],\n              [96.847071, 38.599186],\n              [96.876636, 38.580475],\n              [96.961019, 38.558015],\n              [97.055874, 38.594508],\n              [97.047251, 38.653888],\n              [97.057722, 38.67258],\n              [97.009063, 38.702477],\n              [97.023229, 38.755699],\n              [97.00044, 38.7613],\n              [96.987505, 38.793025],\n              [96.993664, 38.834993],\n              [96.983809, 38.869016],\n              [96.940693, 38.90768],\n              [96.938846, 38.95563],\n              [96.965331, 39.017034],\n              [96.95794, 39.041674],\n              [96.969643, 39.097895],\n              [97.012142, 39.142004],\n              [96.962251, 39.198144],\n              [97.017686, 39.208347],\n              [97.060186, 39.19768],\n              [97.14149, 39.199999],\n              [97.220946, 39.193042],\n              [97.315185, 39.164744],\n              [97.347213, 39.167528],\n              [97.371235, 39.140611],\n              [97.401416, 39.146645],\n              [97.458698, 39.117863],\n              [97.504894, 39.076527],\n              [97.58127, 39.052364],\n              [97.679205, 39.010524],\n              [97.701379, 38.963076],\n              [97.828878, 38.93003],\n              [97.875689, 38.898365],\n              [98.009348, 38.85923],\n              [98.029058, 38.834061],\n              [98.068478, 38.816344],\n              [98.091884, 38.786495],\n              [98.167645, 38.840121],\n              [98.242173, 38.880664],\n              [98.235398, 38.918855],\n              [98.276666, 38.963541],\n              [98.287753, 38.992386],\n              [98.280977, 39.027263],\n              [98.316702, 39.040744],\n              [98.383839, 39.029588],\n              [98.401086, 39.001688],\n              [98.432498, 38.996107],\n              [98.428187, 38.976104],\n              [98.457752, 38.952838],\n              [98.526737, 38.95563],\n              [98.584635, 38.93003],\n              [98.624056, 38.959353],\n              [98.612353, 38.977035],\n              [98.661628, 38.993782],\n              [98.70536, 39.043533],\n              [98.730613, 39.057011],\n              [98.743548, 39.086747],\n              [98.816845, 39.085818],\n              [98.818076, 39.064911],\n              [98.886446, 39.040744],\n              [98.903076, 39.012384],\n              [98.951735, 38.987735],\n              [99.054597, 38.97657],\n              [99.107568, 38.951907],\n              [99.071843, 38.921184],\n              [99.068764, 38.896968],\n              [99.141445, 38.852706],\n              [99.222133, 38.788827],\n              [99.291118, 38.765966],\n              [99.361951, 38.718354],\n              [99.375502, 38.684727],\n              [99.412458, 38.665571],\n              [99.450646, 38.60433],\n              [99.501769, 38.612281],\n              [99.52887, 38.546314],\n              [99.585537, 38.498556],\n              [99.63974, 38.474666],\n              [99.65945, 38.449361],\n              [99.727203, 38.415607],\n              [99.758, 38.410449],\n              [99.826985, 38.370109],\n              [99.960028, 38.320825],\n              [100.001912, 38.315191],\n              [100.049955, 38.283254],\n              [100.071513, 38.284663],\n              [100.117093, 38.253652],\n              [100.126332, 38.231561],\n              [100.182998, 38.222158],\n              [100.159592, 38.291239],\n              [100.163904, 38.328337],\n              [100.136803, 38.33444],\n              [100.093071, 38.407166],\n              [100.022238, 38.432017],\n              [100.001296, 38.467169],\n              [100.025933, 38.507923],\n              [100.064122, 38.518694],\n              [100.086911, 38.492936],\n              [100.113397, 38.497151],\n              [100.163288, 38.461546],\n              [100.24028, 38.441861],\n              [100.259374, 38.366355],\n              [100.301874, 38.388405],\n              [100.331439, 38.337257],\n              [100.318505, 38.329276],\n              [100.396729, 38.293118],\n              [100.424446, 38.307208],\n              [100.432453, 38.275267],\n              [100.459555, 38.2654],\n              [100.474953, 38.288891],\n              [100.516837, 38.272448],\n              [100.545786, 38.247072],\n              [100.595061, 38.242372],\n              [100.619083, 38.26587],\n              [100.71517, 38.253652],\n              [100.752126, 38.238612],\n              [100.825423, 38.158658],\n              [100.860531, 38.148305],\n              [100.913502, 38.17889],\n              [100.93814, 38.16007],\n              [100.91843, 38.129006],\n              [100.922125, 38.084741],\n              [100.888864, 38.056001],\n              [100.895024, 38.013107],\n              [100.91843, 37.999432],\n              [100.964009, 38.011221],\n              [101.077342, 37.941874],\n              [101.103211, 37.946593],\n              [101.114298, 37.92016],\n              [101.152486, 37.891356],\n              [101.159262, 37.86821],\n              [101.202994, 37.84742],\n              [101.276906, 37.83655],\n              [101.362522, 37.791162],\n              [101.382848, 37.822369],\n              [101.459224, 37.86632],\n              [101.551615, 37.835604],\n              [101.598427, 37.827569],\n              [101.670491, 37.754264],\n              [101.659405, 37.733441],\n              [101.791832, 37.696041],\n              [101.815853, 37.654357],\n              [101.854657, 37.664781],\n              [101.873135, 37.686569],\n              [101.946432, 37.728235],\n              [101.998787, 37.724921],\n              [102.036359, 37.685149],\n              [102.048678, 37.651515],\n              [102.035128, 37.627819],\n              [102.102265, 37.582304],\n              [102.131214, 37.54625],\n              [102.103497, 37.482641],\n              [102.125055, 37.48549],\n              [102.176794, 37.458892],\n              [102.19712, 37.420403],\n              [102.299981, 37.391404],\n              [102.29875, 37.370004],\n              [102.368351, 37.327662],\n              [102.428097, 37.308624],\n              [102.419474, 37.294343],\n              [102.45335, 37.271487],\n              [102.457662, 37.248147],\n              [102.490307, 37.223371],\n              [102.533422, 37.217176],\n              [102.578386, 37.17284],\n              [102.599944, 37.174748],\n              [102.642444, 37.099845],\n              [102.583314, 37.104618],\n              [102.488459, 37.078362],\n              [102.506321, 37.019134],\n              [102.450271, 36.968467],\n              [102.499546, 36.954599],\n              [102.526031, 36.928291],\n              [102.56114, 36.91968],\n              [102.587009, 36.869904],\n              [102.639364, 36.852666],\n              [102.720052, 36.767858],\n              [102.692335, 36.775528],\n              [102.639364, 36.732853],\n              [102.612879, 36.738129],\n              [102.601176, 36.710307],\n              [102.630741, 36.650793],\n              [102.684328, 36.619097],\n              [102.724364, 36.613813],\n              [102.714509, 36.599401],\n              [102.761936, 36.568645],\n              [102.734219, 36.562396],\n              [102.753313, 36.525855],\n              [102.793349, 36.497957],\n              [102.771791, 36.47438],\n              [102.829689, 36.365544],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 640000,\n        name: '宁夏回族自治区',\n        center: [106.278179, 38.46637],\n        centroid: [106.169867, 37.291331],\n        childrenNum: 5,\n        level: 'province',\n        subFeatureIndex: 29,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [107.268764, 37.099367],\n              [107.234887, 37.096503],\n              [107.181916, 37.143269],\n              [107.133873, 37.134681],\n              [107.095685, 37.115595],\n              [107.030395, 37.140883],\n              [107.031011, 37.108436],\n              [106.998367, 37.106527],\n              [106.905976, 37.151378],\n              [106.912135, 37.110345],\n              [106.891193, 37.098413],\n              [106.818512, 37.141838],\n              [106.776012, 37.158056],\n              [106.772933, 37.120367],\n              [106.750143, 37.09889],\n              [106.728585, 37.121321],\n              [106.687933, 37.12991],\n              [106.673151, 37.1113],\n              [106.6171, 37.135158],\n              [106.605397, 37.127524],\n              [106.645433, 37.064992],\n              [106.666991, 37.016745],\n              [106.646665, 37.000496],\n              [106.64297, 36.962729],\n              [106.594926, 36.967988],\n              [106.595542, 36.94025],\n              [106.540108, 36.984244],\n              [106.549347, 36.941685],\n              [106.601702, 36.918244],\n              [106.609709, 36.878521],\n              [106.609709, 36.878521],\n              [106.626955, 36.892403],\n              [106.637426, 36.867031],\n              [106.637426, 36.867031],\n              [106.657752, 36.820575],\n              [106.627571, 36.752995],\n              [106.644817, 36.72278],\n              [106.59431, 36.750118],\n              [106.514238, 36.715584],\n              [106.519782, 36.708868],\n              [106.519782, 36.708868],\n              [106.530869, 36.690154],\n              [106.490833, 36.685835],\n              [106.491448, 36.628703],\n              [106.444637, 36.624861],\n              [106.465579, 36.583063],\n              [106.444637, 36.557109],\n              [106.397826, 36.576816],\n              [106.392282, 36.556628],\n              [106.363949, 36.577296],\n              [106.37134, 36.549417],\n              [106.39721, 36.548455],\n              [106.455724, 36.496995],\n              [106.494528, 36.494589],\n              [106.523477, 36.468605],\n              [106.492064, 36.422389],\n              [106.510543, 36.379037],\n              [106.497608, 36.31348],\n              [106.470507, 36.306246],\n              [106.504383, 36.266207],\n              [106.54134, 36.25366],\n              [106.559202, 36.292259],\n              [106.647897, 36.259451],\n              [106.685469, 36.273445],\n              [106.698404, 36.244008],\n              [106.735976, 36.23725],\n              [106.772933, 36.212628],\n              [106.808657, 36.21118],\n              [106.833295, 36.229044],\n              [106.858548, 36.206834],\n              [106.858548, 36.206834],\n              [106.873947, 36.178338],\n              [106.873947, 36.178338],\n              [106.930613, 36.138716],\n              [106.925686, 36.115997],\n              [106.957715, 36.091337],\n              [106.940468, 36.064734],\n              [106.928149, 36.011502],\n              [106.94786, 35.988262],\n              [106.90228, 35.943699],\n              [106.93862, 35.952905],\n              [106.940468, 35.931101],\n              [106.912751, 35.93207],\n              [106.849925, 35.887476],\n              [106.927534, 35.810346],\n              [106.897353, 35.759856],\n              [106.868403, 35.771996],\n              [106.867171, 35.738485],\n              [106.819128, 35.7448],\n              [106.806193, 35.70982],\n              [106.750759, 35.725369],\n              [106.750759, 35.689408],\n              [106.674998, 35.728284],\n              [106.66268, 35.70739],\n              [106.633115, 35.714679],\n              [106.620796, 35.743829],\n              [106.595542, 35.727312],\n              [106.566593, 35.738971],\n              [106.506231, 35.737514],\n              [106.49268, 35.732656],\n              [106.434782, 35.688436],\n              [106.460036, 35.643705],\n              [106.47913, 35.575101],\n              [106.460036, 35.578995],\n              [106.440941, 35.52641],\n              [106.465579, 35.481101],\n              [106.490217, 35.480613],\n              [106.483441, 35.450393],\n              [106.503767, 35.415284],\n              [106.501304, 35.364056],\n              [106.472354, 35.310842],\n              [106.415688, 35.276161],\n              [106.368261, 35.273718],\n              [106.363333, 35.238532],\n              [106.319601, 35.265411],\n              [106.241377, 35.358687],\n              [106.237681, 35.409431],\n              [106.196414, 35.409919],\n              [106.173008, 35.437716],\n              [106.129892, 35.393333],\n              [106.113262, 35.361616],\n              [106.083081, 35.421624],\n              [106.073226, 35.447468],\n              [106.071378, 35.449418],\n              [106.073226, 35.450393],\n              [106.073842, 35.45478],\n              [106.06953, 35.458193],\n              [106.071994, 35.463555],\n              [106.078769, 35.509848],\n              [106.047356, 35.498155],\n              [106.023335, 35.49377],\n              [106.017175, 35.519103],\n              [105.900147, 35.54735],\n              [105.868734, 35.540046],\n              [105.847176, 35.490359],\n              [105.816379, 35.575101],\n              [105.800365, 35.564878],\n              [105.762176, 35.602841],\n              [105.759097, 35.634464],\n              [105.713517, 35.650513],\n              [105.722756, 35.673366],\n              [105.690727, 35.698643],\n              [105.723988, 35.725854],\n              [105.740618, 35.698643],\n              [105.759097, 35.724883],\n              [105.70243, 35.733142],\n              [105.667322, 35.749657],\n              [105.595873, 35.715651],\n              [105.481924, 35.727312],\n              [105.457286, 35.771511],\n              [105.432033, 35.787533],\n              [105.428953, 35.819082],\n              [105.408627, 35.822479],\n              [105.38091, 35.792873],\n              [105.371055, 35.844312],\n              [105.39754, 35.857409],\n              [105.350113, 35.875839],\n              [105.324859, 35.941761],\n              [105.343954, 36.033767],\n              [105.406163, 36.074409],\n              [105.430801, 36.10391],\n              [105.491163, 36.101009],\n              [105.515185, 36.147415],\n              [105.478844, 36.213111],\n              [105.460366, 36.223733],\n              [105.45975, 36.268137],\n              [105.476381, 36.293224],\n              [105.455439, 36.321678],\n              [105.425873, 36.330357],\n              [105.401236, 36.369881],\n              [105.398156, 36.430575],\n              [105.363048, 36.443093],\n              [105.362432, 36.496514],\n              [105.322396, 36.535954],\n              [105.281744, 36.522489],\n              [105.252179, 36.553263],\n              [105.2762, 36.563358],\n              [105.261418, 36.602764],\n              [105.22015, 36.631105],\n              [105.225693, 36.664716],\n              [105.201056, 36.700711],\n              [105.218302, 36.730455],\n              [105.272505, 36.739567],\n              [105.275584, 36.752515],\n              [105.319932, 36.742924],\n              [105.340874, 36.764502],\n              [105.334714, 36.80093],\n              [105.303302, 36.820575],\n              [105.279896, 36.86751],\n              [105.244787, 36.894796],\n              [105.178882, 36.892403],\n              [105.185657, 36.942164],\n              [105.165331, 36.99476],\n              [105.128991, 36.996194],\n              [105.05939, 37.022956],\n              [105.03968, 37.007187],\n              [105.004571, 37.035378],\n              [104.95468, 37.040156],\n              [104.954064, 37.077407],\n              [104.914644, 37.097935],\n              [104.888158, 37.15901],\n              [104.864753, 37.17284],\n              [104.85613, 37.211933],\n              [104.776673, 37.246718],\n              [104.717543, 37.208597],\n              [104.638087, 37.201923],\n              [104.600515, 37.242907],\n              [104.624536, 37.298627],\n              [104.651022, 37.290534],\n              [104.673812, 37.317668],\n              [104.713848, 37.329566],\n              [104.662109, 37.367626],\n              [104.679971, 37.408044],\n              [104.521059, 37.43466],\n              [104.499501, 37.421353],\n              [104.448994, 37.42468],\n              [104.437907, 37.445589],\n              [104.365226, 37.418026],\n              [104.298705, 37.414223],\n              [104.287002, 37.428007],\n              [104.322726, 37.44844],\n              [104.407726, 37.464592],\n              [104.419429, 37.511604],\n              [104.433595, 37.515402],\n              [104.623305, 37.522522],\n              [104.805007, 37.539133],\n              [104.866601, 37.566651],\n              [105.027977, 37.580881],\n              [105.111128, 37.633981],\n              [105.187505, 37.657674],\n              [105.221998, 37.677097],\n              [105.315004, 37.702197],\n              [105.4037, 37.710246],\n              [105.467141, 37.695094],\n              [105.598952, 37.699356],\n              [105.616199, 37.722555],\n              [105.622358, 37.777919],\n              [105.677177, 37.771769],\n              [105.760944, 37.799674],\n              [105.80406, 37.862068],\n              [105.799749, 37.939986],\n              [105.840401, 38.004147],\n              [105.780655, 38.084741],\n              [105.76772, 38.121474],\n              [105.775111, 38.186887],\n              [105.802828, 38.220277],\n              [105.842248, 38.240962],\n              [105.86627, 38.296406],\n              [105.821307, 38.366824],\n              [105.835473, 38.387467],\n              [105.827466, 38.432486],\n              [105.850872, 38.443736],\n              [105.836705, 38.476071],\n              [105.863806, 38.53508],\n              [105.856415, 38.569714],\n              [105.874277, 38.593105],\n              [105.852719, 38.641735],\n              [105.894603, 38.696405],\n              [105.88598, 38.716953],\n              [105.908154, 38.737496],\n              [105.909386, 38.791159],\n              [105.992538, 38.857366],\n              [105.97098, 38.909077],\n              [106.021487, 38.953769],\n              [106.060907, 38.96866],\n              [106.087392, 39.006339],\n              [106.078153, 39.026333],\n              [106.096631, 39.084889],\n              [106.145907, 39.153142],\n              [106.170544, 39.163352],\n              [106.192718, 39.142932],\n              [106.251232, 39.131327],\n              [106.285109, 39.146181],\n              [106.29558, 39.167992],\n              [106.280181, 39.262118],\n              [106.402753, 39.291767],\n              [106.511774, 39.272311],\n              [106.525325, 39.308439],\n              [106.556122, 39.322329],\n              [106.602318, 39.37555],\n              [106.643586, 39.357969],\n              [106.683622, 39.357506],\n              [106.751375, 39.381564],\n              [106.781556, 39.371849],\n              [106.806809, 39.318625],\n              [106.806193, 39.277407],\n              [106.790795, 39.241263],\n              [106.795723, 39.214375],\n              [106.825288, 39.19397],\n              [106.859164, 39.107648],\n              [106.878874, 39.091392],\n              [106.933693, 39.076527],\n              [106.96757, 39.054688],\n              [106.971881, 39.026333],\n              [106.954019, 38.941202],\n              [106.837606, 38.847579],\n              [106.756302, 38.748699],\n              [106.709491, 38.718821],\n              [106.66268, 38.601524],\n              [106.647897, 38.470917],\n              [106.599854, 38.389812],\n              [106.482209, 38.319417],\n              [106.555506, 38.263521],\n              [106.627571, 38.232501],\n              [106.654672, 38.22921],\n              [106.737824, 38.197706],\n              [106.779092, 38.171833],\n              [106.858548, 38.156306],\n              [106.942316, 38.132302],\n              [107.010069, 38.120532],\n              [107.051337, 38.122886],\n              [107.071047, 38.138892],\n              [107.119091, 38.134185],\n              [107.138801, 38.161011],\n              [107.19054, 38.153953],\n              [107.240431, 38.111586],\n              [107.33159, 38.086625],\n              [107.3938, 38.014993],\n              [107.440611, 37.995659],\n              [107.411662, 37.948009],\n              [107.448618, 37.933378],\n              [107.49235, 37.944706],\n              [107.560719, 37.893717],\n              [107.65003, 37.86443],\n              [107.659269, 37.844112],\n              [107.646335, 37.805349],\n              [107.620465, 37.776026],\n              [107.599523, 37.791162],\n              [107.57119, 37.776499],\n              [107.499125, 37.765619],\n              [107.484959, 37.706458],\n              [107.425828, 37.684201],\n              [107.387024, 37.691305],\n              [107.389488, 37.671413],\n              [107.422133, 37.665254],\n              [107.361155, 37.613125],\n              [107.311264, 37.609806],\n              [107.330358, 37.584201],\n              [107.369162, 37.58752],\n              [107.345756, 37.518725],\n              [107.284162, 37.481691],\n              [107.282931, 37.437036],\n              [107.257677, 37.337179],\n              [107.273075, 37.29101],\n              [107.309416, 37.239095],\n              [107.270612, 37.229089],\n              [107.317423, 37.200017],\n              [107.336517, 37.165687],\n              [107.334669, 37.138975],\n              [107.306952, 37.100799],\n              [107.281083, 37.127047],\n              [107.268764, 37.099367],\n            ],\n          ],\n          [\n            [\n              [106.048588, 35.488898],\n              [106.054132, 35.45478],\n              [106.034422, 35.469404],\n              [106.002393, 35.438692],\n              [105.894603, 35.413821],\n              [105.897683, 35.451368],\n              [106.048588, 35.488898],\n            ],\n          ],\n          [\n            [\n              [106.073842, 35.45478],\n              [106.073226, 35.450393],\n              [106.071378, 35.449418],\n              [106.06953, 35.458193],\n              [106.073842, 35.45478],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 650000,\n        name: '新疆维吾尔自治区',\n        center: [87.617733, 43.792818],\n        centroid: [85.294711, 41.371801],\n        childrenNum: 24,\n        level: 'province',\n        subFeatureIndex: 30,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [96.386348, 42.727592],\n              [96.166458, 42.623314],\n              [96.103632, 42.604375],\n              [96.072219, 42.569566],\n              [96.02356, 42.542675],\n              [96.0174, 42.482239],\n              [95.978596, 42.436762],\n              [96.06606, 42.414674],\n              [96.042038, 42.352787],\n              [96.040806, 42.326688],\n              [96.178161, 42.21775],\n              [96.077147, 42.149457],\n              [96.13874, 42.05399],\n              [96.137509, 42.019765],\n              [96.117183, 41.985966],\n              [96.054973, 41.936124],\n              [95.998306, 41.906289],\n              [95.855408, 41.849699],\n              [95.801206, 41.848361],\n              [95.759322, 41.835878],\n              [95.65646, 41.826067],\n              [95.57146, 41.796181],\n              [95.445193, 41.719841],\n              [95.39407, 41.693481],\n              [95.335556, 41.644305],\n              [95.299831, 41.565994],\n              [95.247476, 41.61344],\n              [95.194505, 41.694821],\n              [95.199433, 41.719395],\n              [95.16494, 41.735474],\n              [95.135991, 41.772976],\n              [95.110738, 41.768513],\n              [95.011572, 41.726541],\n              [94.969072, 41.718948],\n              [94.861898, 41.668451],\n              [94.809543, 41.619256],\n              [94.750413, 41.538227],\n              [94.534219, 41.505966],\n              [94.184365, 41.268444],\n              [94.01067, 41.114875],\n              [93.908424, 40.983539],\n              [93.809874, 40.879548],\n              [93.820961, 40.793519],\n              [93.760599, 40.664721],\n              [93.506216, 40.648376],\n              [92.928465, 40.572504],\n              [92.920458, 40.391792],\n              [92.906907, 40.310609],\n              [92.796654, 40.153897],\n              [92.745531, 39.868331],\n              [92.687632, 39.657174],\n              [92.639589, 39.514196],\n              [92.52564, 39.368611],\n              [92.378431, 39.258411],\n              [92.339011, 39.236628],\n              [92.343938, 39.146181],\n              [92.366112, 39.096037],\n              [92.366728, 39.059335],\n              [92.41046, 39.03842],\n              [92.416003, 39.010524],\n              [92.380279, 38.999828],\n              [92.263866, 39.002153],\n              [92.197961, 38.983548],\n              [92.173323, 38.960749],\n              [92.10865, 38.963541],\n              [91.966368, 38.930961],\n              [91.880752, 38.899297],\n              [91.87952, 38.884391],\n              [91.806223, 38.872744],\n              [91.694738, 38.86622],\n              [91.681188, 38.852706],\n              [91.501333, 38.815411],\n              [91.446515, 38.813546],\n              [91.298689, 38.746365],\n              [91.242639, 38.752433],\n              [91.188436, 38.73096],\n              [90.992567, 38.695003],\n              [90.970394, 38.697806],\n              [90.899561, 38.679588],\n              [90.724634, 38.658094],\n              [90.65996, 38.674449],\n              [90.619308, 38.664636],\n              [90.645794, 38.635191],\n              [90.606374, 38.610878],\n              [90.608837, 38.594508],\n              [90.560794, 38.593573],\n              [90.525685, 38.561291],\n              [90.463476, 38.556611],\n              [90.465323, 38.521971],\n              [90.427135, 38.493873],\n              [90.353222, 38.482162],\n              [90.315034, 38.501835],\n              [90.248513, 38.491531],\n              [90.130868, 38.494341],\n              [90.111774, 38.477945],\n              [90.111774, 38.418889],\n              [90.129636, 38.400131],\n              [90.179528, 38.396848],\n              [90.137644, 38.340543],\n              [90.280542, 38.238142],\n              [90.352607, 38.233441],\n              [90.361846, 38.300163],\n              [90.401882, 38.311434],\n              [90.531229, 38.319886],\n              [90.516446, 38.207111],\n              [90.519526, 37.730601],\n              [90.579272, 37.720661],\n              [90.586663, 37.703144],\n              [90.643946, 37.696988],\n              [90.777605, 37.648672],\n              [90.820104, 37.613599],\n              [90.854597, 37.604117],\n              [90.882314, 37.575664],\n              [90.865684, 37.53059],\n              [90.911879, 37.519674],\n              [90.958075, 37.477891],\n              [91.019669, 37.493088],\n              [91.073256, 37.475992],\n              [91.099741, 37.447965],\n              [91.113292, 37.387124],\n              [91.136081, 37.355734],\n              [91.134849, 37.324331],\n              [91.194596, 37.273868],\n              [91.1909, 37.205737],\n              [91.280211, 37.163779],\n              [91.286371, 37.105095],\n              [91.303617, 37.083136],\n              [91.291298, 37.042544],\n              [91.303617, 37.012444],\n              [91.216153, 37.010054],\n              [91.181045, 37.025345],\n              [91.133618, 37.007665],\n              [91.126842, 36.978507],\n              [91.051698, 36.96751],\n              [91.036915, 36.929727],\n              [90.983944, 36.913459],\n              [90.924198, 36.921115],\n              [90.853981, 36.915373],\n              [90.758511, 36.825844],\n              [90.732025, 36.825844],\n              [90.727098, 36.755872],\n              [90.754815, 36.721341],\n              [90.720938, 36.708868],\n              [90.706156, 36.658955],\n              [90.730793, 36.655594],\n              [90.72217, 36.620058],\n              [90.741264, 36.585947],\n              [90.810865, 36.585466],\n              [90.831191, 36.55807],\n              [90.905104, 36.560474],\n              [91.011662, 36.539801],\n              [91.035683, 36.529703],\n              [91.039995, 36.474861],\n              [91.028292, 36.443093],\n              [91.051698, 36.433946],\n              [91.026444, 36.323607],\n              [91.07264, 36.299012],\n              [91.051698, 36.238215],\n              [91.096045, 36.219871],\n              [91.09235, 36.163844],\n              [91.124994, 36.115514],\n              [91.081263, 36.088436],\n              [90.979017, 36.106811],\n              [90.922966, 36.028927],\n              [90.850285, 36.016827],\n              [90.815793, 36.035703],\n              [90.776373, 36.086501],\n              [90.659344, 36.13485],\n              [90.613149, 36.126632],\n              [90.534925, 36.147899],\n              [90.478258, 36.13195],\n              [90.424055, 36.133883],\n              [90.325505, 36.159496],\n              [90.23681, 36.160462],\n              [90.198006, 36.187516],\n              [90.130252, 36.2078],\n              [90.145651, 36.239181],\n              [90.058188, 36.255591],\n              [90.043405, 36.276822],\n              [90.003369, 36.278752],\n              [90.028006, 36.258486],\n              [90.019999, 36.213594],\n              [89.997825, 36.168193],\n              [89.944855, 36.140649],\n              [89.941159, 36.067637],\n              [89.914058, 36.079246],\n              [89.819819, 36.080697],\n              [89.766848, 36.073925],\n              [89.711414, 36.093272],\n              [89.614711, 36.109712],\n              [89.594385, 36.126632],\n              [89.490291, 36.151281],\n              [89.375727, 36.228078],\n              [89.335075, 36.23725],\n              [89.292575, 36.231457],\n              [89.232213, 36.295636],\n              [89.198952, 36.260417],\n              [89.126887, 36.254626],\n              [89.10225, 36.281164],\n              [89.054822, 36.291777],\n              [89.013554, 36.315409],\n              [88.964279, 36.318785],\n              [88.926091, 36.36458],\n              [88.870657, 36.348193],\n              [88.838628, 36.353496],\n              [88.802903, 36.33807],\n              [88.783809, 36.291777],\n              [88.766563, 36.292259],\n              [88.690186, 36.367954],\n              [88.623665, 36.389636],\n              [88.618121, 36.428168],\n              [88.573158, 36.461386],\n              [88.498629, 36.446463],\n              [88.470912, 36.48208],\n              [88.41055, 36.473418],\n              [88.356963, 36.477268],\n              [88.366202, 36.458016],\n              [88.282434, 36.470049],\n              [88.241782, 36.468605],\n              [88.222688, 36.447426],\n              [88.182652, 36.452721],\n              [88.134609, 36.427205],\n              [88.092109, 36.43539],\n              [88.006494, 36.430575],\n              [87.983088, 36.437797],\n              [87.95845, 36.408423],\n              [87.919646, 36.39349],\n              [87.838342, 36.383855],\n              [87.826023, 36.391563],\n              [87.767509, 36.3747],\n              [87.731785, 36.384818],\n              [87.6203, 36.360243],\n              [87.570409, 36.342409],\n              [87.470626, 36.354459],\n              [87.460155, 36.409868],\n              [87.426895, 36.42576],\n              [87.386859, 36.412757],\n              [87.363453, 36.420463],\n              [87.348055, 36.393008],\n              [87.292004, 36.358797],\n              [87.193454, 36.349158],\n              [87.161425, 36.325535],\n              [87.149106, 36.297565],\n              [87.08628, 36.310587],\n              [87.051788, 36.2966],\n              [86.996353, 36.308658],\n              [86.943998, 36.284058],\n              [86.931064, 36.265242],\n              [86.887332, 36.262829],\n              [86.86331, 36.299977],\n              [86.836209, 36.291294],\n              [86.746282, 36.291777],\n              [86.69947, 36.24449],\n              [86.599072, 36.222285],\n              [86.531935, 36.227113],\n              [86.515305, 36.205385],\n              [86.454943, 36.221319],\n              [86.392733, 36.206834],\n              [86.35824, 36.168676],\n              [86.2794, 36.170608],\n              [86.248603, 36.141616],\n              [86.187625, 36.130983],\n              [86.182081, 36.064734],\n              [86.199944, 36.047801],\n              [86.173458, 36.008113],\n              [86.150668, 36.00424],\n              [86.129111, 35.941761],\n              [86.093386, 35.906868],\n              [86.090306, 35.876809],\n              [86.05335, 35.842857],\n              [86.035488, 35.846738],\n              [85.949256, 35.778794],\n              [85.903677, 35.78462],\n              [85.835308, 35.771996],\n              [85.811286, 35.778794],\n              [85.691178, 35.751114],\n              [85.65299, 35.731199],\n              [85.612953, 35.651486],\n              [85.566142, 35.6403],\n              [85.518715, 35.680658],\n              [85.373969, 35.700101],\n              [85.341324, 35.753543],\n              [85.271107, 35.788989],\n              [85.146071, 35.742371],\n              [85.053065, 35.752086],\n              [84.99455, 35.737028],\n              [84.973608, 35.709334],\n              [84.920022, 35.696213],\n              [84.798066, 35.647595],\n              [84.729081, 35.613546],\n              [84.704443, 35.616951],\n              [84.628067, 35.595055],\n              [84.570168, 35.588242],\n              [84.513502, 35.564391],\n              [84.448828, 35.550272],\n              [84.475929, 35.516181],\n              [84.45314, 35.473303],\n              [84.424191, 35.466479],\n              [84.333032, 35.413821],\n              [84.274517, 35.404065],\n              [84.200605, 35.381135],\n              [84.160569, 35.359663],\n              [84.140859, 35.379184],\n              [84.095895, 35.362592],\n              [84.077417, 35.400163],\n              [84.005968, 35.422599],\n              [83.906186, 35.40309],\n              [83.885244, 35.367472],\n              [83.79778, 35.354783],\n              [83.785462, 35.36308],\n              [83.677672, 35.361128],\n              [83.622238, 35.335256],\n              [83.599448, 35.351366],\n              [83.54155, 35.341603],\n              [83.540318, 35.364056],\n              [83.502745, 35.360639],\n              [83.449159, 35.382111],\n              [83.405427, 35.380648],\n              [83.333978, 35.397236],\n              [83.280391, 35.401138],\n              [83.251442, 35.417722],\n              [83.178145, 35.38943],\n              [83.127022, 35.398699],\n              [83.088834, 35.425526],\n              [83.067892, 35.46258],\n              [82.998907, 35.484512],\n              [82.971806, 35.548324],\n              [82.981661, 35.599922],\n              [82.956407, 35.636409],\n              [82.967494, 35.667532],\n              [82.894813, 35.673852],\n              [82.873871, 35.688922],\n              [82.795031, 35.688436],\n              [82.780249, 35.666073],\n              [82.731589, 35.637868],\n              [82.652133, 35.67288],\n              [82.628727, 35.692324],\n              [82.546192, 35.708362],\n              [82.501844, 35.701073],\n              [82.468583, 35.717595],\n              [82.424852, 35.712736],\n              [82.392823, 35.656349],\n              [82.336156, 35.651486],\n              [82.350323, 35.611113],\n              [82.328149, 35.559523],\n              [82.2992, 35.544916],\n              [82.263475, 35.547837],\n              [82.234526, 35.520565],\n              [82.189563, 35.513258],\n              [82.164925, 35.495719],\n              [82.086701, 35.467454],\n              [82.071302, 35.450393],\n              [82.034346, 35.451855],\n              [82.029419, 35.426013],\n              [82.05344, 35.35039],\n              [82.030034, 35.321585],\n              [81.99123, 35.30547],\n              [81.955506, 35.307423],\n              [81.927789, 35.271275],\n              [81.853876, 35.25857],\n              [81.804601, 35.270786],\n              [81.736847, 35.26248],\n              [81.68634, 35.235599],\n              [81.513261, 35.23511],\n              [81.504638, 35.279092],\n              [81.447972, 35.318167],\n              [81.441196, 35.333303],\n              [81.385762, 35.335256],\n              [81.363588, 35.354783],\n              [81.314313, 35.337209],\n              [81.285364, 35.345508],\n              [81.26627, 35.322562],\n              [81.219458, 35.319144],\n              [81.191741, 35.36552],\n              [81.142466, 35.365032],\n              [81.103662, 35.386015],\n              [81.09935, 35.40748],\n              [81.054387, 35.402602],\n              [81.031597, 35.380648],\n              [81.030981, 35.337209],\n              [81.002648, 35.334768],\n              [81.026053, 35.31133],\n              [80.963844, 35.310842],\n              [80.924423, 35.330862],\n              [80.894242, 35.324027],\n              [80.844351, 35.345508],\n              [80.759968, 35.334768],\n              [80.689135, 35.339162],\n              [80.690982, 35.364544],\n              [80.65649, 35.393821],\n              [80.599823, 35.409431],\n              [80.56841, 35.391381],\n              [80.532686, 35.404553],\n              [80.514824, 35.391869],\n              [80.444607, 35.417235],\n              [80.432904, 35.449418],\n              [80.375006, 35.387966],\n              [80.321419, 35.38699],\n              [80.286926, 35.35283],\n              [80.267832, 35.295701],\n              [80.362687, 35.20871],\n              [80.257977, 35.203331],\n              [80.223484, 35.177409],\n              [80.23026, 35.147565],\n              [80.118159, 35.066293],\n              [80.078123, 35.076578],\n              [80.031311, 35.034447],\n              [80.04363, 35.022196],\n              [80.02392, 34.971209],\n              [80.041782, 34.943252],\n              [80.034391, 34.902033],\n              [80.003594, 34.895162],\n              [79.996819, 34.856375],\n              [79.961094, 34.862759],\n              [79.926602, 34.849499],\n              [79.947544, 34.821008],\n              [79.898268, 34.732035],\n              [79.906892, 34.683821],\n              [79.866856, 34.671517],\n              [79.88595, 34.642965],\n              [79.84345, 34.55725],\n              [79.861312, 34.528166],\n              [79.801566, 34.478847],\n              [79.735661, 34.471447],\n              [79.699936, 34.477861],\n              [79.675914, 34.451216],\n              [79.58106, 34.456151],\n              [79.545335, 34.476381],\n              [79.504683, 34.45467],\n              [79.435082, 34.447761],\n              [79.363017, 34.428018],\n              [79.326677, 34.44332],\n              [79.274322, 34.435916],\n              [79.241677, 34.415183],\n              [79.179467, 34.422588],\n              [79.161605, 34.441345],\n              [79.072294, 34.412714],\n              [79.039033, 34.421601],\n              [79.0107, 34.399877],\n              [79.048888, 34.348506],\n              [79.039649, 34.33467],\n              [78.973128, 34.362833],\n              [78.958961, 34.386049],\n              [78.899831, 34.354929],\n              [78.878273, 34.391481],\n              [78.809288, 34.432955],\n              [78.742766, 34.45467],\n              [78.758781, 34.481807],\n              [78.715049, 34.502031],\n              [78.708274, 34.522249],\n              [78.634977, 34.538026],\n              [78.58139, 34.505483],\n              [78.562912, 34.51288],\n              [78.559832, 34.55725],\n              [78.542586, 34.574499],\n              [78.492695, 34.578441],\n              [78.436029, 34.543942],\n              [78.427405, 34.594207],\n              [78.397224, 34.605538],\n              [78.346101, 34.60406],\n              [78.280812, 34.623269],\n              [78.265413, 34.651335],\n              [78.267261, 34.705472],\n              [78.213059, 34.717771],\n              [78.21429, 34.760556],\n              [78.230921, 34.776288],\n              [78.237696, 34.882398],\n              [78.206283, 34.891726],\n              [78.182262, 34.936874],\n              [78.201972, 34.974642],\n              [78.160704, 34.990823],\n              [78.123131, 35.036897],\n              [78.150849, 35.069721],\n              [78.124979, 35.108407],\n              [78.078784, 35.100084],\n              [78.062769, 35.114772],\n              [78.060306, 35.180344],\n              [78.01719, 35.228267],\n              [78.020885, 35.315237],\n              [78.013494, 35.366008],\n              [78.046755, 35.384063],\n              [78.107117, 35.437229],\n              [78.113892, 35.466967],\n              [78.140378, 35.494745],\n              [78.048603, 35.491334],\n              [78.029509, 35.469404],\n              [78.009799, 35.491821],\n              [77.951284, 35.478664],\n              [77.917408, 35.490847],\n              [77.914944, 35.465017],\n              [77.870596, 35.495232],\n              [77.85643, 35.487436],\n              [77.816394, 35.518616],\n              [77.797299, 35.491334],\n              [77.757879, 35.497181],\n              [77.735706, 35.461605],\n              [77.690742, 35.448443],\n              [77.657481, 35.477689],\n              [77.639619, 35.45478],\n              [77.590344, 35.460143],\n              [77.578025, 35.47574],\n              [77.518895, 35.482075],\n              [77.451758, 35.46063],\n              [77.396939, 35.467942],\n              [77.355055, 35.494257],\n              [77.331649, 35.530793],\n              [77.307628, 35.540533],\n              [77.195527, 35.519103],\n              [77.093281, 35.569746],\n              [77.072339, 35.591162],\n              [76.99781, 35.611113],\n              [76.967013, 35.591649],\n              [76.906651, 35.615005],\n              [76.848753, 35.668018],\n              [76.769297, 35.653917],\n              [76.69292, 35.747714],\n              [76.593754, 35.771996],\n              [76.566037, 35.819082],\n              [76.587595, 35.840431],\n              [76.579587, 35.866625],\n              [76.59745, 35.895718],\n              [76.55803, 35.923347],\n              [76.51553, 35.881173],\n              [76.471798, 35.886021],\n              [76.431762, 35.851589],\n              [76.369552, 35.86323],\n              [76.365857, 35.82442],\n              [76.298719, 35.841401],\n              [76.228502, 35.837035],\n              [76.221727, 35.823449],\n              [76.160133, 35.82442],\n              [76.146582, 35.839946],\n              [76.16506, 35.908807],\n              [76.117017, 35.975186],\n              [76.097307, 36.022635],\n              [76.044336, 36.026991],\n              [76.028322, 36.016827],\n              [75.982742, 36.031347],\n              [75.949482, 36.070056],\n              [75.936547, 36.13485],\n              [75.96796, 36.159013],\n              [76.016619, 36.165294],\n              [76.011691, 36.229044],\n              [76.060967, 36.225182],\n              [76.055423, 36.252695],\n              [75.998757, 36.312034],\n              [75.991365, 36.35205],\n              [76.035097, 36.409386],\n              [75.991981, 36.505654],\n              [75.924228, 36.566242],\n              [75.947018, 36.590752],\n              [75.871257, 36.666636],\n              [75.8072, 36.707908],\n              [75.724048, 36.750597],\n              [75.634121, 36.771693],\n              [75.588541, 36.762584],\n              [75.537418, 36.773131],\n              [75.536802, 36.729975],\n              [75.504773, 36.743404],\n              [75.458578, 36.720861],\n              [75.425933, 36.778883],\n              [75.434556, 36.83303],\n              [75.430245, 36.873255],\n              [75.396368, 36.904367],\n              [75.413614, 36.954599],\n              [75.345861, 36.960816],\n              [75.288579, 36.974682],\n              [75.244847, 36.963207],\n              [75.16847, 36.991892],\n              [75.172166, 37.013877],\n              [75.063145, 37.006231],\n              [75.032348, 37.016745],\n              [75.005862, 36.99476],\n              [74.927638, 36.978029],\n              [74.938725, 36.94312],\n              [74.893762, 36.939772],\n              [74.86974, 36.990458],\n              [74.84387, 37.0134],\n              [74.84695, 37.056873],\n              [74.806914, 37.054485],\n              [74.792747, 37.027257],\n              [74.739161, 37.028212],\n              [74.70898, 37.084569],\n              [74.632603, 37.066425],\n              [74.617205, 37.043499],\n              [74.56793, 37.032512],\n              [74.530357, 37.082182],\n              [74.498944, 37.072155],\n              [74.496481, 37.116072],\n              [74.465068, 37.147085],\n              [74.487858, 37.161871],\n              [74.477387, 37.19954],\n              [74.511263, 37.240048],\n              [74.54514, 37.2491],\n              [74.578401, 37.231472],\n              [74.598727, 37.258151],\n              [74.642458, 37.261485],\n              [74.665864, 37.23576],\n              [74.727458, 37.282916],\n              [74.753943, 37.281011],\n              [74.800139, 37.248147],\n              [74.816153, 37.216699],\n              [74.911008, 37.233378],\n              [74.927022, 37.277678],\n              [75.018181, 37.293867],\n              [75.078543, 37.318144],\n              [75.125971, 37.322427],\n              [75.140137, 37.355258],\n              [75.125971, 37.388075],\n              [75.153072, 37.414223],\n              [75.129666, 37.459367],\n              [75.090862, 37.486915],\n              [75.078543, 37.511129],\n              [75.035428, 37.500685],\n              [75.002167, 37.511604],\n              [75.000935, 37.53059],\n              [74.940573, 37.559061],\n              [74.891914, 37.668097],\n              [74.920863, 37.684675],\n              [74.923327, 37.717347],\n              [74.949196, 37.725395],\n              [75.006478, 37.770823],\n              [74.989848, 37.797783],\n              [74.917167, 37.845057],\n              [74.936877, 37.876241],\n              [74.919015, 37.908357],\n              [74.911008, 37.966884],\n              [74.92579, 38.01735],\n              [74.879595, 38.021122],\n              [74.821697, 38.10311],\n              [74.80445, 38.167128],\n              [74.816769, 38.215576],\n              [74.793363, 38.271039],\n              [74.806914, 38.285602],\n              [74.789668, 38.324581],\n              [74.834015, 38.361193],\n              [74.868508, 38.403883],\n              [74.862965, 38.484035],\n              [74.821697, 38.491062],\n              [74.78474, 38.538357],\n              [74.717603, 38.542102],\n              [74.639995, 38.599653],\n              [74.613509, 38.593105],\n              [74.546988, 38.607604],\n              [74.506336, 38.637528],\n              [74.455829, 38.632853],\n              [74.421952, 38.647812],\n              [74.353583, 38.655757],\n              [74.229779, 38.656224],\n              [74.147859, 38.676785],\n              [74.11275, 38.611345],\n              [74.088113, 38.610878],\n              [74.068403, 38.585621],\n              [74.090577, 38.542102],\n              [74.034526, 38.541634],\n              [74.011736, 38.52478],\n              [73.926121, 38.536016],\n              [73.89902, 38.579071],\n              [73.852208, 38.584217],\n              [73.799237, 38.610878],\n              [73.809092, 38.634256],\n              [73.757353, 38.719755],\n              [73.769056, 38.775765],\n              [73.729636, 38.837324],\n              [73.699455, 38.857832],\n              [73.70931, 38.893241],\n              [73.742571, 38.933754],\n              [73.767824, 38.941202],\n              [73.826339, 38.916993],\n              [73.846665, 38.962145],\n              [73.839889, 39.008199],\n              [73.820179, 39.041674],\n              [73.780143, 39.026798],\n              [73.743187, 39.029588],\n              [73.720397, 39.071881],\n              [73.719781, 39.108112],\n              [73.688368, 39.154999],\n              [73.657571, 39.166136],\n              [73.639709, 39.220402],\n              [73.623079, 39.235237],\n              [73.580579, 39.237555],\n              [73.564564, 39.266288],\n              [73.542391, 39.269531],\n              [73.554709, 39.295935],\n              [73.554094, 39.350102],\n              [73.502355, 39.383877],\n              [73.592898, 39.412087],\n              [73.61076, 39.465702],\n              [73.6471, 39.474479],\n              [73.745651, 39.462005],\n              [73.836194, 39.472169],\n              [73.868223, 39.482794],\n              [73.893476, 39.528046],\n              [73.883621, 39.540969],\n              [73.914418, 39.564041],\n              [73.916266, 39.586644],\n              [73.953838, 39.600018],\n              [73.924273, 39.722108],\n              [73.905795, 39.741899],\n              [73.841737, 39.756163],\n              [73.845433, 39.831115],\n              [73.907027, 39.873843],\n              [73.910722, 39.934443],\n              [73.980324, 40.004617],\n              [73.943367, 40.016076],\n              [74.008041, 40.050901],\n              [74.023439, 40.085251],\n              [74.113366, 40.086624],\n              [74.126301, 40.104479],\n              [74.26304, 40.125074],\n              [74.280902, 40.09807],\n              [74.316626, 40.106767],\n              [74.356662, 40.089371],\n              [74.433039, 40.13148],\n              [74.485394, 40.182251],\n              [74.534669, 40.207851],\n              [74.577169, 40.260391],\n              [74.618437, 40.27957],\n              [74.673255, 40.278656],\n              [74.697893, 40.310153],\n              [74.700357, 40.346195],\n              [74.824776, 40.344371],\n              [74.862965, 40.32658],\n              [74.908544, 40.338897],\n              [74.795211, 40.443278],\n              [74.814921, 40.461039],\n              [74.819233, 40.505647],\n              [74.844486, 40.521117],\n              [74.891914, 40.507467],\n              [74.963363, 40.464681],\n              [74.995392, 40.455119],\n              [75.021877, 40.466958],\n              [75.051442, 40.449654],\n              [75.102565, 40.44009],\n              [75.13521, 40.463315],\n              [75.206659, 40.447833],\n              [75.242383, 40.448743],\n              [75.268869, 40.483802],\n              [75.292274, 40.483802],\n              [75.355716, 40.537947],\n              [75.432093, 40.563412],\n              [75.467817, 40.599773],\n              [75.550353, 40.64883],\n              [75.599628, 40.659727],\n              [75.636584, 40.624306],\n              [75.627345, 40.605226],\n              [75.631041, 40.548862],\n              [75.646439, 40.516567],\n              [75.733287, 40.474242],\n              [75.717272, 40.443278],\n              [75.686475, 40.418223],\n              [75.669845, 40.363982],\n              [75.688323, 40.343915],\n              [75.709265, 40.280939],\n              [75.739446, 40.299199],\n              [75.785642, 40.301025],\n              [75.831221, 40.327492],\n              [75.84046, 40.312434],\n              [75.890351, 40.30924],\n              [75.921764, 40.291439],\n              [75.932235, 40.339353],\n              [75.986438, 40.381763],\n              [76.026474, 40.355317],\n              [76.048648, 40.357141],\n              [76.048648, 40.388601],\n              [76.081293, 40.39635],\n              [76.144118, 40.393615],\n              [76.176147, 40.381307],\n              [76.22419, 40.401819],\n              [76.279625, 40.439179],\n              [76.283321, 40.415034],\n              [76.327668, 40.391336],\n              [76.333212, 40.343459],\n              [76.381871, 40.39088],\n              [76.390494, 40.37766],\n              [76.442233, 40.391336],\n              [76.470566, 40.422779],\n              [76.508754, 40.429613],\n              [76.539551, 40.464226],\n              [76.543247, 40.513837],\n              [76.556798, 40.542495],\n              [76.601145, 40.578868],\n              [76.611, 40.601591],\n              [76.657196, 40.620218],\n              [76.654732, 40.652917],\n              [76.676906, 40.696036],\n              [76.646725, 40.73686],\n              [76.646725, 40.759983],\n              [76.693536, 40.779472],\n              [76.731724, 40.818887],\n              [76.741579, 40.912119],\n              [76.761905, 40.954167],\n              [76.817956, 40.975406],\n              [76.85368, 40.97631],\n              [76.885709, 41.027347],\n              [76.940528, 41.028701],\n              [77.002122, 41.073381],\n              [77.023064, 41.059394],\n              [77.091433, 41.062553],\n              [77.108063, 41.038181],\n              [77.169041, 41.009285],\n              [77.236795, 41.027798],\n              [77.296541, 41.004769],\n              [77.363062, 41.04089],\n              [77.415417, 41.038633],\n              [77.473931, 41.022832],\n              [77.476395, 40.999349],\n              [77.540453, 41.006575],\n              [77.591576, 40.992122],\n              [77.597119, 41.005221],\n              [77.654402, 41.016059],\n              [77.684583, 41.00793],\n              [77.737553, 41.032313],\n              [77.780669, 41.022832],\n              [77.796068, 41.049014],\n              [77.829328, 41.059394],\n              [77.807155, 41.091876],\n              [77.814546, 41.13426],\n              [77.836104, 41.153189],\n              [77.905089, 41.185174],\n              [77.972842, 41.173013],\n              [78.094798, 41.224347],\n              [78.129291, 41.228398],\n              [78.136682, 41.279239],\n              [78.165015, 41.340825],\n              [78.149617, 41.368228],\n              [78.163783, 41.383497],\n              [78.235232, 41.399211],\n              [78.324544, 41.384395],\n              [78.338094, 41.397415],\n              [78.385522, 41.394721],\n              [78.391681, 41.408189],\n              [78.454507, 41.412228],\n              [78.527188, 41.440947],\n              [78.580774, 41.481759],\n              [78.650375, 41.467411],\n              [78.675629, 41.50238],\n              [78.707042, 41.522098],\n              [78.696571, 41.54181],\n              [78.739071, 41.555695],\n              [78.825302, 41.560173],\n              [78.86657, 41.593749],\n              [78.891824, 41.597777],\n              [78.957729, 41.65146],\n              [78.99407, 41.664427],\n              [79.021787, 41.657273],\n              [79.043345, 41.681414],\n              [79.10925, 41.697503],\n              [79.138199, 41.722968],\n              [79.21704, 41.725648],\n              [79.271858, 41.767174],\n              [79.276786, 41.78101],\n              [79.326061, 41.809565],\n              [79.356242, 41.795735],\n              [79.415372, 41.836769],\n              [79.457256, 41.847915],\n              [79.500988, 41.835432],\n              [79.550879, 41.834094],\n              [79.616784, 41.856385],\n              [79.640806, 41.884907],\n              [79.724574, 41.896935],\n              [79.776313, 41.89248],\n              [79.822508, 41.963275],\n              [79.854537, 41.984186],\n              [79.852689, 42.015319],\n              [79.923522, 42.042436],\n              [80.089826, 42.047325],\n              [80.14218, 42.03488],\n              [80.193303, 42.081535],\n              [80.16805, 42.096635],\n              [80.139717, 42.151232],\n              [80.163738, 42.152563],\n              [80.168666, 42.200462],\n              [80.233339, 42.210215],\n              [80.28631, 42.233261],\n              [80.29247, 42.259842],\n              [80.272144, 42.281984],\n              [80.283847, 42.320493],\n              [80.229028, 42.358536],\n              [80.239499, 42.389927],\n              [80.206238, 42.431462],\n              [80.225948, 42.485769],\n              [80.265368, 42.502097],\n              [80.221637, 42.533415],\n              [80.180985, 42.590718],\n              [80.163738, 42.629919],\n              [80.179753, 42.670415],\n              [80.228412, 42.692852],\n              [80.225948, 42.713083],\n              [80.259209, 42.790865],\n              [80.262289, 42.828623],\n              [80.280151, 42.838278],\n              [80.338049, 42.831695],\n              [80.407034, 42.834767],\n              [80.450766, 42.861971],\n              [80.503737, 42.882146],\n              [80.602903, 42.894424],\n              [80.5912, 42.923354],\n              [80.487106, 42.948766],\n              [80.397795, 42.996933],\n              [80.378701, 43.031502],\n              [80.416889, 43.05687],\n              [80.482795, 43.06955],\n              [80.556092, 43.104515],\n              [80.593048, 43.133347],\n              [80.650946, 43.147321],\n              [80.706997, 43.143828],\n              [80.73225, 43.131163],\n              [80.752576, 43.148194],\n              [80.79446, 43.137277],\n              [80.804315, 43.178314],\n              [80.789533, 43.201876],\n              [80.788917, 43.242433],\n              [80.769207, 43.265535],\n              [80.777214, 43.308227],\n              [80.69283, 43.32042],\n              [80.686055, 43.333916],\n              [80.735946, 43.389609],\n              [80.746417, 43.439167],\n              [80.761199, 43.446554],\n              [80.75504, 43.494329],\n              [80.522215, 43.816473],\n              [80.511128, 43.906657],\n              [80.475404, 43.938124],\n              [80.485259, 43.95579],\n              [80.457541, 43.981203],\n              [80.458773, 44.047054],\n              [80.449534, 44.078017],\n              [80.3941, 44.127009],\n              [80.407034, 44.149772],\n              [80.400875, 44.198704],\n              [80.413194, 44.264741],\n              [80.399027, 44.30587],\n              [80.383013, 44.401297],\n              [80.350368, 44.484615],\n              [80.411962, 44.605321],\n              [80.400259, 44.628751],\n              [80.313412, 44.704938],\n              [80.238883, 44.7228],\n              [80.200695, 44.756808],\n              [80.178521, 44.796741],\n              [80.18776, 44.825612],\n              [80.169898, 44.84471],\n              [80.115695, 44.815424],\n              [80.087978, 44.817122],\n              [79.999283, 44.793768],\n              [79.991891, 44.830281],\n              [79.953703, 44.849377],\n              [79.969102, 44.877797],\n              [79.887798, 44.90917],\n              [79.944464, 44.937985],\n              [79.951855, 44.957892],\n              [79.98142, 44.964244],\n              [80.056565, 45.011227],\n              [80.060876, 45.026033],\n              [80.111999, 45.052675],\n              [80.136021, 45.041259],\n              [80.144644, 45.059017],\n              [80.195767, 45.030686],\n              [80.24381, 45.031532],\n              [80.291854, 45.06578],\n              [80.328194, 45.070007],\n              [80.358375, 45.040836],\n              [80.404571, 45.049293],\n              [80.443991, 45.077614],\n              [80.445839, 45.097895],\n              [80.493882, 45.127037],\n              [80.519135, 45.108878],\n              [80.599207, 45.105921],\n              [80.686055, 45.129148],\n              [80.731634, 45.156164],\n              [80.816634, 45.152788],\n              [80.862214, 45.127037],\n              [80.897938, 45.127459],\n              [80.93551, 45.160384],\n              [80.966307, 45.168402],\n              [81.024821, 45.162916],\n              [81.080872, 45.182745],\n              [81.111669, 45.218168],\n              [81.170183, 45.211001],\n              [81.175111, 45.227863],\n              [81.236705, 45.247248],\n              [81.284748, 45.23882],\n              [81.327864, 45.260729],\n              [81.382066, 45.257781],\n              [81.398697, 45.275471],\n              [81.437501, 45.28263],\n              [81.462754, 45.264099],\n              [81.52866, 45.285999],\n              [81.536667, 45.304101],\n              [81.575471, 45.30789],\n              [81.582863, 45.336503],\n              [81.645072, 45.359216],\n              [81.677101, 45.35459],\n              [81.78797, 45.3836],\n              [81.832318, 45.319673],\n              [81.879745, 45.284314],\n              [81.921013, 45.233342],\n              [81.993078, 45.237978],\n              [82.052824, 45.255674],\n              [82.09594, 45.249776],\n              [82.091012, 45.222383],\n              [82.109491, 45.211422],\n              [82.206809, 45.236713],\n              [82.294272, 45.247669],\n              [82.344779, 45.219011],\n              [82.487061, 45.181058],\n              [82.562822, 45.204676],\n              [82.58746, 45.224069],\n              [82.60101, 45.346178],\n              [82.546808, 45.426038],\n              [82.448257, 45.461309],\n              [82.281954, 45.53891],\n              [82.266555, 45.620172],\n              [82.288729, 45.655321],\n              [82.289961, 45.71636],\n              [82.340468, 45.772742],\n              [82.349707, 45.822811],\n              [82.336156, 45.882418],\n              [82.342932, 45.935303],\n              [82.401446, 45.972333],\n              [82.461808, 45.97982],\n              [82.518474, 46.153798],\n              [82.609017, 46.294985],\n              [82.726662, 46.494756],\n              [82.774089, 46.600124],\n              [82.788872, 46.677784],\n              [82.829524, 46.772551],\n              [82.878183, 46.797138],\n              [82.876335, 46.823762],\n              [82.923762, 46.932169],\n              [82.937929, 47.014248],\n              [82.993364, 47.065229],\n              [83.031552, 47.168265],\n              [83.02724, 47.21544],\n              [83.108544, 47.221944],\n              [83.15474, 47.236168],\n              [83.17445, 47.218286],\n              [83.207094, 47.213814],\n              [83.221877, 47.186977],\n              [83.257602, 47.173147],\n              [83.306261, 47.179656],\n              [83.324739, 47.167858],\n              [83.370318, 47.178436],\n              [83.418978, 47.119012],\n              [83.463325, 47.132042],\n              [83.53847, 47.083977],\n              [83.566803, 47.080717],\n              [83.576042, 47.059114],\n              [83.700462, 47.032199],\n              [83.69923, 47.015472],\n              [83.766367, 47.026896],\n              [83.88586, 46.982003],\n              [83.932671, 46.970161],\n              [83.951765, 46.98731],\n              [84.002888, 46.990576],\n              [84.038613, 46.973428],\n              [84.086656, 46.965261],\n              [84.150098, 46.977512],\n              [84.195061, 47.003638],\n              [84.2893, 46.994658],\n              [84.336727, 47.00527],\n              [84.37122, 46.993434],\n              [84.425422, 47.008943],\n              [84.506726, 46.97302],\n              [84.563393, 46.991801],\n              [84.668718, 46.995067],\n              [84.699515, 47.008535],\n              [84.748175, 47.009759],\n              [84.781435, 46.979962],\n              [84.849189, 46.957092],\n              [84.867051, 46.927673],\n              [84.934188, 46.863878],\n              [84.95513, 46.861013],\n              [84.979768, 46.883106],\n              [84.987159, 46.918272],\n              [85.082014, 46.939933],\n              [85.102956, 46.968936],\n              [85.175637, 46.997924],\n              [85.213825, 47.041172],\n              [85.276651, 47.068898],\n              [85.325926, 47.044842],\n              [85.355491, 47.054629],\n              [85.441106, 47.063191],\n              [85.545816, 47.057891],\n              [85.547048, 47.096609],\n              [85.582772, 47.142626],\n              [85.641903, 47.18413],\n              [85.682555, 47.222757],\n              [85.682555, 47.249982],\n              [85.701033, 47.28856],\n              [85.675779, 47.321837],\n              [85.701649, 47.384275],\n              [85.685018, 47.428829],\n              [85.614801, 47.498015],\n              [85.617881, 47.550552],\n              [85.547048, 48.008205],\n              [85.531649, 48.046227],\n              [85.551975, 48.081423],\n              [85.55136, 48.127781],\n              [85.576613, 48.15853],\n              [85.587084, 48.191654],\n              [85.622193, 48.202824],\n              [85.633895, 48.232731],\n              [85.678243, 48.266205],\n              [85.695489, 48.302445],\n              [85.695489, 48.335078],\n              [85.758315, 48.403064],\n              [85.791576, 48.418954],\n              [85.916612, 48.438015],\n              [86.053966, 48.441192],\n              [86.225813, 48.432456],\n              [86.270161, 48.452307],\n              [86.305269, 48.491984],\n              [86.38103, 48.49357],\n              [86.416138, 48.481671],\n              [86.579978, 48.538763],\n              [86.594761, 48.576789],\n              [86.635413, 48.612016],\n              [86.640956, 48.629027],\n              [86.693311, 48.64366],\n              [86.70255, 48.666195],\n              [86.771535, 48.717156],\n              [86.780774, 48.731369],\n              [86.754289, 48.78463],\n              [86.770303, 48.810255],\n              [86.818963, 48.831139],\n              [86.821426, 48.850439],\n              [86.782006, 48.887049],\n              [86.757985, 48.894919],\n              [86.730267, 48.959797],\n              [86.732115, 48.994757],\n              [86.772151, 49.02773],\n              [86.836209, 49.051269],\n              [86.84976, 49.066563],\n              [86.854071, 49.109284],\n              [86.887948, 49.132001],\n              [86.953853, 49.131218],\n              [87.000049, 49.142572],\n              [87.088128, 49.133567],\n              [87.112766, 49.15549],\n              [87.211932, 49.140615],\n              [87.239033, 49.114376],\n              [87.304939, 49.112418],\n              [87.388707, 49.097921],\n              [87.43675, 49.075188],\n              [87.511894, 49.10184],\n              [87.49588, 49.132001],\n              [87.517438, 49.145704],\n              [87.563017, 49.142572],\n              [87.602437, 49.152359],\n              [87.67635, 49.15549],\n              [87.700372, 49.175839],\n              [87.762582, 49.172709],\n              [87.793379, 49.18249],\n              [87.821096, 49.173883],\n              [87.82048, 49.148445],\n              [87.845733, 49.146096],\n              [87.867291, 49.108892],\n              [87.844502, 49.090084],\n              [87.858052, 49.07362],\n              [87.835263, 49.054406],\n              [87.883306, 49.023806],\n              [87.883922, 48.993971],\n              [87.911639, 48.979833],\n              [87.871603, 48.963726],\n              [87.87653, 48.949186],\n              [87.814321, 48.945256],\n              [87.793995, 48.927565],\n              [87.760118, 48.925992],\n              [87.742256, 48.881146],\n              [87.78106, 48.872094],\n              [87.792147, 48.849258],\n              [87.829103, 48.825623],\n              [87.803234, 48.824835],\n              [87.826639, 48.800795],\n              [87.872219, 48.799612],\n              [87.93874, 48.757809],\n              [87.96153, 48.773588],\n              [88.029283, 48.750313],\n              [88.064392, 48.712813],\n              [88.090877, 48.71992],\n              [88.089645, 48.69504],\n              [88.02682, 48.65315],\n              [88.010805, 48.618742],\n              [87.96153, 48.599353],\n              [87.973233, 48.575997],\n              [88.041602, 48.548272],\n              [88.10874, 48.545895],\n              [88.130297, 48.521721],\n              [88.151855, 48.526478],\n              [88.196819, 48.493967],\n              [88.229464, 48.498329],\n              [88.318159, 48.478497],\n              [88.363123, 48.460641],\n              [88.360659, 48.433251],\n              [88.438267, 48.393528],\n              [88.462289, 48.392335],\n              [88.503557, 48.412996],\n              [88.523267, 48.403461],\n              [88.535586, 48.368884],\n              [88.573158, 48.369679],\n              [88.573774, 48.351785],\n              [88.605803, 48.337863],\n              [88.575006, 48.277757],\n              [88.594716, 48.259831],\n              [88.601491, 48.221567],\n              [88.638447, 48.183674],\n              [88.668628, 48.171303],\n              [88.700657, 48.180881],\n              [88.721599, 48.160526],\n              [88.79736, 48.133772],\n              [88.824461, 48.107005],\n              [88.939026, 48.115396],\n              [88.953808, 48.090618],\n              [89.027105, 48.051028],\n              [89.044967, 48.009806],\n              [89.078228, 47.98698],\n              [89.156452, 47.996992],\n              [89.231597, 47.98017],\n              [89.282104, 47.994189],\n              [89.308589, 48.021816],\n              [89.359712, 48.026219],\n              [89.38127, 48.046227],\n              [89.498299, 48.02822],\n              [89.569132, 48.037825],\n              [89.599313, 48.015811],\n              [89.595617, 47.973359],\n              [89.645508, 47.947711],\n              [89.651052, 47.913627],\n              [89.735435, 47.89758],\n              [89.761921, 47.835751],\n              [89.86971, 47.834144],\n              [89.957789, 47.842982],\n              [89.960253, 47.885942],\n              [90.040941, 47.874704],\n              [90.066195, 47.883534],\n              [90.086521, 47.86547],\n              [90.070506, 47.820483],\n              [90.07605, 47.777469],\n              [90.13518, 47.723147],\n              [90.180144, 47.72516],\n              [90.216484, 47.70543],\n              [90.331665, 47.681663],\n              [90.384635, 47.644179],\n              [90.346447, 47.637324],\n              [90.376012, 47.603036],\n              [90.398186, 47.547724],\n              [90.468403, 47.497611],\n              [90.474562, 47.462422],\n              [90.459164, 47.43895],\n              [90.468403, 47.404937],\n              [90.507823, 47.400076],\n              [90.526301, 47.379007],\n              [90.488113, 47.317374],\n              [90.521374, 47.2845],\n              [90.56141, 47.206903],\n              [90.579888, 47.198364],\n              [90.653801, 47.111681],\n              [90.691989, 47.080717],\n              [90.767134, 46.992617],\n              [90.830575, 46.995883],\n              [90.901408, 46.960768],\n              [90.92235, 46.938707],\n              [90.929742, 46.893331],\n              [90.958075, 46.879425],\n              [90.942676, 46.82581],\n              [90.992567, 46.790583],\n              [90.992567, 46.769682],\n              [91.019053, 46.766402],\n              [91.054161, 46.717598],\n              [91.036299, 46.670393],\n              [91.017821, 46.58244],\n              [91.068328, 46.579149],\n              [91.079415, 46.558989],\n              [91.060937, 46.516999],\n              [91.038147, 46.500936],\n              [91.025828, 46.444057],\n              [90.996263, 46.419309],\n              [90.983328, 46.374734],\n              [90.900177, 46.31235],\n              [90.955611, 46.233752],\n              [90.94822, 46.219262],\n              [90.98456, 46.160431],\n              [91.021517, 46.121038],\n              [91.014741, 46.06667],\n              [91.028292, 46.023054],\n              [90.890937, 45.921566],\n              [90.799778, 45.834905],\n              [90.714779, 45.728895],\n              [90.676591, 45.582488],\n              [90.671047, 45.487747],\n              [90.723402, 45.464667],\n              [90.772677, 45.432338],\n              [90.773909, 45.405874],\n              [90.813329, 45.32851],\n              [90.804706, 45.29484],\n              [90.831807, 45.300313],\n              [90.877387, 45.280946],\n              [90.897713, 45.249776],\n              [90.866916, 45.209314],\n              [90.881698, 45.192025],\n              [90.96177, 45.201303],\n              [91.007966, 45.218589],\n              [91.050466, 45.208892],\n              [91.129922, 45.21606],\n              [91.17119, 45.199616],\n              [91.195827, 45.159118],\n              [91.230936, 45.153632],\n              [91.242023, 45.13717],\n              [91.33503, 45.129571],\n              [91.37753, 45.11099],\n              [91.429268, 45.156586],\n              [91.448978, 45.156586],\n              [91.500101, 45.103809],\n              [91.561695, 45.075501],\n              [91.694738, 45.065357],\n              [91.803144, 45.082685],\n              [91.885679, 45.078882],\n              [92.056911, 45.086911],\n              [92.100026, 45.081417],\n              [92.240461, 45.015881],\n              [92.315605, 45.028994],\n              [92.348866, 45.014188],\n              [92.414155, 45.018419],\n              [92.501003, 45.001072],\n              [92.547814, 45.018419],\n              [92.683937, 45.02561],\n              [92.779407, 45.050561],\n              [92.847777, 45.038721],\n              [92.884117, 45.046756],\n              [92.922921, 45.03703],\n              [92.932776, 45.017573],\n              [93.002377, 45.009958],\n              [93.062124, 45.018419],\n              [93.100312, 45.007419],\n              [93.174225, 45.015458],\n              [93.252449, 44.991761],\n              [93.314043, 44.980333],\n              [93.314659, 44.995147],\n              [93.376869, 44.985412],\n              [93.434767, 44.955351],\n              [93.509296, 44.968055],\n              [93.613389, 44.926546],\n              [93.716251, 44.894334],\n              [93.723642, 44.865498],\n              [94.066105, 44.732154],\n              [94.152336, 44.684944],\n              [94.215162, 44.667921],\n              [94.227481, 44.645785],\n              [94.279836, 44.603617],\n              [94.329727, 44.582734],\n              [94.359292, 44.515775],\n              [94.390705, 44.521749],\n              [94.470777, 44.509373],\n              [94.557008, 44.462408],\n              [94.606283, 44.448311],\n              [94.673421, 44.397021],\n              [94.722696, 44.34055],\n              [94.768275, 44.34055],\n              [94.826174, 44.320001],\n              [94.945666, 44.292592],\n              [94.998637, 44.253169],\n              [95.1286, 44.269884],\n              [95.238853, 44.277169],\n              [95.41378, 44.298589],\n              [95.43041, 44.281882],\n              [95.4107, 44.245024],\n              [95.376208, 44.227444],\n              [95.355882, 44.166087],\n              [95.35157, 44.090054],\n              [95.326932, 44.028554],\n              [95.377439, 44.025972],\n              [95.426099, 44.009618],\n              [95.527113, 44.007466],\n              [95.623199, 43.855756],\n              [95.645373, 43.787966],\n              [95.705735, 43.67077],\n              [95.735916, 43.597569],\n              [95.857872, 43.417436],\n              [95.880046, 43.28035],\n              [95.921314, 43.229789],\n              [96.363558, 42.900562],\n              [96.386348, 42.727592],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 710000,\n        name: '台湾省',\n        center: [121.509062, 25.044332],\n        centroid: [120.971485, 23.749452],\n        childrenNum: 0,\n        level: 'province',\n        subFeatureIndex: 31,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [120.443706, 22.441432],\n              [120.297112, 22.531565],\n              [120.274323, 22.560307],\n              [120.20041, 22.721039],\n              [120.149287, 22.896468],\n              [120.133272, 23.000625],\n              [120.029795, 23.048544],\n              [120.018708, 23.073322],\n              [120.081534, 23.291728],\n              [120.108019, 23.341191],\n              [120.12157, 23.504836],\n              [120.095084, 23.58768],\n              [120.102476, 23.701162],\n              [120.175156, 23.807427],\n              [120.245989, 23.840276],\n              [120.278018, 23.92783],\n              [120.316206, 23.984708],\n              [120.391967, 24.118055],\n              [120.451713, 24.182493],\n              [120.470807, 24.242533],\n              [120.520698, 24.311816],\n              [120.546568, 24.370159],\n              [120.589068, 24.43229],\n              [120.642654, 24.490033],\n              [120.68885, 24.600542],\n              [120.762147, 24.658208],\n              [120.82374, 24.688118],\n              [120.89211, 24.767482],\n              [120.914899, 24.864715],\n              [120.961095, 24.940167],\n              [121.009754, 24.993878],\n              [121.024537, 25.040517],\n              [121.102145, 25.075214],\n              [121.132942, 25.078466],\n              [121.209318, 25.12724],\n              [121.319572, 25.140785],\n              [121.371926, 25.159746],\n              [121.413194, 25.238806],\n              [121.444607, 25.27074],\n              [121.53515, 25.307535],\n              [121.585041, 25.309159],\n              [121.62323, 25.29455],\n              [121.655259, 25.242054],\n              [121.700222, 25.226896],\n              [121.707613, 25.191701],\n              [121.745186, 25.161912],\n              [121.782142, 25.160287],\n              [121.841888, 25.135367],\n              [121.917033, 25.138076],\n              [121.947214, 25.031841],\n              [121.98109, 25.030757],\n              [122.012503, 25.001471],\n              [121.933047, 24.938539],\n              [121.844968, 24.836476],\n              [121.841272, 24.734329],\n              [121.86283, 24.671261],\n              [121.892395, 24.617953],\n              [121.88562, 24.529784],\n              [121.867758, 24.47914],\n              [121.82649, 24.423572],\n              [121.809243, 24.339083],\n              [121.689135, 24.174303],\n              [121.678048, 24.133895],\n              [121.643556, 24.097843],\n              [121.63986, 24.064514],\n              [121.65957, 24.007125],\n              [121.621382, 23.920718],\n              [121.587505, 23.760878],\n              [121.522832, 23.538858],\n              [121.5216, 23.483431],\n              [121.497578, 23.419744],\n              [121.479716, 23.322507],\n              [121.440296, 23.271937],\n              [121.415042, 23.196047],\n              [121.430441, 23.137175],\n              [121.409499, 23.1025],\n              [121.370695, 23.084334],\n              [121.35468, 23.00999],\n              [121.324499, 22.945526],\n              [121.276456, 22.877171],\n              [121.237652, 22.836362],\n              [121.21055, 22.770711],\n              [121.170514, 22.723247],\n              [121.078739, 22.669691],\n              [121.03316, 22.650914],\n              [121.014682, 22.584069],\n              [120.981421, 22.528248],\n              [120.914899, 22.302525],\n              [120.903197, 22.12634],\n              [120.912436, 22.086418],\n              [120.907508, 22.033171],\n              [120.86624, 21.984345],\n              [120.873016, 21.897191],\n              [120.854537, 21.883309],\n              [120.781857, 21.923843],\n              [120.743052, 21.915515],\n              [120.701784, 21.927174],\n              [120.667908, 21.983235],\n              [120.651277, 22.033171],\n              [120.661748, 22.067007],\n              [120.659285, 22.154056],\n              [120.640806, 22.241605],\n              [120.569973, 22.361757],\n              [120.517619, 22.408793],\n              [120.443706, 22.441432],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 810000,\n        name: '香港',\n        center: [114.173355, 22.320048],\n        centroid: [114.134391, 22.37737],\n        childrenNum: 18,\n        level: 'province',\n        subFeatureIndex: 32,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [114.031778, 22.503923],\n              [114.082285, 22.512216],\n              [114.095219, 22.534329],\n              [114.156813, 22.543726],\n              [114.166052, 22.559201],\n              [114.222719, 22.553122],\n              [114.232574, 22.539857],\n              [114.232574, 22.528801],\n              [114.260291, 22.547595],\n              [114.263371, 22.541515],\n              [114.263987, 22.541515],\n              [114.28924, 22.52272],\n              [114.309566, 22.497288],\n              [114.340979, 22.50337],\n              [114.2529, 22.445304],\n              [114.23319, 22.466875],\n              [114.205473, 22.449729],\n              [114.220255, 22.427603],\n              [114.278769, 22.435901],\n              [114.325581, 22.479041],\n              [114.376088, 22.436454],\n              [114.406269, 22.433688],\n              [114.406269, 22.432582],\n              [114.385327, 22.41156],\n              [114.394566, 22.361757],\n              [114.356994, 22.340171],\n              [114.323733, 22.384447],\n              [114.323733, 22.385001],\n              [114.323117, 22.385554],\n              [114.322501, 22.385554],\n              [114.283081, 22.386661],\n              [114.278153, 22.328546],\n              [114.315726, 22.299756],\n              [114.315726, 22.299203],\n              [114.313262, 22.264315],\n              [114.284929, 22.263761],\n              [114.262139, 22.294773],\n              [114.248588, 22.274837],\n              [114.265835, 22.200608],\n              [114.203009, 22.206703],\n              [114.200545, 22.232188],\n              [114.164821, 22.226648],\n              [114.120473, 22.272068],\n              [114.145726, 22.300864],\n              [114.121089, 22.320795],\n              [114.069966, 22.326885],\n              [114.034857, 22.300864],\n              [114.029314, 22.262653],\n              [114.004676, 22.239389],\n              [114.026234, 22.229418],\n              [113.996669, 22.206149],\n              [113.981271, 22.229972],\n              [113.935691, 22.205041],\n              [113.899351, 22.215568],\n              [113.852539, 22.191188],\n              [113.8433, 22.229418],\n              [113.889496, 22.271514],\n              [113.898119, 22.308615],\n              [113.969568, 22.321349],\n              [113.955401, 22.298649],\n              [114.026234, 22.34792],\n              [113.980039, 22.366185],\n              [113.941235, 22.355116],\n              [113.920293, 22.367845],\n              [113.918445, 22.418199],\n              [113.977575, 22.45692],\n              [114.000981, 22.491206],\n              [114.031778, 22.503923],\n            ],\n          ],\n          [\n            [\n              [114.142647, 22.213906],\n              [114.166668, 22.205041],\n              [114.154965, 22.177888],\n              [114.120473, 22.177888],\n              [114.123553, 22.238836],\n              [114.142647, 22.213906],\n            ],\n          ],\n          [\n            [\n              [114.305871, 22.372273],\n              [114.305255, 22.372826],\n              [114.332972, 22.353455],\n              [114.313878, 22.340724],\n              [114.305871, 22.372273],\n            ],\n          ],\n          [\n            [\n              [114.320037, 22.381127],\n              [114.320037, 22.38168],\n              [114.319421, 22.382234],\n              [114.322501, 22.385554],\n              [114.323117, 22.385554],\n              [114.323733, 22.385001],\n              [114.323733, 22.384447],\n              [114.320037, 22.381127],\n            ],\n          ],\n          [\n            [\n              [114.305871, 22.369506],\n              [114.305255, 22.372826],\n              [114.305871, 22.372273],\n              [114.305871, 22.369506],\n            ],\n          ],\n          [\n            [\n              [114.315726, 22.299203],\n              [114.315726, 22.299756],\n              [114.316342, 22.30031],\n              [114.316958, 22.298649],\n              [114.315726, 22.299203],\n            ],\n          ],\n          [\n            [\n              [114.319421, 22.382234],\n              [114.320037, 22.38168],\n              [114.320037, 22.381127],\n              [114.319421, 22.382234],\n            ],\n          ],\n          [\n            [\n              [114.372392, 22.32301],\n              [114.372392, 22.323564],\n              [114.373008, 22.323564],\n              [114.372392, 22.32301],\n            ],\n          ],\n          [\n            [\n              [114.323733, 22.297541],\n              [114.323733, 22.298095],\n              [114.324349, 22.297541],\n              [114.323733, 22.297541],\n            ],\n          ],\n        ],\n      },\n    },\n    {\n      type: 'Feature',\n      properties: {\n        adcode: 820000,\n        name: '澳门',\n        center: [113.54909, 22.198951],\n        centroid: [113.566988, 22.159307],\n        childrenNum: 8,\n        level: 'province',\n        subFeatureIndex: 33,\n        acroutes: [100000],\n      },\n      geometry: {\n        type: 'MultiPolygon',\n        coordinates: [\n          [\n            [\n              [113.554425, 22.107489],\n              [113.554425, 22.142416],\n              [113.534715, 22.174009],\n              [113.53841, 22.209473],\n              [113.558736, 22.212244],\n              [113.575983, 22.194513],\n              [113.6037, 22.132438],\n              [113.554425, 22.107489],\n            ],\n          ],\n          [\n            [\n              [113.586453, 22.201162],\n              [113.575983, 22.194513],\n              [113.575983, 22.201162],\n              [113.586453, 22.201162],\n            ],\n          ],\n        ],\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "packages/lego-map/src/basic/index.md",
    "content": "---\ntitle: 基础地图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 地图\n  order: 1\n---\n\n# 基本地图\n\n## API\n\n| 属性      | 必填    | 说明             | 类型                                     | 默认值  |\n| --------- | ------- | ---------------- | ---------------------------------------- | ------- |\n| mapName   | `false` | 地图名字         | `string`                                 | `china` |\n| mapJson   | `false` | 地图 json 数据   | `string`                                 |         |\n| top       | `false` | 和顶部的距离     | `number`                                 | `40`    |\n| zoom      | `false` | 地图缩放         | `number`                                 | `1`     |\n| showLabel | `false` | 显示地名         | `boolean`                                | `false` |\n| labelSize | `false` | 地名字体大小     | `number`                                 | `16`    |\n| silent    | `false` | 是否禁用图表交互 | `boolean`                                | `false` |\n| config    | `false` | 图表配置         | `Partial<EChartsOption>`                 |         |\n| style     | `false` | 自定义样式       | `CSSProperties`                          |         |\n| onEvents  | `false` | 自定义事件       | `Record<string, (params?: any) => void>` |         |\n\n## 默认效果\n\n<code src=\"../../example/BasicMapDemo/demo1.tsx\" background=\"#040727\">\n\n## 地图放大 1.2 倍\n\n<code src=\"../../example/BasicMapDemo/demo7.tsx\" background=\"#040727\">\n\n## 自定义地图\n\n<code src=\"../../example/BasicMapDemo/demo2.tsx\" background=\"#040727\">\n\n## 不显示地名\n\n<code src=\"../../example/BasicMapDemo/demo3.tsx\" background=\"#040727\">\n\n## 禁用地图交互\n\n<code src=\"../../example/BasicMapDemo/demo4.tsx\" background=\"#040727\">\n\n## 自定义地图配置\n\n<code src=\"../../example/BasicMapDemo/demo5.tsx\" background=\"#040727\">\n\n## 切换地图\n\n<code src=\"../../example/BasicMapDemo/demo6.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego-map/src/basic/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useEffect, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport type { EChartsOption, SeriesOption } from 'echarts';\nimport ReactEcharts from 'echarts-for-react';\nimport { isArray, merge } from 'lodash-es';\n\nimport chinaMapJson from '../assets/china';\nimport { generate4MapLayers } from '../utils/baseSeries';\nimport { INITIAL_MAP_NAME } from '../utils/constant';\n\ninterface BasicMapProps {\n  /** 地图名称 */\n  mapName?: string;\n  /** 图表geoJson数据 */\n  mapJson?: any;\n  /** 顶部偏移量 */\n  top?: number;\n  /** 地图缩放 */\n  zoom?: number;\n  /** 显示地名 */\n  showLabel?: boolean;\n  /** 地名字体大小 */\n  labelSize?: number;\n  /** 是否禁用图表交互 */\n  silent?: boolean;\n  /** 图表配置 */\n  config?: Partial<EChartsOption>;\n  /** 图表样式 */\n  style?: CSSProperties;\n  /** 图表事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n}\n\nconst BasicMap = forwardRef<ReactEcharts, BasicMapProps>(\n  (\n    {\n      mapName = INITIAL_MAP_NAME,\n      mapJson = chinaMapJson,\n      top = 40,\n      zoom = 1,\n      showLabel = true,\n      labelSize,\n      style,\n      silent = false,\n      onEvents,\n      config = {},\n    },\n    ref\n  ) => {\n    const [loading, setLoading] = useState(true);\n    const [option, setOption] = useState<any>(config);\n\n    // 注册地图\n    useEffect(() => {\n      echarts.registerMap(mapName, mapJson);\n      new Array(4).fill('').forEach((_, i) => {\n        echarts.registerMap(`${mapName}${i}`, mapJson);\n      });\n      const { series, ...restConfig } = config;\n      const configSeries = isArray(series) ? series : [series].filter(Boolean);\n      setOption(\n        merge(\n          {\n            backgroundColor: '',\n            tooltip: {\n              trigger: 'item',\n            },\n            geo: {\n              map: mapName,\n              aspectScale: 0.75,\n              zoom,\n              top,\n              roam: false,\n              silent: true,\n              itemStyle: {\n                borderColor: '#697899',\n                borderWidth: 1,\n                areaColor: '#103682',\n                shadowColor: 'RGBA(75, 192, 255, 0.6)',\n                shadowOffsetX: 6,\n                shadowOffsetY: 5,\n                shadowBlur: 20,\n              },\n              regions: [\n                {\n                  name: '南海诸岛',\n                  itemStyle: {\n                    areaColor: '#103682',\n                    borderColor: 'RGBA(75, 192, 255, 0.6)',\n                  },\n                  label: {\n                    show: true,\n                    color: '#fff',\n                  },\n                },\n              ],\n            },\n            series: [\n              ...generate4MapLayers(mapName, top, zoom, showLabel, labelSize, silent),\n              ...(configSeries as SeriesOption[]),\n            ],\n          },\n          restConfig\n        )\n      );\n      setLoading(false);\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [labelSize, mapJson, mapName, showLabel, silent, top, JSON.stringify(config)]);\n\n    return (\n      <ReactEcharts\n        ref={ref}\n        showLoading={loading}\n        echarts={echarts}\n        option={option}\n        onEvents={onEvents}\n        style={style}\n      />\n    );\n  }\n);\n\nexport default BasicMap;\n"
  },
  {
    "path": "packages/lego-map/src/drill/index.less",
    "content": "@prefix: .td-lego-map;\n\n@{prefix}-container {\n  position: relative;\n}\n@{prefix}-return-btn {\n  position: absolute;\n  top: 2px;\n  left: 10px;\n  z-index: 100;\n  color: #24afff;\n  font-size: 22px;\n  cursor: pointer;\n}\n"
  },
  {
    "path": "packages/lego-map/src/drill/index.md",
    "content": "---\ntitle: 下钻地图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 地图\n  order: 2\n---\n\n# 下钻地图\n\n地图下钻功能依赖于高德地图提供的 API，所以在使用前请前往[高德地图开放平台](https://lbs.amap.com/)申请。要新建两个 key, 一个是 Web 端（JS API），另一个是 Web 服务端。\n\n然后在项目中使用：\n\n- 如果你是 umi 项目，请在 umi 项目的配置文件（.umirc.ts 或者 config/index.ts）中配置：\n\n```js\nexport default {\n  // ... 其他配置\n  define: {\n    AMAP_DRILL_SERVER_KEY: '你申请的Web服务端的key',\n    AMAP_DRILL_JS_KEY: '你申请的Web JS API的key',\n    AMAP_DRILL_JS_SECRET: '你申请的Web JS API的secret',\n  },\n};\n```\n\n- 如果你是 webpack 项目，请在 webpack 配置文件中配置：\n\n```js\nnew webpack.DefinePlugin({\n  AMAP_DRILL_SERVER_KEY: '你申请的Web服务端的key',\n  AMAP_DRILL_JS_KEY: '你申请的Web JS API的key',\n  AMAP_DRILL_JS_SECRET: '你申请的Web JS API的secret',\n});\n```\n\n如果是 ts 项目的话，还需要在你的项目的.d.ts 文件进行配置：\n\n```ts\ndeclare const AMAP_DRILL_SERVER_KEY: string;\ndeclare const AMAP_DRILL_JS_KEY: string;\ndeclare const AMAP_DRILL_JS_SECRET: string;\n```\n\n## API\n\n| 属性        | 必填    | 说明               | 类型                                     | 默认值   |\n| ----------- | ------- | ------------------ | ---------------------------------------- | -------- |\n| adcode      | `false` | 地图行政区划 code  | `string`                                 | `100000` |\n| top         | `false` | 和顶部的距离       | `number`                                 | `40`     |\n| zoom        | `false` | 地图缩放           | `number`                                 | `1`      |\n| showLabel   | `false` | 显示地名           | `boolean`                                | `false`  |\n| labelSize   | `false` | 地名字体大小       | `number`                                 | `16`     |\n| silent      | `false` | 是否禁用图表交互   | `boolean`                                | `false`  |\n| simple      | `false` | 是否以简单地图展示 | `boolean`                                | `false`  |\n| enableDrill | `false` | 允许下钻           | `boolean`                                | `true`   |\n| config      | `false` | 图表配置           | `Partial<EChartsOption>`                 |          |\n| style       | `false` | 自定义样式         | `CSSProperties`                          |          |\n| onEvents    | `false` | 自定义事件         | `Record<string, (params?: any) => void>` |          |\n\n## 默认效果\n\n<!-- <code src=\"../../example/DrillMapDemo/demo1.tsx\" background=\"#040727\"> -->\n\n## 禁用下钻\n\n<!-- <code src=\"../../example/DrillMapDemo/demo2.tsx\" background=\"#040727\"> -->\n\n## 初始地图为四川省\n\n<!-- <code src=\"../../example/DrillMapDemo/demo3.tsx\" background=\"#040727\"> -->\n\n## 初始地图为四川省 (简单地图)\n\n<!-- <code src=\"../../example/DrillMapDemo/demo4.tsx\" background=\"#040727\"> -->\n\n## 地图放大 1.2 倍\n\n<!-- <code src=\"../../example/DrillMapDemo/demo5.tsx\" background=\"#040727\"> -->\n"
  },
  {
    "path": "packages/lego-map/src/drill/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport type { EChartsOption, SeriesOption } from 'echarts';\nimport ReactEcharts from 'echarts-for-react';\nimport { isArray, merge } from 'lodash-es';\n\nimport { DistrictInfo, formatAdcode, register } from '../utils';\nimport { generate4MapLayers, generateMapLayer } from '../utils/baseSeries';\nimport { genAmapAdcodeUrl, INITIAL_ADCODE } from '../utils/constant';\nimport './index.less';\n\ninterface DrillMapProps {\n  /** 初始化地图行政区号，默认为100000表示中国 */\n  adcode?: string;\n  /** 顶部偏移量 */\n  top?: number;\n  /** 地图缩放 */\n  zoom?: number;\n  /** 显示地名 */\n  showLabel?: boolean;\n  /** 地名字体大小 */\n  labelSize?: number;\n  /** 是否禁用图表交互 */\n  silent?: boolean;\n  /** 是否简单地图 */\n  simple?: boolean;\n  /** 允许下钻 */\n  enableDrill?: boolean;\n  /** 图表配置 */\n  config?: Partial<EChartsOption>;\n  /** 图表样式 */\n  style?: CSSProperties;\n  /** 图表事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n}\n\nconst DrillMap = forwardRef<ReactEcharts, DrillMapProps>(\n  (\n    {\n      onEvents = {},\n      config = {},\n      adcode = INITIAL_ADCODE,\n      top = 40,\n      zoom = 1,\n      enableDrill = true,\n      showLabel = true,\n      labelSize,\n      style,\n      silent = false,\n      simple = false,\n    },\n    ref\n  ) => {\n    const regions = useRef<DistrictInfo[]>([]);\n    const [option, setOption] = useState<EChartsOption>({});\n    const [selectedArea, setSelectedArea] = useState<DistrictInfo>();\n\n    /** 调用高德地图API请求地区编码数据 */\n    useEffect(() => {\n      (async () => {\n        const url = genAmapAdcodeUrl(adcode);\n        const result = await fetch(url, {\n          method: 'GET',\n        });\n        const res = await result.json();\n        if (res && res.status === '1' && res.info === 'OK') {\n          const _regions = formatAdcode(res.districts, adcode);\n          regions.current = _regions;\n\n          const currentArea = _regions.find(item => item.adcode === adcode);\n          if (!currentArea) return;\n\n          await register(currentArea.name, currentArea.adcode);\n          setOption(createOption(currentArea));\n        }\n      })();\n    }, [adcode]);\n\n    const createOption = (selectedArea: DistrictInfo) => {\n      const { series, ...restConfig } = config;\n      const configSeries = isArray(series) ? series : [series].filter(Boolean);\n\n      const mapName = selectedArea.adcode === INITIAL_ADCODE ? 'china' : selectedArea.name;\n      const mapConfig: any = {\n        backgroundColor: '',\n        tooltip: {\n          trigger: 'item',\n        },\n        geo: {\n          show: mapName === 'china' ? true : false,\n          map: 'china',\n          aspectScale: 0.75,\n          roam: false,\n          silent: true,\n          top,\n          zoom,\n          itemStyle: {\n            borderColor: '#697899',\n            borderWidth: 1,\n            areaColor: '#103682',\n            shadowColor: 'RGBA(75, 192, 255, 0.6)',\n            shadowOffsetX: 6,\n            shadowOffsetY: 5,\n            shadowBlur: 20,\n          },\n          regions: [\n            {\n              name: '南海诸岛',\n              itemStyle: {\n                areaColor: '#103682',\n                borderColor: 'RGBA(75, 192, 255, 0.6)',\n              },\n              label: {\n                show: true,\n                color: '#fff',\n              },\n            },\n          ],\n        },\n        series: [\n          ...(simple\n            ? generateMapLayer(mapName, top, zoom, showLabel, labelSize, silent)\n            : generate4MapLayers(mapName, top, zoom, showLabel, labelSize, silent)),\n          ...(configSeries as SeriesOption[]),\n        ],\n      };\n      return merge(mapConfig, restConfig);\n    };\n\n    /** 返回上级地图 */\n    const goBack = useCallback(async () => {\n      if (!selectedArea) return;\n\n      const currentArea = regions.current.find(item => item.adcode === selectedArea.adcode);\n      const parentArea = regions.current.find(item => item.adcode === currentArea!.parent);\n\n      if (parentArea) {\n        await register(parentArea.name, parentArea.adcode);\n        setOption(createOption(parentArea));\n        setSelectedArea(parentArea);\n      }\n    }, [selectedArea]);\n\n    /** 地图下钻 */\n    const handleDrill = useCallback(\n      async (params: any) => {\n        if (!enableDrill) return;\n\n        // 根据 name，找到对应的地图\n        const { name } = params;\n        // 首先需要根据 name 转换成对应的 adCode\n        const area = regions.current?.find(item => item.name === name);\n\n        // 判断 area 的 level\n        if (area?.level === 'district' || area?.level === 'country') return;\n\n        if (area) {\n          await register(area.name, area.adcode);\n          setOption(createOption(area));\n          setSelectedArea(area);\n        }\n      },\n      [enableDrill]\n    );\n\n    const events = useMemo(() => {\n      if (!enableDrill) return onEvents;\n\n      return {\n        ...onEvents,\n        click: handleDrill,\n      };\n    }, [enableDrill, onEvents, handleDrill]);\n\n    return (\n      <div className=\"td-lego-map-container\">\n        {selectedArea?.adcode && selectedArea.adcode !== adcode && selectedArea.level !== 'country' && (\n          <div className=\"td-lego-map-return-btn\" onClick={goBack}>\n            {'< 返回上级'}\n          </div>\n        )}\n        <ReactEcharts ref={ref} echarts={echarts} option={option} onEvents={events} style={style} />\n      </div>\n    );\n  }\n);\n\nexport default DrillMap;\n"
  },
  {
    "path": "packages/lego-map/src/index.ts",
    "content": "import { default as BasicMap } from './basic';\nimport { default as DrillMap } from './drill';\nimport { default as SimpleMap } from './simple';\n\nexport { BasicMap, DrillMap, SimpleMap };\n"
  },
  {
    "path": "packages/lego-map/src/simple/index.md",
    "content": "---\ntitle: 简单地图\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 地图\n  order: 1\n---\n\n# 简单地图\n\n## API\n\n| 属性      | 必填    | 说明             | 类型                                     | 默认值  |\n| --------- | ------- | ---------------- | ---------------------------------------- | ------- |\n| mapName   | `false` | 地图名字         | `string`                                 | `china` |\n| mapJson   | `false` | 地图 json 数据   | `string`                                 |         |\n| top       | `false` | 和顶部的距离     | `number`                                 | `40`    |\n| zoom      | `false` | 地图缩放         | `number`                                 | `1`     |\n| showLabel | `false` | 显示地名         | `boolean`                                | `false` |\n| labelSize | `false` | 地名字体大小     | `number`                                 | `16`    |\n| silent    | `false` | 是否禁用图表交互 | `boolean`                                | `false` |\n| config    | `false` | 图表配置         | `Partial<EChartsOption>`                 |         |\n| style     | `false` | 自定义样式       | `CSSProperties`                          |         |\n| onEvents  | `false` | 自定义事件       | `Record<string, (params?: any) => void>` |         |\n\n## 默认效果\n\n<code src=\"../../example/SimpleMapDemo/demo1.tsx\" background=\"#040727\">\n\n## 自定义地图\n\n<code src=\"../../example/SimpleMapDemo/demo2.tsx\" background=\"#040727\">\n\n## 不显示地名\n\n<code src=\"../../example/SimpleMapDemo/demo3.tsx\" background=\"#040727\">\n\n## 禁用地图交互\n\n<code src=\"../../example/SimpleMapDemo/demo4.tsx\" background=\"#040727\">\n\n## 自定义地图配置\n\n<code src=\"../../example/SimpleMapDemo/demo5.tsx\" background=\"#040727\">\n\n## 地图放大 1.2 倍\n\n<code src=\"../../example/SimpleMapDemo/demo6.tsx\" background=\"#040727\">\n"
  },
  {
    "path": "packages/lego-map/src/simple/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useEffect, useState } from 'react';\n\nimport * as echarts from 'echarts/core';\nimport type { EChartsOption, SeriesOption } from 'echarts';\nimport ReactEcharts from 'echarts-for-react';\nimport { isArray, merge } from 'lodash-es';\n\nimport chinaMapJson from '../assets/china';\nimport { generateMapLayer } from '../utils/baseSeries';\nimport { INITIAL_MAP_NAME } from '../utils/constant';\n\ninterface SimpleMapProps {\n  /** 地图名称 */\n  mapName?: string;\n  /** 图表geoJson数据 */\n  mapJson?: any;\n  /** 顶部偏移量 */\n  top?: number;\n  /** 地图缩放 */\n  zoom?: number;\n  /** 显示地名 */\n  showLabel?: boolean;\n  /** 地名字体大小 */\n  labelSize?: number;\n  /** 是否禁用图表交互 */\n  silent?: boolean;\n  /** 图表配置 */\n  config?: Partial<EChartsOption>;\n  /** 图表样式 */\n  style?: CSSProperties;\n  /** 图表事件 */\n  onEvents?: Record<string, (params?: any) => void>;\n}\n\nconst SimpleMap = forwardRef<ReactEcharts, SimpleMapProps>(\n  (\n    {\n      mapName = INITIAL_MAP_NAME,\n      mapJson = chinaMapJson,\n      top = 40,\n      zoom = 1,\n      showLabel = true,\n      labelSize,\n      style,\n      silent = false,\n      onEvents,\n      config = {},\n    },\n    ref\n  ) => {\n    const [loading, setLoading] = useState(true);\n    const [option, setOption] = useState<any>(config);\n\n    // 注册地图\n    useEffect(() => {\n      echarts.registerMap(mapName, mapJson);\n\n      const { series, ...restConfig } = config;\n      const configSeries = isArray(series) ? series : [series].filter(Boolean);\n      setOption(\n        merge(\n          {\n            backgroundColor: '',\n            tooltip: {\n              trigger: 'item',\n            },\n            geo: {\n              map: mapName,\n              roam: false,\n              silent: true,\n              top,\n              zoom,\n              regions: [\n                {\n                  name: '南海诸岛',\n                  itemStyle: {\n                    areaColor: '#103682',\n                    borderColor: 'RGBA(75, 192, 255, 0.6)',\n                  },\n                  label: {\n                    show: true,\n                    color: '#fff',\n                  },\n                },\n              ],\n            },\n            series: [\n              ...generateMapLayer(mapName, top, zoom, showLabel, labelSize, silent),\n              ...(configSeries as SeriesOption[]),\n            ],\n          },\n          restConfig\n        )\n      );\n\n      setLoading(false);\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [JSON.stringify(config), labelSize, mapJson, mapName, showLabel, silent, top]);\n\n    return (\n      <ReactEcharts\n        ref={ref}\n        echarts={echarts}\n        showLoading={loading}\n        option={option}\n        onEvents={onEvents}\n        style={style}\n      />\n    );\n  }\n);\n\nexport default SimpleMap;\n"
  },
  {
    "path": "packages/lego-map/src/utils/baseSeries.ts",
    "content": "import { defaultBg } from '../assets/bgImage';\n\nexport const pvTop = 105;\nexport const INITIAL_ZOOM = 1.2;\n\n/**\n * 默认四层地图叠加实现立体效果\n */\nexport const generate4MapLayers = (\n  mapName: string,\n  top = 20,\n  zoom = 1,\n  showLabel = true,\n  labelSize = 14,\n  silent = false,\n  imgBase64 = defaultBg\n) => {\n  const bgImage = new Image();\n  bgImage.src = imgBase64;\n\n  return [\n    {\n      type: 'map',\n      zoom,\n      top: top - 2,\n      roam: false,\n      silent: true,\n      geoIndex: 0,\n      map: `${mapName}0`,\n      itemStyle: {\n        borderColor: '#4570C6',\n        borderWidth: 1,\n        areaColor: '#1645a3',\n      },\n    },\n    {\n      type: 'map',\n      zoom,\n      top: top - 4,\n      roam: false,\n      silent: true,\n      map: `${mapName}1`,\n      itemStyle: {\n        borderColor: '#a2a2b2',\n        borderWidth: 2,\n        areaColor: '#1246ad',\n        shadowColor: '#1B4EB8',\n        shadowOffsetX: -2,\n        shadowOffsetY: -5,\n        shadowBlur: 8,\n      },\n    },\n    {\n      type: 'map',\n      zoom,\n      roam: false,\n      top: top - 6,\n      silent: true,\n      map: `${mapName}2`,\n      itemStyle: {\n        borderColor: '#cbcbdc',\n        borderWidth: 3,\n        areaColor: '#103682',\n        shadowColor: '#1B4EB8',\n        shadowOffsetX: -2,\n        shadowOffsetY: -5,\n        shadowBlur: 8,\n      },\n    },\n    {\n      type: 'map',\n      zoom,\n      silent,\n      roam: false,\n      top: top - 8,\n      map: `${mapName}3`,\n      label: {\n        show: showLabel,\n        color: '#fff',\n        fontSize: labelSize,\n      },\n      tooltip: {\n        show: false,\n      },\n      itemStyle: {\n        areaColor: {\n          image: bgImage,\n          repeat: 'repeat',\n        },\n        shadowColor: '#1B4EB8',\n        shadowOffsetX: -2,\n        shadowOffsetY: -5,\n        shadowBlur: 8,\n        borderColor: '#fff',\n        borderWidth: 1,\n      },\n      select: {\n        label: { show: true, color: '#fff' },\n        itemStyle: {\n          areaColor: '#49e7db',\n          opacity: 0.6,\n          borderWidth: 2,\n          borderColor: '#16fff1',\n        },\n      },\n      emphasis: {\n        label: { show: true, color: '#fff' },\n        itemStyle: {\n          areaColor: '#49e7db',\n          opacity: 0.6,\n          borderWidth: 2,\n          borderColor: '#16fff1',\n        },\n      },\n    },\n  ];\n};\n\n/**\n * 单层地图\n */\nexport const generateMapLayer = (\n  mapName: string,\n  top: number,\n  zoom: number,\n  showLabel = true,\n  labelSize = 14,\n  silent = false,\n  imgBase64 = defaultBg\n) => {\n  const bgImage = new Image();\n  bgImage.src = imgBase64;\n\n  return [\n    {\n      type: 'map',\n      silent,\n      roam: false,\n      top,\n      zoom,\n      map: mapName,\n      label: {\n        show: showLabel,\n        color: '#fff',\n        fontSize: labelSize,\n      },\n      tooltip: {\n        show: false,\n      },\n      itemStyle: {\n        areaColor: {\n          image: bgImage,\n          repeat: 'repeat',\n        },\n        shadowColor: '#1B4EB8',\n        shadowOffsetX: -2,\n        shadowOffsetY: -5,\n        shadowBlur: 8,\n        borderColor: '#fff',\n        borderWidth: 1,\n      },\n      select: {\n        label: { show: true, color: '#fff' },\n        itemStyle: {\n          areaColor: '#49e7db',\n          opacity: 0.6,\n          borderWidth: 2,\n          borderColor: '#16fff1',\n        },\n      },\n      emphasis: {\n        label: { show: true, color: '#fff' },\n        itemStyle: {\n          areaColor: '#49e7db',\n          opacity: 0.6,\n          borderWidth: 2,\n          borderColor: '#16fff1',\n        },\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/lego-map/src/utils/constant.ts",
    "content": "/** 初始化地图名称 */\nexport const INITIAL_MAP_NAME = 'china';\n\n/** 初始化行政区号 */\nexport const INITIAL_ADCODE = '100000';\n\nexport const genAmapAdcodeUrl = (adcode = INITIAL_ADCODE) =>\n  `https://restapi.amap.com/v3/config/district?keywords=${adcode}&subdistrict=3&extensions=base&key=${AMAP_DRILL_SERVER_KEY}`;\n"
  },
  {
    "path": "packages/lego-map/src/utils/index.ts",
    "content": "import * as echarts from 'echarts/core';\nimport AMapLoader from '@amap/amap-jsapi-loader';\n\nimport chinaJson from '../assets/china';\nimport { INITIAL_ADCODE } from './constant';\n\ninterface AMapDistrict {\n  adcode: string;\n  name: string;\n  level: 'country' | 'province' | 'city' | 'district';\n  districts: AMapDistrict[];\n}\n\nexport type DistrictInfo = Pick<AMapDistrict, 'adcode' | 'level' | 'name'> & {\n  parent: string;\n};\n\n/**\n * 对高德地图返回的省市区数据进行打平处理，方便后期根据地区名字查询地区编码\n * @param districts\n */\nexport function formatAdcode(districts: AMapDistrict[], adcode: string) {\n  const pcd: DistrictInfo[] = [];\n\n  function _format(districts: AMapDistrict[], adcode: string) {\n    districts.forEach(d => {\n      pcd.push({\n        parent: adcode,\n        adcode: d.adcode,\n        level: d.level,\n        name: d.name,\n      });\n      if (d.districts) {\n        _format(d.districts, d.adcode);\n      }\n    });\n  }\n\n  _format(districts, adcode);\n\n  return pcd;\n}\n\n// 缓存地图数据\nconst memoizedMaps = {};\n\nexport async function register(mapName: string, adcode: string) {\n  if (adcode === INITIAL_ADCODE) {\n    return new Promise(resolve => {\n      echarts.registerMap('china', chinaJson as any);\n      new Array(4).fill('').forEach((_, i) => {\n        echarts.registerMap(`china${i}`, chinaJson as any);\n      });\n      resolve(true);\n    });\n  } else {\n    const mapJson = memoizedMaps[mapName];\n    if (mapJson) {\n      return new Promise(resolve => {\n        echarts.registerMap(mapName, mapJson);\n        new Array(4).fill('').forEach((_, i) => {\n          echarts.registerMap(`${mapName}${i}`, mapJson);\n        });\n\n        resolve(true);\n      });\n    } else {\n      // @ts-ignore\n      if (!window._AMapSecurityConfig) {\n        // @ts-ignore\n        window._AMapSecurityConfig = {\n          securityJsCode: AMAP_DRILL_JS_SECRET,\n        };\n      }\n      await AMapLoader.load({\n        key: AMAP_DRILL_JS_KEY,\n        version: '2.0',\n        AMapUI: {\n          plugins: ['geo/DistrictExplorer'], // 这是关键插件\n        },\n      });\n      await loadUI(mapName, adcode);\n    }\n  }\n}\n\nfunction loadUI(mapName: string, adcode: string) {\n  return new Promise((resolve, reject) => {\n    // @ts-ignore\n    window.AMapUI.loadUI(['geo/DistrictExplorer'], (DistrictExplorer: any) => {\n      const districtExplorer = new DistrictExplorer();\n      districtExplorer.loadAreaNode(adcode, (error: Error, areaNode: any) => {\n        if (error) {\n          reject(error);\n        }\n        const features = areaNode.getSubFeatures(); // 获取Features\n        const geoJson = {\n          type: 'FeatureCollection',\n          features,\n        } as any;\n\n        memoizedMaps[mapName] = geoJson;\n        echarts.registerMap(mapName, geoJson);\n        new Array(4).fill('').forEach((_, i) => {\n          echarts.registerMap(`${mapName}${i}`, geoJson);\n        });\n\n        resolve(true);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "packages/lego-map/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"lib\": [\"dom\", \"ESNext\"],\n    \"moduleResolution\": \"node\",\n    \"jsx\": \"react\",\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"downlevelIteration\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": false,\n    \"strictNullChecks\": true,\n    \"baseUrl\": \".\"\n  },\n  \"exclude\": [\"node_modules\", \"lib\", \"es\", \"dist\", \"**/index.test.ts\", \"**/demo\", \"coverage\", \"**/*.js\", \"example\"]\n}\n"
  },
  {
    "path": "packages/lego-map/typings.d.ts",
    "content": "declare module '*.css';\ndeclare module '*.less';\ndeclare module '*.png';\ndeclare module '*.webp';\ndeclare module '*.svg';\n\ndeclare const AMAP_DRILL_SERVER_KEY: string;\ndeclare const AMAP_DRILL_JS_KEY: string;\ndeclare const AMAP_DRILL_JS_SECRET: string;\n\ndeclare interface Window {\n  echarts: any;\n}\n"
  },
  {
    "path": "packages/lego-video/CHANGELOG.md",
    "content": "# @td-design/lego-video\n\n## 1.1.1\n\n### Patch Changes\n\n- [`e749c01a6`](https://github.com/thundersdata-frontend/td-design/commit/e749c01a6daa53c1171104b30b720dc3625ce1f9) - 去除一些使用 useMemo 的过度优化场景\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo1.tsx",
    "content": "import React from 'react';\nimport Video from '@td-design/lego-video';\n\nexport default () => {\n  return (\n    <Video\n      id=\"demo1\"\n      videoUrls={[\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n      ]}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo2.tsx",
    "content": "import React from 'react';\nimport Video from '@td-design/lego-video';\n\nexport default () => {\n  return (\n    <Video\n      id=\"demo2\"\n      videoUrls={[\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n      ]}\n      width={300}\n      height={150}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo3.tsx",
    "content": "import React from 'react';\nimport Video from '@td-design/lego-video';\n\nexport default () => {\n  return (\n    <Video\n      id=\"demo3\"\n      videoUrls={[\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n      ]}\n      enableMemory\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo4.tsx",
    "content": "import React from 'react';\nimport Video from '@td-design/lego-video';\n\nexport default () => {\n  return (\n    <Video\n      id=\"demo4\"\n      videoUrls={[\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n      ]}\n      autoplay\n      muted\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo5.tsx",
    "content": "import React from 'react';\nimport Video from '@td-design/lego-video';\n\nexport default () => {\n  return (\n    <Video\n      id=\"demo5\"\n      videoUrls={[\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n      ]}\n      isLoop={false}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo6.tsx",
    "content": "import React, { useState, useCallback } from 'react';\nimport Video from '@td-design/lego-video';\nimport { Button } from 'antd';\n\nexport default () => {\n  const [currentIndex, setCurrentIndex] = useState<number>(0);\n  return (\n    <div>\n      <Video\n        id=\"demo6\"\n        currentIndex={currentIndex}\n        setCurrentIndex={setCurrentIndex}\n        videoUrls={[\n          'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n          'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n        ]}\n      />\n      <div style={{ marginTop: 8 }}>\n        <Button type=\"primary\" style={{ marginRight: 8 }} onClick={() => setCurrentIndex(0)}>\n          第一集\n        </Button>\n        <Button type=\"primary\" onClick={() => setCurrentIndex(1)}>\n          第二集\n        </Button>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo7.tsx",
    "content": "import React, { useState, useEffect } from 'react';\nimport Video from '@td-design/lego-video';\nimport { Button, Modal } from 'antd';\n\nexport default () => {\n  const [visible, setVisible] = useState<boolean>(false);\n  return (\n    <div>\n      <Button type=\"primary\" onClick={() => setVisible(true)}>\n        显示弹窗\n      </Button>\n      <Modal visible={visible} onCancel={() => setVisible(false)} width={600}>\n        <Video\n          id=\"demo7\"\n          visible={visible}\n          autoplay\n          videoUrls={[\n            'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n            'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n          ]}\n          width={500}\n        />\n      </Modal>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo8.tsx",
    "content": "import React from 'react';\nimport Video from '@td-design/lego-video';\n\nexport default () => {\n  return (\n    <Video\n      id=\"demo8\"\n      videoUrls={[\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n        'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n      ]}\n      definitionList={[\n        [\n          {\n            name: '标清',\n            url: 'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n          },\n          {\n            name: '高清',\n            url: 'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n          },\n        ],\n        [\n          {\n            name: '标清',\n            url: 'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615240630670967.mov',\n          },\n          {\n            name: '高清',\n            url: 'https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1631615153504280070.m4v',\n          },\n        ],\n      ]}\n      width={500}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/lego-video/example/VideoDemo/demo9.tsx",
    "content": "import React from 'react';\nimport Video from '@td-design/lego-video';\n\nexport default () => {\n  return <Video id=\"demo9\" videoUrls={[]} />;\n};\n"
  },
  {
    "path": "packages/lego-video/package.json",
    "content": "{\n  \"name\": \"@td-design/lego-video\",\n  \"version\": \"1.1.1\",\n  \"description\": \"雷数大屏素材库-视频组件\",\n  \"keywords\": [\n    \"thundersdata\",\n    \"frontend\",\n    \"lego\",\n    \"video\"\n  ],\n  \"homepage\": \"https://github.com/thundersdata-frontend/td-design#readme\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/commonjs/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/thundersdata-frontend/td-design.git\"\n  },\n  \"scripts\": {\n    \"build\": \"rollup -c\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/thundersdata-frontend/td-design/issues\"\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\",\n  \"dependencies\": {\n    \"lodash-es\": \"^4.17.21\",\n    \"xgplayer\": \"^2.32.1\"\n  },\n  \"devDependencies\": {\n    \"@types/lodash-es\": \"^4.17.8\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-dom\": \"^18.2.7\",\n    \"typescript\": \"^5.1.6\",\n    \"@rollup/plugin-babel\": \"^6.0.3\",\n    \"@rollup/plugin-commonjs\": \"^25.0.3\",\n    \"@rollup/plugin-node-resolve\": \"^15.1.0\",\n    \"rollup\": \"^3.26.3\",\n    \"rollup-plugin-typescript2\": \"^0.35.0\",\n    \"tslib\": \"^2.6.0\"\n  }\n}"
  },
  {
    "path": "packages/lego-video/rollup.config.js",
    "content": "const commonjs = require('@rollup/plugin-commonjs');\nconst resolve = require('@rollup/plugin-node-resolve');\nconst typescript = require('rollup-plugin-typescript2')\nconst fs = require(\"fs\")\n\nconst noDeclarationFiles = { compilerOptions: { declaration: false } };\n\nlet pkg = JSON.parse(fs.readFileSync('./package.json')),\n    external = Object.keys(pkg.dependencies || {});\n\nmodule.exports = [\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/commonjs',\n      format: 'cjs',\n      name: '[name].js',\n      preserveModules: true, \n      preserveModulesRoot: 'src',\n    },\n    plugins: [\n      resolve(),\n      commonjs(),\n      typescript({tsconfig: \"tsconfig.json\",tsconfigOverride:{ compilerOptions: { declaration: true ,declarationDir:'./lib/typescript'} },useTsconfigDeclarationDir: true}),\n    ],\n    external: ['react', 'react-dom',...external,/node_modules/],\n  },\n  {\n    input: ['./src/index.ts'],\n    output: {\n      dir: 'lib/module',\n      format: 'esm',\n      entryFileNames: '[name].js',\n      preserveModules: true, \n      preserveModulesRoot: 'src',\n    },\n    plugins: [\n      resolve(),\n      commonjs({ mainFields: [\"module\", \"main\", \"jsnext:main\", \"browser\"],\n      extensions: [\".js\", \".mjs\", \".json\"],\n      sourceMap: false,\n      browser: true,}),\n      typescript({ tsconfigOverride: noDeclarationFiles}),\n    ],\n    external: ['react', 'react-dom',...external,/node_modules/],\n  }\n]\n\n\n"
  },
  {
    "path": "packages/lego-video/src/index.ts",
    "content": "import { default as Video } from './video';\n\nexport default Video;\n"
  },
  {
    "path": "packages/lego-video/src/video/index.md",
    "content": "---\ntitle: 视频\nnav:\n  title: 大屏素材库\n  path: /screen\ngroup:\n  title: 其他\n---\n\n# 视频\n\n## API (继承自 xgplayer)\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| id | `true` | 唯一 id 值 | `string` |  |\n| videoUrls | `true` | 视频路径数组 | `string[]` |  |\n| definitionList | `false` | 清晰度视频数组,顺序应与 videoUrls 保持一致 | `{name: string; url: string}[][]` |  |\n| isLoop | `false` | 是否循环播放 | `boolean` | `true` |\n| visible | `false` | 是否可见 | `boolean` | `true` |\n| muted | `false` | 是否静音播放 | `boolean` | `false` |\n| videoInit | `false` | 初始化显示首帧 | `boolean` | `true` |\n| enableMemory | `false` | 是否允许记忆播放 | `boolean` | `false` |\n| lastPlayTimeHideDelay | `false` | 记忆提示文字展示时长(s) | `number` | `5` |\n| currentIndex | `false` | 手动控制当前播放集数 | `number` |  |\n| setCurrentIndex | `false` | 控制当前播放视频 | `(currentIndex: number) => void` |  |\n| style | `false` | 自定义样式 | `CSSProperties` |  |\n| className | `false` | 自定义类名 | `string` |  |\n\n## 基本使用\n\n默认循环播放。\n\n**注：因为浏览器的限制，用户必须手动点击播放以后才能允许自动播放视频，或者设置视频为静音(muted)**\n\n<code src=\"../../example/VideoDemo/demo1.tsx\" background=\"#fff\">\n\n## 自定义设置宽高\n\n<code src=\"../../example/VideoDemo/demo2.tsx\" background=\"#fff\">\n\n## 启用记忆播放\n\n下次开始播放时可以自动跳转到对应集数和进度。\n\n<code src=\"../../example/VideoDemo/demo3.tsx\" background=\"#fff\">\n\n## 自动播放（静音）\n\n<code src=\"../../example/VideoDemo/demo4.tsx\" background=\"#fff\">\n\n## 禁用循环播放\n\n<code src=\"../../example/VideoDemo/demo5.tsx\" background=\"#fff\">\n\n## 按钮控制播放第几集\n\n<code src=\"../../example/VideoDemo/demo6.tsx\" background=\"#fff\">\n\n## 按钮点击出现视频弹窗\n\n<code src=\"../../example/VideoDemo/demo7.tsx\" background=\"#fff\">\n\n## 配置清晰度\n\n传入清晰度视频数组 definitionList,顺序应与 videoUrls 保持一致,当只有一个清晰度源的时候清晰度配置会默认隐藏。\n\n<code src=\"../../example/VideoDemo/demo8.tsx\" background=\"#fff\">\n\n## 视频数组为空\n\n<code src=\"../../example/VideoDemo/demo9.tsx\" background=\"#fff\">\n"
  },
  {
    "path": "packages/lego-video/src/video/index.tsx",
    "content": "import React, { CSSProperties, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { isEmpty } from 'lodash-es';\nimport Player, { IPlayerOptions } from 'xgplayer';\n\n// 默认速度控制\nconst DEFAULT_PLAY_BACK_RATE = [0.5, 0.75, 1, 1.5, 2];\n\n// 默认记忆提示文字展示时长(s)\nconst DEFAULT_LAST_PLAY_TIME_DELAY = 5;\n\ninterface PlayerProps extends Player {\n  currentVideoIndex?: number;\n  video?: { duration: number };\n  on: (eventName: string | symbol, listener: (...args: any[]) => void) => this;\n  off: (eventName: string | symbol, listener: (...args: any[]) => void) => this;\n  emit: (eventName: string | symbol, ...args: any[]) => boolean;\n}\n\n/** 清晰度视频项目,name 为清晰度,url 为视频源 */\nexport interface DefinitionItemProps {\n  name: string;\n  url: string;\n}\n\n/** 视频属性配置，继承 xgplayer 配置属性 */\ninterface VideoProps extends Omit<IPlayerOptions, 'url' | 'loop'> {\n  /** 唯一id值 */\n  id: string;\n  /** 视频路径数组 */\n  videoUrls: string[];\n  /** 清晰度视频数组,顺序应与 videoUrls 保持一致 */\n  definitionList?: DefinitionItemProps[][];\n  /** 是否循环播放(多视频只支持循环播放) */\n  isLoop?: boolean;\n  /** 是否可见 */\n  visible?: boolean;\n  /** 是否静音播放 */\n  muted?: boolean;\n  /** 初始化显示首帧 */\n  videoInit?: boolean;\n  /** 是否允许记忆播放 */\n  enableMemory?: boolean;\n  /** 记忆提示文字展示时长(s) */\n  lastPlayTimeHideDelay?: number;\n  /** 手动控制当前播放集数 */\n  currentIndex?: number;\n  setCurrentIndex?: (currentIndex: number) => void;\n  style?: CSSProperties;\n  className?: string;\n}\n\n// 默认音量大小\nconst DEFAULT_VOLUME = 0.6;\n\nexport default forwardRef<PlayerProps, VideoProps>(\n  (\n    {\n      id,\n      videoUrls = [],\n      definitionList = [],\n      isLoop = true,\n      muted = false,\n      currentIndex: parentIndex,\n      setCurrentIndex: setParentIndex,\n      className,\n      style,\n      visible = true,\n      autoplay = false,\n      videoInit = true,\n      enableMemory = false,\n      lastPlayTimeHideDelay = DEFAULT_LAST_PLAY_TIME_DELAY,\n      ...props\n    },\n    playerRef\n  ) => {\n    const player = useRef<PlayerProps>();\n    const [firstRender, setFirstRender] = useState<boolean>(true);\n    const [ready, setReady] = useState<boolean>(false);\n    const currentPlayerIndex = useRef<number>(0);\n    // 内置的 index 状态管理\n    const [videoIndex, setVideoIndex] = useState<number>(0);\n\n    const currentIndex = parentIndex ?? videoIndex;\n    const setCurrentIndex = setParentIndex ?? setVideoIndex;\n\n    const config = useRef<IPlayerOptions>({\n      url: videoUrls[0],\n      playbackRate: DEFAULT_PLAY_BACK_RATE, // 传入倍速可选数组\n      playNext: {\n        urlList: videoUrls.slice(1),\n      },\n      volume: muted ? 0 : DEFAULT_VOLUME,\n      autoplay,\n      videoInit,\n      lastPlayTimeHideDelay,\n      ...props,\n    });\n\n    /** 设置当前播放 index */\n    const handleSetCurrentIndex = useCallback(\n      ({ currentIdx, videoUrls }: { currentIdx?: number; videoUrls: string[] }) => {\n        let newIdx = currentIdx ?? currentPlayerIndex.current + 1;\n        if (newIdx >= videoUrls.length) {\n          newIdx = 0;\n        }\n        setCurrentIndex(newIdx);\n      },\n      [setCurrentIndex]\n    );\n\n    /** 结束事件 */\n    const onEnd = useCallback(\n      (isLoop: boolean, videoUrls: string[]) => () => {\n        // 如果是循环或有其他视频未播放完，继续播放下一个\n        if (isLoop || (!isLoop && currentPlayerIndex.current < videoUrls.length - 1)) {\n          setTimeout(() => player.current?.play());\n        }\n        handleSetCurrentIndex({ videoUrls });\n      },\n      [handleSetCurrentIndex]\n    );\n\n    /** 点击下一个事件 */\n    const onPlayNextBtnClick = useCallback(\n      (videoUrls: string[]) => () => {\n        if (player.current) {\n          // 防止 next 按钮消失\n          player.current.currentVideoIndex = videoUrls.length - 2;\n        }\n        handleSetCurrentIndex({ videoUrls });\n      },\n      [handleSetCurrentIndex]\n    );\n\n    /** 播放下一个 */\n    const handlePlayNext = useCallback(\n      (currentIdx: number, isLoop: boolean) => {\n        if (!player.current) {\n          return;\n        }\n        player.current.src = videoUrls[currentIdx];\n        player.current.emit('playerNext', currentIdx);\n        player.current.play();\n        currentPlayerIndex.current = currentIdx;\n        if (isLoop) {\n          // 防止 next 按钮消失\n          player.current.currentVideoIndex = -videoUrls.length;\n        }\n      },\n      [videoUrls]\n    );\n\n    /** 重置视频 */\n    const handleReset = useCallback(() => {\n      if (!player.current) {\n        return;\n      }\n      setCurrentIndex(0);\n      currentPlayerIndex.current = -1;\n      player.current.destroy();\n      player.current = undefined;\n    }, [setCurrentIndex]);\n\n    /** 弹窗中的视频关闭以后重置 */\n    useEffect(() => {\n      if (!visible) {\n        handleReset();\n      }\n    }, [handleReset, visible]);\n\n    /** 当 currentIndex 改变以后自动播放下一个 */\n    useEffect(() => {\n      if (!player.current || !visible) {\n        return;\n      }\n      handlePlayNext(currentIndex ?? currentPlayerIndex.current, isLoop);\n    }, [currentIndex, handlePlayNext, isLoop, visible]);\n\n    /** 播放器初始化并绑定事件 */\n    useEffect(() => {\n      if (!visible || isEmpty(videoUrls) || player.current) {\n        return;\n      }\n      const newConfig = {\n        ...config.current,\n        muted,\n        volume: muted ? 0 : DEFAULT_VOLUME,\n        autoplay,\n        videoInit,\n      };\n      setReady(false);\n      setFirstRender(false);\n      // @ts-ignore\n      player.current = new Player(newConfig);\n      player.current!.currentVideoIndex = -videoUrls.length;\n      player.current!.on('ended', onEnd(isLoop, videoUrls));\n\n      // 播放记忆缓存\n      if (enableMemory) {\n        const videoPlayedTimeObj = JSON.parse(localStorage.getItem('videoPlayedTime') || '{}');\n        player.current?.on('timeupdate', () => {\n          if (currentPlayerIndex.current === -1) {\n            return;\n          }\n          localStorage.setItem(\n            'videoPlayedTime',\n            JSON.stringify({\n              ...videoPlayedTimeObj,\n              [id]: {\n                lastPlayTime: player.current?.currentTime,\n                videoIndex: currentPlayerIndex.current,\n              },\n            })\n          );\n        });\n      }\n      player.current?.on('playNextBtnClick', onPlayNextBtnClick(videoUrls));\n    }, [\n      ready,\n      autoplay,\n      enableMemory,\n      handleSetCurrentIndex,\n      id,\n      isLoop,\n      videoUrls,\n      videoUrls.length,\n      visible,\n      muted,\n      videoInit,\n      onEnd,\n      onPlayNextBtnClick,\n    ]);\n\n    /** 读取缓存的播放记忆并跳转 */\n    useEffect(() => {\n      if (enableMemory && visible) {\n        const { lastPlayTime, videoIndex } = JSON.parse(localStorage.getItem('videoPlayedTime') || '{}')?.[id] || {};\n        setTimeout(() => {\n          handleSetCurrentIndex({ currentIdx: videoIndex, videoUrls });\n          setTimeout(() => {\n            if (player.current) {\n              player.current.currentTime = lastPlayTime;\n            }\n          });\n        });\n      }\n    }, [visible, enableMemory, handleSetCurrentIndex, id, videoUrls]);\n\n    /** 加载清晰度配置 */\n    useEffect(() => {\n      if (!isEmpty(definitionList[currentIndex]) && player.current) {\n        player.current.emit('resourceReady', definitionList[currentIndex]);\n      }\n    }, [currentIndex, definitionList]);\n\n    useEffect(() => {\n      if (firstRender) {\n        return;\n      }\n      player.current?.off('ended', onEnd(isLoop, videoUrls));\n      player.current?.off('playNextBtnClick', onPlayNextBtnClick(videoUrls));\n      player.current?.destroy();\n      player.current = undefined;\n      setReady(true);\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [muted, isLoop, videoUrls, autoplay, videoInit, onEnd, onPlayNextBtnClick]);\n\n    const getRef = useCallback(\n      ref => {\n        if (ref && visible) {\n          const newConfig = {\n            ...config.current,\n            el: ref,\n            url: videoUrls[0],\n            playNext: {\n              urlList: videoUrls.slice(1),\n            },\n          };\n          if (enableMemory) {\n            const { lastPlayTime } = JSON.parse(localStorage.getItem('videoPlayedTime') || '{}')?.[id] || {};\n            Object.assign(newConfig, { lastPlayTime, lastPlayTimeHideDelay });\n          }\n          config.current = newConfig;\n        }\n\n        if (playerRef) {\n          if (typeof playerRef === 'function') {\n            playerRef(player.current!);\n          } else {\n            playerRef.current = player.current!;\n          }\n        }\n      },\n      [visible, playerRef, videoUrls, enableMemory, id, lastPlayTimeHideDelay]\n    );\n    return <div className={className} ref={getRef} style={style}></div>;\n  }\n);\n"
  },
  {
    "path": "packages/lego-video/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"lib\": [\"dom\", \"ESNext\"],\n    \"moduleResolution\": \"node\",\n    \"jsx\": \"react\",\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"downlevelIteration\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": false,\n    \"strictNullChecks\": true,\n    \"baseUrl\": \".\"\n  },\n  \"exclude\": [\"node_modules\", \"lib\", \"es\", \"dist\", \"**/index.test.ts\", \"**/demo\", \"coverage\", \"**/*.js\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native/CHANGELOG.md",
    "content": "# @td-design/react-native\n\n## 5.9.9\n\n### Patch Changes\n\n- [#931](https://github.com/thundersdata-frontend/td-design/pull/931) [`039c394d0`](https://github.com/thundersdata-frontend/td-design/commit/039c394d03cbee95807a04722a7b076c9ac43f0b) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Radio不显示label的bug\n\n## 5.9.8\n\n### Patch Changes\n\n- [#928](https://github.com/thundersdata-frontend/td-design/pull/928) [`d035cb837`](https://github.com/thundersdata-frontend/td-design/commit/d035cb837371dfc32fe7fe8105bead76195c93af) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 优化弹窗类组件的显示方式\n\n## 5.9.7\n\n### Patch Changes\n\n- [#926](https://github.com/thundersdata-frontend/td-design/pull/926) [`539c12385`](https://github.com/thundersdata-frontend/td-design/commit/539c123858422a59cc73e63530e38e35e37afabb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复Toast组件导致物理返回键无法正常使用的bug\n\n## 5.9.6\n\n### Patch Changes\n\n- [#923](https://github.com/thundersdata-frontend/td-design/pull/923) [`c7c10df31`](https://github.com/thundersdata-frontend/td-design/commit/c7c10df31bfc9fcf32d3a885eed7903148b20fba) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复Toast和Passcode组件的bug\n\n## 5.9.5\n\n### Patch Changes\n\n- [#906](https://github.com/thundersdata-frontend/td-design/pull/906) [`c514138e2`](https://github.com/thundersdata-frontend/td-design/commit/c514138e2749fceb3d279b8d48e0b9ae4f3b409b) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复TextArea设置value无效的bug\n\n## 5.9.4\n\n### Patch Changes\n\n- [#900](https://github.com/thundersdata-frontend/td-design/pull/900) [`3f109b17a`](https://github.com/thundersdata-frontend/td-design/commit/3f109b17ad7f16bd470945a59a914da5a2e92df9) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复类型问题\n\n## 5.9.3\n\n### Patch Changes\n\n- [#898](https://github.com/thundersdata-frontend/td-design/pull/898) [`f61c08970`](https://github.com/thundersdata-frontend/td-design/commit/f61c08970b7f7c5b83fe821c3e966cfe31216a4e) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复弹窗子组件内无法关闭弹窗的bug\n\n## 5.9.2\n\n### Patch Changes\n\n- [#896](https://github.com/thundersdata-frontend/td-design/pull/896) [`da60d29ed`](https://github.com/thundersdata-frontend/td-design/commit/da60d29ed5151d57bfd07cc82f7aebd5c5fd9863) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 为Modal增加show方法，实现指令式打开弹窗的功能\n\n## 5.9.1\n\n### Patch Changes\n\n- [#894](https://github.com/thundersdata-frontend/td-design/pull/894) [`e8e96323a`](https://github.com/thundersdata-frontend/td-design/commit/e8e96323a9d4a4b6ae6f3c604330fdd675a23a30) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Input组件无法输入中文的bug\n\n## 5.9.0\n\n### Minor Changes\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 优化多个组件\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 优化代码性能\n\n### Patch Changes\n\n- Updated dependencies [[`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f), [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f)]:\n  - @td-design/rn-hooks@2.8.1\n\n## 5.8.12\n\n### Patch Changes\n\n- [#890](https://github.com/thundersdata-frontend/td-design/pull/890) [`fe9a1ab9d`](https://github.com/thundersdata-frontend/td-design/commit/fe9a1ab9d4cb8133257138c2f6430194faf59af3) Thanks [@chj-damon](https://github.com/chj-damon)! - 删除 `react-native-redash`依赖优化`react-native-picker` 的`onChange`事件的参数类型问题\n\n## 5.8.11\n\n### Patch Changes\n\n- [#873](https://github.com/thundersdata-frontend/td-design/pull/873) [`20fe552d1`](https://github.com/thundersdata-frontend/td-design/commit/20fe552d15b50714cf4f69d7c6cd2926f048647b) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复searchbar在取消时不触发onSearch的bug\n\n## 5.8.10\n\n### Patch Changes\n\n- [#863](https://github.com/thundersdata-frontend/td-design/pull/863) [`b9a711bc9`](https://github.com/thundersdata-frontend/td-design/commit/b9a711bc9a60eb8c36fc4f7f0ca058de5c432f51) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复数字输入组件的校验bug\n\n## 5.8.9\n\n### Patch Changes\n\n- [#859](https://github.com/thundersdata-frontend/td-design/pull/859) [`4bd7cd7a6`](https://github.com/thundersdata-frontend/td-design/commit/4bd7cd7a640a371c20f918f85c276fb243b538d2) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复slider组件滑动不到最后的bug\n\n## 5.8.8\n\n### Patch Changes\n\n- [#857](https://github.com/thundersdata-frontend/td-design/pull/857) [`a4597ec7c`](https://github.com/thundersdata-frontend/td-design/commit/a4597ec7c495edd85edff389e2b4a3f84d396dae) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 数字输入组件支持输入负数\n\n## 5.8.7\n\n### Patch Changes\n\n- [#843](https://github.com/thundersdata-frontend/td-design/pull/843) [`9ea47b186`](https://github.com/thundersdata-frontend/td-design/commit/9ea47b18603db0bc1cd56066593d0e447de11b6a) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复slider滑动判断step的逻辑bug\n\n## 5.8.6\n\n### Patch Changes\n\n- [#838](https://github.com/thundersdata-frontend/td-design/pull/838) [`dd79cf862`](https://github.com/thundersdata-frontend/td-design/commit/dd79cf8624e705c36e52ce865333a75a6157d5e2) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: Modal的几个方法的title属性支持传入自定义组件\n\n## 5.8.5\n\n### Patch Changes\n\n- [#836](https://github.com/thundersdata-frontend/td-design/pull/836) [`85e4a81cd`](https://github.com/thundersdata-frontend/td-design/commit/85e4a81cdfa177d185cac14cbc7e890e227ed1eb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复Card组件的header不显示的bug\n\n## 5.8.4\n\n### Patch Changes\n\n- [#833](https://github.com/thundersdata-frontend/td-design/pull/833) [`d6ec3d770`](https://github.com/thundersdata-frontend/td-design/commit/d6ec3d77017825a9865d4aff24793e027da6b69c) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复几个组件的bug\n\n## 5.8.3\n\n### Patch Changes\n\n- Updated dependencies [[`85fcb2d49`](https://github.com/thundersdata-frontend/td-design/commit/85fcb2d49ad1a15f5db089b769ecfb610988c0d1)]:\n  - @td-design/rn-hooks@2.8.0\n\n## 5.8.2\n\n### Patch Changes\n\n- [#829](https://github.com/thundersdata-frontend/td-design/pull/829) [`3fc1f6424`](https://github.com/thundersdata-frontend/td-design/commit/3fc1f6424ed20c7e476530a072266461f7dff21a) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复NumberKeyboardItem/VehicleKeyboardItem组件宽度没有撑满整行的bug\n\n## 5.8.1\n\n### Patch Changes\n\n- [#827](https://github.com/thundersdata-frontend/td-design/pull/827) [`4de596f49`](https://github.com/thundersdata-frontend/td-design/commit/4de596f49c82355144ddd16d93e57b5944c1f22c) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复 FormListitem label属性类型问题\n\n## 5.8.0\n\n### Minor Changes\n\n- [#825](https://github.com/thundersdata-frontend/td-design/pull/825) [`08ae08cd5`](https://github.com/thundersdata-frontend/td-design/commit/08ae08cd56a6510983b9fa5f4566569fea08ff05) Thanks [@chj-damon](https://github.com/chj-damon)!\n  - refactor: 修改NumberKeyboard和VehicleKeyboard的弹窗实现方式\n  - refactor: 变更FormListItem的title属性为label属性\n  - fix: 修复NumberKeyboard和VehicleKeyboard下多个组件没有默认导出的问题\n\n## 5.7.0\n\n### Minor Changes\n\n- [#821](https://github.com/thundersdata-frontend/td-design/pull/821) [`a8e2b30ce`](https://github.com/thundersdata-frontend/td-design/commit/a8e2b30ce3a34ab1404a6b741073487857d5e9c6) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 默认将所有组件导出方式统一到index,取消多个组件的Object.assign导出方式\n\n## 5.6.1\n\n### Patch Changes\n\n- [#819](https://github.com/thundersdata-frontend/td-design/pull/819) [`b336ffd80`](https://github.com/thundersdata-frontend/td-design/commit/b336ffd80d98064e3a7c3dda959b2d60ba9ee0a1) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Brief组件的样式问题\n\n## 5.6.0\n\n### Minor Changes\n\n- [#816](https://github.com/thundersdata-frontend/td-design/pull/816) [`4798f13b7`](https://github.com/thundersdata-frontend/td-design/commit/4798f13b780df488f355f30e59eacc9d14e2f128) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复多个组件的bug\n\n## 5.5.4\n\n### Patch Changes\n\n- Updated dependencies [[`603414f12`](https://github.com/thundersdata-frontend/td-design/commit/603414f12353bdd2ae1ffa1655fcddf8b799029b)]:\n  - @td-design/rn-hooks@2.7.4\n\n## 5.5.3\n\n### Patch Changes\n\n- [#810](https://github.com/thundersdata-frontend/td-design/pull/810) [`b541087a3`](https://github.com/thundersdata-frontend/td-design/commit/b541087a38439df39cd2bad436ab29d090d0f419) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 继续优化Input组件的样式问题\n\n## 5.5.2\n\n### Patch Changes\n\n- [#808](https://github.com/thundersdata-frontend/td-design/pull/808) [`0ff8a1d0a`](https://github.com/thundersdata-frontend/td-design/commit/0ff8a1d0a2df3367795c23f5058c9e9955dd958c) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Input组件在复杂布局场景下的样式问题\n\n## 5.5.1\n\n### Patch Changes\n\n- [#805](https://github.com/thundersdata-frontend/td-design/pull/805) [`4344a1e18`](https://github.com/thundersdata-frontend/td-design/commit/4344a1e185a96cdf5fef7d1ab1bf3e4f08fb60b6) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Input相关组件在FormItem下的高度问题\n\n## 5.5.0\n\n### Minor Changes\n\n- [#802](https://github.com/thundersdata-frontend/td-design/pull/802) [`e81ddb0ce`](https://github.com/thundersdata-frontend/td-design/commit/e81ddb0ceb6f5c692be12eec032b1ec5465b9199) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 全面优化组件在表单下使用时的样式\n\n## 5.4.14\n\n### Patch Changes\n\n- [#800](https://github.com/thundersdata-frontend/td-design/pull/800) [`70e1c6a37`](https://github.com/thundersdata-frontend/td-design/commit/70e1c6a3787224201071d5806af75224a50e951c) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 优化Input组件样式\n\n## 5.4.13\n\n### Patch Changes\n\n- [#798](https://github.com/thundersdata-frontend/td-design/pull/798) [`0b68a6057`](https://github.com/thundersdata-frontend/td-design/commit/0b68a60572efc9b1baacb45af8fd86b5bdb4d29f) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 为FormItem和FormListItem增加noStyle属性\n\n## 5.4.12\n\n### Patch Changes\n\n- [#796](https://github.com/thundersdata-frontend/td-design/pull/796) [`611199f65`](https://github.com/thundersdata-frontend/td-design/commit/611199f6546320d5ef8a77b5006b34030931342a) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复TextArea在FormItem下高度无法生效的问题\n\n## 5.4.11\n\n### Patch Changes\n\n- [#794](https://github.com/thundersdata-frontend/td-design/pull/794) [`cce84edd8`](https://github.com/thundersdata-frontend/td-design/commit/cce84edd8a0c3288b5132905d2c3e5a9bdfa82e2) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复 list-item 组件的样式问题\n\n## 5.4.10\n\n### Patch Changes\n\n- [#792](https://github.com/thundersdata-frontend/td-design/pull/792) [`d832bc6e5`](https://github.com/thundersdata-frontend/td-design/commit/d832bc6e5cebc927c1d6426d3dfae5e8a50e9658) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复 FormItem 下的 Input/InputItem 组件的 inputStyle 不生效的问题\n\n## 5.4.9\n\n### Patch Changes\n\n- [#787](https://github.com/thundersdata-frontend/td-design/pull/787) [`a11745df1`](https://github.com/thundersdata-frontend/td-design/commit/a11745df10c5e0181bba6b2e09c193a656fdd5eb) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复 Input 组件在 FormItem 下显示问题 fix: rename Button 的 borderless 属性为 bordered\n\n## 5.4.8\n\n### Patch Changes\n\n- [#785](https://github.com/thundersdata-frontend/td-design/pull/785) [`f52667d34`](https://github.com/thundersdata-frontend/td-design/commit/f52667d3410ad4f2cbe243c1e8934f055fe13622) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复 TextArea 的标签高度跟其他表单项不一致的问题\n\n## 5.4.7\n\n### Patch Changes\n\n- [#783](https://github.com/thundersdata-frontend/td-design/pull/783) [`839433baf`](https://github.com/thundersdata-frontend/td-design/commit/839433bafc549c82067b308cff3dd29dfb616d76) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复多个组件在表单中使用时的样式问题\n\n## 5.4.6\n\n### Patch Changes\n\n- [#779](https://github.com/thundersdata-frontend/td-design/pull/779) [`9c1d33e1a`](https://github.com/thundersdata-frontend/td-design/commit/9c1d33e1a4843a385819bf79c7f1c9937a513b93) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 Card 组件自定义 header 的bug\n\n## 5.4.5\n\n### Patch Changes\n\n- [#777](https://github.com/thundersdata-frontend/td-design/pull/777) [`5eeb55d50`](https://github.com/thundersdata-frontend/td-design/commit/5eeb55d5070d44f77f44818657a2dc5703145de1) Thanks [@chj-damon](https://github.com/chj-damon)! - 为 List 组件增加 itemStyle 属性用来控制列表项的样式\n\n## 5.4.4\n\n### Patch Changes\n\n- [#775](https://github.com/thundersdata-frontend/td-design/pull/775) [`d6b55fa8e`](https://github.com/thundersdata-frontend/td-design/commit/d6b55fa8e9d9e10201fb400d2cfd038c736e303f) Thanks [@SunshineH2](https://github.com/SunshineH2)! - noticeBar支持修改文本颜色\n\n## 5.4.3\n\n### Patch Changes\n\n- [#749](https://github.com/thundersdata-frontend/td-design/pull/749) [`616feb43e`](https://github.com/thundersdata-frontend/td-design/commit/616feb43e40e3d1e527a66c7f0d51e4a5b602347) Thanks [@chj-damon](https://github.com/chj-damon)! - 修改几个组件里children的类型定义方式\n\n## 5.4.2\n\n### Patch Changes\n\n- [#747](https://github.com/thundersdata-frontend/td-design/pull/747) [`d91317db1`](https://github.com/thundersdata-frontend/td-design/commit/d91317db103dfe4ed8bd4531f5c170f3602b0429) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复一些bug\n\n## 5.4.1\n\n### Patch Changes\n\n- [#743](https://github.com/thundersdata-frontend/td-design/pull/743) [`acdd74c13`](https://github.com/thundersdata-frontend/td-design/commit/acdd74c1324be45816f4e1dff0d5e854124172ad) Thanks [@chj-damon](https://github.com/chj-damon)! - 使用useSafeState代替useState\n\n## 5.4.0\n\n### Minor Changes\n\n- [#739](https://github.com/thundersdata-frontend/td-design/pull/739) [`dc908cf2c`](https://github.com/thundersdata-frontend/td-design/commit/dc908cf2c920a88f8a50e980a7cd88279467315d) Thanks [@chj-damon](https://github.com/chj-damon)! - 对组件库组件进行优化\n\n## 5.3.0\n\n### Minor Changes\n\n- [#736](https://github.com/thundersdata-frontend/td-design/pull/736) [`d29c3c4fd`](https://github.com/thundersdata-frontend/td-design/commit/d29c3c4fdd6ede126a1e95a266d25b41d0e784b0) Thanks [@chj-damon](https://github.com/chj-damon)! - 对Box和Text两个基础组件进行性能优化\n\n## 5.2.0\n\n### Minor Changes\n\n- [#729](https://github.com/thundersdata-frontend/td-design/pull/729) [`08f29ea53`](https://github.com/thundersdata-frontend/td-design/commit/08f29ea5307e522a101f807d450e1cb69d1d9b04) Thanks [@chen929104](https://github.com/chen929104)! - 重写 table 组件\n\n## 5.1.1\n\n### Patch Changes\n\n- [#714](https://github.com/thundersdata-frontend/td-design/pull/714) [`ef6d88136`](https://github.com/thundersdata-frontend/td-design/commit/ef6d88136421ea13b19b11730f94b589047c5a8b) Thanks [@chj-damon](https://github.com/chj-damon)! - 继续优化组件样式\n\n## 5.1.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 使用 Pressable 代替 TouchableOpacity; 2. 优化所有组件的样式; 3. 重写 Menu/Tree/Timeline/Searchbar 组件\n\n## 5.0.1\n\n### Patch Changes\n\n- [#709](https://github.com/thundersdata-frontend/td-design/pull/709) [`8afd89e7f`](https://github.com/thundersdata-frontend/td-design/commit/8afd89e7fa0db12aa038c806c78de9607c098ae9) Thanks [@chj-damon](https://github.com/chj-damon)! -\n  - 修改 Text 组件默认不允许选中\n  - 优化 Table 组件\n\n## 5.0.0\n\n### Major Changes\n\n- [#706](https://github.com/thundersdata-frontend/td-design/pull/706) [`b8428d249`](https://github.com/thundersdata-frontend/td-design/commit/b8428d249ba31aa1302f38bdefedd5f5ef4958e9) Thanks [@chj-damon](https://github.com/chj-damon)! - 废弃 Image 组件\n\n## 4.3.15\n\n### Patch Changes\n\n- [#703](https://github.com/thundersdata-frontend/td-design/pull/703) [`7396e4d3a`](https://github.com/thundersdata-frontend/td-design/commit/7396e4d3a947e189741fec3f7f79cc9d37ff4b83) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化 TextInput 组件的默认行为\n\n## 4.3.14\n\n### Patch Changes\n\n- [#698](https://github.com/thundersdata-frontend/td-design/pull/698) [`52e472893`](https://github.com/thundersdata-frontend/td-design/commit/52e472893db980bbbc0131fe45da2188ec681542) Thanks [@chj-damon](https://github.com/chj-damon)! - 统一 WingBlank 的 size 为'x2'\n\n- Updated dependencies [[`52e472893`](https://github.com/thundersdata-frontend/td-design/commit/52e472893db980bbbc0131fe45da2188ec681542)]:\n  - @td-design/rn-hooks@2.7.3\n\n## 4.3.13\n\n### Patch Changes\n\n- Updated dependencies [[`8edd617ee`](https://github.com/thundersdata-frontend/td-design/commit/8edd617eee2d62d4c6daa6aa1c348464325cd358)]:\n  - @td-design/rn-hooks@2.7.2\n\n## 4.3.12\n\n### Patch Changes\n\n- [#692](https://github.com/thundersdata-frontend/td-design/pull/692) [`ef3aa1744`](https://github.com/thundersdata-frontend/td-design/commit/ef3aa1744206291b4238946575307fc7b79c4751) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 reanimated3.0.0 上可能引起报错的问题\n\n## 4.3.11\n\n### Patch Changes\n\n- [#690](https://github.com/thundersdata-frontend/td-design/pull/690) [`9a21764b8`](https://github.com/thundersdata-frontend/td-design/commit/9a21764b8aff2faa2b52727d6f12902cd0a84264) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复 search bar 在没有取消按钮时宽度计算不正确的问题\n\n## 4.3.10\n\n### Patch Changes\n\n- [#683](https://github.com/thundersdata-frontend/td-design/pull/683) [`28ca3d4ff`](https://github.com/thundersdata-frontend/td-design/commit/28ca3d4ffa565b17cca39dbc774c18129a1f1369) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复 toast.process 下仍然能点击的问题\n\n## 4.3.9\n\n### Patch Changes\n\n- [#679](https://github.com/thundersdata-frontend/td-design/pull/679) [`9355cab9c`](https://github.com/thundersdata-frontend/td-design/commit/9355cab9ce0e749c525f72d6bb16f17035e81680) Thanks [@chj-damon](https://github.com/chj-damon)!\n- 优化一些组件的 UI 效果优化\n- NoticeBar 组件滚动效果修复 progress 组件修改 value 后没有效果的 bug\n- 修复 search-bar 组件的 bug\n\n## 4.3.8\n\n### Patch Changes\n\n- [#677](https://github.com/thundersdata-frontend/td-design/pull/677) [`469b748a3`](https://github.com/thundersdata-frontend/td-design/commit/469b748a33b288afc288be969a193eae0e2f6d13) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化组件同时为一些组件补充 activeOpacity 属性\n\n## 4.3.7\n\n### Patch Changes\n\n- [#672](https://github.com/thundersdata-frontend/td-design/pull/672) [`c53b31ce9`](https://github.com/thundersdata-frontend/td-design/commit/c53b31ce9c2be07840d707660babc7272133805e) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化数字输入组件的文字样式\n\n## 4.3.6\n\n### Patch Changes\n\n- [#670](https://github.com/thundersdata-frontend/td-design/pull/670) [`604e5fb82`](https://github.com/thundersdata-frontend/td-design/commit/604e5fb8227d4f365ee5127ca50516edbd5fb289) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复一些样式问题\n\n## 4.3.5\n\n### Patch Changes\n\n- [#668](https://github.com/thundersdata-frontend/td-design/pull/668) [`be30c6e8d`](https://github.com/thundersdata-frontend/td-design/commit/be30c6e8d31c9642e24ae5270660b0990d50813b) Thanks [@chen929104](https://github.com/chen929104)! - 新增车牌键盘\n\n## 4.3.4\n\n### Patch Changes\n\n- [#666](https://github.com/thundersdata-frontend/td-design/pull/666) [`c59bc62c0`](https://github.com/thundersdata-frontend/td-design/commit/c59bc62c0d387c14abf53f5da24f5a1ddf07e0ec) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 为 NumberKeyboard 组件新增`extra`属性 2. 修改 WheelPickerItem 组件,让文字效果更好 3. 优化 theme 文件内关于`textVariants`的定义 4. 为 Tag 组件新增`selectable`属性控制是否可选中\n\n## 4.3.3\n\n### Patch Changes\n\n- [#664](https://github.com/thundersdata-frontend/td-design/pull/664) [`8d9d2f356`](https://github.com/thundersdata-frontend/td-design/commit/8d9d2f3568ee53c71be4a420884d0ba2afd57d15) Thanks [@chen929104](https://github.com/chen929104)! - fix(custom): 修改 prompt 回调没有参数的问题\n\n## 4.3.2\n\n### Patch Changes\n\n- [#662](https://github.com/thundersdata-frontend/td-design/pull/662) [`0ff69db64`](https://github.com/thundersdata-frontend/td-design/commit/0ff69db6456c35026986ba05c7e2431e917ec943) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 ActionSheet 点击事件执行前 Modal 尚未关闭的 bug\n\n## 4.3.1\n\n### Patch Changes\n\n- [#660](https://github.com/thundersdata-frontend/td-design/pull/660) [`94e1422ba`](https://github.com/thundersdata-frontend/td-design/commit/94e1422babc364a236695e12a80718336a039e70) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 修复 Modal 的几个方法在关闭后 Portal 没有被销毁的问题 2. 优化 ImagePicker 两个方法的写法 3. 修复 ActionSheet 的一些问题\n- Updated dependencies [[`94e1422ba`](https://github.com/thundersdata-frontend/td-design/commit/94e1422babc364a236695e12a80718336a039e70)]:\n  - @td-design/rn-hooks@2.7.1\n\n## 4.3.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n### Patch Changes\n\n- Updated dependencies [[`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199)]:\n  - @td-design/rn-hooks@2.7.0\n\n## 4.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`694c4666c`](https://github.com/thundersdata-frontend/td-design/commit/694c4666c116869ee9321dd579113136603b8ba3)]:\n  - @td-design/rn-hooks@2.6.1\n\n## 4.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`68cfd28b1`](https://github.com/thundersdata-frontend/td-design/commit/68cfd28b1f3bc9bebfe8b6eda4979102054fb8df)]:\n  - @td-design/rn-hooks@2.6.0\n\n## 4.2.1\n\n### Patch Changes\n\n- [#634](https://github.com/thundersdata-frontend/td-design/pull/634) [`bd73bbe02`](https://github.com/thundersdata-frontend/td-design/commit/bd73bbe02e0eb74d8bddbe9451275e33bd4b06ea) Thanks [@chj-damon](https://github.com/chj-damon)! - 重写 Tooltip 组件\n\n## 4.2.0\n\n### Minor Changes\n\n- [#631](https://github.com/thundersdata-frontend/td-design/pull/631) [`71a4fb174`](https://github.com/thundersdata-frontend/td-design/commit/71a4fb17491c9bf22d407a3450f49e827a243503) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复一些组件的 bug; 全面使用 Box 组件代替 View 组件\n\n## 4.1.18\n\n### Patch Changes\n\n- [#627](https://github.com/thundersdata-frontend/td-design/pull/627) [`eeb2c1066`](https://github.com/thundersdata-frontend/td-design/commit/eeb2c10669d59106e2f42e2571014e85484a1ddb) Thanks [@chj-damon](https://github.com/chj-damon)! - Text 和 Input 组件默认允许跟随系统字体缩放\n\n## 4.1.17\n\n### Patch Changes\n\n- [#623](https://github.com/thundersdata-frontend/td-design/pull/623) [`46b4e27c0`](https://github.com/thundersdata-frontend/td-design/commit/46b4e27c0ceb9e337e26d9181b9af0774b51eaaa) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复安卓手机上字体问题\n\n## 4.1.16\n\n### Patch Changes\n\n- [#620](https://github.com/thundersdata-frontend/td-design/pull/620) [`70f8ff7d3`](https://github.com/thundersdata-frontend/td-design/commit/70f8ff7d31fd1fdefa5d31b8b85a11374abb4b65) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 onCheck 函数的返回值类型\n\n## 4.1.15\n\n### Patch Changes\n\n- [#618](https://github.com/thundersdata-frontend/td-design/pull/618) [`93d4be091`](https://github.com/thundersdata-frontend/td-design/commit/93d4be091aefc327a1187ef6acab7c064318b37c) Thanks [@chj-damon](https://github.com/chj-damon)!\n- 1. 为 NumberKeyboard 组件增加 onCheck 方法进行校验\n- 2. 修改组件中 Text 的引入路径\n- 3. 默认不允许 Text 和 Input 跟随系统缩放\n\n## 4.1.14\n\n### Patch Changes\n\n- [#616](https://github.com/thundersdata-frontend/td-design/pull/616) [`5ed898586`](https://github.com/thundersdata-frontend/td-design/commit/5ed8985868789efdafe12bf9a31f201200351e9f) Thanks [@chj-damon](https://github.com/chj-damon)! - 为一些组件的文本增加可选中功能\n\n## 4.1.13\n\n### Patch Changes\n\n- [#614](https://github.com/thundersdata-frontend/td-design/pull/614) [`b6034352d`](https://github.com/thundersdata-frontend/td-design/commit/b6034352d9d61fc892795b87d9bac9d5fcf9067f) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 passcode 组件取值不正确的 bug\n\n## 4.1.12\n\n### Patch Changes\n\n- [#611](https://github.com/thundersdata-frontend/td-design/pull/611) [`0e334a77e`](https://github.com/thundersdata-frontend/td-design/commit/0e334a77e7cbf25a446f962e90d8645f5dfafa4b) Thanks [@chj-damon](https://github.com/chj-damon)! - 防御性修改防止 RN 对&&的判断问题\n\n## 4.1.11\n\n### Patch Changes\n\n- [#609](https://github.com/thundersdata-frontend/td-design/pull/609) [`d044bceae`](https://github.com/thundersdata-frontend/td-design/commit/d044bceaedd6eaf87a502e2078259467335b70fe) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 IOS 模拟器一直提示无法识别字体的问题\n\n## 4.1.10\n\n### Patch Changes\n\n- [#607](https://github.com/thundersdata-frontend/td-design/pull/607) [`c78d71225`](https://github.com/thundersdata-frontend/td-design/commit/c78d71225916ca5642fee15f238234c395b5fe77) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 alert/confirm/prompt 按钮接收异步函数的 bug\n\n## 4.1.9\n\n### Patch Changes\n\n- [#601](https://github.com/thundersdata-frontend/td-design/pull/601) [`986e31435`](https://github.com/thundersdata-frontend/td-design/commit/986e3143547a4b4743c6b49c02b1508efeb3ac5c) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 modal 安全区域问题\n\n## 4.1.8\n\n### Patch Changes\n\n- [#599](https://github.com/thundersdata-frontend/td-design/pull/599) [`f2df34215`](https://github.com/thundersdata-frontend/td-design/commit/f2df342153f5a9c9be4879e6828773c1a7aac88b) Thanks [@chj-damon](https://github.com/chj-damon)! - 按钮组件支持自定义高度\n\n## 4.1.7\n\n### Patch Changes\n\n- [#595](https://github.com/thundersdata-frontend/td-design/pull/595) [`14420b459`](https://github.com/thundersdata-frontend/td-design/commit/14420b4597f3a18aac828e8047fcdba6da0c537d) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修改按钮在禁用状态下的颜色\n\n## 4.1.6\n\n### Patch Changes\n\n- [#593](https://github.com/thundersdata-frontend/td-design/pull/593) [`6c0ded607`](https://github.com/thundersdata-frontend/td-design/commit/6c0ded6074bb787642877ee832b69251e978b280) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修改按钮在禁用状态下的颜色\n\n## 4.1.5\n\n### Patch Changes\n\n- [#591](https://github.com/thundersdata-frontend/td-design/pull/591) [`92221a60f`](https://github.com/thundersdata-frontend/td-design/commit/92221a60fcd97cd17132f6116404c40454d0e686) Thanks [@chj-damon](https://github.com/chj-damon)! - - 重写 Modal 组件\n  - 为 Theme 的 textVariants 添加 defaults 配置\n  - 导出 Portal\n\n## 4.1.4\n\n### Patch Changes\n\n- [#589](https://github.com/thundersdata-frontend/td-design/pull/589) [`6bd906307`](https://github.com/thundersdata-frontend/td-design/commit/6bd90630781c3769af64ab0983f8d050daca6c0c) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复 useUpdateEffect 第一次不会执行的问题\n\n## 4.1.3\n\n### Patch Changes\n\n- [#587](https://github.com/thundersdata-frontend/td-design/pull/587) [`0630e0987`](https://github.com/thundersdata-frontend/td-design/commit/0630e0987ff7d8302270bb97fcb2cba2032c5620) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 Notify 组件在 onPress 和 onClose 同时存在时的 bug\n\n## 4.1.2\n\n### Patch Changes\n\n- [`f7e06c5d2`](https://github.com/thundersdata-frontend/td-design/commit/f7e06c5d2ae782cdbb39fcc7bda076a41c0c971f) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复在 restyle 最新版本下报错的问题\n\n## 4.1.1\n\n### Patch Changes\n\n- [`2c7a58659`](https://github.com/thundersdata-frontend/td-design/commit/2c7a5865991a1f388ddf438601a7893721c4b483) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复 FormListItem 无法设置背景色的问题\n\n## 4.1.0\n\n### Minor Changes\n\n- [`fddce8944`](https://github.com/thundersdata-frontend/td-design/commit/fddce89444ff649bd9c086cd75a9d351a847dd70) Thanks [@chj-damon](https://github.com/chj-damon)! - 重写与 Portal 相关的组件\n\n## 4.0.12\n\n### Patch Changes\n\n- [`124097240`](https://github.com/thundersdata-frontend/td-design/commit/1240972402c5a81da22aa618341eed07075ee17e) Thanks [@chj-damon](https://github.com/chj-damon)! - 在 List 上增加 itemHeight 属性统一设置列表项高度\n\n## 4.0.11\n\n### Patch Changes\n\n- [#578](https://github.com/thundersdata-frontend/td-design/pull/578) [`311ec38dc`](https://github.com/thundersdata-frontend/td-design/commit/311ec38dcb088c977d6fca37c7fc7a7e24030104) Thanks [@821wkli](https://github.com/821wkli)! - fix: 修正 Carousel 组件把 auto 设置为 false 时，用户手动滚动结束后会改成自动滚动\n\n## 4.0.10\n\n### Patch Changes\n\n- [#576](https://github.com/thundersdata-frontend/td-design/pull/576) [`b0519af10`](https://github.com/thundersdata-frontend/td-design/commit/b0519af10ab549814f18dafa16d65f5a3821d357) Thanks [@821wkli](https://github.com/821wkli)! - fix: 修正 Badge 组件显示位置总是在子组件范围内\n\n## 4.0.9\n\n### Patch Changes\n\n- [`42883168d`](https://github.com/thundersdata-frontend/td-design/commit/42883168d67307602330e1ce7834e281064d9f02) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 Toast 组件在 mask 启用时无法显示的问题\n\n## 4.0.8\n\n### Patch Changes\n\n- [`f1a650b30`](https://github.com/thundersdata-frontend/td-design/commit/f1a650b30f1d0da65e7e2d6fbdfcaee7a17341ce) Thanks [@chj-damon](https://github.com/chj-damon)! - Toast 组件支持自定义展示内容\n\n## 4.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`1cffe53a5`](https://github.com/thundersdata-frontend/td-design/commit/1cffe53a553b66a78b09a34ad091afae5cfc56c7)]:\n  - @td-design/rn-hooks@2.5.1\n\n## 4.0.6\n\n### Patch Changes\n\n- [`a996afe9c`](https://github.com/thundersdata-frontend/td-design/commit/a996afe9cfb9170f77aad669088ac4dddcc048c2) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化动画后代码执行逻辑\n\n## 4.0.5\n\n### Patch Changes\n\n- [`3f723f31b`](https://github.com/thundersdata-frontend/td-design/commit/3f723f31be0bcf1809343dc836236f86d66333e7) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 runOnJS 写法报错的问题\n\n## 4.0.4\n\n### Patch Changes\n\n- [`9b16623e9`](https://github.com/thundersdata-frontend/td-design/commit/9b16623e9f03d748f3d85733c6fb5fe1ab02500c) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 Modal.confirm 类型报错\n\n## 4.0.3\n\n### Patch Changes\n\n- [`44eed4809`](https://github.com/thundersdata-frontend/td-design/commit/44eed4809542e53a24522c09289c45c975235982) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 Toast/Notify 组件的层级显示问题\n\n## 4.0.0\n\n### Major Changes\n\n- [`4d1d4db4c`](https://github.com/thundersdata-frontend/td-design/commit/4d1d4db4c83b1d37810af6c289adfade573364d8) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 为所有组件增加 displayName - 2. 重写 Portal 组件 - 3. 重写 Tooltip 组件 - 4. 重写 Toast 组件 - 5. 重写 SwipeRow 组件 - 6. 重命名 Swiper 组件为 Carousel 组件 - 7. 修复 Modal 组件在一些情况下不显示的问题 - 8. 优化一些组件 - 9. 修复 Checkbox 的 bug - 10. 拆分 Skeleton 组件，单独使用 - 11. 优化 Menu 组件渲染 - 12. 修改 Passcode 组件，不再支持复制粘贴功能 - 13. 修复 CircleProgress 组件的 strokeWidth 属性的显示 bug - 14. 新增`@ebay/nice-modal-react`依赖\n\n### Patch Changes\n\n- Updated dependencies [[`4d1d4db4c`](https://github.com/thundersdata-frontend/td-design/commit/4d1d4db4c83b1d37810af6c289adfade573364d8)]:\n  - @td-design/rn-hooks@2.5.0\n\n## 3.12.4\n\n### Patch Changes\n\n- [`f5a3b2378`](https://github.com/thundersdata-frontend/td-design/commit/f5a3b2378cbdcfe9457d461fa4eb4b76d359dd9b) - 合并 rc-field-form 的 Store/ValidateErrorEntity 类型\n\n## 3.12.3\n\n### Patch Changes\n\n- [#562](https://github.com/thundersdata-frontend/td-design/pull/562) [`cb28e8b32`](https://github.com/thundersdata-frontend/td-design/commit/cb28e8b32ddfc49b17a626be6f144fa111f2ca5d) Thanks [@chen929104](https://github.com/chen929104)! - 修改 number-keyboard 默认右对齐修复 list-item 箭头没有右对齐\n\n## 3.12.2\n\n### Patch Changes\n\n- [#558](https://github.com/thundersdata-frontend/td-design/pull/558) [`6a219811a`](https://github.com/thundersdata-frontend/td-design/commit/6a219811ab673ebef2b9961497c3e74782166c19) Thanks [@chen929104](https://github.com/chen929104)! - fix(custom): 1 修复 toast position 属性不生效问题\n\n## 3.12.1\n\n### Patch Changes\n\n- [`4efbfc3c0`](https://github.com/thundersdata-frontend/td-design/commit/4efbfc3c0584e02326258ee01d62627c5f34525b) - 优化组件样式\n\n## 3.12.0\n\n### Minor Changes\n\n- [`c6bd561b9`](https://github.com/thundersdata-frontend/td-design/commit/c6bd561b9de5022456bf903b32d7c56446f79a46) - 修改 number-keyboard 组件\n\n## 3.11.22\n\n### Patch Changes\n\n- [`7d3e9ddb3`](https://github.com/thundersdata-frontend/td-design/commit/7d3e9ddb3dedad36fb2a65b2ff01d32778f176d5) - 修复 WingBlank 组件导致点击事件失效的问题\n\n## 3.11.21\n\n### Patch Changes\n\n- [`3c0c0607f`](https://github.com/thundersdata-frontend/td-design/commit/3c0c0607f11a1a6d0aa2cd75f731d51a4370d395) - StatusBar 组件支持自定义样式\n\n## 3.11.20\n\n### Patch Changes\n\n- [#538](https://github.com/thundersdata-frontend/td-design/pull/538) [`341f4ae17`](https://github.com/thundersdata-frontend/td-design/commit/341f4ae1708c81afe903c335a73f2d75839d9fd2) Thanks [@qqack](https://github.com/qqack)! - feat: 进度条组件添加自定义标签\n\n## 3.11.19\n\n### Patch Changes\n\n- [`e749c01a6`](https://github.com/thundersdata-frontend/td-design/commit/e749c01a6daa53c1171104b30b720dc3625ce1f9) - 去除一些使用 useMemo 的过度优化场景\n\n## 3.11.18\n\n### Patch Changes\n\n- [#531](https://github.com/thundersdata-frontend/td-design/pull/531) [`8b837c8ae`](https://github.com/thundersdata-frontend/td-design/commit/8b837c8aeb2133b74f2f168077d7ebe2edabe652) Thanks [@qqack](https://github.com/qqack)! - fix: 暗黑模式下的样式优化\n\n## 3.11.17\n\n### Patch Changes\n\n- [#529](https://github.com/thundersdata-frontend/td-design/pull/529) [`3e12b31e7`](https://github.com/thundersdata-frontend/td-design/commit/3e12b31e7a88808f3b81a19a311422fed26ea4e4) Thanks [@qqack](https://github.com/qqack)! - 修复暗黑模式下颜色显示 bug\n\n## 3.11.16\n\n### Patch Changes\n\n- [#521](https://github.com/thundersdata-frontend/td-design/pull/521) [`40c51d3fa`](https://github.com/thundersdata-frontend/td-design/commit/40c51d3fa7170613c0ddde71032f047cb23c59bf) Thanks [@qqack](https://github.com/qqack)! - fix: 修复 list-item 在暗黑模式下背景色 bug\n\n- [#522](https://github.com/thundersdata-frontend/td-design/pull/522) [`c57574f03`](https://github.com/thundersdata-frontend/td-design/commit/c57574f033632d56f7f71d08343abd42804e70a6) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复手风琴组件在安卓上不能正常使用的问题\n\n- [#525](https://github.com/thundersdata-frontend/td-design/pull/525) [`91264ede1`](https://github.com/thundersdata-frontend/td-design/commit/91264ede16715b48240ea9eb080087051f3ba70c) Thanks [@qqack](https://github.com/qqack)! - 修复暗黑模式下背景色切换问题\n\n## 3.11.15\n\n### Patch Changes\n\n- [`bc03a6bdb`](https://github.com/thundersdata-frontend/td-design/commit/bc03a6bdb5437846f58a4c20929649597bc28696) - 在 theme 中定义 theme 字段来标识当前主题\n\n## 3.11.14\n\n### Patch Changes\n\n- [`585e7801e`](https://github.com/thundersdata-frontend/td-design/commit/585e7801e246a25f2dfa647a4dd9e6a5800b5f3c) - 优化 children 的定义\n\n## 3.11.13\n\n### Patch Changes\n\n- [#511](https://github.com/thundersdata-frontend/td-design/pull/511) [`752368668`](https://github.com/thundersdata-frontend/td-design/commit/752368668b806690a8d6ba9e25355c5520a6f34e) Thanks [@qqack](https://github.com/qqack)! - fix: 解决 Menu 组件默认选中不生效问题\n\n## 3.11.12\n\n### Patch Changes\n\n- [`18b3760e8`](https://github.com/thundersdata-frontend/td-design/commit/18b3760e88beb5a83140f6fbe62a97b1b04f48ae) - 修改光标颜色\n\n## 3.11.11\n\n### Patch Changes\n\n- [#507](https://github.com/thundersdata-frontend/td-design/pull/507) [`419928d20`](https://github.com/thundersdata-frontend/td-design/commit/419928d2090b8174af0980ca3148c4c11e4d8d9d) Thanks [@SunshineH2](https://github.com/SunshineH2)! - CountDown 组件支持 resendLabel 属性\n\n## 3.11.10\n\n### Patch Changes\n\n- [`cd9baf794`](https://github.com/thundersdata-frontend/td-design/commit/cd9baf79494bc4b761e71f21f3dab3c3225d1cc5) - 修复 input 组件文字没有垂直居中的问题\n\n## 3.11.9\n\n### Patch Changes\n\n- [`039fd7a13`](https://github.com/thundersdata-frontend/td-design/commit/039fd7a13f49d2e6e59b66c77cd2b62b552646ae) - 修复 Modal 弹出动画的 bug\n\n## 3.11.8\n\n### Patch Changes\n\n- [`dcca3b59c`](https://github.com/thundersdata-frontend/td-design/commit/dcca3b59c3656eb4d61e583863e858a78e6a4a71) - 删除下拉刷新组件\n"
  },
  {
    "path": "packages/react-native/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native\",\n  \"version\": \"5.9.9\",\n  \"description\": \"react-native UI组件库\",\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"license\": \"Apache-2.0\",\n  \"author\": \"thundersdata-frontend\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"dependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@td-design/rn-hooks\": \"^2.8.1\",\n    \"rc-field-form\": \"^1.34.2\",\n    \"react-native-shadow-2\": \"^7.0.8\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-gesture-handler\": \"^2.12.0\",\n    \"react-native-reanimated\": \"^3.3.0\",\n    \"react-native-safe-area-context\": \"^4.7.1\",\n    \"react-native-svg\": \"^13.10.0\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"registry\": \"https://registry.npmjs.org/\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/accordion/index.md",
    "content": "---\ntitle: Accordion - 手风琴组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 其他组件\n  path: /other\n  order: 10\n---\n\n# Accordion 手风琴组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Accordion\n  sections={[\n    { title: '我是标题', content: '11111111111111111' },\n    {\n      title: '我是标题',\n      content: '222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222',\n    },\n    {\n      title: '我是标题',\n      content: `我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是`,\n    },\n  ]}\n/>\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643092835880873364.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 2. 只允许展开一个\n\n```tsx | pure\n<Accordion\n  multiple={false}\n  sections={[\n    { title: '我是标题', content: '11111111111111111' },\n    {\n      title: '我是标题',\n      content: '222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222',\n    },\n    {\n      title: '我是标题',\n      content: `我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是`,\n    },\n  ]}\n/>\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643092898980235941.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 3. 自定义选项卡容器样式\n\n```tsx | pure\n<Accordion\n  multiple={true}\n  sections={[\n    { title: '我是标题', content: '11111111111111111' },\n    {\n      title: '我是标题',\n      content: '222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222',\n    },\n    {\n      title: '我是标题',\n      content: `我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是`,\n    },\n  ]}\n  contentStyle={{ padding: 12 }}\n/>\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643093000896584086.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 4. 自定义容器样式\n\n```tsx | pure\n<Accordion\n  multiple={true}\n  sections={[\n    { title: '我是标题', content: '11111111111111111' },\n    {\n      title: '我是标题',\n      content: '222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222',\n    },\n    {\n      title: '我是标题',\n      content: `我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是`,\n    },\n  ]}\n  accordionStyle={{ borderWidth: 1, borderColor: 'red', marginHorizontal: 12 }}\n/>\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643093115012785632.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n## API\n\n### Accordion 属性\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| sections | `true` | 手风琴选项卡列表 | `Section[]` |  |\n| multiple | `false` | 是否允许展开多个 | `boolean` | `true` |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n| headerHeight | `false` | 选项卡标题高度 | `number` | `54` |\n| accordionStyle | `false` | 容器样式 | `ViewStyle` |  |\n| contentStyle | `false` | 选项卡样式 | `ViewStyle` |  |\n| customIcon | `false` | 自定义右侧图标 | `({ progress }: { progress: Animated.SharedValue<number> }) => ReactNode` |  |\n"
  },
  {
    "path": "packages/react-native/src/accordion/index.tsx",
    "content": "import React, { FC, useMemo } from 'react';\nimport { FlatList } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { AccordionProps, Section } from './type';\nimport useAccordion from './useAccordion';\n\nconst Accordion: FC<AccordionProps> = ({\n  sections = [],\n  multiple = true,\n  activeOpacity = 0.6,\n  customIcon,\n  accordionStyle,\n  headerStyle,\n  contentStyle,\n}) => {\n  const [currentIndex, setCurrentIndex] = useSafeState<number>();\n\n  return (\n    <FlatList\n      data={sections}\n      keyExtractor={(_, index) => `${index}`}\n      renderItem={({ item, index }) => (\n        <AccordionItem\n          {...item}\n          multiple={multiple}\n          customIcon={customIcon}\n          currentIndex={currentIndex}\n          index={index}\n          activeOpacity={activeOpacity}\n          onPress={setCurrentIndex}\n          headerStyle={headerStyle}\n          contentStyle={contentStyle}\n        />\n      )}\n      showsHorizontalScrollIndicator={false}\n      showsVerticalScrollIndicator={false}\n      bounces={false}\n      decelerationRate={'fast'}\n      contentContainerStyle={accordionStyle}\n      style={{ flexGrow: 0 }}\n    />\n  );\n};\n\nconst AccordionItem: FC<\n  Section &\n    Pick<AccordionProps, 'customIcon' | 'contentStyle' | 'headerStyle'> &\n    Required<Pick<AccordionProps, 'multiple' | 'activeOpacity'>> & {\n      currentIndex?: number;\n      index: number;\n      onPress: (index: number) => void;\n    }\n> = ({\n  title,\n  content,\n  customIcon,\n  multiple,\n  currentIndex,\n  index,\n  activeOpacity,\n  onPress,\n  contentStyle,\n  headerStyle,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const { iconStyle, heightStyle, progress, contentRef, handlePress } = useAccordion({\n    multiple,\n    currentIndex,\n    index,\n    onPress,\n  });\n\n  const Title = useMemo(() => {\n    if (typeof title === 'string') {\n      return (\n        <Text variant=\"p0\" color=\"text\">\n          {title}\n        </Text>\n      );\n    }\n    return title;\n  }, [title]);\n\n  const Content = useMemo(() => {\n    if (typeof content === 'string') {\n      return (\n        <Text variant=\"p1\" selectable color=\"text\">\n          {content}\n        </Text>\n      );\n    }\n    return content;\n  }, [content]);\n\n  return (\n    <Box backgroundColor={'white'} overflow={'hidden'}>\n      <Pressable\n        activeOpacity={activeOpacity}\n        onPress={handlePress}\n        style={[\n          {\n            flexDirection: 'row',\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            paddingHorizontal: theme.spacing.x2,\n            paddingVertical: theme.spacing.x2,\n            borderBottomWidth: helpers.ONE_PIXEL,\n            borderBottomColor: theme.colors.border,\n            backgroundColor: theme.colors.white,\n          },\n          headerStyle,\n        ]}\n      >\n        {Title}\n        {customIcon ? (\n          customIcon({ progress })\n        ) : (\n          <Animated.View style={iconStyle}>\n            <SvgIcon name=\"down\" color={theme.colors.icon} size={helpers.px(20)} />\n          </Animated.View>\n        )}\n      </Pressable>\n      <Animated.View style={heightStyle}>\n        <Animated.View\n          ref={contentRef}\n          collapsable={false}\n          style={[\n            contentStyle,\n            {\n              position: 'absolute',\n              width: '100%',\n              top: 0,\n            },\n          ]}\n        >\n          {Content}\n        </Animated.View>\n      </Animated.View>\n    </Box>\n  );\n};\n\nAccordion.displayName = 'Accordion';\n\nexport default Accordion;\n"
  },
  {
    "path": "packages/react-native/src/accordion/type.ts",
    "content": "import { Component, ReactNode, RefObject } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\nexport interface Section {\n  title: ReactNode;\n  content: ReactNode;\n}\n\nexport interface AccordionProps {\n  /** 手风琴选项卡列表 */\n  sections: Section[];\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n  /** 是否允许展开多个 */\n  multiple?: boolean;\n  /** 容器样式 */\n  accordionStyle?: StyleProp<ViewStyle>;\n  /** 选项卡标题样式 */\n  headerStyle?: StyleProp<ViewStyle>;\n  /** 选项卡内容样式 */\n  contentStyle?: StyleProp<ViewStyle>;\n  /** 自定义右侧图标 */\n  customIcon?: ({ progress }: { progress: Animated.SharedValue<number> }) => ReactNode;\n}\n\nexport interface SectionProps extends Pick<AccordionProps, 'contentStyle' | 'customIcon' | 'multiple'> {\n  index: number;\n  /** 选项卡 */\n  title: ReactNode;\n  content: ReactNode;\n  contentHeights: Animated.SharedValue<number>[];\n}\n\nexport interface SectionHeaderProps\n  extends Pick<SectionProps, 'title' | 'contentHeights' | 'customIcon' | 'index' | 'multiple'> {\n  animatedRef: RefObject<Component>;\n}\n"
  },
  {
    "path": "packages/react-native/src/accordion/useAccordion.ts",
    "content": "import { useEffect } from 'react';\nimport Animated, {\n  measure,\n  runOnUI,\n  useAnimatedRef,\n  useAnimatedStyle,\n  useDerivedValue,\n  useSharedValue,\n  withTiming,\n} from 'react-native-reanimated';\n\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nexport default function useAccordion({\n  multiple,\n  currentIndex,\n  index,\n  onPress,\n}: {\n  multiple: boolean;\n  currentIndex?: number;\n  index: number;\n  onPress: (index: number) => void;\n}) {\n  const contentRef = useAnimatedRef<Animated.View>();\n  const heightValue = useSharedValue(0);\n  const open = useSharedValue(false);\n\n  const progress = useDerivedValue(() => (open.value ? withTiming(1) : withTiming(0)));\n\n  /** 如果 multiple=false，则非当前index的都要收起来 */\n  useEffect(() => {\n    if (!multiple && currentIndex !== index) {\n      heightValue.value = withTiming(0);\n      open.value = false;\n    }\n  }, [multiple, currentIndex, index]);\n\n  const iconStyle = useAnimatedStyle(() => ({\n    transform: [{ rotate: `${progress.value * -180}deg` }],\n  }));\n\n  const heightStyle = useAnimatedStyle(() => ({\n    height: heightValue.value,\n  }));\n\n  const handlePress = () => {\n    if (heightValue.value === 0) {\n      runOnUI(() => {\n        'worklet';\n        heightValue.value = withTiming(measure(contentRef)?.height ?? 0);\n      })();\n    } else {\n      heightValue.value = withTiming(0);\n    }\n    open.value = !open.value;\n    onPress(index);\n  };\n\n  return {\n    contentRef,\n    iconStyle,\n    heightStyle,\n    handlePress: useMemoizedFn(handlePress),\n    progress,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/action-sheet/ActionSheetItem.tsx",
    "content": "import React, { memo, ReactNode } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nimport Pressable from '../pressable';\nimport Text from '../text';\n\nexport interface ActionSheetItemProps {\n  /** 操作项文字 */\n  text: string;\n  /** 操作项点击事件 */\n  onPress: () => void;\n  /** 操作项类型。danger表示警示性操作 */\n  type?: 'default' | 'danger';\n  render?: (text: string, type?: 'default' | 'danger') => ReactNode;\n}\n\nfunction ActionSheetItem({\n  text,\n  type = 'default',\n  onPress,\n  activeOpacity,\n  render,\n  onCancel,\n  itemStyle,\n}: ActionSheetItemProps & {\n  onCancel: () => void;\n  activeOpacity: number;\n  itemStyle: StyleProp<ViewStyle>;\n}) {\n  return (\n    <Pressable\n      key={text}\n      activeOpacity={activeOpacity}\n      onPress={() => {\n        onCancel();\n        // 因为Modal关闭的动画效果是300ms，所以这里延迟350ms执行onPress\n        setTimeout(onPress, 350);\n      }}\n      style={itemStyle}\n    >\n      {render ? (\n        render(text, type)\n      ) : (\n        <Text variant=\"p0\" color={type === 'default' ? 'text' : 'func600'}>\n          {text}\n        </Text>\n      )}\n    </Pressable>\n  );\n}\n\nexport default memo(ActionSheetItem);\n"
  },
  {
    "path": "packages/react-native/src/action-sheet/index.md",
    "content": "---\ntitle: ActionSheet - 操作项组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 反馈组件\n  path: /feedback\n  order: 6\n---\n\n# ActionSheet 操作项组件\n\n## 效果演示\n\n```tsx | pure\n<ActionSheet\n  data={[\n    { text: '操作1', onPress: () => console.log(1) },\n    { text: '操作2', onPress: () => console.log(2) },\n    { text: '操作3', onPress: () => console.log(3), render: (text, type) => <Text>{text}</Text> },\n    { text: '操作4', onPress: () => console.log(4), type: 'danger' },\n  ]}\n  onCancel={() => setVisible(false)}\n  visible={visible}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609071284389640582.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### ActionSheet 属性\n\n| 属性          | 必填    | 说明             | 类型                | 默认值 |\n| ------------- | ------- | ---------------- | ------------------- | ------ |\n| items         | `true`  | 操作项列表       | `ActionSheetItem[]` | `[]`   |\n| visible       | `true`  | 是否显示操作面板 | `boolean`           |        |\n| activeOpacity | `false` | 按下时的不透明度 | `number`            | `0.6`  |\n| onCancel      | `true`  | 关闭操作面板     | `() => void`        |        |\n| cancelText    | `false` | 关闭按钮文字     | `string`            | `取消` |\n\n### ActionSheetItem 属性\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| text | `true` | 操作项文字 | `string` |  |\n| onPress | `true` | 操作项点击事件 | `() => void` |  |\n| type | `false` | 操作项类型。danger 表示警示性操作 | `default` \\| `danger` |  |\n| render | `false` | 自定义渲染操作项 | `(text: string, type?: 'default' \\| 'danger') => ReactNode` |  |\n"
  },
  {
    "path": "packages/react-native/src/action-sheet/index.tsx",
    "content": "import React, { FC, ReactNode, useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport ModalView from '../modal/Modal/ModalView';\nimport Portal from '../portal';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport WhiteSpace from '../white-space';\nimport ActionSheetItem, { ActionSheetItemProps } from './ActionSheetItem';\n\nconst { ONE_PIXEL } = helpers;\n\nexport interface ActionSheetProps {\n  /** 标题 */\n  title?: ReactNode;\n  /** 操作项列表 */\n  items: ActionSheetItemProps[];\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n  /** 关闭文字 */\n  cancelText?: string;\n}\n\nconst ActionSheet = () => null;\n\nActionSheet.displayName = 'ActionSheet';\n\nActionSheet.show = (props: ActionSheetProps) => {\n  const key = Portal.add(\n    <ActionSheetContent\n      {...props}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    />\n  );\n};\n\nconst ActionSheetContent: FC<ActionSheetProps & { onAnimationEnd: (visible: boolean) => void }> = ({\n  title,\n  items = [],\n  cancelText = '取消',\n  activeOpacity = 0.6,\n  onAnimationEnd,\n}) => {\n  const [visible, setVisible] = useSafeState(true);\n\n  const theme = useTheme<Theme>();\n\n  const styles = StyleSheet.create({\n    action: {\n      backgroundColor: theme.colors.white,\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: theme.spacing.x3,\n      borderTopWidth: ONE_PIXEL,\n      borderTopColor: theme.colors.border,\n    },\n    cancel: {\n      borderTopWidth: 0,\n      borderBottomLeftRadius: theme.borderRadii.x2,\n      borderBottomRightRadius: theme.borderRadii.x2,\n    },\n  });\n\n  const Title = useMemo(() => {\n    if (!title) return null;\n\n    if (typeof title === 'string')\n      return (\n        <Box padding=\"x3\">\n          <Text variant=\"p1\" color=\"text\">\n            {title}\n          </Text>\n        </Box>\n      );\n\n    return <Box padding=\"x3\">{title}</Box>;\n  }, [title]);\n\n  return (\n    <ModalView\n      position=\"bottom\"\n      maskVisible\n      maskClosable\n      animationType=\"slide\"\n      onAnimationEnd={onAnimationEnd}\n      visible={visible}\n      onClose={() => setVisible(false)}\n    >\n      <Box>\n        {Title}\n        {items.map((item, index) => (\n          <ActionSheetItem\n            key={index}\n            {...item}\n            onCancel={() => setVisible(false)}\n            itemStyle={styles.action}\n            activeOpacity={activeOpacity}\n          />\n        ))}\n        <WhiteSpace size=\"x2\" backgroundColor={theme.colors.gray50} />\n        <Pressable\n          activeOpacity={activeOpacity}\n          onPress={() => setVisible(false)}\n          style={[styles.action, styles.cancel]}\n        >\n          <Text variant=\"p0\" color=\"text\">\n            {cancelText}\n          </Text>\n        </Pressable>\n      </Box>\n    </ModalView>\n  );\n};\n\nexport default ActionSheet;\n"
  },
  {
    "path": "packages/react-native/src/avatar/Accessory/index.tsx",
    "content": "import React, { memo } from 'react';\nimport { Image, StyleSheet } from 'react-native';\n\nimport Box from '../../box';\nimport helpers from '../../helpers';\nimport { AccessoryProps } from '../type';\n\nconst { px } = helpers;\nconst Accessory = ({ size = px(14), url, component, top = false, left = false }: AccessoryProps) => {\n  return (\n    <Box\n      position={'absolute'}\n      alignItems={'center'}\n      justifyContent={'center'}\n      width={size}\n      height={size}\n      style={StyleSheet.flatten([\n        { borderRadius: size / 2 },\n        top ? styles.top : styles.bottom,\n        left ? styles.left : styles.right,\n      ])}\n    >\n      <Icon {...{ url, size, component }} />\n    </Box>\n  );\n};\nAccessory.displayName = 'Accessory';\n\n/** 挂件的位置 */\nconst styles = StyleSheet.create({\n  top: {\n    top: 0,\n  },\n  bottom: {\n    bottom: 0,\n  },\n  left: {\n    left: 0,\n  },\n  right: {\n    right: 0,\n  },\n});\n\nexport default Accessory;\n\nconst Icon = memo(({ url, size, component }: Pick<AccessoryProps, 'size' | 'url' | 'component'>) => {\n  if (url) {\n    const source = typeof url === 'string' ? { uri: url } : url;\n    return (\n      <Image\n        style={{\n          width: size,\n          height: size,\n          borderRadius: size! / 2,\n        }}\n        source={source}\n        resizeMode=\"cover\"\n      />\n    );\n  }\n  if (component) {\n    return component;\n  }\n  return null;\n});\n"
  },
  {
    "path": "packages/react-native/src/avatar/Avatar/index.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { Image, StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Pressable from '../../pressable';\nimport Text from '../../text';\nimport { Theme } from '../../theme';\nimport { AvatarProps } from '../type';\nimport useAvatar from './useAvatar';\n\nconst Avatar: FC<AvatarProps> = ({ title, url, textStyle, ...props }) => {\n  const theme = useTheme<Theme>();\n  const { onPress, activeOpacity = 0.6, backgroundColor = theme.colors.white, containerStyle } = props;\n  const { width, height, avatarRadius } = useAvatar(props);\n\n  const styles = StyleSheet.create({\n    avatar: {\n      position: 'relative',\n      width,\n      height,\n      justifyContent: 'center',\n      alignItems: 'center',\n      backgroundColor: backgroundColor,\n      borderRadius: avatarRadius,\n      ...containerStyle,\n    },\n  });\n\n  return (\n    <Pressable activeOpacity={activeOpacity} disabled={!onPress} onPress={onPress} style={styles.avatar}>\n      <Content {...{ url, title, width, height, avatarRadius, textStyle }} />\n    </Pressable>\n  );\n};\nAvatar.displayName = 'Avatar';\n\nexport default Avatar;\n\nconst Content = memo(\n  ({\n    url,\n    title,\n    width,\n    height,\n    avatarRadius,\n    textStyle,\n  }: Pick<AvatarProps, 'url' | 'title' | 'textStyle'> & {\n    width: number;\n    height: number;\n    avatarRadius: number;\n  }) => {\n    if (!!url)\n      return (\n        <Image\n          source={typeof url === 'string' ? { uri: url } : url}\n          style={{ width, height, borderRadius: avatarRadius }}\n          resizeMode=\"cover\"\n        />\n      );\n    if (!!title)\n      return (\n        <Text variant=\"p0\" textAlign=\"center\" color=\"text\" style={textStyle}>\n          {title}\n        </Text>\n      );\n    return null;\n  }\n);\n"
  },
  {
    "path": "packages/react-native/src/avatar/Avatar/useAvatar.ts",
    "content": "import helpers from '../../helpers';\nimport { AvatarProps } from '../type';\n\nconst { px } = helpers;\nexport default function useAvatar({ size = px(46), borderRadius = 0, circular = true }: AvatarProps) {\n  /** icon的长宽 */\n  const width = size;\n  const height = size;\n\n  /** 挂件的大小 */\n  const accessorySize = ((Math.sqrt(2) - 1) * width) / Math.sqrt(2);\n\n  /** 头像的弧度 */\n  const avatarRadius = circular ? width / 2 : borderRadius;\n\n  return {\n    width,\n    height,\n    accessorySize,\n    avatarRadius,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/avatar/AvatarGroup/index.tsx",
    "content": "import React, { Children, cloneElement, FC, isValidElement, ReactElement } from 'react';\n\nimport Flex from '../../flex';\nimport helpers from '../../helpers';\nimport Avatar from '../Avatar';\nimport { AvatarGroupProps } from '../type';\n\nconst { px } = helpers;\nconst AvatarGroup: FC<AvatarGroupProps> = props => {\n  const { children: childrenProp, max = 4, spacing = px(23), textStyle, backgroundColor } = props;\n  /** 有效的自节点 */\n  const children = Children.toArray(childrenProp).filter(child => {\n    return isValidElement(child);\n  }) as Array<ReactElement>;\n  /** 额外的头像尾巴 */\n  const extraAvatars = children.length > max ? children.length - max + 1 : 0;\n  /** 头像的间距 */\n  const marginLeft = -spacing;\n\n  return (\n    <Flex>\n      {children.slice(0, children.length - extraAvatars).map((child, index) => {\n        return cloneElement(child, {\n          containerStyle: {\n            marginLeft: index === 0 ? 0 : marginLeft,\n            ...child.props.containerStyle,\n          },\n          circular: true,\n        });\n      })}\n      {extraAvatars ? (\n        <Avatar\n          circular\n          containerStyle={{ marginLeft }}\n          title={'+' + extraAvatars}\n          textStyle={textStyle}\n          backgroundColor={backgroundColor}\n        />\n      ) : null}\n    </Flex>\n  );\n};\nAvatarGroup.displayName = 'AvatarGroup';\n\nexport default AvatarGroup;\n"
  },
  {
    "path": "packages/react-native/src/avatar/index.md",
    "content": "---\ntitle: Avatar - 头像组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n  order: 5\n---\n\n# Avatar 头像组件\n\n## 效果演示\n\n### 1. 默认头像\n\n```tsx | pure\n<Avatar url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"默认头像 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608541697872721505.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 头像大小\n\n```tsx | pure\n <Avatar\n    size={20}\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n  />\n  <Avatar\n    size={40}\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n  />\n  <Avatar\n    size={60}\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n  />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"头像大小 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608541697902152616.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 头像弧度\n\n```tsx | pure\n <Avatar\n    circular={false}\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n  />\n  <Avatar\n    borderRadius={10}\n    circular={false}\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n  />\n  <Avatar\n    borderRadius={20}\n    circular={false}\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n  />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"头像弧度 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608541697200668208.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 头像挂件\n\n```tsx | pure\n// 自定义挂件 位置在上边\n <Avatar url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\">\n  <Accessory component={<Icon name=\"user\" color=\"green\" rounded />} top={true} />\n</Avatar>\n// 自定义挂件 位置在左上边\n<Avatar url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\">\n  <Accessory component={<Icon name=\"user\" color=\"green\" rounded />} top={true} left={true} />\n</Avatar>\n// 自定义图片\n<Avatar url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\">\n  <Accessory url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\" />\n</Avatar>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"头像挂件 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608541697202802021.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 头像内容\n\n```tsx | pure\n// 自定义内容：使用文字\n<Avatar title=\"123\" />\n// 自定义内容：使用图片\n<Avatar url={require('../../assets/images/island.jpg')} />\n// 自定义内容：使用图片\n<Avatar url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"头像内容 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608541699890608695.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 头像组\n\n```tsx | pure\n<AvatarGroup max={4}>\n  <Avatar\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n    circular\n  />\n  <Avatar\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n    circular\n  />\n  <Avatar\n    url=\"https://i0.wp.com/fancycrave.com/wp-content/uploads/2020/03/group-of-diverse-friends-playing-game-on-mobile-P5BYNJM.jpg\"\n    circular\n  />\n  <Avatar\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n    circular\n  />\n  <Avatar\n    url=\"https://i0.wp.com/fancycrave.com/wp-content/uploads/2020/03/group-of-diverse-friends-playing-game-on-mobile-P5BYNJM.jpg\"\n    circular\n  />\n</AvatarGroup>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"头像组 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608541697216544391.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 7. 头像组背景\n\n```tsx | pure\n<AvatarGroup max={4} backgroundColor=\"orange\">\n  <Avatar\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n    circular\n  />\n  <Avatar\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n    circular\n  />\n  <Avatar\n    url=\"https://i0.wp.com/fancycrave.com/wp-content/uploads/2020/03/group-of-diverse-friends-playing-game-on-mobile-P5BYNJM.jpg\"\n    circular\n  />\n  <Avatar\n    url=\"https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=1000\"\n    circular\n  />\n  <Avatar\n    url=\"https://i0.wp.com/fancycrave.com/wp-content/uploads/2020/03/group-of-diverse-friends-playing-game-on-mobile-P5BYNJM.jpg\"\n    circular\n  />\n</AvatarGroup>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"头像组背景 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608541698067149032.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## Avatar 组件 API\n\n| 属性            | 必填    | 说明                                          | 类型                 | 默认值    |\n| --------------- | ------- | --------------------------------------------- | -------------------- | --------- |\n| url             | `false` | 图片的路径                                    | `string` \\| `number` |           |\n| size            | `false` | 头像大小                                      | `number`             | `px(46)`  |\n| borderRadius    | `false` | 头像弧度                                      | `number`             | `0`       |\n| title           | `false` | 标题（显示在头像中的文字，不能与 url 一起用） | `string`             |           |\n| circular        | `false` | 头像是否为圆形                                | `boolean`            | `true`    |\n| backgroundColor | `false` | 使用 title 时的背景                           | `string`             | `#E5F1FF` |\n| textStyle       | `false` | title 文字的样式                              | `TextStyle`          |           |\n| containerStyle  | `false` | 容器的样式                                    | `ViewStyle`          |           |\n| activeOpacity   | `false` | 点击时的透明度                                | `number`             | `0.6`     |\n| onPress         | `false` | 点击头像的回调事件                            | `() => void`         |           |\n\n## Accessory 组件 API\n\n| 属性      | 必填    | 说明                 | 类型                 | 默认值   |\n| --------- | ------- | -------------------- | -------------------- | -------- |\n| url       | `false` | 图片的路径           | `string` \\| `number` |          |\n| size      | `false` | 图标大小             | `number`             | `px(14)` |\n| icon      | `false` | 使用 icon 时的 props | `IconProps`          |          |\n| component | `false` | 使用自定义组件       | `ReactNode`          |          |\n| top       | `false` | 挂件垂直方向位置     | `boolean`            | `false`  |\n| left      | `false` | 挂件水平方向位置     | `boolean`            | `false`  |\n\n## AvatarGroup 组件 API\n\n| 属性            | 必填    | 说明                      | 类型        | 默认值    |\n| --------------- | ------- | ------------------------- | ----------- | --------- |\n| max             | `false` | 最大显示数量              | `number`    | `4`       |\n| spacing         | `false` | 头像的间距                | `number`    | `px(23)`  |\n| backgroundColor | `false` | 数量头像的背景            | `string`    | `#E5F1FF` |\n| textStyle       | `false` | 数量头像 title 文字的样式 | `TextStyle` |           |\n"
  },
  {
    "path": "packages/react-native/src/avatar/index.tsx",
    "content": "export { default as Avatar } from './Avatar';\nexport { default as Accessory } from './Accessory';\nexport { default as AvatarGroup } from './AvatarGroup';\n"
  },
  {
    "path": "packages/react-native/src/avatar/type.ts",
    "content": "import { PropsWithChildren, ReactElement } from 'react';\nimport { TextStyle, ViewStyle } from 'react-native';\n\nexport interface AccessoryProps {\n  /** 图标大小 */\n  size?: number;\n  /** 使用图片时的值 */\n  url?: string | number;\n  /** 使用自定义组件 */\n  component?: ReactElement;\n  /** 挂件垂直方向位置 */\n  top?: boolean;\n  /** 挂件水平方向位置 */\n  left?: boolean;\n}\nexport type AvatarGroupProps = PropsWithChildren<{\n  /** 最大显示数量 */\n  max?: number;\n  /** 头像的间距 */\n  spacing?: number;\n  /** 数量的背景 */\n  backgroundColor?: string;\n  /** 数量的文字的样式 */\n  textStyle?: TextStyle;\n}>;\n\nexport type AvatarProps = {\n  /** 点击头像 */\n  onPress?: () => void;\n  /** 点击时的透明度 */\n  activeOpacity?: number;\n  /** 头像大小 */\n  size?: number;\n  /** 图片地址 */\n  url?: string | number;\n  /** 头像弧度 */\n  borderRadius?: number;\n  /** 标题显示在头像中的文字不能与url一起用 */\n  title?: string;\n  /** 是否为圆形 */\n  circular?: boolean;\n  /** title时的背景 */\n  backgroundColor?: string;\n  /** title文字的样式 */\n  textStyle?: TextStyle;\n  /** 容器的样式 */\n  containerStyle?: ViewStyle;\n};\n"
  },
  {
    "path": "packages/react-native/src/badge/index.md",
    "content": "---\ntitle: Badge - 徽标组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Badge 徽标组件\n\n## 效果演示\n\n### 1. type 默认，展示为 text\n\n```tsx | pure\n<Badge text={4}>\n  <Box width={50} height={52} backgroundColor=\"warningColor2\" />\n</Badge>\n<WhiteSpace />\n<Badge text=\"折\" backgroundColor=\"primaryTextColor\">\n  <Box backgroundColor=\"warningColor2\" width={52} height={52} />\n</Badge>\n<WhiteSpace />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"badge-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608797068494109760.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. type 为 dot\n\n```tsx | pure\n<Badge text={4} type=\"dot\">\n  <Box width={50} height={52} backgroundColor=\"warningColor2\" />\n</Badge>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"badge-ios3.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608797081010456297.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. overflowCount\n\n```tsx | pure\n<WhiteSpace />\n<Badge text={10900} overflowCount={14000} backgroundColor=\"func300\">\n  <Box backgroundColor=\"warningColor2\" width={302} height={132} />\n</Badge>\n<WhiteSpace />\n<Badge text={10900} backgroundColor=\"func300\">\n  <Box backgroundColor=\"warningColor2\" width={302} height={132} />\n</Badge>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"badge-ios4.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608797087820228989.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性           | 必填    | 说明                 | 类型                 | 默认值 |\n| -------------- | ------- | -------------------- | -------------------- | ------ |\n| type           | `false` | badge 的形态         | `dot` \\| `text`      | `text` |\n| text           | `false` | badge 的内容         | `string` \\| `number` |        |\n| max            | `false` | 展示封顶的数值       | `number`             | `99`   |\n| containerStyle | `false` | badge 的容器的 style | `ViewStyle`          |        |\n| textStyle      | `false` | badge 中文字的 style | `ViewStyle`          |        |\n"
  },
  {
    "path": "packages/react-native/src/badge/index.tsx",
    "content": "import React, { cloneElement, FC, memo, ReactElement } from 'react';\nimport { StyleSheet, TextStyle, ViewStyle } from 'react-native';\n\nimport Box from '../box';\nimport Text from '../text';\nimport useBadge from './useBadge';\n\nconst DOT_SIZE = 8; // 默认点大小\nexport interface BadgeProps {\n  /** 徽标内容 */\n  text?: string | number;\n  /** 展示封顶的数值 */\n  max?: number;\n  /** badge的形态，小圆点 | 文字 */\n  type?: 'dot' | 'text';\n  /** badge的容器的style */\n  containerStyle?: ViewStyle;\n  /** badge中文字的style */\n  textStyle?: TextStyle;\n  /** 子组件 */\n  children: ReactElement;\n}\n\nconst Badge: FC<BadgeProps> = ({\n  type = 'text',\n  containerStyle = {},\n  textStyle = {},\n  text,\n  max = 99,\n  children,\n}: BadgeProps) => {\n  const { onBadgeLayout, badgeOffset, layout } = useBadge();\n\n  return (\n    <Box width={layout.width} height={layout.height}>\n      {cloneElement(children, {\n        onLayout: onBadgeLayout,\n      })}\n      <Content {...{ type, text, max, containerStyle, textStyle, badgeOffset }} />\n    </Box>\n  );\n};\nBadge.displayName = 'Badge';\n\nexport default Badge;\n\nconst Content = memo(\n  ({\n    type,\n    text,\n    max,\n    containerStyle,\n    textStyle,\n    badgeOffset,\n  }: Pick<BadgeProps, 'type' | 'text' | 'max' | 'containerStyle' | 'textStyle'> & {\n    badgeOffset: { top: number; right: number };\n  }) => {\n    text = typeof text === 'number' && text > max! ? `${max}+` : text;\n\n    const isZero = text === '0' || text === 0;\n    const isEmpty = text === null || text === undefined || text === '';\n    const isHidden = isEmpty || isZero;\n\n    if (isHidden) return null;\n\n    if (type === 'dot')\n      return (\n        <Box\n          width={DOT_SIZE}\n          height={DOT_SIZE}\n          position={'absolute'}\n          top={-(DOT_SIZE / 2)}\n          right={-(DOT_SIZE / 2)}\n          backgroundColor={'func600'}\n          style={StyleSheet.compose(\n            {\n              borderRadius: DOT_SIZE / 2,\n            },\n            containerStyle\n          )}\n        />\n      );\n    return (\n      <Box\n        borderRadius={'x1'}\n        position={'absolute'}\n        top={badgeOffset.top}\n        right={badgeOffset.right}\n        paddingHorizontal={'x1'}\n        backgroundColor={'func600'}\n        justifyContent={'center'}\n        style={containerStyle}\n      >\n        <Text textAlign={'center'} color=\"white\" style={textStyle}>\n          {text}\n        </Text>\n      </Box>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/react-native/src/badge/useBadge.ts",
    "content": "import { LayoutChangeEvent } from 'react-native';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nexport default function useBadge() {\n  const [layout, setLayout] = useSafeState({ width: 0, height: 0 });\n  const [badgeOffset, setBadgeOffset] = useSafeState({\n    top: 0,\n    right: 0,\n  });\n\n  const onBadgeLayout = (event: LayoutChangeEvent) => {\n    const { width, height } = event.nativeEvent.layout;\n    const newX = Math.round(-width / 2);\n    const newY = Math.round(-height / 2);\n\n    setLayout({ width, height });\n\n    if (badgeOffset.top !== newY || badgeOffset.right !== newX) {\n      setBadgeOffset({ top: newY, right: newX });\n    }\n  };\n\n  return {\n    badgeOffset,\n    layout,\n    onBadgeLayout,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/box/index.md",
    "content": "---\ntitle: Box - 盒子组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n  order: 4\n---\n\n# Box 盒子组件\n\n基于`restyle`，除样式属性外继承`ViewProps`。\n\n**注意，Box组件不直接基于`View`组件，而是基于`react-native/Libraries/Components/View/ViewNativeComponent`（[why](https://twitter.com/natebirdman/status/1695511232298783079?s=42)）。**\n\n## 效果演示\n\n### 1. 背景为蓝色的正方形\n\n```tsx | pure\n<Box width={200} height={200} backgroundColor=\"primaryColor\" margin=\"x3\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"box-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607493786211498786.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 居中显示文本\n\n```tsx | pure\n<Box width={200} height={200} borderWidth={1} borderColor=\"borderColor\" justifyContent=\"center\" alignItems=\"center\">\n  <Text>Hello, Box</Text>\n</Box>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"box-ios2\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607493903256997162.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n除样式属性外，其他属性和`ViewProps`保持一致。样式属性基于`restyle`，把原来用`style`包裹的属性展平，同时采用`Theme`里面定义的约束。具体如下：\n\n### 一般属性\n\n定义参见：[https://reactnative.dev/docs/layout-props](https://reactnative.dev/docs/layout-props)\n\n| 属性            | 必填    | 说明                                | 类型      | 默认值 |\n| --------------- | ------- | ----------------------------------- | --------- | ------ |\n| backgroundColor | `false` | 背景色。取值为 Theme 里面的`colors` | `string`  |        |\n| opacity         | `false` | 透明度。取值 0 - 1                  | `number`  | `1`    |\n| visible         | `false` | 是否可见                            | `boolean` | `true` |\n\n### 内边距、外边距相关属性\n\n取值为 Theme 里面的`spacing`。\n\n定义参见：[https://reactnative.dev/docs/layout-props](https://reactnative.dev/docs/layout-props)\n\n| 属性              | 必填    | 说明 | 类型 | 默认值 |\n| ----------------- | ------- | ---- | ---- | ------ |\n| margin            | `false` |      |      |        |\n| marginStart       | `false` |      |      |        |\n| marginEnd         | `false` |      |      |        |\n| marginHorizontal  | `false` |      |      |        |\n| marginVertical    | `false` |      |      |        |\n| marginLeft        | `false` |      |      |        |\n| marginRight       | `false` |      |      |        |\n| marginBottom      | `false` |      |      |        |\n| marginTop         | `false` |      |      |        |\n| padding           | `false` |      |      |        |\n| paddingStart      | `false` |      |      |        |\n| paddingEnd        | `false` |      |      |        |\n| paddingHorizontal | `false` |      |      |        |\n| paddingVertical   | `false` |      |      |        |\n| paddingLeft       | `false` |      |      |        |\n| paddingRight      | `false` |      |      |        |\n| paddingBottom     | `false` |      |      |        |\n| paddingTop        | `false` |      |      |        |\n\n### 宽高布局相关属性\n\n定义参见：[https://reactnative.dev/docs/layout-props](https://reactnative.dev/docs/layout-props)\n\n| 属性           | 必填    | 说明 | 类型 | 默认值 |\n| -------------- | ------- | ---- | ---- | ------ |\n| width          | `false` |      |      |        |\n| minWidth       | `false` |      |      |        |\n| maxWidth       | `false` |      |      |        |\n| height         | `false` |      |      |        |\n| maxHeight      | `false` |      |      |        |\n| minHeight      | `false` |      |      |        |\n| flex           | `false` |      |      |        |\n| flexDirection  | `false` |      |      |        |\n| flexBasis      | `false` |      |      |        |\n| flexGrow       | `false` |      |      |        |\n| flexShrink     | `false` |      |      |        |\n| flexWrap       | `false` |      |      |        |\n| alignContent   | `false` |      |      |        |\n| alignItems     | `false` |      |      |        |\n| alignSelf      | `false` |      |      |        |\n| justifyContent | `false` |      |      |        |\n| aspectRatio    | `false` |      |      |        |\n| overflow       | `false` |      |      |        |\n\n### 定位相关属性\n\n定义参见：[https://reactnative.dev/docs/layout-props](https://reactnative.dev/docs/layout-props)\n\n| 属性     | 必填    | 说明 | 类型 | 默认值 |\n| -------- | ------- | ---- | ---- | ------ |\n| position | `false` |      |      |        |\n| start    | `false` |      |      |        |\n| end      | `false` |      |      |        |\n| left     | `false` |      |      |        |\n| right    | `false` |      |      |        |\n| bottom   | `false` |      |      |        |\n| top      | `false` |      |      |        |\n| zIndex   | `false` |      |      |        |\n\n### 边框相关属性\n\n定义参见：[https://reactnative.dev/docs/view-style-props](https://reactnative.dev/docs/view-style-props)\n\n| 属性                    | 必填    | 说明 | 类型 | 默认值 |\n| ----------------------- | ------- | ---- | ---- | ------ |\n| borderWidth             | `false` |      |      |        |\n| borderLeftWidth         | `false` |      |      |        |\n| borderRightWidth        | `false` |      |      |        |\n| borderBottomWidth       | `false` |      |      |        |\n| borderTopWidth          | `false` |      |      |        |\n| borderStartWidth        | `false` |      |      |        |\n| borderEndWidth          | `false` |      |      |        |\n| borderStyle             | `false` |      |      |        |\n| borderColor             | `false` |      |      |        |\n| borderStartColor        | `false` |      |      |        |\n| borderEndColor          | `false` |      |      |        |\n| borderLeftColor         | `false` |      |      |        |\n| borderRightColor        | `false` |      |      |        |\n| borderBottomColor       | `false` |      |      |        |\n| borderTopColor          | `false` |      |      |        |\n| borderRadius            | `false` |      |      |        |\n| borderBottomStartRadius | `false` |      |      |        |\n| borderBottomEndRadius   | `false` |      |      |        |\n| borderBottomLeftRadius  | `false` |      |      |        |\n| borderBottomRightRadius | `false` |      |      |        |\n| borderTopStartRadius    | `false` |      |      |        |\n| borderTopEndRadius      | `false` |      |      |        |\n| borderTopLeftRadius     | `false` |      |      |        |\n| borderTopRightRadius    | `false` |      |      |        |\n\n### 阴影相关属性\n\n定义参见：[https://reactnative.dev/docs/shadow-props](https://reactnative.dev/docs/shadow-props)\n\n| 属性          | 必填    | 说明 | 类型 | 默认值 |\n| ------------- | ------- | ---- | ---- | ------ |\n| elevation     | `false` |      |      |        |\n| shadowOffset  | `false` |      |      |        |\n| shadowOpacity | `false` |      |      |        |\n| shadowRadius  | `false` |      |      |        |\n| shadowColor   | `false` |      |      |        |\n"
  },
  {
    "path": "packages/react-native/src/box/index.tsx",
    "content": "// @ts-ignore\nimport NativeView from 'react-native/Libraries/Components/View/ViewNativeComponent';\n\nimport { createBox } from '@shopify/restyle';\n\nimport { Theme } from '../theme';\n\nconst Box = createBox<Theme>(NativeView);\nBox.displayName = 'Box';\nBox.defaultProps = {\n  pointerEvents: 'box-none',\n};\n\nexport default Box;\n"
  },
  {
    "path": "packages/react-native/src/box-shadow/index.md",
    "content": "---\ntitle: BoxShadow - 阴影组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /other\n---\n\n# BoxShadow 盒子组件\n\n原样暴露[react-native-shadow-2](https://github.com/SrBrahma/react-native-shadow-2)的属性，可以自定义阴影的样式。\n"
  },
  {
    "path": "packages/react-native/src/box-shadow/index.tsx",
    "content": "import React, { FC } from 'react';\n\nlet Shadow: any;\nlet ShadowProps: any;\n\ntry {\n  ({ Shadow, ShadowProps } = require('react-native-shadow-2'));\n} catch (error) {\n  throw new Error(\n    'The dependency \"react-native-shadow-2\" is not installed. Please install it to use the BoxShadow component.'\n  );\n}\n\nconst BoxShadow: FC<typeof ShadowProps> = props => {\n  return <Shadow {...props} />;\n};\nBoxShadow.displayName = 'BoxShadow';\n\nexport default BoxShadow;\n"
  },
  {
    "path": "packages/react-native/src/brief/index.tsx",
    "content": "import React, { memo, ReactNode } from 'react';\n\nimport Box from '../box';\nimport Text from '../text';\n\nconst Brief = memo(({ brief }: { brief?: ReactNode }) => {\n  if (!brief) return null;\n  return (\n    <Box marginLeft=\"x1\">\n      {typeof brief === 'string' ? (\n        <Text variant=\"p2\" color=\"text\">\n          {brief}\n        </Text>\n      ) : (\n        brief\n      )}\n    </Box>\n  );\n});\n\nexport default Brief;\n"
  },
  {
    "path": "packages/react-native/src/button/index.md",
    "content": "---\ntitle: Button - 按钮组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n  order: 8\n---\n\n# Button 按钮组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Button title=\"按钮\" onPress={() => Alert.alert('hello, Button')} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643094661379223377.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. type='secondary'\n\n```tsx | pure\n<Button title=\"按钮\" type=\"secondary\" onPress={() => Alert.alert('hello, Button')} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643094817445413324.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. loading 状态（不响应点击事件）\n\n```tsx | pure\n<Button title=\"按钮\" loading onPress={() => Alert.alert('hello, Button')} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643094995808075383.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 禁用按钮\n\n```tsx | pure\n<Button title=\"按钮\" disabled onPress={() => Alert.alert('hello, Button')} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643095088204101287.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 设置按钮宽度\n\n```tsx | pure\n<Button title=\"按钮\" width=\"80%\" onPress={() => Alert.alert('hello, Button')} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643095170934109065.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 设置按钮圆角大小\n\n```tsx | pure\n<Button title=\"按钮\" borderRadius={20} onPress={() => Alert.alert('hello, Button')} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643095234774951875.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n组件属性继承`SpacingProps`，其余属性如下：\n\n| 属性         | 必填    | 说明         | 类型                            | 默认值    |\n| ------------ | ------- | ------------ | ------------------------------- | --------- |\n| title        | `true`  | 按钮文字内容 | `ReactNode`                     |           |\n| type         | `false` | 按钮展示类型 | `primary` \\| `secondary`        | `primary` |\n| disabled     | `false` | 是否失效     | `boolean`                       | `false`   |\n| loading      | `false` | 是否加载中   | `boolean`                       |           |\n| onPress      | `true`  | 按钮点击事件 | `() => void`                    |           |\n| width        | `false` | 按钮宽度     | `number` \\| `string`            | `100%`    |\n| borderRadius | `false` | 圆角大小     | `number`                        | `px(4)`   |\n| bordered     | `false` | 是否显示边框 | `boolean`                       | `true`    |\n| size         | `false` | 按钮大小     | `default` \\| `small` \\| `large` | `default` |\n| style        | `false` | 自定义样式   | `ViewStyle`                     |           |\n"
  },
  {
    "path": "packages/react-native/src/button/index.tsx",
    "content": "import React, { FC, ReactNode, useMemo } from 'react';\nimport { DimensionValue } from 'react-native';\n\nimport helpers from '../helpers';\nimport UIActivityIndicator from '../indicator/UIActivityIndicator';\nimport Pressable, { PressableProps } from '../pressable';\nimport Text from '../text';\nimport useButton from './useButton';\n\nconst { px } = helpers;\nexport type ButtonProps = PressableProps & {\n  /** 按钮文字内容 */\n  title: ReactNode;\n  /** 按钮展示类型 */\n  type?: 'primary' | 'secondary';\n  /** 是否失效 */\n  disabled?: boolean;\n  /** 是否加载中 */\n  loading?: boolean;\n  /** 按钮点击事件 */\n  onPress: () => void;\n  /** 按钮的宽度 */\n  width?: DimensionValue;\n  /** 圆角 */\n  borderRadius?: number;\n  /** 不显示border */\n  bordered?: boolean;\n  /** 按钮大小 */\n  size?: 'default' | 'small' | 'large';\n};\n\nconst Button: FC<ButtonProps> = props => {\n  const { loading, title } = props;\n\n  const { pressableProps, textColor, variant, indicatorColor, loadingIconSize } = useButton(props);\n\n  const Title = useMemo(() => {\n    if (typeof title === 'string')\n      return (\n        <Text variant={variant} color={textColor}>\n          {title}\n        </Text>\n      );\n    return title;\n  }, [title, textColor, variant]);\n\n  return (\n    <Pressable {...pressableProps}>\n      {!!loading && (\n        <UIActivityIndicator\n          color={indicatorColor}\n          size={loadingIconSize}\n          animating={loading}\n          style={{ marginRight: px(4) }}\n        />\n      )}\n      {Title}\n    </Pressable>\n  );\n};\nButton.displayName = 'Button';\n\nexport default Button;\n"
  },
  {
    "path": "packages/react-native/src/button/useButton.ts",
    "content": "import { useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport type { ButtonProps } from '.';\nimport helpers from '../helpers';\nimport { PressableProps } from '../pressable';\nimport { Color, Theme, Variant } from '../theme';\n\nconst { px, ONE_PIXEL } = helpers;\n\nexport default function useButton(props: ButtonProps) {\n  const theme = useTheme<Theme>();\n  const {\n    loading,\n    type = 'primary',\n    width = '100%',\n    size = 'default',\n    disabled = false,\n    borderRadius = theme.borderRadii.x1,\n    onPress,\n    bordered = true,\n    style,\n    ...restProps\n  } = props;\n\n  let textColor: Color = 'text_active';\n  let backgroundColor = theme.colors.transparent;\n  let indicatorColor = disabled ? theme.colors.gray200 : theme.colors.white;\n\n  if (type === 'primary') {\n    backgroundColor = disabled ? theme.colors.primary400 : theme.colors.primary200;\n  } else if (type === 'secondary') {\n    textColor = disabled ? 'gray200' : 'primary200';\n    backgroundColor = disabled ? theme.colors.disabled : theme.colors.transparent;\n    indicatorColor = disabled ? theme.colors.gray200 : theme.colors.primary200;\n  }\n\n  let borderWidth = 0;\n  if (bordered) {\n    borderWidth = type === 'secondary' ? ONE_PIXEL : 0;\n  }\n\n  const { variant, paddingVertical, loadingIconSize } = useMemo(() => {\n    switch (size) {\n      case 'default':\n      default:\n        return {\n          variant: 'p1' as Variant,\n          paddingVertical: theme.spacing.x2,\n          loadingIconSize: px(16),\n        };\n\n      case 'large':\n        return {\n          variant: 'p0' as Variant,\n          paddingVertical: theme.spacing.x3,\n          loadingIconSize: px(20),\n        };\n\n      case 'small':\n        return {\n          variant: 'p2' as Variant,\n          paddingVertical: theme.spacing.x1,\n          loadingIconSize: px(12),\n        };\n    }\n  }, [size]);\n\n  /** 容器属性 */\n  const pressableProps: PressableProps = {\n    disabled,\n    onPress: () => {\n      if (loading) return;\n      onPress?.();\n    },\n    activeOpacity: disabled ? 1 : 0.6,\n    style: StyleSheet.flatten([\n      {\n        width,\n        flexDirection: 'row',\n        justifyContent: 'center',\n        alignItems: 'center',\n        backgroundColor,\n        borderWidth,\n        borderColor:\n          type === 'primary' ? theme.colors.border : disabled ? theme.colors.disabled : theme.colors.primary200,\n        borderRadius,\n        paddingVertical,\n      },\n      style,\n    ]),\n    ...restProps,\n  };\n\n  return {\n    variant,\n    textColor,\n    indicatorColor,\n    pressableProps,\n    loadingIconSize,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/button-group/Item.tsx",
    "content": "import React, { cloneElement, FC, memo, ReactElement, ReactNode, useMemo } from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Spacing, Theme } from '../theme';\n\nexport interface ButtonGroupOption {\n  /** 文本或者组件 */\n  label: ReactNode;\n  /** 按下的回调函数 */\n  onPress?: () => void;\n}\ninterface ItemProps extends ButtonGroupOption {\n  /** 自定义Item样式 */\n  itemStyle?: StyleProp<ViewStyle>;\n  /** 尺寸 */\n  size?: Spacing;\n  /** 是否禁用 */\n  disabled: boolean;\n  /** 序号 */\n  index: number;\n  /** 点击事件 */\n  onItemPress: (index: number) => void;\n  isFirst: boolean;\n  isLast: boolean;\n  isCurrent: boolean;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nconst ButtonItem: FC<ItemProps> = ({\n  label,\n  onItemPress,\n  onPress,\n  itemStyle,\n  disabled,\n  size = 'x2',\n  index,\n  isFirst,\n  isLast,\n  isCurrent,\n  activeOpacity,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const styles = StyleSheet.create({\n    item: {\n      backgroundColor: isCurrent ? theme.colors.primary200 : theme.colors.white,\n      borderColor: theme.colors.primary200,\n      padding: theme.spacing[size],\n      display: 'flex',\n      alignItems: 'center',\n      flex: 1,\n      borderTopWidth: 1,\n      borderBottomWidth: 1,\n      borderRightWidth: 1,\n    },\n    first: {\n      borderTopStartRadius: theme.borderRadii.x1,\n      borderBottomStartRadius: theme.borderRadii.x1,\n      borderLeftWidth: 1,\n    },\n    last: {\n      borderTopEndRadius: theme.borderRadii.x1,\n      borderBottomEndRadius: theme.borderRadii.x1,\n      borderRightWidth: 1,\n      borderLeftWidth: 0,\n    },\n  });\n\n  const Label = useMemo(() => {\n    const textColor = isCurrent ? theme.colors.text_active : theme.colors.primary200;\n\n    if (typeof label === 'string')\n      return (\n        <Text\n          variant={'p1'}\n          textAlign={'center'}\n          style={{\n            color: disabled ? theme.colors.gray200 : textColor,\n          }}\n        >\n          {label}\n        </Text>\n      );\n    return cloneElement(label as ReactElement, {\n      style: {\n        color: textColor,\n      },\n    });\n  }, [label, isCurrent, disabled, theme.colors.primary200, theme.colors.text_active, theme.colors.gray200]);\n\n  if (!disabled)\n    return (\n      <Pressable\n        activeOpacity={activeOpacity}\n        onPress={() => {\n          onItemPress(index);\n          onPress?.();\n        }}\n        style={StyleSheet.flatten([styles.item, isFirst && styles.first, isLast && styles.last, itemStyle])}\n      >\n        {Label}\n      </Pressable>\n    );\n\n  return (\n    <Box style={StyleSheet.flatten([styles.item, isFirst && styles.first, isLast && styles.last, itemStyle])}>\n      {Label}\n    </Box>\n  );\n};\n\nexport default memo(ButtonItem);\n"
  },
  {
    "path": "packages/react-native/src/button-group/index.md",
    "content": "---\ntitle: ButtonGroup - 按钮组组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# ButtonGroup 按钮组组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<ButtonGroup\n  options={[\n    {\n      label: 'test1',\n      onPress: () => {\n        console.log(111);\n      },\n    },\n    { label: 'test2' },\n    { label: 'test3' },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"buttonGroup-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607765928867208467.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2.设置不同 Size 的按钮组\n\n```tsx | pure\n<WhiteSpace />\n<ButtonGroup\n  options={[{ label: 'L' }, { label: 'R' }]}\n  size='x5'\n  containerStyle={{ width: '75%' }}\n/>\n<WhiteSpace />\n<ButtonGroup\n  options={[{ label: 'L' }, { label: 'R' }]}\n  containerStyle={{ width: '50%' }}\n/>\n<WhiteSpace />\n<ButtonGroup\n  options={[{ label: 'L' }, { label: 'R' }]}\n  size='x1'\n  containerStyle={{ width: '25%' }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"buttonGroup-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607766005198871809.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义样式\n\n```tsx | pure\n<ButtonGroup\n  options={[{ label: 'test1', style: { backgroundColor: 'pink' } }, { label: 'test2' }, { label: 'test3' }]}\n  disabledItems={[1]}\n  containerStyle={{ padding: px(2), backgroundColor: '#005DFF', borderRadius: px(4) }}\n/>\n<WhiteSpace />\n<ButtonGroup\n  options={[{ label: '年' }, { label: '月' }, { label: '周' }]}\n  size='x2'\n  containerStyle={{ width: '50%' }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"buttonGroup-ios3.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607766073303038285.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 内容为自定义图标（组件）\n\n```tsx | pure\n<ButtonGroup\n  options={[\n    {\n      label: <Icon name=\"star\" />,\n    },\n    {\n      label: <Icon name=\"star\" />,\n    },\n    {\n      label: <Icon name=\"star\" />,\n    },\n    {\n      label: <Icon name=\"star\" />,\n    },\n    {\n      label: <Icon name=\"star\" />,\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"buttonGroup-ios4.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607766030643665923.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### ButtonGroup API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| options | `true` | 指定可选项 | `Option[]` |  |\n| size | `false` | 尺寸 | `xxs` \\| `xs` \\| `s` \\| `m` \\| `l` \\| `xl` \\| `xxl` | `m` |\n| disabledItems | `false` | 设置禁用的项，值为 options 的数组下标 | `number[]` |  |\n| activeIndex | `false` | 默认处于点击状态的 Item，值为 options 的数组下标 | `number` |  |\n| activeOpacity | `false` | 未禁用时的不透明度 | `number` | `0.6` |\n| itemStyle | `false` | 自定义 Item 样式 | `ViewStyle` |  |\n| containerStyle | `false` | 自定义容器样式 | `ViewStyle` |  |\n\n### Option 类型\n\n| 属性    | 必填    | 说明           | 类型                   | 默认值 |\n| ------- | ------- | -------------- | ---------------------- | ------ |\n| label   | `true`  | 文本或者组件   | `ReactNode`            |        |\n| onPress | `false` | 按下的回调函数 | `() => void`           |        |\n| style   | `false` | 自定义样式     | `StyleProp<ViewStyle>` |        |\n"
  },
  {
    "path": "packages/react-native/src/button-group/index.tsx",
    "content": "import React, { FC, useEffect } from 'react';\nimport { Keyboard, StyleProp, ViewStyle } from 'react-native';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport { Spacing } from '../theme';\nimport ButtonItem, { ButtonGroupOption } from './Item';\n\nexport interface ButtonGroupProps {\n  /** 指定可选项 */\n  options: ButtonGroupOption[];\n  /** 尺寸 */\n  size?: Spacing;\n  /** 设置禁用的项，值为options的数组下标 */\n  disabledItems?: number[];\n  /** 默认处于点击状态的Item，值为 options 的数组下标 */\n  activeIndex?: number;\n  /** 自定义Item样式 */\n  itemStyle?: StyleProp<ViewStyle>;\n  /** 自定义容器样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n  /** 未禁用时的不透明度 */\n  activeOpacity?: number;\n}\n\nconst ButtonGroup: FC<ButtonGroupProps> = ({\n  disabledItems = [],\n  containerStyle,\n  options = [],\n  activeIndex,\n  itemStyle,\n  size,\n  activeOpacity = 0.6,\n}) => {\n  const [active, setActive] = useSafeState(activeIndex);\n\n  useEffect(() => {\n    setActive(activeIndex);\n  }, [activeIndex]);\n\n  if (options.length === 0) return null;\n\n  const handlePress = useMemoizedFn(index => {\n    Keyboard.dismiss();\n    setActive(index);\n  });\n\n  return (\n    <Box style={containerStyle}>\n      <Flex flexWrap=\"nowrap\">\n        {options.map((item, index, array) => (\n          <ButtonItem\n            key={index}\n            {...item}\n            {...{ activeOpacity }}\n            index={index}\n            size={size}\n            disabled={disabledItems.includes(index)}\n            onItemPress={handlePress}\n            itemStyle={itemStyle}\n            isCurrent={active === index}\n            isFirst={index === 0}\n            isLast={index === array.length - 1}\n          />\n        ))}\n      </Flex>\n    </Box>\n  );\n};\nButtonGroup.displayName = 'ButtonGroup';\n\nexport default ButtonGroup;\n"
  },
  {
    "path": "packages/react-native/src/card/index.md",
    "content": "---\ntitle: Card - 卡片组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n---\n\n# Card 卡片组件\n\n## 效果演示\n\n### 1. 标准的 Card\n\n```tsx | pure\n<Card\n  icon={<Icon name=\"user\" color=\"green\" />}\n  title=\"我是标题\"\n  extra=\"说明文字\"\n  footer={\n    <Box>\n      <Text variant=\"primaryTip\">底部文字</Text>\n    </Box>\n  }\n>\n  <Text variant=\"secondaryBodyReverse\">\n    我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n    我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n  </Text>\n</Card>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607514164797819749.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 没有 footer 的 Card\n\n```tsx | pure\n<Card title=\"我是标题\" extra=\"说明文字\">\n  <Text variant=\"secondaryBodyReverse\">\n    我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n    我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n  </Text>\n</Card>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios2\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607514257388033912.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义 Header 的 Card\n\n```tsx | pure\n<Card\n  renderHeader={() => (\n    <Box>\n      <Text variant=\"primaryBody\">自定义标题</Text>\n    </Box>\n  )}\n>\n  <Text variant=\"secondaryBodyReverse\">\n    我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n    我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n  </Text>\n</Card>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios3\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607514356040261698.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 只有 body 的 Card\n\n```tsx | pure\n<Card renderHeader={() => <Text variant=\"primaryBody\">自定义标题</Text>} hideHeader>\n  <Text variant=\"secondaryBodyReverse\">\n    我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n  </Text>\n</Card>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios4\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607514417328538607.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性           | 必填    | 说明                   | 类型              | 默认值  |\n| -------------- | ------- | ---------------------- | ----------------- | ------- |\n| icon           | `false` | header 左侧的图标      | `ReactNode`       |         |\n| title          | `false` | header 的文字          | `ReactNode`       |         |\n| extra          | `false` | header 右侧的图标      | `ReactNode`       |         |\n| renderHeader   | `false` | 自定义渲染标题         | `() => ReactNode` |         |\n| hideHeader     | `false` | 是否隐藏标题           | `boolean`         | `false` |\n| footer         | `false` | 底部容器。不传时不渲染 | `ReactNode`       |         |\n| containerStyle | `false` | 容器的样式             | `ViewStyle`       |         |\n| contentStyle   | `false` | 容器 body 的样式       | `ViewStyle`       |         |\n"
  },
  {
    "path": "packages/react-native/src/card/index.tsx",
    "content": "import React, { FC, memo, ReactNode } from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Brief from '../brief';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { Theme } from '../theme';\n\nconst { ONE_PIXEL } = helpers;\nexport interface CardProps {\n  /** 图标 */\n  icon?: ReactNode;\n  /** 标题 */\n  title?: ReactNode;\n  /** 标题右边内容 */\n  extra?: ReactNode;\n  /** 自定义渲染标题 */\n  renderHeader?: () => ReactNode;\n  /** 是否隐藏标题 */\n  hideHeader?: boolean;\n  /** 底部内容 */\n  footer?: ReactNode;\n  /** 容器样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n  /** 容器内content样式 */\n  contentStyle?: StyleProp<ViewStyle>;\n  /** 子组件 */\n  children?: ReactNode;\n}\n\n/**\n * Card 组件由Header（可选）/Content/Footer（可选）三部分组成\n */\nconst Card: FC<CardProps> = ({\n  icon,\n  title,\n  extra,\n  renderHeader,\n  footer,\n  hideHeader,\n  containerStyle,\n  contentStyle,\n  children,\n}) => {\n  return (\n    <Box\n      backgroundColor=\"white\"\n      borderWidth={ONE_PIXEL}\n      borderColor=\"border\"\n      borderRadius={'x2'}\n      style={containerStyle}\n    >\n      {renderHeader ? renderHeader() : <Header {...{ hideHeader, icon, title, extra }} />}\n      <Body {...{ footer, contentStyle }}>{children}</Body>\n      {!!footer && <Box padding=\"x2\">{footer}</Box>}\n    </Box>\n  );\n};\nCard.displayName = 'Card';\n\nexport default Card;\n\nconst Header = memo(\n  ({ hideHeader, icon, title, extra }: Pick<CardProps, 'hideHeader' | 'icon' | 'title' | 'extra'>) => {\n    if (hideHeader) return null;\n\n    const Header = (\n      <Flex justifyContent=\"space-between\">\n        {!!(icon || title) && (\n          <Flex>\n            {!!icon && <Box>{icon}</Box>}\n            {!!title && (\n              <Box>\n                {typeof title === 'string' ? (\n                  <Text variant=\"p0\" color=\"text\">\n                    {title}\n                  </Text>\n                ) : (\n                  title\n                )}\n              </Box>\n            )}\n          </Flex>\n        )}\n        <Brief brief={extra} />\n      </Flex>\n    );\n\n    return (\n      <Box\n        borderBottomWidth={ONE_PIXEL}\n        borderBottomColor=\"border\"\n        paddingHorizontal=\"x2\"\n        paddingVertical={'x2'}\n        justifyContent=\"center\"\n      >\n        {Header}\n      </Box>\n    );\n  }\n);\n\nconst Body = memo(({ footer, contentStyle, children }: Pick<CardProps, 'footer' | 'contentStyle' | 'children'>) => {\n  const theme = useTheme<Theme>();\n\n  return (\n    <Box\n      padding=\"x2\"\n      style={\n        footer\n          ? StyleSheet.compose(\n              {\n                borderBottomWidth: ONE_PIXEL,\n                borderBottomColor: theme.colors.border,\n                paddingBottom: theme.spacing.x2,\n              },\n              contentStyle\n            )\n          : contentStyle\n      }\n    >\n      {children}\n    </Box>\n  );\n});\n"
  },
  {
    "path": "packages/react-native/src/carousel/Bullets.tsx",
    "content": "import React, { memo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport { Theme } from '../theme';\nimport { mix, mixColor } from '../utils/redash';\nimport { CarouselProps } from './type';\n\nconst justifyContentMap = {\n  left: 'flex-start',\n  right: 'flex-end',\n  center: 'center',\n};\n\nconst Bullets = ({\n  indicatorEnabled,\n  indicatorSize,\n  activeColor,\n  inactiveColor,\n  currentIndex,\n  count,\n  width,\n  align,\n}: Required<Pick<CarouselProps, 'indicatorEnabled' | 'indicatorSize' | 'width' | 'align'>> &\n  Pick<CarouselProps, 'activeColor' | 'inactiveColor'> & {\n    currentIndex: number;\n    count: number;\n  }) => {\n  if (!indicatorEnabled) return null;\n\n  const styles = StyleSheet.create({\n    dot: {\n      bottom: indicatorSize,\n      justifyContent: justifyContentMap[align] as any,\n    },\n  });\n\n  return (\n    <Box\n      position={'absolute'}\n      alignItems={'center'}\n      width={width}\n      left={0}\n      right={0}\n      flexDirection={'row'}\n      style={styles.dot}\n    >\n      {Array(count)\n        .fill('')\n        .map((_, index) => (\n          <Dot key={index} isCurrent={currentIndex === index} {...{ activeColor, inactiveColor, indicatorSize }} />\n        ))}\n    </Box>\n  );\n};\nBullets.displayName = 'Bullets';\n\nexport default memo(Bullets);\n\nconst Dot = memo(\n  (props: { isCurrent: boolean; activeColor?: string; inactiveColor?: string; indicatorSize: number }) => {\n    const theme = useTheme<Theme>();\n    const { isCurrent, activeColor = theme.colors.gray50, inactiveColor = theme.colors.gray200, indicatorSize } = props;\n\n    const backgroundColor = mixColor(+isCurrent, inactiveColor, activeColor) as any;\n    const scale = mix(+isCurrent, 1, 1.2);\n\n    const styles = StyleSheet.create({\n      dot: {\n        width: indicatorSize,\n        height: indicatorSize,\n        borderRadius: indicatorSize / 2,\n        backgroundColor,\n        transform: [{ scale }],\n        marginHorizontal: indicatorSize / 2,\n      },\n    });\n\n    return <Animated.View style={styles.dot} />;\n  }\n);\n"
  },
  {
    "path": "packages/react-native/src/carousel/index.md",
    "content": "---\ntitle: Carousel - 轮播组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Carousel 轮播组件\n\n## 效果演示\n\n### 1. 默认配置\n\n```tsx | pure\n<Carousel>\n  <Image source={require('../../assets/images/img-01.jpg')} />\n  <Image source={require('../../assets/images/img-02.jpg')} />\n  <Image source={require('../../assets/images/img-03.jpeg')} />\n</Carousel>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"Carousel-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607584871809874524.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 宽度 200，高度 100\n\n```tsx | pure\n<Carousel width={px(200)} height={px(100)}>\n  <Image source={require('../../assets/images/img-01.jpg')} />\n  <Image source={require('../../assets/images/img-02.jpg')} />\n  <Image source={require('../../assets/images/img-03.jpeg')} />\n</Carousel>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"Carousel-ios2.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607585106049348222.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 轮播时长为 1000 毫秒\n\n```tsx | pure\n<Carousel duration={1000}>\n  <Image source={require('../../assets/images/img-01.jpg')} />\n  <Image source={require('../../assets/images/img-02.jpg')} />\n  <Image source={require('../../assets/images/img-03.jpeg')} />\n</Carousel>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"Carousel-ios5.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607585607849541264.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 修改指示器颜色\n\n```tsx | pure\n<Carousel dotColor=\"gold\">\n  <Image source={require('../../assets/images/img-01.jpg')} />\n  <Image source={require('../../assets/images/img-02.jpg')} />\n  <Image source={require('../../assets/images/img-03.jpeg')} />\n</Carousel>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"Carousel-ios8.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607586190454474657.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性             | 必填    | 说明               | 类型        | 默认值        |\n| ---------------- | ------- | ------------------ | ----------- | ------------- |\n| auto             | `false` | 是否自动滚动       | `boolean`   | `true`        |\n| width            | `false` | 轮播图宽度         | `number`    | `deviceWidth` |\n| height           | `false` | 轮播图高度         | `number`    | `320`         |\n| duration         | `false` | 轮播时长（毫秒）   | `number`    | `2000`        |\n| indicatorEnabled | `false` | 是否显示滚动指示器 | `boolean`   | `true`        |\n| indicatorSize    | `false` | 指示器大小         | `number`    | `10`          |\n| activeColor      | `false` | 原点选中时颜色     | `string`    | `#fff`        |\n| inactiveColor    | `false` | 原点未选中时颜色   | `string`    | `#fff`        |\n| align            | `false` | 指示器布局方式。   | `AlignType` | `center`      |\n\n`AlignType`的类型如下：\n\n```ts\ntype AlignType = 'left' | 'center' | 'right';\n```\n"
  },
  {
    "path": "packages/react-native/src/carousel/index.tsx",
    "content": "import React, { Children, cloneElement, FC, isValidElement, ReactElement } from 'react';\nimport Animated from 'react-native-reanimated';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Bullets from './Bullets';\nimport { CarouselProps } from './type';\nimport useCarousel from './useCarousel';\n\nconst { deviceWidth, px } = helpers;\n\nconst Carousel: FC<CarouselProps> = ({\n  auto = true,\n  width = deviceWidth,\n  height = px(320),\n  duration = 2000,\n  indicatorEnabled = true,\n  indicatorSize = px(10),\n  align = 'center',\n  activeColor,\n  inactiveColor,\n  children,\n}) => {\n  // 放到hooks里面就不起作用了...\n  const validChildren = Children.toArray(children)\n    .filter(child => isValidElement(child))\n    .map(child =>\n      cloneElement(child as ReactElement, {\n        ...(child as ReactElement).props,\n        style: {\n          ...(child as ReactElement).props.style,\n          width,\n          height,\n        },\n      })\n    );\n\n  const count = validChildren.length;\n  const { onTouchStart, onTouchEnd, onScrollEnd, currentIndex, scrollViewRef } = useCarousel({\n    auto,\n    width,\n    duration,\n    count,\n  });\n\n  return (\n    <Box width={width} height={height}>\n      <Animated.ScrollView\n        ref={scrollViewRef}\n        horizontal={true}\n        showsHorizontalScrollIndicator={false}\n        showsVerticalScrollIndicator={false}\n        snapToAlignment={'center'}\n        bounces={false}\n        scrollEnabled\n        pagingEnabled\n        scrollEventThrottle={1}\n        decelerationRate={'fast'}\n        onTouchStart={onTouchStart}\n        onTouchEnd={onTouchEnd}\n        onMomentumScrollEnd={onScrollEnd}\n        style={{ height }}\n      >\n        {validChildren}\n      </Animated.ScrollView>\n      <Bullets\n        {...{ indicatorEnabled, indicatorSize, activeColor, inactiveColor, align, currentIndex, count, width }}\n      />\n    </Box>\n  );\n};\nCarousel.displayName = 'Carousel';\n\nexport default Carousel;\n"
  },
  {
    "path": "packages/react-native/src/carousel/type.ts",
    "content": "import { PropsWithChildren } from 'react';\n\nexport type AlignType = 'left' | 'center' | 'right';\nexport type CarouselProps = PropsWithChildren<{\n  /** 自动滚动 */\n  auto?: boolean;\n  /** 宽度 */\n  width?: number;\n  /** 高度 */\n  height?: number;\n  /** 停留时长 */\n  duration?: number;\n  /** 是否显示原点指示器 */\n  indicatorEnabled?: boolean;\n  /** 指示器大小 */\n  indicatorSize?: number;\n  /** 原点选中时颜色 */\n  activeColor?: string;\n  /** 原点未选中时颜色 */\n  inactiveColor?: string;\n  /** 指示器位置 */\n  align?: AlignType;\n}>;\n"
  },
  {
    "path": "packages/react-native/src/carousel/useCarousel.ts",
    "content": "import { useEffect, useRef } from 'react';\nimport { NativeScrollEvent, NativeSyntheticEvent } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { CarouselProps } from './type';\n\nexport default function useCarousel({\n  auto,\n  width,\n  duration,\n  count,\n}: Required<Pick<CarouselProps, 'auto' | 'width' | 'duration'>> & { count: number }) {\n  const scrollViewRef = useRef<Animated.ScrollView>(null);\n  const timer = useRef<ReturnType<typeof setInterval>>();\n\n  const [currentIndex, setCurrentIndex] = useSafeState(0);\n\n  const loop = useMemoizedFn(() => {\n    setCurrentIndex(index => (index === count - 1 ? 0 : index + 1));\n  });\n\n  // 用户手动滚动开始时，停止轮播\n  const clearTimer = useMemoizedFn(() => {\n    clearInterval(timer.current);\n    timer.current = undefined;\n  });\n\n  useEffect(() => {\n    if (!auto) return;\n\n    timer.current = setInterval(loop, duration);\n\n    return () => clearTimer();\n  }, [loop, auto, duration]);\n\n  useEffect(() => {\n    scrollViewRef.current?.scrollTo({ animated: true, y: 0, x: width * currentIndex });\n  }, [currentIndex]);\n\n  const startTimer = () => {\n    timer.current = setInterval(loop, duration);\n  };\n\n  // 在ScrollView滚动结束后，修改当前index\n  const onScrollEnd = (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n    const { x } = e.nativeEvent.contentOffset;\n    const index = Math.ceil(x / width);\n    setCurrentIndex(index);\n    if (auto && !timer.current) {\n      startTimer();\n    }\n  };\n\n  // 如果是自动轮播，手指离开屏幕后，重新开始轮播\n  const onTouchEnd = () => {\n    if (auto && !timer.current) {\n      startTimer();\n    }\n  };\n\n  return {\n    scrollViewRef,\n    currentIndex,\n\n    onTouchStart: clearTimer,\n    onTouchEnd: useMemoizedFn(onTouchEnd),\n    onScrollEnd: useMemoizedFn(onScrollEnd),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/center/index.md",
    "content": "---\ntitle: Center - 居中组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n---\n\n# Center 居中组件\n\nCenter 是 flex 布局的一个封装，它的子组件永远处于水平和垂直居中。\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Center>\n  <Box width={90} height={90} backgroundColor=\"func500\" />\n</Center>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643096226546921536.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 在指定了宽高的容器中居中\n\n```tsx | pure\n<Box width={'100%'} height={400} borderWidth={1} borderColor={'border'}>\n  <Center>\n    <Box width={100} height={100} backgroundColor=\"func200\" />\n  </Center>\n</Box>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643096237451002191.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性   | 必填    | 说明 | 类型                 | 默认值 |\n| ------ | ------- | ---- | -------------------- | ------ |\n| width  | `false` | 宽度 | `string` \\| `number` | `100%` |\n| height | `false` | 高度 | `string` \\| `number` | `100%` |\n"
  },
  {
    "path": "packages/react-native/src/center/index.tsx",
    "content": "import React, { FC, PropsWithChildren } from 'react';\nimport { DimensionValue } from 'react-native';\n\nimport Box from '../box';\n\nconst Center: FC<\n  PropsWithChildren<{\n    width?: DimensionValue;\n    height?: DimensionValue;\n  }>\n> = ({ children, width = '100%', height = '100%' }) => {\n  return (\n    <Box justifyContent={'center'} alignItems={'center'} height={height} width={width}>\n      {children}\n    </Box>\n  );\n};\nCenter.displayName = 'Center';\n\nexport default Center;\n"
  },
  {
    "path": "packages/react-native/src/checkbox/CheckboxItem.tsx",
    "content": "import React, { FC, memo, useMemo } from 'react';\nimport { Keyboard, StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport Pressable from '../pressable';\nimport SvgIcon, { IconNames } from '../svg-icon';\nimport Text from '../text';\nimport type { Theme } from '../theme';\nimport type { CheckboxItemProps } from './type';\n\nconst mapping: Record<string, IconNames> = {\n  checked: 'checkboxChecked',\n  unchecked: 'checkboxUnchecked',\n  halfchecked: 'checkboxHalfchecked',\n};\n\nconst CheckboxItem: FC<CheckboxItemProps> = ({\n  mode,\n  size,\n  status,\n  label,\n  value,\n  isLast = false,\n  disabled,\n  itemStyle,\n  labelStyle,\n  onChange,\n  activeOpacity,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const styles = StyleSheet.create({\n    list: {\n      width: '100%',\n    },\n  });\n\n  const handleChange = useMemoizedFn(() => {\n    Keyboard.dismiss();\n    if (disabled) return;\n    onChange?.(value, status);\n  });\n\n  const Label = useMemo(() => {\n    if (typeof label === 'string')\n      return (\n        <Box flex={1}>\n          <Text\n            variant=\"p1\"\n            color={disabled ? 'disabled' : 'text'}\n            style={labelStyle}\n            numberOfLines={1}\n            ellipsizeMode=\"tail\"\n          >\n            {label}\n          </Text>\n        </Box>\n      );\n    return label;\n  }, [disabled, label, labelStyle]);\n\n  if (!disabled)\n    return (\n      <Pressable\n        onPress={handleChange}\n        activeOpacity={activeOpacity}\n        style={[mode === 'list' && styles.list, itemStyle]}\n      >\n        <Flex marginRight={isLast ? 'x0' : 'x2'} style={mode === 'list' && styles.list}>\n          <Box marginRight=\"x1\">\n            <SvgIcon name={mapping[status]} color={theme.colors.primary200} size={size} />\n          </Box>\n          {Label}\n        </Flex>\n      </Pressable>\n    );\n\n  return (\n    <Box style={[mode === 'list' && styles.list, itemStyle]}>\n      <Flex marginRight={isLast ? 'x0' : 'x2'} style={mode === 'list' && styles.list}>\n        <Box marginRight=\"x1\">\n          <SvgIcon name={mapping[status]} color={theme.colors.disabled} size={size} />\n        </Box>\n        {Label}\n      </Flex>\n    </Box>\n  );\n};\nCheckboxItem.displayName = 'CheckboxItem';\n\nexport default memo(CheckboxItem);\n"
  },
  {
    "path": "packages/react-native/src/checkbox/CheckboxList.tsx",
    "content": "import React, { FC } from 'react';\n\nimport Box from '../box';\nimport { ONE_PIXEL, px } from '../helpers/normalize';\nimport CheckboxItem from './CheckboxItem';\nimport type { CheckboxProps } from './type';\nimport useCheckbox from './useCheckbox';\n\nconst CheckboxList: FC<CheckboxProps> = ({\n  value,\n  disabledValue,\n  defaultValue,\n  containerStyle,\n  options,\n  showCheckAll = true,\n  size = px(24),\n  onChange,\n  itemStyle,\n  activeOpacity = 0.6,\n  ...restProps\n}) => {\n  const {\n    transformedOptions = [],\n    checkedAllStatus,\n    handleAllChange,\n    handleChange,\n  } = useCheckbox({\n    options,\n    disabledValue,\n    defaultValue,\n    onChange,\n    value,\n    showCheckAll,\n  });\n\n  return (\n    <Box style={containerStyle}>\n      {showCheckAll && (\n        <Box\n          key=\"checkbox-select-all\"\n          style={itemStyle}\n          justifyContent=\"center\"\n          alignItems=\"flex-start\"\n          paddingLeft=\"x1\"\n          paddingVertical={'x2'}\n          borderBottomWidth={ONE_PIXEL}\n          borderBottomColor=\"border\"\n        >\n          <CheckboxItem\n            mode=\"list\"\n            disabled={false}\n            label=\"全选\"\n            value=\"checkbox-select-all\"\n            status={checkedAllStatus}\n            size={size}\n            onChange={handleAllChange}\n            {...{ activeOpacity }}\n            {...restProps}\n          />\n        </Box>\n      )}\n      {transformedOptions.map(option => {\n        return (\n          <Box\n            key={option.value}\n            style={itemStyle}\n            justifyContent=\"center\"\n            alignItems=\"flex-start\"\n            paddingLeft=\"x1\"\n            paddingVertical={'x2'}\n            borderBottomWidth={ONE_PIXEL}\n            borderBottomColor=\"border\"\n          >\n            <CheckboxItem\n              mode=\"list\"\n              {...option}\n              size={size}\n              onChange={handleChange}\n              {...{ activeOpacity }}\n              {...restProps}\n            />\n          </Box>\n        );\n      })}\n    </Box>\n  );\n};\nCheckboxList.displayName = 'CheckboxList';\n\nexport default CheckboxList;\n"
  },
  {
    "path": "packages/react-native/src/checkbox/index.md",
    "content": "---\ntitle: Checkbox - 复选框\nnav:\n  title: RN 组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n  order: 7\n---\n\n# Checkbox 复选框\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Checkbox\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643097541850634284.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 默认选中一个复选框\n\n```tsx | pure\n<Checkbox\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n  defaultValue={['Pear']}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643097612076589222.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 不显示全选\n\n```tsx | pure\n<Checkbox\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n  showCheckAll={false}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643097712505780986.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 禁用某个复选框\n\n```tsx | pure\n<Checkbox\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n  showCheckAll={false}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643097869657649774.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 复选框列表\n\n```tsx | pure\n<CheckboxList\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"card-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643097786018078990.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Checkbox / CheckboxList\n\n| 属性           | 必填    | 说明                     | 类型                           | 默认值 |\n| -------------- | ------- | ------------------------ | ------------------------------ | ------ |\n| options        | `true`  | 指定可选项               | `RadioOption[]`                |        |\n| value          | `false` | 选中的项                 | `ReactText[]`                  |        |\n| onChange       | `false` | 选中单选框触发的回调函数 | `(value: ReactText[]) => void` |        |\n| defaultValue   | `false` | 默认选中的项             | `ReactText[]`                  |        |\n| size           | `false` | 图标大小                 | `number`                       |        |\n| disabledValue  | `false` | 设置禁用的项             | `ReactText[]`                  |        |\n| containerStyle | `false` | 自定义容器样式           | `ViewStyle`                    |        |\n| itemStyle      | `false` | 自定义单个单选框样式     | `ViewStyle`                    |        |\n| labelStyle     | `false` | 自定义文本样式           | `TextStyle`                    |        |\n| showCheckAll   | `false` | 是否显示全选框           | `boolean`                      | `true` |\n| activeOpacity  | `false` | 未禁用时的不透明度       | `number`                       | `0.6`  |\n\n### CheckboxItem\n\n| 属性       | 必填    | 说明                            | 类型                                              | 默认值 |\n| ---------- | ------- | ------------------------------- | ------------------------------------------------- | ------ |\n| itemStyle  | `false` | 自定义单个单选框样式            | `ViewStyle`                                       |        |\n| labelStyle | `false` | 自定义文本样式                  | `TextStyle`                                       |        |\n| size       | `false` | 图标大小                        | `number`                                          |        |\n| label      | `true`  | 单选框文本                      | `ReactNode`                                       |        |\n| value      | `true`  | 单选框的值                      | `ReactText`                                       |        |\n| status     | `true`  | 单选框选中状态                  | `'checked' \\| 'unchecked' \\| 'halfchecked'`       |        |\n| disabled   | `true`  | 单选框禁用状态                  | `boolean`                                         |        |\n| mode       | `false` | 单选框模式，list 表示以列表展示 | `'list' \\| 'row'`                                 |        |\n| onChange   | `false` | 选中单选框触发的回调函数        | `(value: ReactText, status: RadioStatus) => void` |        |\n"
  },
  {
    "path": "packages/react-native/src/checkbox/index.tsx",
    "content": "import React, { forwardRef } from 'react';\n\nimport Flex from '../flex';\nimport { px } from '../helpers/normalize';\nimport CheckboxItem from './CheckboxItem';\nimport type { CheckboxProps } from './type';\nimport useCheckbox from './useCheckbox';\n\nconst Checkbox = forwardRef<unknown, CheckboxProps>(\n  (\n    {\n      value,\n      disabledValue,\n      defaultValue,\n      containerStyle,\n      options,\n      showCheckAll = true,\n      size = px(24),\n      onChange,\n      activeOpacity = 0.6,\n      ...restProps\n    },\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _ref\n  ) => {\n    const {\n      transformedOptions = [],\n      checkedAllStatus,\n      handleAllChange,\n      handleChange,\n    } = useCheckbox({\n      options,\n      disabledValue,\n      defaultValue,\n      onChange,\n      value,\n      showCheckAll,\n    });\n\n    return (\n      <Flex flexWrap=\"wrap\" style={containerStyle}>\n        {showCheckAll && (\n          <CheckboxItem\n            disabled={false}\n            label=\"全选\"\n            value=\"checkbox-select-all\"\n            status={checkedAllStatus}\n            size={size}\n            onChange={handleAllChange}\n            {...{ activeOpacity }}\n            {...restProps}\n          />\n        )}\n        {transformedOptions.map((option, index, array) => {\n          return (\n            <CheckboxItem\n              key={option.value}\n              {...option}\n              size={size}\n              isLast={index === array.length - 1}\n              onChange={handleChange}\n              {...{ activeOpacity }}\n              {...restProps}\n            />\n          );\n        })}\n      </Flex>\n    );\n  }\n);\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };\nexport { default as CheckboxList } from './CheckboxList';\n"
  },
  {
    "path": "packages/react-native/src/checkbox/type.ts",
    "content": "import type { ReactNode, ReactText } from 'react';\nimport type { StyleProp, TextStyle, ViewStyle } from 'react-native';\n\nexport type CheckboxStatus = 'checked' | 'unchecked' | 'halfchecked';\n\nexport interface CheckboxOption {\n  label: ReactNode;\n  value: ReactText;\n}\nexport interface TransformedOption extends CheckboxOption {\n  /** 是否选中 */\n  status: CheckboxStatus;\n  /** 是否禁用 */\n  disabled: boolean;\n}\n\nexport interface CheckboxProps {\n  /** 选中的项 */\n  value?: ReactText[];\n  /** 点击切换的回调函数  */\n  onChange?: (value: ReactText[]) => void;\n  /** 自定义item样式 */\n  itemStyle?: StyleProp<ViewStyle>;\n  /** 图标大小 */\n  size?: number;\n  /** 自定义文本样式 */\n  labelStyle?: StyleProp<TextStyle>;\n  /** 指定可选项 */\n  options: CheckboxOption[];\n  /** 默认选中的项 */\n  defaultValue?: ReactText[];\n  /** 设置禁用的项  */\n  disabledValue?: ReactText[];\n  /** 自定义容器样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n  /** 是否显示全选 */\n  showCheckAll?: boolean;\n  /** 未禁用时的不透明度 */\n  activeOpacity?: number;\n}\n\nexport type CheckboxItemProps = Pick<CheckboxProps, 'itemStyle' | 'labelStyle' | 'size' | 'activeOpacity'> &\n  TransformedOption & {\n    mode?: 'list' | 'row';\n    isLast?: boolean;\n    onChange: (value: ReactText, status: CheckboxStatus) => void;\n  };\n"
  },
  {
    "path": "packages/react-native/src/checkbox/useCheckbox.ts",
    "content": "import { useEffect, useState } from 'react';\n\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport type { CheckboxProps, CheckboxStatus, TransformedOption } from './type';\n\nexport default function useCheckbox(\n  props: Pick<CheckboxProps, 'value' | 'options' | 'disabledValue' | 'defaultValue' | 'onChange' | 'showCheckAll'>\n) {\n  const { value, options, disabledValue, defaultValue, onChange, showCheckAll } = props;\n\n  const [transformedOptions, setTransformedOptions] = useState<TransformedOption[]>([]);\n\n  useEffect(() => {\n    const checkedValue = value ?? defaultValue ?? [];\n    const newOptions: TransformedOption[] = options.map(option => {\n      const disabled = !!disabledValue?.includes(option.value);\n      const checked = !!checkedValue?.includes(option.value);\n      return {\n        ...option,\n        disabled,\n        status: checked ? 'checked' : 'unchecked',\n      };\n    });\n    setTransformedOptions(newOptions);\n  }, [options, value, defaultValue, disabledValue]);\n\n  let checkedAllStatus: CheckboxStatus = 'unchecked';\n  if (showCheckAll) {\n    checkedAllStatus = getCheckedAllStatus(transformedOptions);\n  }\n\n  /**\n   * 1. 选中或者办选中状态下，设置为未选中\n   * 2. 未选中状态下，设置为选中\n   */\n  const handleAllChange = (_: string | number, status: CheckboxStatus) => {\n    if (status === 'checked') {\n      const newOptions: TransformedOption[] = transformedOptions.map(option => {\n        return {\n          ...option,\n          disabled: !!disabledValue?.includes(option.value),\n          status: 'unchecked',\n        };\n      });\n      if (onChange) {\n        onChange([]);\n      } else {\n        setTransformedOptions(newOptions);\n      }\n    } else {\n      const newOptions: TransformedOption[] = transformedOptions.map(option => {\n        const disabled = !!disabledValue?.includes(option.value);\n        return {\n          ...option,\n          disabled,\n          status: !disabled ? 'checked' : 'unchecked',\n        };\n      });\n      if (onChange) {\n        const values = newOptions.filter(item => !disabledValue?.includes(item.value)).map(option => option.value);\n        onChange(values);\n      } else {\n        setTransformedOptions(newOptions);\n      }\n    }\n  };\n\n  /**\n   * 1. 选中状态下，设置为未选中\n   * 2. 未选中状态下，设置为选中\n   */\n  const handleChange = (value: string | number, status: CheckboxStatus) => {\n    const newOptions = transformedOptions.map(item => {\n      if (item.value === value) {\n        item.status = status === 'checked' ? 'unchecked' : 'checked';\n      }\n      return item;\n    });\n    if (onChange) {\n      const values = newOptions.filter(item => item.status === 'checked').map(item => item.value);\n      onChange(values);\n    } else {\n      setTransformedOptions(newOptions);\n    }\n  };\n\n  return {\n    transformedOptions,\n    checkedAllStatus,\n\n    handleAllChange: useMemoizedFn(handleAllChange),\n    handleChange: useMemoizedFn(handleChange),\n  };\n}\n\nfunction getCheckedAllStatus<T extends TransformedOption>(options: T[] = []) {\n  const checkedLength = options.filter(option => option.status === 'checked').length;\n\n  if (checkedLength === 0) {\n    return 'unchecked';\n  } else if (checkedLength === options.length) {\n    return 'checked';\n  } else {\n    return 'halfchecked';\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/collapse-text/index.md",
    "content": "---\ntitle: CollapseText - 文本折叠组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# CollapseText 文本折叠组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\nconst text = `我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容`;\n\n<CollapseText text={text} defaultNumberOfLines={3} lineHeight={px(20)} />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"collapseText-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608113460423595271.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 自定义样式\n\n```tsx | pure\nconst text = `我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容\n  我是内容我是内容我是内容我是内容我是内容我是内容我是内容`;\n\n<CollapseText\n  text={text}\n  defaultNumberOfLines={3}\n  lineHeight={px(20)}\n  textStyle={{ color: 'red', fontSize: px(16) }}\n  textContainerStyle={{ marginHorizontal: px(10) }}\n  expandStyle={{ color: 'gold', fontSize: px(16) }}\n/>;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"collapseText-ios2.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608115028918829687.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性                 | 必填    | 说明                | 类型        | 默认值 |\n| -------------------- | ------- | ------------------- | ----------- | ------ |\n| text                 | `true`  | 文本                | `string`    |        |\n| defaultNumberOfLines | `false` | 默认展示行数        | `number`    | `2`    |\n| lineHeight           | `false` | 每行文本高度        | `number`    | `18`   |\n| textStyle            | `false` | 文本样式            | `TextStyle` |        |\n| textContainerStyle   | `false` | 文本容器样式        | `ViewStyle` |        |\n| expandText           | `false` | 展开时候的文本      | `string`    | `展开` |\n| unExpandText         | `false` | 收起时候的文本      | `string`    | `收起` |\n| expandStyle          | `false` | 展开/收起文本的样式 | `TextStyle` |        |\n| activeOpacity        | `false` | 按下时的不透明度    | `number`    | `0.6`  |\n"
  },
  {
    "path": "packages/react-native/src/collapse-text/index.tsx",
    "content": "import React, { FC } from 'react';\nimport { LayoutChangeEvent, StyleProp, StyleSheet, TextStyle, ViewStyle } from 'react-native';\n\nimport { useBoolean } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport Text from '../text';\n\nconst { px } = helpers;\nexport interface CollapseTextProps {\n  /** 文本 */\n  text: string;\n  /** 默认展示行数 */\n  defaultNumberOfLines?: number;\n  /** 每行文本高度 */\n  lineHeight?: number;\n  /** 文本样式 */\n  textStyle?: StyleProp<TextStyle>;\n  /** 文本容器样式 */\n  textContainerStyle?: StyleProp<ViewStyle>;\n  /** 展开时候的文本。默认为“展开” */\n  expandText?: string;\n  /** 收起时候的文本。默认为“收起” */\n  unExpandText?: string;\n  /** 展开/收起文本样式 */\n  expandStyle?: StyleProp<TextStyle>;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nconst CollapseText: FC<CollapseTextProps> = ({\n  text,\n  defaultNumberOfLines = 2,\n  lineHeight = px(18),\n  textStyle,\n  textContainerStyle,\n  expandText = '展开',\n  unExpandText = '收起',\n  expandStyle,\n  activeOpacity = 0.6,\n}) => {\n  const [isOverflow, { set: setOverflow }] = useBoolean(false);\n  const [hidden, { toggle: toggleHidden }] = useBoolean(true);\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    const { height } = e.nativeEvent.layout;\n    if (height - 1 < lineHeight * defaultNumberOfLines) {\n      setOverflow(false);\n    } else {\n      setOverflow(true);\n    }\n  };\n\n  const styles = StyleSheet.create({\n    container: {\n      position: 'relative',\n    },\n    text: {\n      position: 'absolute',\n      zIndex: -99999,\n      opacity: 0,\n    },\n  });\n\n  return (\n    <>\n      <Box style={[textContainerStyle, styles.container]}>\n        <Text\n          numberOfLines={hidden ? defaultNumberOfLines : undefined}\n          ellipsizeMode=\"tail\"\n          fontSize={px(14)}\n          lineHeight={lineHeight}\n          color=\"text\"\n          style={textStyle}\n          selectable\n          // @ts-ignore\n          userSelect=\"all\"\n        >\n          {text}\n        </Text>\n        {isOverflow && (\n          <Flex justifyContent=\"flex-end\" paddingRight=\"x1\">\n            <Pressable activeOpacity={activeOpacity} onPress={toggleHidden}>\n              <Text fontSize={px(12)} color=\"text\" style={expandStyle}>\n                {hidden ? expandText : unExpandText}\n              </Text>\n            </Pressable>\n          </Flex>\n        )}\n        {/* 隐藏节点，用于判断文字真实高度 */}\n        <Text fontSize={px(14)} lineHeight={lineHeight} onLayout={handleLayout} style={[styles.text, textStyle]}>\n          {text}\n        </Text>\n      </Box>\n    </>\n  );\n};\nCollapseText.displayName = 'CollapseText';\n\nexport default CollapseText;\n"
  },
  {
    "path": "packages/react-native/src/count-down/CountDownItem.tsx",
    "content": "import React, { forwardRef } from 'react';\nimport { Keyboard, StyleSheet, TextInput } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useMemoizedFn, useSms } from '@td-design/rn-hooks';\n\nimport helpers from '../helpers';\nimport InputItem from '../input/InputItem';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { CountDownItemProps } from './type';\n\nconst { ONE_PIXEL } = helpers;\n\nconst CountDownItem = forwardRef<TextInput, CountDownItemProps>(\n  (\n    {\n      sendText = '发送验证码',\n      resendText = '重新发送',\n      placeholder = '请输入验证码',\n      count = 60,\n      codeType = 'normal',\n      onBefore,\n      onSend,\n      onEnd,\n      activeOpacity = 0.6,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { sendSms, text, disabled } = useSms({\n      defaultLabel: sendText,\n      resendLabel: resendText,\n      count,\n      onBefore,\n      onSend,\n      onAfter: onEnd,\n      ref,\n    });\n\n    const handlePress = useMemoizedFn(() => {\n      Keyboard.dismiss();\n      sendSms();\n    });\n\n    const styles = StyleSheet.create({\n      input: {\n        justifyContent: 'center',\n        alignItems: 'center',\n        borderColor: disabled ? theme.colors.disabled : theme.colors.border,\n      },\n      border: {\n        borderWidth: ONE_PIXEL,\n        paddingHorizontal: theme.spacing.x1,\n        paddingVertical: theme.spacing.x1,\n        borderRadius: theme.borderRadii.x1,\n      },\n    });\n\n    return (\n      <InputItem\n        ref={ref}\n        {...restProps}\n        placeholder={placeholder}\n        keyboardType=\"number-pad\"\n        right={\n          <Pressable\n            style={[styles.input, codeType === 'border' && styles.border]}\n            disabled={disabled}\n            activeOpacity={activeOpacity}\n            onPress={handlePress}\n          >\n            <Text variant={'p1'} color={disabled ? 'disabled' : 'primary200'}>\n              {text}\n            </Text>\n          </Pressable>\n        }\n      />\n    );\n  }\n);\nCountDownItem.displayName = 'CountDownItem';\n\nexport default CountDownItem;\n"
  },
  {
    "path": "packages/react-native/src/count-down/index.md",
    "content": "---\ntitle: CountDown - 倒计时组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# CountDown 倒计时组件\n\n倒计时组件的调用后端接口发送请求部分，由开发人员自行实现（包括手机号校验等）。\n\n## 效果演示\n\n### 1. 默认配置\n\n```tsx | pure\n<Form onFinish={handleFinish} form={form}>\n  <FormListItem title=\"手机号\" required name=\"useCharacter\" rules={[{ required: true, message: '请输入手机号' }]}>\n    <InputItem border={false} placeholder=\"请输入手机号\" inputStyle={{ textAlign: 'right' }} />\n  </FormListItem>\n  <WhiteSpace size=\"x4\" />\n  <FormItem type={bordered ? 'all' : 'bottom'} name=\"sms\" rules={[{ required: true, message: '请输入验证码' }]}>\n    <CountDown\n      bordered={bordered}\n      onSend={() => {\n        console.log('123');\n      }}\n    />\n  </FormItem>\n</Form>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643100543561048617.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 配置 codeType\n\n```tsx | pure\n<Form onFinish={handleFinish} form={form}>\n  <FormListItem title=\"手机号\" required name=\"useCharacter\" rules={[{ required: true, message: '请输入手机号' }]}>\n    <InputItem border={false} placeholder=\"请输入手机号\" inputStyle={{ textAlign: 'right' }} />\n  </FormListItem>\n  <WhiteSpace size=\"x4\" />\n  <FormItem type={bordered ? 'all' : 'bottom'} name=\"sms\" rules={[{ required: true, message: '请输入验证码' }]}>\n    <CountDown\n      bordered={bordered}\n      codeType=\"border\"\n      onSend={() => {\n        console.log('123');\n      }}\n    />\n  </FormItem>\n</Form>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643100592792781362.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n```ts\nexport interface SmsProps {\n  /** 倒计时文字，默认为 获取验证码 */\n  sendText?: string;\n  /** 重新发送文字，默认为：重新发送 */\n  resendText?: string;\n  /** 倒计时时长，默认为 60秒 */\n  count?: number;\n  /** 发送验证码之前的回调，通常用于判断手机号是否有值 */\n  onBefore?: () => Promise<boolean>;\n  /** 发送验证码 */\n  onSend: () => void;\n  /** 倒计时结束后的回调 */\n  onEnd?: () => void;\n  /** 验证码样式是否有边框 */\n  codeType?: 'normal' | 'border';\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\nexport interface CountDownItemProps extends InputItemProps, SmsProps {}\n\nexport interface CountDownProps extends InputProps, SmsProps {}\n```\n"
  },
  {
    "path": "packages/react-native/src/count-down/index.tsx",
    "content": "import React, { forwardRef } from 'react';\nimport { Keyboard, StyleSheet, TextInput } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useMemoizedFn, useSms } from '@td-design/rn-hooks';\n\nimport helpers from '../helpers';\nimport Input from '../input';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { CountDownProps } from './type';\n\nconst { ONE_PIXEL } = helpers;\n\nconst CountDown = forwardRef<TextInput, CountDownProps>(\n  (\n    {\n      sendText = '发送验证码',\n      resendText = '重新发送',\n      placeholder = '请输入验证码',\n      count = 60,\n      codeType = 'normal',\n      onBefore,\n      onSend,\n      onEnd,\n      activeOpacity = 0.6,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { sendSms, text, disabled } = useSms({\n      defaultLabel: sendText,\n      resendLabel: resendText,\n      count,\n      onBefore,\n      onSend,\n      onAfter: onEnd,\n      ref,\n    });\n\n    const handlePress = useMemoizedFn(() => {\n      Keyboard.dismiss();\n      sendSms();\n    });\n\n    const styles = StyleSheet.create({\n      input: {\n        justifyContent: 'center',\n        alignItems: 'center',\n        borderColor: disabled ? theme.colors.disabled : theme.colors.border,\n      },\n      border: {\n        borderWidth: ONE_PIXEL,\n        paddingHorizontal: theme.spacing.x1,\n        paddingVertical: theme.spacing.x1,\n        borderRadius: theme.borderRadii.x1,\n      },\n    });\n\n    return (\n      <Input\n        ref={ref}\n        placeholder={placeholder}\n        {...restProps}\n        keyboardType=\"number-pad\"\n        right={\n          <Pressable\n            style={[styles.input, codeType === 'border' && styles.border]}\n            disabled={disabled}\n            activeOpacity={activeOpacity}\n            onPress={handlePress}\n          >\n            <Text variant={'p2'} color={disabled ? 'disabled' : 'primary200'}>\n              {text}\n            </Text>\n          </Pressable>\n        }\n      />\n    );\n  }\n);\nCountDown.displayName = 'CountDown';\n\nexport { CountDown };\nexport { default as CountDownItem } from './CountDownItem';\n"
  },
  {
    "path": "packages/react-native/src/count-down/type.ts",
    "content": "import { InputProps } from '../input';\nimport { InputItemProps } from '../input/InputItem';\n\nexport interface SmsProps {\n  /** 倒计时文字，默认为 获取验证码 */\n  sendText?: string;\n  /** 重新发送文字，默认为：重新发送 */\n  resendText?: string;\n  /** 倒计时时长，默认为 60秒 */\n  count?: number;\n  /** 发送验证码之前的回调，通常用于判断手机号是否有值 */\n  onBefore?: () => Promise<boolean>;\n  /** 发送验证码 */\n  onSend: () => void;\n  /** 倒计时结束后的回调 */\n  onEnd?: () => void;\n  /** 验证码样式是否有边框 */\n  codeType?: 'normal' | 'border';\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\nexport interface CountDownItemProps extends InputItemProps, SmsProps {}\n\nexport interface CountDownProps extends InputProps, SmsProps {}\n"
  },
  {
    "path": "packages/react-native/src/divider/index.md",
    "content": "---\ntitle: Divider - 分割线组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n---\n\n# Divider 分割线组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Text>我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本</Text>\n<Divider />\n<Text>我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本</Text>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"divider-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643102035172039045.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 分隔线为虚线\n\n```tsx | pure\n<Text>我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本</Text>\n<Divider type=\"dashed\" />\n<Text>我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本我是一段文本</Text>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"divider-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643102120875587191.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 垂直分隔线\n\n```tsx | pure\n<Flex>\n  <Text variant=\"p0\" color=\"primary200\">\n    酒店\n  </Text>\n  <Divider axis=\"vertical\" height={px(20)} />\n  <Text variant=\"p0\" color=\"primary200\">\n    商圈\n  </Text>\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"divider-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643102245405233201.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 带文字的分隔线\n\n```tsx | pure\n<Divider text=\"我是分割线\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"divider-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643102322187525239.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 自定义虚线分隔线\n\n```tsx | pure\n<Divider type=\"dashed\" dashGap={px(30)} dashLength={px(20)} dashThickness={px(2)} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"divider-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643102435846380112.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| type | `false` | 分割线类型 | `solid` \\| `dashed` | `solid` |\n| axis | `false` | 分割线方向 | `horizontal` \\| `vertical` | `horizontal` |\n| height | `false` | 垂直时分割线的高度 | `number` | `12` |\n| color | `false` | 分割线颜色 | `string` | `#bbbbbb` |\n| margin | `false` | 水平时为上下外边距，垂直时为左右外边距 | `xxs` \\| `xs` \\| `s` \\| `m` \\| `l` \\| `xl` \\| `xxl` | `xs` |\n| text | `false` | 分割线文字（仅支持水平分割线） | `string` |  |\n| textAlign | `false` | 分割线文字位置 | `left` \\| `center` \\| `right` | `center` |\n| dashGap | `false` | 虚线间隔宽度 | `number` |  |\n| dashLength | `false` | 单格虚线宽度 | `number` |  |\n| dashThickness | `false` | 虚线厚度 | `number` |  |\n"
  },
  {
    "path": "packages/react-native/src/divider/index.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Svg, { G, Rect } from 'react-native-svg';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { Spacing, Theme } from '../theme';\n\nconst { px, ONE_PIXEL, deviceWidth } = helpers;\ntype DividerProps = {\n  /** 类型是实线还是虚线 */\n  type?: 'solid' | 'dashed';\n  /** 水平或是垂直 */\n  axis?: 'horizontal' | 'vertical';\n  /** 垂直时指定分隔线高度 */\n  height?: number;\n  /** 外边距 */\n  margin?: Spacing;\n  /** 分隔线颜色 */\n  color?: string;\n  /** 文字（水平时有效） */\n  text?: string;\n  /** 文字的位置 */\n  textAlign?: 'left' | 'center' | 'right';\n  /** 虚线间隔宽度 */\n  dashGap?: number;\n  /** 单格虚线宽度 */\n  dashLength?: number;\n  /** 虚线厚度 */\n  dashThickness?: number;\n};\n\nconst Divider: FC<DividerProps> = props => {\n  const theme = useTheme<Theme>();\n  const {\n    type = 'solid',\n    axis = 'horizontal',\n    margin = 'x1',\n    height = px(40),\n    color = theme.colors.border,\n    text = '',\n    textAlign = 'center',\n    dashGap,\n    dashLength,\n    dashThickness,\n  } = props;\n\n  if (!text) {\n    if (type === 'dashed') {\n      return axis === 'horizontal' ? (\n        <HorizontalDashLine {...{ dashLength, dashThickness, dashGap, color, margin }} />\n      ) : (\n        <VerticalDashLine {...{ dashLength, dashThickness, dashGap, color, margin, height }} />\n      );\n    }\n    return (\n      <Box\n        style={[\n          { backgroundColor: color },\n          axis === 'horizontal'\n            ? {\n                width: '100%',\n                height: ONE_PIXEL,\n                marginVertical: theme.spacing[margin],\n              }\n            : {\n                width: ONE_PIXEL,\n                height,\n                marginHorizontal: theme.spacing[margin],\n              },\n        ]}\n      />\n    );\n  }\n\n  const styles = StyleSheet.create({\n    line: {\n      width: '100%',\n      height: ONE_PIXEL,\n      backgroundColor: color,\n    },\n    'prefix-left': { flex: 1 },\n    'prefix-center': { flex: 1 },\n    'prefix-right': { flex: 6 },\n    'suffix-left': { flex: 6 },\n    'suffix-center': { flex: 1 },\n    'suffix-right': { flex: 1 },\n    content: {\n      marginHorizontal: px(8),\n    },\n  });\n\n  return (\n    <Flex>\n      <Box style={[type === 'dashed' ? {} : styles.line, styles[`prefix-${textAlign}`]]}>\n        {type === 'dashed' && <HorizontalDashLine {...{ dashLength, dashThickness, dashGap, color, margin }} />}\n      </Box>\n      <Box style={styles.content}>\n        <Text variant=\"p3\" color=\"text\">\n          {text}\n        </Text>\n      </Box>\n      <Box style={[type === 'dashed' ? {} : styles.line, styles[`suffix-${textAlign}`]]}>\n        {type === 'dashed' && <HorizontalDashLine {...{ dashLength, dashThickness, dashGap, color, margin }} />}\n      </Box>\n    </Flex>\n  );\n};\nDivider.displayName = 'Divider';\n\nexport default Divider;\n\nconst HorizontalDashLine: React.FC<\n  Pick<DividerProps, 'dashGap' | 'dashLength' | 'dashThickness' | 'color' | 'margin'>\n> = ({ dashLength, dashThickness, dashGap, color, margin }) => {\n  const itemWidth = dashLength ?? px(8);\n  const itemHeight = dashThickness ?? px(1);\n  const spacing = dashGap ? dashGap + itemWidth : px(16);\n  const dashes = new Array(Math.floor(deviceWidth / spacing)).fill(null);\n\n  return (\n    <Box marginVertical={margin} width=\"100%\">\n      <Svg height={itemHeight} width=\"100%\">\n        <G>\n          {dashes.map((_, index) => (\n            <Rect\n              key={index}\n              x=\"0\"\n              y=\"0\"\n              width={itemWidth}\n              height={itemHeight}\n              fill={color}\n              translateX={spacing * index}\n            />\n          ))}\n        </G>\n      </Svg>\n    </Box>\n  );\n};\n\nconst VerticalDashLine: FC<\n  Pick<DividerProps, 'dashGap' | 'dashLength' | 'dashThickness' | 'color' | 'margin' | 'height'>\n> = ({ dashLength, dashThickness, dashGap, color, margin, height }) => {\n  const itemHeight = dashThickness ?? px(4);\n  const itemWidth = dashLength ?? px(1);\n  const spacing = dashGap ? dashGap + itemHeight : px(4);\n  const dashes = new Array(Math.floor(height! / spacing)).fill(null);\n  return (\n    <Box marginHorizontal={margin} height={height}>\n      <Svg width={itemWidth} height=\"100%\">\n        <G>\n          {dashes.map((_, index) => (\n            <Rect\n              key={index}\n              x=\"0\"\n              y={spacing ? spacing / 2 : 0}\n              width={itemWidth}\n              height={itemHeight}\n              fill={color}\n              translateY={spacing * index}\n            />\n          ))}\n        </G>\n      </Svg>\n    </Box>\n  );\n};\n"
  },
  {
    "path": "packages/react-native/src/empty/index.md",
    "content": "---\ntitle: Empty - 暂无数据组件\nnav:\n  title: RN 组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Empty 暂无数据组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Box flex={1}>\n  <Empty />\n</Box>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"empty-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643164552166522287.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 自定义图片\n\n```tsx | pure\n<Empty customImg={<Image source={require('../../assets/img/pic_empty.png')} />} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"empty-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643164614557936927.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性      | 必填    | 说明               | 类型        | 默认值   |\n| --------- | ------- | ------------------ | ----------- | -------- |\n| emptyText | `false` | 暂无数据的文字 dom | `ReactNode` | 暂无数据 |\n| customImg | `false` | 自定义 img         | `ReactNode` |          |\n"
  },
  {
    "path": "packages/react-native/src/empty/index.tsx",
    "content": "import React, { ReactNode, useMemo } from 'react';\nimport Svg, { Ellipse, G, Path } from 'react-native-svg';\n\nimport { BoxProps } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Text from '../text';\nimport { Theme } from '../theme';\n\ntype EmptyProps = BoxProps<Theme> & {\n  /** 暂无数据的文字dom */\n  emptyText?: ReactNode;\n  /** 自定义img */\n  customImg?: ReactNode;\n};\n\nconst Empty: React.FC<EmptyProps> = ({ emptyText = '暂无数据', customImg, ...boxProps }) => {\n  const EmptyText = useMemo(() => {\n    if (typeof emptyText === 'string') {\n      return (\n        <Text variant=\"p1\" color=\"text\">\n          {emptyText}\n        </Text>\n      );\n    }\n    return emptyText;\n  }, [emptyText]);\n\n  const EmptyImage = useMemo(() => {\n    if (customImg) return customImg;\n\n    return (\n      <Svg width={128} height={82} viewBox=\"0 0 64 41\">\n        <G transform=\"translate(0 1)\" fill=\"none\" fillRule=\"evenodd\">\n          <Ellipse fill=\"#f5f5f5\" cx={32} cy={33} rx={32} ry={7} />\n          <G stroke=\"#d9d9d9\">\n            <Path d=\"M55 12.76 44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\" />\n            <Path\n              d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\"\n              fill=\"#fafafa\"\n            />\n          </G>\n        </G>\n      </Svg>\n    );\n  }, [customImg]);\n\n  return (\n    <Box alignItems={'center'} justifyContent={'center'} {...boxProps}>\n      {EmptyImage}\n      {EmptyText}\n    </Box>\n  );\n};\nEmpty.displayName = 'Empty';\n\nexport default Empty;\n"
  },
  {
    "path": "packages/react-native/src/error-block/index.md",
    "content": "---\ntitle: ErrorBlock - 异常捕获组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# ErrorBlock 异常捕获组件\n\n内置了两种场景：\n\n- 代码出错，包括 hooks 内出错、render 内出错，这时候会显示默认的应用出错的界面\n- 网络请求出错，即代码层面通过`throw new Error(JSON.stringify({type: 'network'}))`，这时候会显示内置的网络请求失败的出错界面\n\n具体测试代码可以参见 `exmaple` 里面的 `ErrorBlockDemo.tsx` 文件\n\n## 效果演示\n\n### 1. 默认异常\n\n```tsx | pure\n<Box flex={1}>\n  <ErrorBlock onError={onError} onRefresh={onRefresh}>\n    <Demo1 />\n  </ErrorBlock>\n</Box>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"empty-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643165357318249571.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 网络连接异常\n\n```tsx | pure\n<Empty customImg={<Image source={require('../../assets/img/pic_empty.png')} />} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"empty-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643165225985160065.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义异常展示\n\n```tsx | pure\n<Box height={300}>\n  <ErrorBlock\n    onError={onError}\n    customNode={\n      <Box\n        height={200}\n        padding=\"x4\"\n        justifyContent={'center'}\n        alignItems=\"center\"\n        borderWidth={1}\n        borderColor=\"func600\"\n      >\n        <Text>我是自定义错误展示</Text>\n      </Box>\n    }\n  >\n    <Demo1 />\n  </ErrorBlock>\n</Box>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"empty-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643165587210140943.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性       | 必填    | 说明                 | 类型                                           | 默认值 |\n| ---------- | ------- | -------------------- | ---------------------------------------------- | ------ |\n| customNode | `false` | 自定义出错时渲染组件 | `ReactNode`                                    |        |\n| onError    | `false` | 异常捕获的处理逻辑   | `(error: Error, errorInfo: ErrorInfo) => void` |        |\n| onRefresh  | `false` | 重新刷新逻辑         | `() => void`                                   |        |\n"
  },
  {
    "path": "packages/react-native/src/error-block/index.tsx",
    "content": "import React, { ErrorInfo, PropsWithChildren, ReactNode } from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport Box from '../box';\nimport Button from '../button';\nimport Text from '../text';\n\nexport default class ErrorBlock extends React.Component<\n  PropsWithChildren<{\n    customNode?: ReactNode;\n    onError?: (error: Error, errorInfo: ErrorInfo) => void;\n    onRefresh?: () => void;\n  }>,\n  { error: Error | null }\n> {\n  static displayName = 'ErrorBlock';\n  state = {\n    error: null,\n  };\n\n  static getDerivedStateFromError(error: Error) {\n    return { error };\n  }\n\n  componentDidCatch(error: Error, info: ErrorInfo) {\n    // 错误上报\n    if (this.props.onError) {\n      this.props.onError(error, info);\n    } else {\n      console.error(error, info);\n    }\n  }\n\n  handleRefresh = () => {\n    this.setState({ error: null }, () => this.props.onRefresh?.());\n  };\n\n  renderFallback = () => {\n    if (this.props.customNode) return this.props.customNode;\n    try {\n      const { type } = JSON.parse((this.state.error! as Error).message);\n      if (type === 'network') {\n        return <Fallback onRefresh={this.handleRefresh} type=\"network\" />;\n      }\n      return <Fallback onRefresh={this.handleRefresh} />;\n    } catch (error) {\n      return <Fallback onRefresh={this.handleRefresh} />;\n    }\n  };\n\n  render() {\n    if (this.state.error) {\n      return this.renderFallback();\n    }\n    return this.props.children;\n  }\n}\n\nfunction Fallback({ onRefresh, type }: { onRefresh: () => void; type?: 'network' }) {\n  const defaultXml = `\n    <svg width=\"190\" height=\"190\" viewBox=\"0 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <g clip-path=\"url(#clip0_732_1686)\">\n      <g clip-path=\"url(#clip1_732_1686)\">\n      <path d=\"M64.5904 77.5247V76.7148H57.5842V77.6553H56.0452V99.7025H66.2696V77.5247H64.5904ZM65.3837 97.1755H56.8242V96.5224H65.3837V97.1755ZM65.3837 94.164H56.8242V93.5109H65.3837V94.164ZM65.3837 91.1525H56.8242V90.4994H65.3837V91.1525ZM65.3837 88.2217H56.8242V87.5686H65.3837V88.2217ZM65.3837 85.2981H56.8242V84.645H65.3837V85.2981ZM65.3837 82.2866H56.8242V81.6335H65.3837V82.2866ZM65.3837 79.3558H56.8242V78.7027H65.3837V79.3558Z\" fill=\"url(#paint0_linear_732_1686)\"/>\n      <path d=\"M50.8178 89.8295V64.1368H43.0397V62.061H39.7479V74.7269H38.8621V113.475H52.7582V89.8295H50.8178ZM45.0014 97.3844H43.0397V95.482H45.0014V97.3844ZM45.0014 94.4085H43.0397V92.5061H45.0014V94.4085ZM45.0014 91.4469H43.0397V89.5445H45.0014V91.4469ZM45.0014 88.4924H43.0397V86.59H45.0014V88.4924ZM45.0014 85.5165H43.0397V83.6141H45.0014V85.5165ZM45.0014 79.579H43.0397V77.6767H45.0014V79.579ZM45.0014 76.6032H43.0397V74.7008H45.0014V76.6032ZM45.0014 73.6392H43.0397V71.7368H45.0014V73.6392ZM45.0014 70.6847H43.0397V68.7823H45.0014V70.6847ZM45.0014 67.7088H43.0397V65.8064H45.0014V67.7088ZM47.9346 97.3844H45.9728V95.482H47.9346V97.3844ZM47.9346 94.4085H45.9728V92.5061H47.9346V94.4085ZM47.9346 91.4469H45.9728V89.5445H47.9346V91.4469ZM47.9346 88.4924H45.9728V86.59H47.9346V88.4924ZM47.9346 85.5165H45.9728V83.6141H47.9346V85.5165ZM47.9346 79.579H45.9728V77.6767H47.9346V79.579ZM47.9346 76.6032H45.9728V74.7008H47.9346V76.6032ZM47.9346 73.6392H45.9728V71.7368H47.9346V73.6392ZM47.9346 70.6847H45.9728V68.7823H47.9346V70.6847ZM47.9346 67.7088H45.9728V65.8064H47.9346V67.7088Z\" fill=\"url(#paint1_linear_732_1686)\"/>\n      <path d=\"M127.366 103.338C127.452 102.234 127.366 66.1743 127.366 66.1743H131.767V74.1804H138.774V90.9123H142.747V103.338H127.366Z\" fill=\"url(#paint2_linear_732_1686)\"/>\n      <path d=\"M156.156 87.1551V86.0032H154.969V75.9498H152.071V74.8336H150.117V73.1924H149.098V68.4092H148.364V73.2257H147.428V74.8668H144.531V77.5553H142.856V108.722H156.959V87.1527H156.156V87.1551ZM145.348 99.6903H144.393V96.0708H145.348V99.6903ZM145.348 95.2609H144.393V91.6414H145.348V95.2609ZM145.348 90.8316H144.393V87.2121H145.348V90.8316ZM145.348 86.3238H144.393V82.7043H145.348V86.3238ZM145.348 81.8137H144.393V78.1942H145.348V81.8137ZM147.314 99.6903H146.359V96.0708H147.314V99.6903ZM147.314 95.2609H146.359V91.6414H147.314V95.2609ZM147.314 90.8316H146.359V87.2121H147.314V90.8316ZM147.314 86.3238H146.359V82.7043H147.314V86.3238ZM147.314 81.8137H146.359V78.1942H147.314V81.8137ZM149.278 99.6903H148.323V96.0708H149.278V99.6903ZM149.278 95.2609H148.323V91.6414H149.278V95.2609ZM149.278 90.8316H148.323V87.2121H149.278V90.8316ZM149.278 86.3238H148.323V82.7043H149.278V86.3238ZM149.278 81.8137H148.323V78.1942H149.278V81.8137ZM151.245 99.6903H150.29V96.0708H151.245V99.6903ZM151.245 95.2609H150.29V91.6414H151.245V95.2609ZM151.245 90.8316H150.29V87.2121H151.245V90.8316ZM151.245 86.3238H150.29V82.7043H151.245V86.3238ZM151.245 81.8137H150.29V78.1942H151.245V81.8137ZM153.211 99.6903H152.256V96.0708H153.211V99.6903ZM153.211 95.2609H152.256V91.6414H153.211V95.2609ZM153.211 90.8316H152.256V87.2121H153.211V90.8316ZM153.211 86.3238H152.256V82.7043H153.211V86.3238ZM153.211 81.8137H152.256V78.1942H153.211V81.8137Z\" fill=\"url(#paint3_linear_732_1686)\"/>\n      <path d=\"M22.7644 118.717V97.4511H25.2012V86.5973L33.5754 82.9707V97.2801H35.4113V118.717H22.7644Z\" fill=\"url(#paint4_linear_732_1686)\"/>\n      <path d=\"M166.397 114.774H159.049V85.5308L166.397 89.0861V114.774Z\" fill=\"url(#paint5_linear_732_1686)\"/>\n      <path d=\"M21.534 44.2816C21.534 44.2816 23.7522 38.2301 29.2052 40.6051C30.464 39.3274 32.022 38.3987 34.1286 38.8167C36.2352 39.2371 37.5937 40.8141 38.0545 41.8639C38.7147 41.833 44.0015 42.0087 44.0015 47.4926C44.0015 52.9765 37.6032 52.872 37.1401 52.4374C36.5701 52.9456 33.8293 55.703 30.5043 52.5561C29.7847 53.1712 27.4335 55.7766 23.7166 52.1809C21.9947 52.9005 17.9026 53.4539 17.1093 49.2287C16.3161 45.006 20.3845 43.8114 21.534 44.2816Z\" fill=\"url(#paint6_linear_732_1686)\"/>\n      <path d=\"M144.338 35.537C144.338 35.537 146.556 29.4855 152.009 31.8605C153.268 30.5827 154.826 29.6541 156.933 30.0721C159.039 30.4901 160.398 32.0695 160.859 33.1192C161.519 33.0884 166.806 33.2641 166.806 38.748C166.806 44.2319 160.407 44.125 159.944 43.6903C159.374 44.1986 156.634 46.956 153.309 43.8091C152.589 44.4242 150.238 47.0296 146.521 43.4338C144.799 44.1535 140.707 44.7069 139.914 40.4817C139.12 36.2614 143.189 35.0667 144.338 35.537Z\" fill=\"url(#paint7_linear_732_1686)\"/>\n      <path d=\"M115.995 48.4854C115.995 48.4854 117.6 44.1035 121.548 45.8254C122.46 44.8992 123.585 44.227 125.112 44.531C126.637 44.835 127.62 45.9774 127.953 46.735C128.43 46.7137 132.259 46.8395 132.259 50.8082C132.259 54.7768 127.628 54.7008 127.293 54.3873C126.879 54.7554 124.896 56.7504 122.488 54.4752C121.968 54.9193 120.265 56.8074 117.577 54.2044C116.33 54.7245 113.368 55.1259 112.793 52.0669C112.216 49.0103 115.164 48.1458 115.995 48.4854Z\" fill=\"url(#paint8_linear_732_1686)\"/>\n      <path d=\"M95.4654 177.989C144.126 177.989 183.573 159.268 183.573 136.175C183.573 113.082 144.126 94.3608 95.4654 94.3608C46.8048 94.3608 7.35767 113.082 7.35767 136.175C7.35767 159.268 46.8048 177.989 95.4654 177.989Z\" fill=\"url(#paint9_linear_732_1686)\"/>\n      <path d=\"M35.1262 131.062C35.1262 131.062 34.2878 132.252 35.6891 134.023C36.9383 135.6 38.9119 135.294 39.5674 134.788C39.7693 136.161 41.4532 139.054 44.1179 137.417C46.6236 135.881 45.4171 133.544 44.6167 132.625C46.1818 132.183 47.3479 128.433 43.7569 127.138C44.2889 125.59 44.3839 124.889 43.6049 123.497C42.8544 122.158 41.6218 121.944 39.6553 122.759L36.8124 123.958L35.0003 120.576L34.0313 121.137L36.1213 124.367L33.3521 125.756C33.3521 125.756 30.9842 126.682 32.0054 129.224C32.9507 131.577 35.1262 131.062 35.1262 131.062Z\" fill=\"url(#paint10_linear_732_1686)\"/>\n      <path d=\"M30.3073 116.641H38.8716C38.8716 116.641 41.6385 116.719 42.1895 113.558C42.7951 110.088 40.2704 109.611 40.2704 109.611C40.2704 109.611 41.7905 108.913 41.4603 106.288C41.1278 103.666 38.8193 103.334 37.8574 103.455C38.0142 101.899 38.3419 98.3772 34.6844 98.3416C31.1528 98.3059 31.1742 101.861 31.4378 103.263C30.1791 103.277 26.3767 105.165 29.0509 109.307C27.5951 110.554 26.9799 111.273 27.0441 113.071C27.1058 114.872 28.2078 116.641 30.3073 116.641Z\" fill=\"url(#paint11_linear_732_1686)\"/>\n      <path d=\"M38.6602 111.834L35.0075 114.237L34.9077 111.915L37.2162 109.193L34.8721 111.088L34.5681 103.987L34.3449 111.136L31.8796 109.174L34.3211 111.862L34.2475 114.254L30.4902 111.494L34.219 115.116L34.0314 121.139H35.302L35.0455 115.154L38.6602 111.834Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M159.203 126.713C159.203 126.713 158.432 127.81 159.721 129.44C160.871 130.893 162.69 130.61 163.293 130.143C163.478 131.406 165.032 134.068 167.485 132.565C169.791 131.15 168.682 128.998 167.943 128.152C169.385 127.746 170.459 124.291 167.153 123.101C167.644 121.676 167.732 121.03 167.012 119.75C166.321 118.517 165.186 118.317 163.376 119.07L160.754 120.175L159.085 117.061L158.194 117.576L160.118 120.55L157.569 121.83C157.569 121.83 155.389 122.683 156.33 125.024C157.199 127.188 159.203 126.713 159.203 126.713Z\" fill=\"url(#paint12_linear_732_1686)\"/>\n      <path d=\"M154.762 113.434H162.647C162.647 113.434 165.196 113.508 165.701 110.596C166.257 107.402 163.934 106.963 163.934 106.963C163.934 106.963 165.336 106.319 165.029 103.904C164.723 101.488 162.597 101.182 161.711 101.296C161.856 99.8637 162.158 96.6194 158.79 96.5862C155.539 96.5529 155.558 99.8257 155.8 101.118C154.641 101.13 151.138 102.868 153.603 106.685C152.264 107.832 151.696 108.497 151.755 110.15C151.817 111.805 152.831 113.434 154.762 113.434Z\" fill=\"url(#paint13_linear_732_1686)\"/>\n      <path d=\"M162.455 109.007L159.092 111.221L159.001 109.081L161.127 106.575L158.968 108.321L158.688 101.78L158.481 108.364L156.213 106.556L158.46 109.034L158.391 111.238L154.933 108.694L158.367 112.031L158.192 117.576H159.365L159.127 112.064L162.455 109.007Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M54.8244 105.291C54.8244 105.291 54.4088 105.88 55.1023 106.756C55.7198 107.537 56.6959 107.385 57.0213 107.134C57.121 107.813 57.9546 109.243 59.2728 108.435C60.5125 107.675 59.9164 106.519 59.5198 106.065C60.294 105.846 60.8711 103.992 59.0946 103.353C59.3583 102.588 59.4058 102.241 59.0186 101.552C58.6481 100.89 58.0378 100.783 57.0664 101.187L55.658 101.78L54.7626 100.108L54.2829 100.386L55.316 101.982L53.9456 102.669C53.9456 102.669 52.7748 103.127 53.2806 104.383C53.7485 105.547 54.8244 105.291 54.8244 105.291Z\" fill=\"url(#paint14_linear_732_1686)\"/>\n      <path d=\"M52.4399 98.1586H56.6746C56.6746 98.1586 58.0426 98.1966 58.3157 96.6339C58.6149 94.9168 57.3657 94.6817 57.3657 94.6817C57.3657 94.6817 58.1186 94.3349 57.9547 93.0382C57.7908 91.7414 56.6484 91.5775 56.1734 91.6369C56.2518 90.8674 56.4133 89.1242 54.6036 89.1075C52.8556 89.0909 52.8674 90.8484 52.9981 91.5419C52.3758 91.549 50.4948 92.4824 51.8177 94.532C51.0981 95.1472 50.7917 95.5058 50.8249 96.394C50.8558 97.2823 51.4021 98.1586 52.4399 98.1586Z\" fill=\"url(#paint15_linear_732_1686)\"/>\n      <path d=\"M56.5702 95.7811L54.7652 96.971L54.7153 95.8215L55.8577 94.4749L54.6987 95.413L54.5467 91.9004L54.4374 95.4344L53.2167 94.4654L54.4255 95.7954L54.3875 96.9781L52.5303 95.6125L54.3757 97.4056L54.2807 100.384H54.91L54.7842 97.4222L56.5702 95.7811Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M106.685 115.261L163.03 150.874L101.714 169.974L84.8564 115.261H106.685Z\" fill=\"url(#paint16_linear_732_1686)\"/>\n      <path d=\"M102.042 111.986H89.4995L90.4495 103.709H101.092L102.042 111.986Z\" fill=\"url(#paint17_linear_732_1686)\"/>\n      <path d=\"M106.685 111.986H84.8564V115.261H106.685V111.986Z\" fill=\"url(#paint18_linear_732_1686)\"/>\n      <path d=\"M127.685 104.892H63.8566C61.1871 104.892 59.0234 102.728 59.0234 100.059V55.8527C59.0234 53.1832 61.1871 51.0195 63.8566 51.0195H127.685C130.354 51.0195 132.518 53.1832 132.518 55.8527V100.059C132.518 102.728 130.354 104.892 127.685 104.892Z\" fill=\"url(#paint19_linear_732_1686)\"/>\n      <path d=\"M124.787 96.4317H66.7564C64.5951 96.4317 62.8447 94.6814 62.8447 92.5201V58.959C62.8447 56.7977 64.5951 55.0474 66.7564 55.0474H124.787C126.948 55.0474 128.699 56.7977 128.699 58.959V92.5225C128.696 94.6814 126.946 96.4317 124.787 96.4317Z\" fill=\"url(#paint20_linear_732_1686)\"/>\n      <path d=\"M95.7718 103.186C96.9995 103.186 97.9948 102.191 97.9948 100.963C97.9948 99.7355 96.9995 98.7402 95.7718 98.7402C94.5441 98.7402 93.5488 99.7355 93.5488 100.963C93.5488 102.191 94.5441 103.186 95.7718 103.186Z\" fill=\"#ECF0F7\"/>\n      <path d=\"M95.7719 63.7588C88.9913 63.7588 83.4766 69.2759 83.4766 76.0542C83.4766 82.8324 88.9937 88.3495 95.7719 88.3495C102.553 88.3495 108.067 82.8324 108.067 76.0542C108.067 69.2759 102.553 63.7588 95.7719 63.7588ZM101.885 68.2499L95.7601 74.375L89.6444 68.2594C91.3331 66.9294 93.4587 66.1338 95.7696 66.1338C98.0757 66.1338 100.199 66.927 101.885 68.2499ZM85.8492 76.0565C85.8492 73.7504 86.6424 71.6272 87.9653 69.9409L94.0786 76.0542L87.9629 82.1698C86.6424 80.4835 85.8492 78.3603 85.8492 76.0565ZM89.6444 83.8513L95.7601 77.7357L101.885 83.8608C100.199 85.186 98.0757 85.9769 95.7696 85.9769C93.4611 85.9769 91.3331 85.1813 89.6444 83.8513ZM103.567 82.1817L97.4392 76.0542L103.564 69.929C104.894 71.6177 105.69 73.7457 105.69 76.0565C105.692 78.3674 104.897 80.493 103.567 82.1817Z\" fill=\"url(#paint21_linear_732_1686)\"/>\n      </g>\n      </g>\n      <defs>\n      <linearGradient id=\"paint0_linear_732_1686\" x1=\"61.1563\" y1=\"99.7028\" x2=\"61.1563\" y2=\"76.7155\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint1_linear_732_1686\" x1=\"45.8098\" y1=\"113.476\" x2=\"45.8098\" y2=\"62.0596\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint2_linear_732_1686\" x1=\"135.058\" y1=\"103.339\" x2=\"135.058\" y2=\"66.1751\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint3_linear_732_1686\" x1=\"149.908\" y1=\"108.723\" x2=\"149.908\" y2=\"68.41\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint4_linear_732_1686\" x1=\"29.0885\" y1=\"118.717\" x2=\"29.0885\" y2=\"82.9705\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint5_linear_732_1686\" x1=\"162.723\" y1=\"114.773\" x2=\"162.723\" y2=\"85.5296\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint6_linear_732_1686\" x1=\"30.5047\" y1=\"54.0441\" x2=\"30.5047\" y2=\"38.7156\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint7_linear_732_1686\" x1=\"153.309\" y1=\"45.2994\" x2=\"153.309\" y2=\"29.9709\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint8_linear_732_1686\" x1=\"122.488\" y1=\"55.553\" x2=\"122.488\" y2=\"44.4577\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint9_linear_732_1686\" x1=\"95.4645\" y1=\"177.99\" x2=\"95.4645\" y2=\"94.3595\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4065\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DAE4EF\"/>\n      </linearGradient>\n      <linearGradient id=\"paint10_linear_732_1686\" x1=\"45.8103\" y1=\"136.061\" x2=\"33.5942\" y2=\"121.502\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint11_linear_732_1686\" x1=\"27.0365\" y1=\"107.492\" x2=\"42.2808\" y2=\"107.492\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint12_linear_732_1686\" x1=\"169.04\" y1=\"131.317\" x2=\"157.791\" y2=\"117.911\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint13_linear_732_1686\" x1=\"151.752\" y1=\"105.009\" x2=\"165.79\" y2=\"105.009\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint14_linear_732_1686\" x1=\"60.1076\" y1=\"107.764\" x2=\"54.0653\" y2=\"100.563\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"1.4385e-07\" stop-color=\"#EAEFF6\"/>\n      <stop offset=\"1\" stop-color=\"#CDDAE9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint15_linear_732_1686\" x1=\"50.8218\" y1=\"93.6338\" x2=\"58.3619\" y2=\"93.6338\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint16_linear_732_1686\" x1=\"132.033\" y1=\"161.281\" x2=\"116.255\" y2=\"106.257\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.0938\" stop-color=\"white\"/>\n      <stop offset=\"0.9362\" stop-color=\"#BBCBE0\"/>\n      </linearGradient>\n      <linearGradient id=\"paint17_linear_732_1686\" x1=\"89.5001\" y1=\"107.848\" x2=\"102.042\" y2=\"107.848\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#DDE5F0\"/>\n      <stop offset=\"1\" stop-color=\"#9FB7CE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint18_linear_732_1686\" x1=\"84.8563\" y1=\"113.624\" x2=\"106.686\" y2=\"113.624\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#D4DEEC\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint19_linear_732_1686\" x1=\"59.0242\" y1=\"77.9562\" x2=\"132.518\" y2=\"77.9562\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#CED9E9\"/>\n      <stop offset=\"1\" stop-color=\"#A7BFD6\"/>\n      </linearGradient>\n      <linearGradient id=\"paint20_linear_732_1686\" x1=\"128.698\" y1=\"75.74\" x2=\"62.8443\" y2=\"75.74\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#E7ECF4\"/>\n      <stop offset=\"1\" stop-color=\"#E4E9F3\"/>\n      </linearGradient>\n      <linearGradient id=\"paint21_linear_732_1686\" x1=\"108.067\" y1=\"76.0559\" x2=\"83.4749\" y2=\"76.0559\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#D4DEEB\"/>\n      <stop offset=\"1\" stop-color=\"#A7BFD6\"/>\n      </linearGradient>\n      <clipPath id=\"clip0_732_1686\">\n      <rect width=\"190\" height=\"190\" fill=\"white\"/>\n      </clipPath>\n      <clipPath id=\"clip1_732_1686\">\n      <rect width=\"190\" height=\"190\" fill=\"white\" transform=\"translate(0 -5)\"/>\n      </clipPath>\n      </defs>\n    </svg>\n  `;\n\n  const networkXml = `\n    <svg width=\"190\" height=\"190\" viewBox=\"0 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path d=\"M64.1725 78.4988V77.689H57.1662V78.6295H55.6272V100.677H65.8516V78.4988H64.1725ZM64.9657 98.1496H56.4062V97.4965H64.9657V98.1496ZM64.9657 95.1381H56.4062V94.485H64.9657V95.1381ZM64.9657 92.129H56.4062V91.4758H64.9657V92.129ZM64.9657 89.1958H56.4062V88.5427H64.9657V89.1958ZM64.9657 86.2722H56.4062V85.6191H64.9657V86.2722ZM64.9657 83.2607H56.4062V82.6076H64.9657V83.2607ZM64.9657 80.33H56.4062V79.6768H64.9657V80.33Z\" fill=\"url(#paint0_linear_732_1684)\"/>\n      <path d=\"M50.4023 90.8037V65.1109H42.6242V63.0352H39.3324V75.701H38.4465V114.452H52.3427V90.806H50.4023V90.8037ZM44.5835 98.3586H42.6218V96.4562H44.5835V98.3586ZM44.5835 95.3827H42.6218V93.4803H44.5835V95.3827ZM44.5835 92.4211H42.6218V90.5187H44.5835V92.4211ZM44.5835 89.4665H42.6218V87.5642H44.5835V89.4665ZM44.5835 86.4907H42.6218V84.5883H44.5835V86.4907ZM44.5835 80.5532H42.6218V78.6508H44.5835V80.5532ZM44.5835 77.5773H42.6218V75.6749H44.5835V77.5773ZM44.5835 74.6133H42.6218V72.7109H44.5835V74.6133ZM44.5835 71.6612H42.6218V69.7588H44.5835V71.6612ZM44.5835 68.6853H42.6218V66.7829H44.5835V68.6853ZM47.5167 98.3586H45.5549V96.4562H47.5167V98.3586ZM47.5167 95.3827H45.5549V93.4803H47.5167V95.3827ZM47.5167 92.4211H45.5549V90.5187H47.5167V92.4211ZM47.5167 89.4665H45.5549V87.5642H47.5167V89.4665ZM47.5167 86.4907H45.5549V84.5883H47.5167V86.4907ZM47.5167 80.5532H45.5549V78.6508H47.5167V80.5532ZM47.5167 77.5773H45.5549V75.6749H47.5167V77.5773ZM47.5167 74.6133H45.5549V72.7109H47.5167V74.6133ZM47.5167 71.6612H45.5549V69.7588H47.5167V71.6612ZM47.5167 68.6853H45.5549V66.7829H47.5167V68.6853Z\" fill=\"url(#paint1_linear_732_1684)\"/>\n      <path d=\"M126.951 104.315C127.036 103.211 126.951 67.1509 126.951 67.1509H131.352V75.157H138.358V91.8889H142.331V104.315H126.951Z\" fill=\"url(#paint2_linear_732_1684)\"/>\n      <path d=\"M155.738 88.1292V86.9773H154.551V76.9239H151.653V75.8077H149.698V74.1665H148.68V69.3833H147.946V74.1998H147.012V75.8409H144.115V78.5294H142.44V109.697H156.543V88.1268H155.738V88.1292ZM144.929 100.664H143.975V97.0449H144.929V100.664ZM144.929 96.2351H143.975V92.6155H144.929V96.2351ZM144.929 91.8057H143.975V88.1862H144.929V91.8057ZM144.929 87.2979H143.975V83.6784H144.929V87.2979ZM144.929 82.7878H143.975V79.1683H144.929V82.7878ZM146.896 100.664H145.941V97.0449H146.896V100.664ZM146.896 96.2351H145.941V92.6155H146.896V96.2351ZM146.896 91.8057H145.941V88.1862H146.896V91.8057ZM146.896 87.2979H145.941V83.6784H146.896V87.2979ZM146.896 82.7878H145.941V79.1683H146.896V82.7878ZM148.862 100.664H147.908V97.0449H148.862V100.664ZM148.862 96.2351H147.908V92.6155H148.862V96.2351ZM148.862 91.8057H147.908V88.1862H148.862V91.8057ZM148.862 87.2979H147.908V83.6784H148.862V87.2979ZM148.862 82.7878H147.908V79.1683H148.862V82.7878ZM150.829 100.664H149.874V97.0449H150.829V100.664ZM150.829 96.2351H149.874V92.6155H150.829V96.2351ZM150.829 91.8057H149.874V88.1862H150.829V91.8057ZM150.829 87.2979H149.874V83.6784H150.829V87.2979ZM150.829 82.7878H149.874V79.1683H150.829V82.7878ZM152.795 100.664H151.841V97.0449H152.795V100.664ZM152.795 96.2351H151.841V92.6155H152.795V96.2351ZM152.795 91.8057H151.841V88.1862H152.795V91.8057ZM152.795 87.2979H151.841V83.6784H152.795V87.2979ZM152.795 82.7878H151.841V79.1683H152.795V82.7878Z\" fill=\"url(#paint3_linear_732_1684)\"/>\n      <path d=\"M22.3486 119.691V98.4252H24.783V87.5714L33.1573 83.9448V98.2542H34.9955V119.691H22.3486Z\" fill=\"url(#paint4_linear_732_1684)\"/>\n      <path d=\"M165.982 115.748H158.633V86.5049L165.982 90.0603V115.748Z\" fill=\"url(#paint5_linear_732_1684)\"/>\n      <path d=\"M21.1184 45.2557C21.1184 45.2557 23.3367 39.2042 28.7897 41.5792C30.0484 40.3015 31.6064 39.3729 33.7131 39.7909C35.8197 40.2112 37.1782 41.7882 37.6389 42.838C38.2992 42.8071 43.5859 42.9829 43.5859 48.4667C43.5859 53.9506 37.1877 53.8461 36.7246 53.4115C36.1546 53.9197 33.4138 56.6771 30.0888 53.5302C29.3692 54.1454 27.0179 56.7507 23.3011 53.155C21.5792 53.8746 17.4871 54.428 16.6938 50.2029C15.9006 45.9777 19.9689 44.7855 21.1184 45.2557Z\" fill=\"url(#paint6_linear_732_1684)\"/>\n      <path d=\"M143.923 36.5111C143.923 36.5111 146.141 30.4596 151.594 32.8346C152.853 31.5569 154.411 30.6282 156.517 31.0462C158.624 31.4666 159.982 33.0436 160.443 34.0934C161.103 34.0625 166.39 34.2382 166.39 39.7221C166.39 45.206 159.992 45.1015 159.529 44.6669C158.959 45.1751 156.218 47.9325 152.893 44.7856C152.173 45.4007 149.822 48.0061 146.105 44.4104C144.383 45.13 140.291 45.6834 139.498 41.4582C138.702 37.2355 142.773 36.0409 143.923 36.5111Z\" fill=\"url(#paint7_linear_732_1684)\"/>\n      <path d=\"M91.2023 45.8355C91.2023 45.8355 92.8078 41.4536 96.7551 43.1755C97.6671 42.2493 98.7928 41.5771 100.32 41.8811C101.847 42.1851 102.828 43.3275 103.16 44.0851C103.638 44.0638 107.466 44.1896 107.466 48.1583C107.466 52.1269 102.835 52.0509 102.5 51.7374C102.087 52.1055 100.104 54.1005 97.6956 51.8253C97.1755 52.2694 95.4726 54.1575 92.7841 51.5545C91.5372 52.0746 88.5756 52.476 88.0008 49.417C87.4237 46.3604 90.3711 45.4959 91.2023 45.8355Z\" fill=\"url(#paint8_linear_732_1684)\"/>\n      <path d=\"M95.0475 178.963C143.708 178.963 183.155 160.243 183.155 137.149C183.155 114.056 143.708 95.335 95.0475 95.335C46.3869 95.335 6.9397 114.056 6.9397 137.149C6.9397 160.243 46.3869 178.963 95.0475 178.963Z\" fill=\"url(#paint9_linear_732_1684)\"/>\n      <path d=\"M34.7106 132.036C34.7106 132.036 33.8722 133.226 35.2735 134.998C36.5227 136.575 38.4963 136.268 39.1518 135.762C39.3537 137.135 41.0376 140.028 43.7023 138.391C46.208 136.855 45.0015 134.518 44.2011 133.599C45.7662 133.157 46.9323 129.407 43.3413 128.112C43.8733 126.564 43.9683 125.863 43.1893 124.472C42.4388 123.132 41.2062 122.918 39.2397 123.733L36.3945 124.932L34.5823 121.55L33.6133 122.111L35.7033 125.341L32.9341 126.73C32.9341 126.73 30.5662 127.656 31.5875 130.198C32.5351 132.554 34.7106 132.036 34.7106 132.036Z\" fill=\"url(#paint10_linear_732_1684)\"/>\n      <path d=\"M29.8893 117.615H38.4535C38.4535 117.615 41.2204 117.693 41.7714 114.532C42.377 111.062 39.8524 110.585 39.8524 110.585C39.8524 110.585 41.3724 109.887 41.0423 107.262C40.7122 104.638 38.4013 104.308 37.4394 104.429C37.5962 102.873 37.9239 99.3513 34.2664 99.3157C30.7324 99.2824 30.7562 102.838 31.0174 104.239C29.7587 104.253 25.9563 106.141 28.6305 110.283C27.1747 111.53 26.5595 112.25 26.6237 114.048C26.6902 115.846 27.7922 117.615 29.8893 117.615Z\" fill=\"url(#paint11_linear_732_1684)\"/>\n      <path d=\"M38.2421 112.81L34.5917 115.214L34.492 112.889L36.8005 110.167L34.4563 112.062L34.1523 104.961L33.9267 112.11L31.4638 110.148L33.9053 112.836L33.8293 115.228L30.0745 112.468L33.8032 116.093L33.6132 122.113H34.8862L34.6297 116.128L38.2421 112.81Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M158.785 127.687C158.785 127.687 158.013 128.784 159.303 130.414C160.453 131.867 162.272 131.585 162.875 131.117C163.06 132.38 164.614 135.043 167.067 133.539C169.373 132.124 168.264 129.972 167.525 129.126C168.967 128.72 170.04 125.265 166.734 124.075C167.226 122.65 167.314 122.004 166.594 120.724C165.903 119.491 164.768 119.292 162.958 120.044L160.336 121.149L158.667 118.035L157.776 118.551L159.7 121.524L157.151 122.804C157.151 122.804 154.971 123.657 155.912 125.999C156.783 128.165 158.785 127.687 158.785 127.687Z\" fill=\"url(#paint12_linear_732_1684)\"/>\n      <path d=\"M154.346 114.409H162.231C162.231 114.409 164.78 114.482 165.286 111.57C165.841 108.376 163.519 107.937 163.519 107.937C163.519 107.937 164.92 107.293 164.614 104.878C164.307 102.462 162.182 102.156 161.296 102.27C161.441 100.838 161.742 97.5936 158.374 97.5603C155.123 97.5271 155.142 100.8 155.384 102.092C154.225 102.104 150.722 103.842 153.187 107.659C151.848 108.806 151.28 109.471 151.34 111.124C151.399 112.779 152.416 114.409 154.346 114.409Z\" fill=\"url(#paint13_linear_732_1684)\"/>\n      <path d=\"M162.039 109.984L158.676 112.197L158.584 110.058L160.712 107.55L158.55 109.295L158.272 102.757L158.066 109.338L155.795 107.533L158.044 110.01L157.976 112.212L154.515 109.668L157.949 113.005L157.776 118.551H158.947L158.712 113.038L162.039 109.984Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M54.4064 106.265C54.4064 106.265 53.9908 106.854 54.6843 107.73C55.3018 108.512 56.2779 108.36 56.6033 108.108C56.703 108.787 57.5367 110.217 58.8548 109.409C60.0945 108.649 59.4984 107.493 59.1018 107.039C59.876 106.821 60.4532 104.966 58.6767 104.327C58.9403 103.562 58.9878 103.215 58.6007 102.527C58.2302 101.864 57.6198 101.757 56.6484 102.161L55.24 102.755L54.3447 101.083L53.8649 101.36L54.898 102.956L53.5277 103.643C53.5277 103.643 52.3568 104.101 52.8627 105.358C53.3305 106.521 54.4064 106.265 54.4064 106.265Z\" fill=\"url(#paint14_linear_732_1684)\"/>\n      <path d=\"M52.022 99.1328H56.2566C56.2566 99.1328 57.6246 99.1708 57.8977 97.608C58.197 95.8909 56.9477 95.6558 56.9477 95.6558C56.9477 95.6558 57.7006 95.309 57.5367 94.0123C57.3729 92.7155 56.2305 92.5517 55.7555 92.611C55.8339 91.8415 55.9954 90.0983 54.1856 90.0817C52.4376 90.065 52.4495 91.8225 52.5801 92.516C51.9579 92.5232 50.0768 93.4565 51.3997 95.5062C50.6801 96.1213 50.3737 96.4799 50.407 97.3681C50.4402 98.2588 50.9841 99.1328 52.022 99.1328Z\" fill=\"url(#paint15_linear_732_1684)\"/>\n      <path d=\"M56.1544 96.7553L54.347 97.9452L54.2995 96.7957L55.4419 95.449L54.2805 96.3872L54.1309 92.8745L54.0193 96.4109L52.8009 95.4395L54.0074 96.7695L53.9718 97.9523L52.1145 96.5867L53.9575 98.3798L53.8649 101.358H54.4943L54.366 98.3988L56.1544 96.7553Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M104.17 123.422L165.982 155.34L97.6955 175.534L64.8801 122.833L104.17 123.422Z\" fill=\"url(#paint16_linear_732_1684)\"/>\n      <path d=\"M71.7629 117.584L64.8801 118.724L86.761 124.293L104.17 119.294L99.0374 118.551L71.7629 117.584Z\" fill=\"url(#paint17_linear_732_1684)\"/>\n      <path d=\"M79.2489 56.25C79.2489 56.25 59.8855 74.6753 77.7336 98.2827C94.3088 120.209 122.749 104.199 123.787 102.073C110.269 89.1627 79.2489 56.25 79.2489 56.25Z\" fill=\"url(#paint18_linear_732_1684)\"/>\n      <path d=\"M109.962 70.7896C122.46 83.2869 128.97 97.0357 124.502 101.503C120.037 105.968 106.286 99.4606 93.7886 86.9634C81.2914 74.4661 74.7815 60.7172 79.2489 56.2499C83.7163 51.7825 97.4651 58.2947 109.962 70.7896Z\" fill=\"url(#paint19_linear_732_1684)\"/>\n      <path d=\"M93.7886 86.9633C94.9096 88.0843 96.0425 89.1578 97.1778 90.1791L116.848 66.3602L115.708 65.1323L92.3066 85.441C92.7911 85.9516 93.2851 86.4575 93.7886 86.9633Z\" fill=\"url(#paint20_linear_732_1684)\"/>\n      <path d=\"M116.847 68.0274C118.882 68.0274 120.531 66.3782 120.531 64.3438C120.531 62.3094 118.882 60.6602 116.847 60.6602C114.813 60.6602 113.164 62.3094 113.164 64.3438C113.164 66.3782 114.813 68.0274 116.847 68.0274Z\" fill=\"url(#paint21_linear_732_1684)\"/>\n      <path d=\"M127.202 68.588C126.357 68.5714 125.633 67.9325 125.533 67.0704C124.243 56.0195 115.536 56.1477 115.14 56.1596C114.195 56.1834 112.751 55.7202 112.943 53.9081C113.043 52.9676 113.499 52.742 114.444 52.7111C114.577 52.7064 117.731 52.6185 121.08 54.3024C124.191 55.8675 127.582 59.2305 129.352 66.0539C129.352 68.2365 128.076 68.588 127.202 68.588Z\" fill=\"url(#paint22_linear_732_1684)\"/>\n      <path d=\"M127.632 67.7282C126.787 67.7282 126.051 67.1036 125.932 66.2438C124.421 55.2191 115.135 55.5183 114.741 55.5349C113.796 55.5777 112.99 54.8509 112.943 53.9057C112.895 52.9604 113.617 52.1553 114.56 52.1054C114.693 52.0983 117.845 51.9463 121.227 53.5637C124.369 55.0671 128.326 58.4039 129.335 65.7759C129.463 66.7164 128.806 67.5809 127.867 67.7116C127.789 67.7234 127.711 67.7282 127.632 67.7282Z\" fill=\"url(#paint23_linear_732_1684)\"/>\n      <path d=\"M133.648 68.486C132.428 68.4029 131.898 67.3247 131.848 66.4032C131.461 59.0716 128.343 53.9202 122.576 51.0892C118.197 48.9398 114.724 48.9113 114.677 48.9089C114.674 48.9089 112.589 49.0087 112.938 46.6907C113.316 46.0756 113.686 45.4866 114.636 45.4747C114.845 45.4723 118.985 45.4984 124.089 48.0064C128.879 50.3577 135.895 55.5304 135.895 66.3391C135.897 68.3103 134.271 68.5359 133.648 68.486Z\" fill=\"url(#paint24_linear_732_1684)\"/>\n      <path d=\"M134.211 67.7282C133.299 67.7282 132.539 67.0086 132.496 66.0895C132.164 58.7555 129.081 53.5827 123.336 50.709C118.971 48.5263 114.71 48.524 114.663 48.5216C114.66 48.5216 114.658 48.5216 114.655 48.5216C113.71 48.5216 112.943 47.7568 112.938 46.8116C112.934 45.864 113.698 45.0897 114.648 45.085C114.857 45.085 119.788 45.0897 124.875 47.6333C129.646 50.0202 135.439 55.1312 135.931 65.9303C135.973 66.878 135.24 67.6807 134.292 67.7235C134.263 67.7282 134.237 67.7282 134.211 67.7282Z\" fill=\"url(#paint25_linear_732_1684)\"/>\n      <path d=\"M93.1188 108.801V113.026L86.3667 114.079V119.296L99.0373 116.665V109.666C97.0779 109.573 95.0924 109.302 93.1188 108.801Z\" fill=\"url(#paint26_linear_732_1684)\"/>\n      <path d=\"M97.1967 109.526V113.858L87.3072 115.582L87.3523 114.076C87.3523 114.076 88.0529 96.5371 80.1608 96.5371C72.2687 96.5371 71.1287 109.78 71.1287 112.324C71.1287 114.867 71.1287 119.252 71.1287 119.252L86.103 122.935H87.0887L100.814 119.121V109.702C99.6192 109.709 98.4103 109.654 97.1967 109.526Z\" fill=\"url(#paint27_linear_732_1684)\"/>\n      <path d=\"M70.1409 119.252C70.1409 119.252 70.1409 114.867 70.1409 112.324C70.1409 109.78 71.2809 96.5371 79.173 96.5371C87.0651 96.5371 86.3645 114.076 86.3645 114.076L86.1009 122.935L70.1409 119.252Z\" fill=\"url(#paint28_linear_732_1684)\"/>\n      <path d=\"M81.5527 106.227C81.5527 104.895 80.6288 103.816 79.4912 103.816H78.7858L78.7074 103.997C77.9569 104.358 77.4297 105.22 77.4297 106.227C77.4297 107.236 77.9593 108.099 78.7098 108.46L78.7573 108.635L79.4674 108.638C79.4746 108.638 79.4817 108.64 79.4888 108.64C79.4959 108.64 79.5007 108.64 79.5078 108.64H79.5411V108.638C80.6573 108.604 81.5527 107.54 81.5527 106.227Z\" fill=\"url(#paint29_linear_732_1684)\"/>\n      <path d=\"M78.8664 108.638C80.005 108.638 80.9279 107.558 80.9279 106.227C80.9279 104.896 80.005 103.816 78.8664 103.816C77.7279 103.816 76.8049 104.896 76.8049 106.227C76.8049 107.558 77.7279 108.638 78.8664 108.638Z\" fill=\"url(#paint30_linear_732_1684)\"/>\n      <path d=\"M64.8801 122.833V118.724L86.761 124.293V129.062L64.8801 122.833Z\" fill=\"url(#paint31_linear_732_1684)\"/>\n      <path d=\"M104.17 123.422V119.294L86.761 124.294V129.063L104.17 123.422Z\" fill=\"url(#paint32_linear_732_1684)\"/>\n      <defs>\n      <linearGradient id=\"paint0_linear_732_1684\" x1=\"60.7399\" y1=\"100.677\" x2=\"60.7399\" y2=\"77.6902\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint1_linear_732_1684\" x1=\"45.3934\" y1=\"114.45\" x2=\"45.3934\" y2=\"63.0343\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint2_linear_732_1684\" x1=\"134.642\" y1=\"104.314\" x2=\"134.642\" y2=\"67.1498\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint3_linear_732_1684\" x1=\"149.491\" y1=\"109.698\" x2=\"149.491\" y2=\"69.3847\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint4_linear_732_1684\" x1=\"28.6718\" y1=\"119.692\" x2=\"28.6718\" y2=\"83.9452\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint5_linear_732_1684\" x1=\"162.307\" y1=\"115.748\" x2=\"162.307\" y2=\"86.5042\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint6_linear_732_1684\" x1=\"30.0882\" y1=\"55.0188\" x2=\"30.0882\" y2=\"39.6902\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint7_linear_732_1684\" x1=\"152.892\" y1=\"46.2741\" x2=\"152.892\" y2=\"30.9455\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint8_linear_732_1684\" x1=\"97.6949\" y1=\"52.9025\" x2=\"97.6949\" y2=\"41.8071\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint9_linear_732_1684\" x1=\"95.0481\" y1=\"178.965\" x2=\"95.0481\" y2=\"95.3342\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4065\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DAE4EF\"/>\n      </linearGradient>\n      <linearGradient id=\"paint10_linear_732_1684\" x1=\"45.3938\" y1=\"137.036\" x2=\"33.1777\" y2=\"122.477\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint11_linear_732_1684\" x1=\"26.6199\" y1=\"108.467\" x2=\"41.8643\" y2=\"108.467\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint12_linear_732_1684\" x1=\"168.623\" y1=\"132.292\" x2=\"157.374\" y2=\"118.886\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint13_linear_732_1684\" x1=\"151.335\" y1=\"105.984\" x2=\"165.373\" y2=\"105.984\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint14_linear_732_1684\" x1=\"59.6911\" y1=\"108.739\" x2=\"53.6488\" y2=\"101.538\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"1.4385e-07\" stop-color=\"#EAEFF6\"/>\n      <stop offset=\"1\" stop-color=\"#CDDAE9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint15_linear_732_1684\" x1=\"50.4053\" y1=\"94.6084\" x2=\"57.9455\" y2=\"94.6084\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint16_linear_732_1684\" x1=\"123.739\" y1=\"168.065\" x2=\"107.283\" y2=\"110.674\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.0938\" stop-color=\"white\"/>\n      <stop offset=\"0.9362\" stop-color=\"#BBCBE0\"/>\n      </linearGradient>\n      <linearGradient id=\"paint17_linear_732_1684\" x1=\"64.8791\" y1=\"120.94\" x2=\"104.169\" y2=\"120.94\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint18_linear_732_1684\" x1=\"76.2081\" y1=\"58.0062\" x2=\"107.388\" y2=\"112.011\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint19_linear_732_1684\" x1=\"77.8411\" y1=\"78.8768\" x2=\"125.911\" y2=\"78.8768\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint20_linear_732_1684\" x1=\"116.847\" y1=\"77.6568\" x2=\"92.305\" y2=\"77.6568\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#A1BBD3\"/>\n      </linearGradient>\n      <linearGradient id=\"paint21_linear_732_1684\" x1=\"113.164\" y1=\"64.3441\" x2=\"120.53\" y2=\"64.3441\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint22_linear_732_1684\" x1=\"112.798\" y1=\"60.4893\" x2=\"129.454\" y2=\"60.8208\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#9BB8D1\"/>\n      </linearGradient>\n      <linearGradient id=\"paint23_linear_732_1684\" x1=\"112.941\" y1=\"59.9132\" x2=\"129.352\" y2=\"59.9132\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint24_linear_732_1684\" x1=\"112.976\" y1=\"57.068\" x2=\"135.833\" y2=\"56.9023\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#9BB8D1\"/>\n      </linearGradient>\n      <linearGradient id=\"paint25_linear_732_1684\" x1=\"112.937\" y1=\"56.4073\" x2=\"135.929\" y2=\"56.4073\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint26_linear_732_1684\" x1=\"92.7019\" y1=\"119.295\" x2=\"92.7019\" y2=\"108.8\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#E5EBF4\"/>\n      <stop offset=\"1\" stop-color=\"#9BB8D1\"/>\n      </linearGradient>\n      <linearGradient id=\"paint27_linear_732_1684\" x1=\"85.9709\" y1=\"122.935\" x2=\"85.9709\" y2=\"96.5375\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint28_linear_732_1684\" x1=\"70.1412\" y1=\"109.736\" x2=\"86.3817\" y2=\"109.736\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint29_linear_732_1684\" x1=\"77.4312\" y1=\"106.228\" x2=\"81.5531\" y2=\"106.228\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#E5EBF4\"/>\n      <stop offset=\"1\" stop-color=\"#9BB8D1\"/>\n      </linearGradient>\n      <linearGradient id=\"paint30_linear_732_1684\" x1=\"78.8672\" y1=\"108.64\" x2=\"78.8672\" y2=\"103.816\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#E5EBF4\"/>\n      <stop offset=\"1\" stop-color=\"#9BB8D1\"/>\n      </linearGradient>\n      <linearGradient id=\"paint31_linear_732_1684\" x1=\"64.8791\" y1=\"123.894\" x2=\"86.7602\" y2=\"123.894\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint32_linear_732_1684\" x1=\"86.7602\" y1=\"124.18\" x2=\"104.169\" y2=\"124.18\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      </defs>\n    </svg>\n  `;\n\n  return (\n    <Box padding=\"x6\" width=\"100%\" flex={1} justifyContent=\"center\" alignItems=\"center\">\n      <SvgXml xml={type === 'network' ? networkXml : defaultXml} width={190} height={190} />\n      <Text variant=\"p1\" color=\"text\" marginBottom={'x4'}>\n        {type === 'network' ? '网络连接异常' : '对不起，应用出错了'}\n      </Text>\n      <Button title=\"刷新试试\" type=\"primary\" onPress={onRefresh} width=\"100%\" />\n    </Box>\n  );\n}\n"
  },
  {
    "path": "packages/react-native/src/flex/FlexItem.tsx",
    "content": "import React, { FC, PropsWithChildren } from 'react';\n\nimport { BoxProps } from '@shopify/restyle';\n\nimport Box from '../box';\nimport { Theme } from '../theme';\n\ntype FlexItemProps = PropsWithChildren<Omit<BoxProps<Theme>, 'width'>>;\n\nconst FlexItem: FC<FlexItemProps> = ({ children, ...props }) => {\n  return (\n    <Box flex={1} justifyContent={'center'} {...props}>\n      {children}\n    </Box>\n  );\n};\nFlexItem.displayName = 'FlexItem';\n\nexport default FlexItem;\n"
  },
  {
    "path": "packages/react-native/src/flex/index.md",
    "content": "---\ntitle: Flex - 布局组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n---\n\n# Flex 布局组件\n\nFlex 是 CSS flex 布局的一个封装。\n\n## 效果演示\n\n### 1. 水平方向\n\n```tsx | pure\n<Flex>\n  <View style={{ width: 100, height: 50, backgroundColor: 'red' }} />\n  <View style={{ width: 100, height: 50, backgroundColor: 'green' }} />\n  <View style={{ width: 100, height: 50, backgroundColor: 'gold' }} />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"flex-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607515191492106546.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 垂直方向\n\n```tsx | pure\n<Flex flexDirection=\"column\">\n  <View style={{ width: 100, height: 50, backgroundColor: 'red' }} />\n  <View style={{ width: 100, height: 50, backgroundColor: 'green' }} />\n  <View style={{ width: 100, height: 50, backgroundColor: 'gold' }} />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"flex-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607515262409907926.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 内容居中\n\n```tsx | pure\n<Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n  <View style={{ width: 100, height: 50, backgroundColor: 'red' }} />\n  <View style={{ width: 100, height: 50, backgroundColor: 'green' }} />\n  <View style={{ width: 100, height: 50, backgroundColor: 'gold' }} />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"flex-ios3.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607515318334231753.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自动换行\n\n```tsx | pure\n<Flex flexWrap=\"wrap\">\n  <View style={{ width: '30%', height: 50, backgroundColor: 'red' }} />\n  <View style={{ width: '30%', height: 50, backgroundColor: 'green' }} />\n  <View style={{ width: '30%', height: 50, backgroundColor: 'gold' }} />\n  <View style={{ width: '30%', height: 50, backgroundColor: 'blue' }} />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"flex-ios4.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609148595858116753.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### 基本属性\n\n| 属性            | 必填    | 说明                                | 类型        | 默认值 |\n| --------------- | ------- | ----------------------------------- | ----------- | ------ |\n| backgroundColor | `false` | 背景色。取值为 Theme 里面的`colors` | string      |        |\n| style           | `false` | 样式                                | `ViewStyle` |        |\n\n### 宽高布局相关属性\n\n定义参见：[https://reactnative.dev/docs/layout-props](https://reactnative.dev/docs/layout-props)\n\n| 属性           | 必填    | 说明 | 类型 | 默认值 |\n| -------------- | ------- | ---- | ---- | ------ |\n| width          | `false` |      |      |        |\n| minWidth       | `false` |      |      |        |\n| maxWidth       | `false` |      |      |        |\n| height         | `false` |      |      |        |\n| maxHeight      | `false` |      |      |        |\n| minHeight      | `false` |      |      |        |\n| flex           | `false` |      |      |        |\n| flexDirection  | `false` |      |      |        |\n| flexBasis      | `false` |      |      |        |\n| flexGrow       | `false` |      |      |        |\n| flexShrink     | `false` |      |      |        |\n| flexWrap       | `false` |      |      |        |\n| alignContent   | `false` |      |      |        |\n| alignItems     | `false` |      |      |        |\n| alignSelf      | `false` |      |      |        |\n| justifyContent | `false` |      |      |        |\n| aspectRatio    | `false` |      |      |        |\n| overflow       | `false` |      |      |        |\n\n### 内边距、外边距相关属性\n\n取值为 Theme 里面的`spacing`。\n\n定义参见：[https://reactnative.dev/docs/layout-props](https://reactnative.dev/docs/layout-props)\n\n| 属性              | 必填    | 说明 | 类型 | 默认值 |\n| ----------------- | ------- | ---- | ---- | ------ |\n| margin            | `false` |      |      |        |\n| marginStart       | `false` |      |      |        |\n| marginEnd         | `false` |      |      |        |\n| marginHorizontal  | `false` |      |      |        |\n| marginVertical    | `false` |      |      |        |\n| marginLeft        | `false` |      |      |        |\n| marginRight       | `false` |      |      |        |\n| marginBottom      | `false` |      |      |        |\n| marginTop         | `false` |      |      |        |\n| padding           | `false` |      |      |        |\n| paddingStart      | `false` |      |      |        |\n| paddingEnd        | `false` |      |      |        |\n| paddingHorizontal | `false` |      |      |        |\n| paddingVertical   | `false` |      |      |        |\n| paddingLeft       | `false` |      |      |        |\n| paddingRight      | `false` |      |      |        |\n| paddingBottom     | `false` |      |      |        |\n| paddingTop        | `false` |      |      |        |\n\n### 边框相关属性\n\n定义参见：[https://reactnative.dev/docs/view-style-props](https://reactnative.dev/docs/view-style-props)\n\n| 属性                    | 必填    | 说明 | 类型 | 默认值 |\n| ----------------------- | ------- | ---- | ---- | ------ |\n| borderWidth             | `false` |      |      |        |\n| borderLeftWidth         | `false` |      |      |        |\n| borderRightWidth        | `false` |      |      |        |\n| borderBottomWidth       | `false` |      |      |        |\n| borderTopWidth          | `false` |      |      |        |\n| borderStartWidth        | `false` |      |      |        |\n| borderEndWidth          | `false` |      |      |        |\n| borderStyle             | `false` |      |      |        |\n| borderColor             | `false` |      |      |        |\n| borderStartColor        | `false` |      |      |        |\n| borderEndColor          | `false` |      |      |        |\n| borderLeftColor         | `false` |      |      |        |\n| borderRightColor        | `false` |      |      |        |\n| borderBottomColor       | `false` |      |      |        |\n| borderTopColor          | `false` |      |      |        |\n| borderRadius            | `false` |      |      |        |\n| borderBottomStartRadius | `false` |      |      |        |\n| borderBottomEndRadius   | `false` |      |      |        |\n| borderBottomLeftRadius  | `false` |      |      |        |\n| borderBottomRightRadius | `false` |      |      |        |\n| borderTopStartRadius    | `false` |      |      |        |\n| borderTopEndRadius      | `false` |      |      |        |\n| borderTopLeftRadius     | `false` |      |      |        |\n| borderTopRightRadius    | `false` |      |      |        |\n\n### Flex.Item\n\nFlex.Item 组件默认加上了样式`flex:1`,保证所有 item 平均分宽度, Flex 容器的 children 不一定是 Flex.Item。\n"
  },
  {
    "path": "packages/react-native/src/flex/index.tsx",
    "content": "import React, { PropsWithChildren } from 'react';\nimport { ViewProps } from 'react-native';\n\nimport { BoxProps } from '@shopify/restyle';\n\nimport Box from '../box';\nimport { Theme } from '../theme';\nimport FlexItem from './FlexItem';\n\nconst Flex = ({ children, ...props }: PropsWithChildren<BoxProps<Theme> & ViewProps>) => {\n  return (\n    <Box flexDirection={'row'} flexWrap={'nowrap'} justifyContent={'flex-start'} alignItems={'center'} {...props}>\n      {children}\n    </Box>\n  );\n};\nFlex.displayName = 'Flex';\n\nexport default Object.assign(Flex, { Item: FlexItem });\n"
  },
  {
    "path": "packages/react-native/src/float-button/PlusIcon.tsx",
    "content": "import React, { memo } from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nconst PlusIcon = () => {\n  const xml = `\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"42\" viewBox=\"0 0 24 24\">\n      <path fill=\"#fff\" d=\"M11 13H5v-2h6V5h2v6h6v2h-6v6h-2z\"/>\n    </svg>\n  `;\n\n  return <SvgXml xml={xml} />;\n};\n\nexport default memo(PlusIcon);\n"
  },
  {
    "path": "packages/react-native/src/float-button/index.md",
    "content": "---\ntitle: FloatButton - 悬浮按钮组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# FloatButton 悬浮按钮组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<FloatButton\n  items={[\n    { icon: <IconHome />, label: 'New Task', onPress: handlePress1 },\n    { icon: <IconNotification />, label: 'Notifications', onPress: handlePress2 },\n    { icon: <IconCreate />, label: 'All Tasks', onPress: handlePress3 },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"floatButton-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1704857363855209553.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 修改按钮位置\n\n```tsx | pure\n<FloatButton\n  position=\"topLeft\"\n  items={[\n    { icon: <IconHome />, label: 'New Task', onPress: handlePress1 },\n    { icon: <IconNotification />, label: 'Notifications', onPress: handlePress2 },\n    { icon: <IconCreate />, label: 'All Tasks', onPress: handlePress3 },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"floatButton-ios2.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1704857368486252185.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义主按钮\n\n```tsx | pure\n<FloatButton\n  items={[\n    { icon: <IconHome />, label: 'New Task', onPress: handlePress1 },\n    { icon: <IconNotification />, label: 'Notifications', onPress: handlePress2 },\n    { icon: <IconCreate />, label: 'All Tasks', onPress: handlePress3 },\n  ]}\n  customActionButton={(_, onPress) => <Button title=\"添加商品\" onPress={onPress} />}\n  actionButtonProps={{\n    width: 80,\n    height: 40,\n    borderRadius: 10,\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"floatButton-ios4.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1704857373801391849.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 按钮可拖拽\n\n```tsx | pure\n<FloatButton\n  items={[\n    { icon: <IconHome />, label: 'New Task', onPress: handlePress1 },\n    { icon: <IconNotification />, label: 'Notifications', onPress: handlePress2 },\n    { icon: <IconCreate />, label: 'All Tasks', onPress: handlePress3 },\n  ]}\n  draggable\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"floatButton-ios4.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1704857378202055121.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### FloatButton\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| items | `true` | 操作项 | `FloatButtonItemProps[]` |  |\n| itemHeight | `false` | 操作项行高 | `number` |  |\n| position | `false` | 按钮位置 | `'topLeft' \\| 'topRight' \\| 'bottomLeft' \\| 'bottomRight'` |  |\n| customActionButton | `false` | 自定义主按钮 | `(progress: SharedValue<number>, onPress: () => void) => ReactNode` |  |\n| containerStyle | `false` | 容器样式 | `StyleProp<ViewStyle>` |  |\n| draggable | `false` | 是否可以拖拽(实验属性，不建议是用) | `boolean` |  |\n| actionButtonProps | `false` | 主按钮样式属性 | `ActionButtonProps` |  |\n\n### FloatButtonItemProps\n\n| 属性    | 必填    | 说明           | 类型                          | 默认值 |\n| ------- | ------- | -------------- | ----------------------------- | ------ |\n| icon    | `false` | 按钮图标       | `ReactNode`                   |        |\n| label   | `true`  | 按钮的文字标题 | `ReactNode`                   |        |\n| onPress | `true`  | 点击事件       | `() => void \\| Promise<void>` |        |\n| style   | `false` | 样式           | `StyleProp<ViewStyle>`        |        |\n\n### ActionButtonProps\n\n| 属性         | 必填    | 说明           | 类型     | 默认值 |\n| ------------ | ------- | -------------- | -------- | ------ |\n| width        | `false` | 主按钮宽度     | `number` |        |\n| height       | `false` | 主按钮高度     | `number` |        |\n| borderRadius | `false` | 主按钮圆角大小 | `number` |        |\n"
  },
  {
    "path": "packages/react-native/src/float-button/index.tsx",
    "content": "import React, { ReactNode, useMemo } from 'react';\nimport { Image, Pressable, StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler';\nimport Animated, {\n  SharedValue,\n  useAnimatedStyle,\n  useDerivedValue,\n  useSharedValue,\n  withTiming,\n} from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport PlusIcon from './PlusIcon';\n\ninterface FloatButtonItem {\n  icon?: ReactNode;\n  label: ReactNode;\n  onPress: () => void | Promise<void>;\n  style?: StyleProp<ViewStyle>;\n}\n\nexport interface FloatButtonProps {\n  items: FloatButtonItem[];\n  itemHeight?: number;\n  position?: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';\n  customActionButton?: (progress: SharedValue<number>, onPress: () => void) => ReactNode;\n  containerStyle?: StyleProp<ViewStyle>;\n  draggable?: boolean;\n  actionButtonProps?: {\n    width?: number;\n    height?: number;\n    borderRadius?: number;\n  };\n}\n\nexport default function FloatButton({\n  customActionButton,\n  items,\n  itemHeight = 60,\n  position = 'bottomRight',\n  containerStyle,\n  draggable = false,\n  actionButtonProps,\n}: FloatButtonProps) {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme<Theme>();\n\n  const width = useSharedValue(actionButtonProps?.width || itemHeight);\n  const height = useSharedValue(actionButtonProps?.height || itemHeight);\n  const borderRadius = useSharedValue(actionButtonProps?.borderRadius || itemHeight);\n\n  const isOpen = useSharedValue(false);\n  const [opened, setOpened] = useSafeState(false);\n\n  const progress = useDerivedValue(() => (isOpen.value ? withTiming(1) : withTiming(0)));\n  const scale = useDerivedValue(() => (isOpen.value ? withTiming(0) : withTiming(1)));\n\n  const handlePress = () => {\n    if (!isOpen.value) {\n      width.value = withTiming(200);\n      height.value = withTiming((items.length + 1) * itemHeight);\n      borderRadius.value = withTiming(12);\n    } else {\n      width.value = withTiming(actionButtonProps?.width || itemHeight);\n      height.value = withTiming(actionButtonProps?.height || itemHeight);\n      borderRadius.value = withTiming(actionButtonProps?.borderRadius || itemHeight);\n    }\n    isOpen.value = !isOpen.value;\n    setOpened(opened => !opened);\n  };\n\n  const iconStyle = {\n    width: itemHeight / 2,\n    height: itemHeight / 2,\n  };\n\n  const positionX = useSharedValue(0);\n  const positionY = useSharedValue(0);\n  const context = useSharedValue({ x: 0, y: 0 });\n\n  const panGesture = Gesture.Pan()\n    .enabled(draggable && !opened)\n    .onStart(() => {\n      context.value = { x: positionX.value, y: positionY.value };\n    })\n    .onUpdate(e => {\n      positionX.value = e.translationX + context.value.x;\n      positionY.value = e.translationY + context.value.y;\n    })\n    .onEnd(() => {\n      'worklet';\n      // 滑动结束后，判断位置，自动滑到左边或右边\n      // 同时需要根据position，如果一开始位置在左侧，那么滑动结束后，如果超过屏幕一半，自动滑到右边\n      // 如果一开始位置在右侧，那么滑动结束后，如果超过屏幕一半，自动滑到左边\n      if (position.includes('Left')) {\n        if (positionX.value > (helpers.deviceWidth - itemHeight) / 2) {\n          // 超过屏幕一半，自动滑到右边\n          positionX.value = withTiming(helpers.deviceWidth - itemHeight - 32);\n        } else {\n          positionX.value = withTiming(0);\n        }\n      } else {\n        if (positionX.value < -(helpers.deviceWidth - itemHeight) / 2) {\n          // 超过屏幕一半，自动滑到左边\n          positionX.value = withTiming(-helpers.deviceWidth + itemHeight + 32);\n        } else {\n          positionX.value = withTiming(0);\n        }\n      }\n    });\n\n  const animatedStyle = useAnimatedStyle(() => {\n    return {\n      width: width.value,\n      height: height.value,\n      borderRadius: borderRadius.value,\n      transform: [{ translateX: positionX.value }, { translateY: positionY.value }],\n    };\n  });\n\n  /** 根据position确定绝对定位的初始位置 */\n  const positionStyle = useMemo(() => {\n    switch (position) {\n      case 'topLeft':\n        return { top: 0, left: 0 };\n      case 'topRight':\n        return { top: 0, right: 0 };\n      case 'bottomLeft':\n        return { bottom: insets.bottom, left: 0 };\n      case 'bottomRight':\n        return { bottom: insets.bottom, right: 0 };\n      default:\n        return { top: 0, left: 0 };\n    }\n  }, [position]);\n\n  const mainButtonStyle = useAnimatedStyle(() => {\n    return {\n      opacity: scale.value,\n      transform: [{ scale: scale.value }],\n    };\n  });\n  const closeButtonStyle = useAnimatedStyle(() => {\n    return {\n      opacity: progress.value,\n      transform: [{ scale: progress.value }],\n    };\n  });\n\n  return (\n    <GestureDetector gesture={panGesture}>\n      <Animated.View\n        style={[\n          { backgroundColor: theme.colors.primary200 },\n          styles.container,\n          positionStyle,\n          containerStyle,\n          animatedStyle,\n        ]}\n      >\n        {!opened ? (\n          <Animated.View style={mainButtonStyle}>\n            <Pressable onPress={handlePress}>\n              {customActionButton ? (\n                customActionButton(progress, handlePress)\n              ) : (\n                <Animated.View\n                  style={[\n                    styles.iconContainer,\n                    {\n                      width: itemHeight,\n                      height: itemHeight,\n                      borderRadius: itemHeight,\n                    },\n                  ]}\n                >\n                  <PlusIcon />\n                </Animated.View>\n              )}\n            </Pressable>\n          </Animated.View>\n        ) : (\n          <Animated.View style={[closeButtonStyle]}>\n            <Pressable onPress={handlePress}>\n              <Animated.View\n                style={[\n                  styles.iconContainer,\n                  {\n                    width: itemHeight,\n                    height: itemHeight,\n                    transform: [{ rotate: '-45deg' }],\n                  },\n                ]}\n              >\n                <PlusIcon />\n              </Animated.View>\n            </Pressable>\n          </Animated.View>\n        )}\n\n        <Box>\n          {items.map((item, index) => (\n            <Pressable\n              key={index}\n              onPress={async () => {\n                await item.onPress();\n                handlePress();\n              }}\n            >\n              <Flex alignItems={'center'} height={itemHeight} paddingHorizontal={'x3'} style={item.style}>\n                <Box marginRight={'x2'}>\n                  {typeof item.icon === 'string' ? <Image source={{ uri: item.icon }} style={iconStyle} /> : item.icon}\n                </Box>\n                <Box>\n                  {typeof item.label === 'string' ? (\n                    <Text variant={'p1'} color=\"white\">\n                      {item.label}\n                    </Text>\n                  ) : (\n                    item.label\n                  )}\n                </Box>\n              </Flex>\n            </Pressable>\n          ))}\n        </Box>\n      </Animated.View>\n    </GestureDetector>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    position: 'absolute',\n    overflow: 'hidden',\n    margin: 16,\n  },\n  iconContainer: {\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n});\n"
  },
  {
    "path": "packages/react-native/src/flow/index.md",
    "content": "---\ntitle: Flow - 步骤组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 其他组件\n  path: /other\n---\n\n# Flow 步骤组件\n\n## 效果演示\n\n### 1. 基本的使用\n\n```tsx | pure\n  const steps = [\n    { title: '第一步', description: '测试' },\n    { title: '第二步', description: '测试' },\n    { title: '第三步', description: '测试' },\n    { title: '第四步', description: '测试' },\n  ];\n\n  <Text>基本的使用:</Text>\n  <Flow steps={steps} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"基本的使用ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608792806502927938.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 指定进度\n\n```tsx | pure\n  const steps = [\n    { title: '第一步', description: '测试' },\n    { title: '第二步', description: '测试' },\n    { title: '第三步', description: '测试' },\n    { title: '第四步', description: '测试' },\n  ];\n\n\n  <Text>指定进度:</Text>\n  <Flow steps={steps} current={3} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"指定进度ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608792806489705173.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 当前状态\n\n```tsx | pure\n    const steps = [\n    { title: '第一步', description: '测试' },\n    { title: '第二步', description: '测试' },\n    { title: '第三步', description: '测试' },\n    { title: '第四步', description: '测试' },\n  ];\n\n  <Text>当前状态:</Text>\n  <Flow steps={steps} current={3} status=\"error\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"当前状态ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608792806808339875.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自定义 icon\n\n```tsx | pure\n  const steps = [\n    { title: '第一步', description: '测试', icon: <Icon name=\"user\" /> },\n    { title: '第二步', description: '测试' },\n    { title: '第三步', description: '测试' },\n    { title: '第四步', description: '测试' },\n  ];\n\n  <Text>自定义icon:</Text>\n  <Flow steps={steps} current={2} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义 icon ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608792807134659754.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 自定义 render\n\n```tsx | pure\n  const steps = [\n    { title: '第一步', description: '测试', stepRender: <Text>111111111111</Text> },\n    {\n      title: '第二步',\n      description: '测试',\n      stepRender: (\n        <Image style={{ height: 50, width: 50, borderRadius: 25 }} source={require('../../assets/images/img-01.jpg')} />\n      ),\n    },\n    { title: '第三步', description: '测试', label: '1' },\n    { title: '第四步', description: '测试' },\n  ];\n\n  <Text>自定义render:</Text>\n  <Flow steps={steps} current={2} size={50} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义 render ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608792806506728196.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 自定义线的样式\n\n```tsx | pure\n const steps4 = [\n    {\n      title: '第一步',\n      description: '测试',\n      activeColor: 'green',\n    },\n    {\n      title: '第二步',\n      description: '测试',\n    },\n    { title: '第三步', description: '测试' },\n    { title: '第四步', description: '测试' },\n  ];\n\n  <Text>自定义线的样式:</Text>\n   <Flow steps={steps4} current={2}  />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义线的样式 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608792806816459418.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### 组件属性\n\n| 属性    | 必填    | 说明                 | 类型                                       | 默认值    |\n| ------- | ------- | -------------------- | ------------------------------------------ | --------- |\n| status  | `false` | 当前的状态           | `wait` \\| `process` \\| `finish` \\| `error` | `process` |\n| steps   | `false` | 步骤的数据           | `Array<StepProps>`                         | `[]`      |\n| size    | `false` | 步骤条的 icon 的大小 | `number`                                   | `px(36)`  |\n| current | `false` | 当前的进度           | `number`                                   | `0`       |\n\n### StepProps 属性\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| title | `false` | 步骤的标题 | `string` |  |\n| description | `false` | 步骤的介绍 | `string` |  |\n| label | `false` | 步骤条的标签 | `string` |  |\n| size | `false` | 节点大小 | `number` | `px(36)` |\n| iconSize | `false` | 图标大小 | `number` | `px(16)` |\n| status | `false` | 图标的状态 | `wait` \\| `process` \\| `finish` \\| `error` | `wait` |\n| icon | `false` | 自定义的 icon size 会被覆盖建议使用 size 指定大小 | `ReactElement` |  |\n| stepRender | `false` | 自定义组件 | `ReactElement` |  |\n| active | `false` | 当前节点是否进行完全 | `boolean` | `false` |\n| isCurrent | `false` | 是否为当前的进度 | `boolean` | `false` |\n| isLast | `false` | 是否是最后一个 | `boolean` | `false` |\n"
  },
  {
    "path": "packages/react-native/src/flow/index.tsx",
    "content": "import React, { FC } from 'react';\nimport { LayoutChangeEvent } from 'react-native';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Step, { StepProps } from './step';\n\nconst { px } = helpers;\n\nexport interface FlowProps {\n  /** 当前的状态 */\n  status?: 'wait' | 'process' | 'finish' | 'error';\n  /** 步骤的数据 */\n  steps?: Array<StepProps>;\n  /** 全局的size*/\n  size?: number;\n  /** 当前的进度 */\n  current?: number;\n}\n\nconst Flow: FC<FlowProps> = ({ steps = [], size = px(36), current = 0, status = 'process' }) => {\n  /**当前容器的宽度，用于计算线的长度 */\n  const [wrapWidth, setWrapWidth] = useSafeState(0);\n\n  /** icon或者自定义组件的总长度，用于计算线的长度 */\n  const iconWidth = steps.reduce((pre, cur) => {\n    const iconWidth = (cur.size ?? size) + px(4);\n    return pre + iconWidth;\n  }, 0);\n\n  /** 单条线的长度 */\n  const tailWidth = (wrapWidth - iconWidth) / (steps.length - 1);\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    setWrapWidth(e.nativeEvent.layout.width);\n  };\n\n  return (\n    <Box flexDirection={'row'} onLayout={handleLayout}>\n      {steps.map((item, i) => {\n        return (\n          <Step\n            key={i}\n            size={size}\n            active={current > i}\n            isCurrent={current === i + 1}\n            isLast={i === steps.length - 1}\n            status={current === i + 1 ? status : undefined}\n            {...Object.assign(item, {\n              tailWidth: tailWidth,\n            })}\n          />\n        );\n      })}\n    </Box>\n  );\n};\nFlow.displayName = 'Flow';\n\nexport default Flow;\n"
  },
  {
    "path": "packages/react-native/src/flow/step.tsx",
    "content": "import React, { cloneElement, FC, isValidElement, memo, ReactElement, useMemo } from 'react';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport SvgIcon, { IconNames } from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\n\nconst { px } = helpers;\nexport interface StepProps {\n  /** 标题 */\n  title?: string;\n  /** 介绍 */\n  description?: string;\n  /** 标签 */\n  label?: string;\n  /** 节点大小 */\n  size?: number;\n  /** 图标大小 */\n  iconSize?: number;\n  /** 图标的状态 */\n  status?: 'wait' | 'process' | 'finish' | 'error';\n  /** 自定义的icon size会被覆盖建议使用size指定大小 */\n  icon?: ReactElement;\n  /** 自定义组件，其中style.width会被覆盖建议使用size */\n  stepRender?: ReactElement;\n  /** 当前节点是否进行完全 */\n  active?: boolean;\n  /** 是否为当前的进度 */\n  isCurrent?: boolean;\n  /** 是否是最后一个 */\n  isLast?: boolean;\n}\n\nconst iconType: Record<string, IconNames> = {\n  wait: 'ellipsis',\n  error: 'close',\n  finish: 'check',\n  process: 'reload',\n};\n\nconst Step: FC<StepProps> = ({\n  title,\n  description,\n  size = px(36),\n  active = false,\n  isCurrent = false,\n  isLast = false,\n  status = active ? 'finish' : 'wait',\n  icon,\n  stepRender,\n  iconSize = px(16),\n  label,\n}) => {\n  const theme = useTheme<Theme>();\n  /** icon的颜色 */\n  const iconColor = {\n    wait: theme.colors.primary200,\n    error: theme.colors.func600,\n    finish: theme.colors.primary200,\n    process: theme.colors.primary200,\n  };\n  /** 活动状态的颜色 */\n  const iconActiveColor = iconColor[status];\n  /**\n   * icon的render\n   * 1 判断有没有自定义组件，使用自定义组件\n   * 2 判断是否使用自定义的icon\n   * 3 更具当前的状态进行选择使用的icon\n   * 4 可以使用label\n   */\n  const IconRender = useMemo(() => {\n    if (!!stepRender && isValidElement(stepRender)) {\n      return cloneElement(stepRender as ReactElement, {});\n    }\n\n    if (!!icon && isValidElement(icon)) {\n      return cloneElement(icon as ReactElement, {\n        size: iconSize,\n        color: theme.colors.white,\n      });\n    }\n    if (label) {\n      return (\n        <Text variant=\"p1\" color=\"text\">\n          {label}\n        </Text>\n      );\n    }\n    return <SvgIcon name={iconType[status]} size={iconSize} color={theme.colors.white} />;\n  }, [icon, iconSize, label, stepRender, status, theme.colors.white]);\n\n  /**\n   * 尾巴的样式\n   */\n  const TailRender = useMemo(() => {\n    if (isLast) return null;\n    if (!active || isCurrent)\n      return (\n        <Box borderColor=\"gray200\" borderWidth={1} flex={1} borderStyle=\"dashed\" style={{ marginTop: size / 2 }} />\n      );\n\n    return (\n      <Box\n        height={1}\n        flex={1}\n        style={{\n          backgroundColor: iconActiveColor,\n          marginTop: size / 2,\n        }}\n      />\n    );\n  }, [active, iconActiveColor, isCurrent, isLast, size]);\n\n  return (\n    <Flex justifyContent=\"flex-start\" alignItems=\"flex-start\" flex={1}>\n      <Box alignItems=\"center\">\n        <Box width={size} height={size} borderRadius=\"x2\" alignItems=\"center\" overflow=\"hidden\">\n          {stepRender ? (\n            IconRender\n          ) : (\n            <Box\n              width={size}\n              height={size}\n              justifyContent={'center'}\n              alignItems={'center'}\n              overflow={'hidden'}\n              opacity={active ? 1 : 0.6}\n              backgroundColor={status === 'error' ? 'func600' : 'primary200'}\n              style={{\n                borderRadius: size / 2,\n              }}\n            >\n              {IconRender}\n            </Box>\n          )}\n        </Box>\n        <Box marginTop=\"x1\" alignItems=\"center\">\n          {!!title && (\n            <Text variant=\"p1\" color=\"text\" numberOfLines={1}>\n              {title}\n            </Text>\n          )}\n          {!!description && (\n            <Text variant=\"p2\" color=\"text\" numberOfLines={1} ellipsizeMode=\"clip\">\n              {description}\n            </Text>\n          )}\n        </Box>\n      </Box>\n      {TailRender}\n    </Flex>\n  );\n};\n\nexport default memo(Step);\n"
  },
  {
    "path": "packages/react-native/src/form/FormItem.tsx",
    "content": "import React, { FC, useContext, useMemo, useRef } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport { Field, FieldContext } from 'rc-field-form';\nimport { Meta } from 'rc-field-form/es/interface';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { FormContext } from './context';\nimport { FormItemProps } from './type';\n\nconst { ONE_PIXEL } = helpers;\n\nconst FormItem: FC<FormItemProps> = ({ children, noStyle = false, name, ...fieldProps }) => {\n  const ref = useRef<{ focus: () => void }>(null);\n  const fieldContext = useContext(FieldContext);\n  const [errors, setErrors] = useSafeState<string[]>([]);\n\n  const { formItemHeight, bordered } = useContext(FormContext);\n\n  const onMetaChange = useMemoizedFn(\n    (\n      meta: Meta & {\n        destroy?: boolean;\n      }\n    ) => {\n      setErrors(meta.errors);\n      const errors = fieldContext.getFieldsError() || [];\n      const fieldErrors = errors.filter(item => item.errors.length > 0);\n      if (fieldErrors.length > 0 && name === fieldErrors[0]?.name?.[0]) {\n        ref.current?.focus();\n      }\n    }\n  );\n\n  const Content = useMemo(\n    () => (\n      <Field name={name} {...fieldProps} onMetaChange={onMetaChange}>\n        {React.cloneElement(children, {\n          ref,\n          brief:\n            errors.length > 0 ? (\n              <Text variant=\"p3\" color=\"func600\">\n                {errors[0]}\n              </Text>\n            ) : null,\n          itemHeight: formItemHeight,\n        })}\n      </Field>\n    ),\n    [name, fieldProps, formItemHeight, errors]\n  );\n\n  if (noStyle) return Content;\n\n  return (\n    <>\n      <Box paddingHorizontal={'x2'} minHeight={formItemHeight} justifyContent={'center'}>\n        {Content}\n      </Box>\n      <Box\n        width={'100%'}\n        height={bordered ? ONE_PIXEL : 0}\n        backgroundColor={errors.length > 0 ? 'func600' : 'border'}\n      />\n    </>\n  );\n};\nFormItem.displayName = 'FormItem';\n\nexport default FormItem;\n"
  },
  {
    "path": "packages/react-native/src/form/FormListItem.tsx",
    "content": "import React, { FC, useContext, useRef } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport { Field, FieldContext } from 'rc-field-form';\nimport { Meta } from 'rc-field-form/es/interface';\n\nimport ListItem from '../list-item';\nimport Text from '../text';\nimport { FormContext } from './context';\nimport { FormListItemProps } from './type';\n\nconst FormListItem: FC<FormListItemProps> = ({\n  children,\n  label,\n  required,\n  style,\n  thumb,\n  onPress,\n  name,\n  arrow,\n  backgroundColor,\n  noStyle = false,\n  ...fieldProps\n}) => {\n  const ref = useRef<{ focus: () => void }>(null);\n  const fieldContext = useContext(FieldContext);\n  const [errors, setErrors] = useSafeState<string[]>([]);\n  const { formItemHeight, bordered } = useContext(FormContext);\n\n  const onMetaChange = useMemoizedFn(\n    (\n      meta: Meta & {\n        destroy?: boolean;\n      }\n    ) => {\n      setErrors(meta.errors);\n      const errors = fieldContext.getFieldsError() || [];\n      const fieldErrors = errors.filter(item => item.errors.length > 0);\n      if (fieldErrors.length > 0 && name === fieldErrors[0]?.name?.[0]) {\n        ref.current?.focus();\n      }\n    }\n  );\n\n  if (noStyle)\n    return (\n      <Field {...fieldProps} name={name} onMetaChange={onMetaChange}>\n        {React.cloneElement(children, {\n          ref,\n        })}\n      </Field>\n    );\n\n  return (\n    <ListItem\n      {...{ required, thumb, onPress, arrow, backgroundColor }}\n      title={label}\n      brief={\n        errors.length > 0 ? (\n          <Text variant=\"p3\" color=\"func600\">\n            {errors[0]}\n          </Text>\n        ) : null\n      }\n      extra={\n        <Field {...fieldProps} name={name} onMetaChange={onMetaChange}>\n          {React.cloneElement(children, {\n            ref,\n            inForm: true,\n          })}\n        </Field>\n      }\n      style={{ minHeight: formItemHeight, paddingHorizontal: 0 }}\n      bordered={bordered}\n      borderColor={errors.length > 0 ? 'func600' : 'border'}\n    />\n  );\n};\nFormListItem.displayName = 'FormListItem';\n\nexport default FormListItem;\n"
  },
  {
    "path": "packages/react-native/src/form/context.ts",
    "content": "import { createContext } from 'react';\n\nexport const FormContext = createContext<{ formItemHeight: number; bordered?: boolean }>({ formItemHeight: 0 });\n"
  },
  {
    "path": "packages/react-native/src/form/index.md",
    "content": "---\ntitle: Form - 表单\nnav:\n  title: RN 组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# Form 表单\n\n对`rc-field-form`的封装，提供类似 antd Form 的效果\n\n## 效果演示\n\n### 1. FormItem 使用\n\n```tsx | pure\nimport { Form } from '@td-design/react-native';\n\n// ...other imports\n\nconst { FormItem, FormListItem, useForm } = Form;\n\nexport default function FormDemo() {\n  const [form] = useForm();\n\n  return (\n    <Form onFinish={handleFinish} form={form}>\n      <FormItem name=\"useCharacter2\" rules={[{ required: true, message: '请输入姓名' }]}>\n        <InputItem required label=\"姓名\" placeholder=\"请输入姓名\" inputStyle={{ textAlign: 'right' }} />\n      </FormItem>\n      <FormItem name=\"vehicleLoad2\" rules={[{ required: true, message: '请输入密码' }]}>\n        <InputItem required label=\"密码\" placeholder=\"请输入密码\" inputStyle={{ textAlign: 'right' }} />\n      </FormItem>\n    </Form>\n  );\n}\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义线的样式 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643176119561668349.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. FormListItem 使用\n\n```tsx | pure\nimport { Form } from '@td-design/react-native';\n\n// ...other imports\n\nconst { FormItem, FormListItem, useForm } = Form;\n\nexport default function FormDemo() {\n  const [form] = useForm();\n\n  return (\n    <Form onFinish={handleFinish} form={form}>\n      <FormListItem\n        title=\"性别\"\n        required\n        name=\"gender\"\n        minHeight={54}\n        rules={[{ required: true, message: '请选择性别' }]}\n      >\n        <Radio\n          options={[\n            { label: '男', value: '1' },\n            { label: '女', value: '0' },\n          ]}\n        />\n      </FormListItem>\n      <FormListItem\n        title=\"性别\"\n        required\n        name=\"gender\"\n        minHeight={54}\n        rules={[{ required: true, message: '请选择性别' }]}\n      >\n        <Checkbox\n          showCheckAll={false}\n          options={[\n            { label: '男', value: '1' },\n            { label: '女', value: '0' },\n          ]}\n        />\n      </FormListItem>\n      <FormListItem\n        title=\"数量\"\n        required\n        name=\"count\"\n        minHeight={48}\n        rules={[{ required: true, message: '请选择数量' }]}\n      >\n        <Stepper />\n      </FormListItem>\n      <FormListItem\n        title=\"数量\"\n        required\n        name=\"count\"\n        minHeight={48}\n        rules={[{ required: true, message: '请选择数量' }]}\n      >\n        <Switch />\n      </FormListItem>\n      <FormListItem\n        title=\"数量\"\n        required\n        name=\"count\"\n        minHeight={48}\n        rules={[{ required: true, message: '请选择数量' }]}\n      >\n        <NumberKeyboardInput type=\"number\" placeholder=\"请输入核定载质量\" />\n      </FormListItem>\n    </Form>\n  );\n}\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义线的样式 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643176202465585760.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 校验失败提示效果\n\n```tsx | pure\nimport { Form } from '@td-design/react-native';\n\n// ...other imports\n\nconst { FormItem, FormListItem, useForm } = Form;\n\nexport default function FormDemo() {\n  const [form] = useForm();\n\n  return (\n    <Form onFinish={handleFinish} form={form}>\n      <FormItem type=\"all\" name=\"name\" rules={[{ required: true, message: '请输入用户名' }]}>\n        <Input required label=\"用户名\" labelPosition=\"top\" placeholder=\"请输入用户名\" />\n      </FormItem>\n      <FormItem type=\"all\" name=\"password\" rules={[{ required: true, message: '请输入密码' }]}>\n        <Input required label=\"密码\" labelPosition=\"top\" placeholder=\"请输入密码\" />\n      </FormItem>\n      <FormItem type=\"all\" name=\"count2\">\n        <NumberKeyboardFilter label=\"核定载质量\" type=\"number\" placeholder=\"请输入核定载质量\" />\n      </FormItem>\n    </Form>\n  );\n}\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义线的样式 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643176327063261866.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Form API\n\n```ts\nimport { FormProps as RcFormProps } from 'rc-field-form/es/Form';\n\nexport type FormProps = Omit<RcFormProps, 'component'> & {\n  /** 表单项的高度 */\n  formItemHeight?: number;\n  /** 是否显示边框线 */\n  bordered?: boolean;\n};\n```\n\n### FormItem API\n\n```ts\nimport type { FieldProps } from 'rc-field-form/lib/Field';\n\ntype RcFieldProps = Omit<FieldProps, 'children'>;\nexport interface FormItemProps extends RcFieldProps {\n  /** 保持组件原始样式 */\n  noStyle?: boolean;\n  /** 子组件 */\n  children: ReactElement;\n}\n```\n\n### FormListItem API\n\n```ts\nimport type { FieldProps } from 'rc-field-form/lib/Field';\n\nimport { ListItemProps } from '../list-item';\n\ntype RcFieldProps = Omit<FieldProps, 'children'>;\nexport interface FormListItemProps\n  extends RcFieldProps,\n    Pick<ListItemProps, 'title' | 'required' | 'style' | 'thumb' | 'onPress' | 'minHeight' | 'arrow'> {\n  noStyle?: boolean;\n  children: ReactElement;\n}\n```\n\n### 哪些组件应该作为 FormItem 的 children\n\n- Input\n- TextArea\n- CountDown\n- NumberKeyboardInput\n- VehicleKeyboardInput\n- DatePickerInput\n- DatePeriodInput\n- PickerInput\n\n### 哪些组件应该作为 FormListItem 的 children\n\n- InputItem\n- CountDownItem\n- Radio\n- Checkbox\n- Stepper\n- Slider\n- Switch\n- NumberKeyboardItem\n- VehicleKeyboardItem\n- DatePickerItem\n- PickerItem\n\n### 使用代码示例\n\n```tsx | pure\n<Form onFinish={handleFinish} form={form}>\n  <ListHeader text=\"1. 应该在FormItem下使用的组件\" />\n  <FormItem name=\"field1\">\n    <Input placeholder=\"请输入\" label=\"Input\" />\n  </FormItem>\n  <FormItem name=\"field3\">\n    <TextArea placeholder=\"请输入\" label=\"TextArea\" />\n  </FormItem>\n  <FormItem name=\"field4\">\n    <CountDown label=\"CountDown\" onSend={() => {}} />\n  </FormItem>\n  <FormItem name=\"field10\">\n    <NumberKeyboardInput label=\"NumberKeyboardInput\" />\n  </FormItem>\n  <FormItem name=\"field12\">\n    <VehicleKeyboardInput label=\"VehicleKeyboardInput\" />\n  </FormItem>\n  <FormItem name=\"field14\">\n    <DatePickerInput label=\"DatePickerInput\" />\n  </FormItem>\n  <FormItem name=\"field18\">\n    <DatePeriodInput label=\"DatePeriodInput\" />\n  </FormItem>\n  <FormItem name=\"field16\">\n    <PickerInput label=\"PickerInput\" data={[{ label: '选项1', value: 1 }]} />\n  </FormItem>\n\n  <ListHeader text=\"2. 应该在FormListItem下使用的组件\" />\n  <FormListItem title=\"InputItem\" name=\"field2\">\n    <InputItem placeholder=\"请输入\" inputStyle={{ textAlign: 'right' }} />\n  </FormListItem>\n  <FormListItem title=\"CountDownItem\" name=\"field18\">\n    <CountDownItem onSend={() => {}} />\n  </FormListItem>\n  <FormListItem title=\"Radio\" name=\"field5\">\n    <Radio\n      options={[\n        { label: '选项1', value: 1 },\n        { label: '选项2', value: 2 },\n      ]}\n    />\n  </FormListItem>\n  <FormListItem title=\"Checkbox\" name=\"field6\">\n    <Checkbox\n      options={[\n        { label: '选项1', value: 1 },\n        { label: '选项2', value: 2 },\n      ]}\n    />\n  </FormListItem>\n  <FormListItem title=\"Stepper\" name=\"field7\">\n    <Stepper />\n  </FormListItem>\n  <FormListItem title=\"Slider\" name=\"field8\">\n    <Slider width={200} textPosition=\"right\" />\n  </FormListItem>\n  <FormListItem title=\"Switch\" name=\"field9\">\n    <Switch />\n  </FormListItem>\n  <FormListItem title=\"NumberKeyboardItem\" name=\"field11\">\n    <NumberKeyboardItem />\n  </FormListItem>\n  <FormListItem title=\"VehicleKeyboardItem\" name=\"field13\">\n    <VehicleKeyboardItem />\n  </FormListItem>\n  <FormListItem title=\"DatePickerItem\" name=\"field15\" arrow=\"horizontal\">\n    <DatePickerItem />\n  </FormListItem>\n  <FormListItem title=\"PickerItem\" name=\"field17\" arrow=\"horizontal\">\n    <PickerItem data={[{ label: '选项1', value: 1 }]} />\n  </FormListItem>\n</Form>\n```\n"
  },
  {
    "path": "packages/react-native/src/form/index.tsx",
    "content": "import React, { FC } from 'react';\n\nimport RcForm, { useForm } from 'rc-field-form';\nimport { FormProps as RcFormProps } from 'rc-field-form/es/Form';\n\nimport helpers from '../helpers';\nimport { FormContext } from './context';\nimport FormItem from './FormItem';\nimport FormListItem from './FormListItem';\n\nconst { px } = helpers;\n\nexport type FormProps = Omit<RcFormProps, 'component'> & { formItemHeight?: number; bordered?: boolean };\n\nconst Form: FC<FormProps> = ({ children, formItemHeight = px(54), bordered = true, ...props }) => {\n  return (\n    <RcForm component={false} {...props}>\n      <FormContext.Provider value={{ formItemHeight, bordered }}>{children}</FormContext.Provider>\n    </RcForm>\n  );\n};\nForm.displayName = 'Form';\n\nexport { Form, FormItem, FormListItem, useForm };\n"
  },
  {
    "path": "packages/react-native/src/form/type.ts",
    "content": "import { ReactElement, ReactNode } from 'react';\n\nimport type { FieldProps } from 'rc-field-form/lib/Field';\n\nimport { ListItemProps } from '../list-item';\n\ntype RcFieldProps = Omit<FieldProps, 'children'>;\nexport interface FormItemProps extends RcFieldProps {\n  /** 底部边框还是整个边框 */\n  type?: 'bottom' | 'all';\n  /** 保持组件原始样式 */\n  noStyle?: boolean;\n  /** 子组件 */\n  children: ReactElement;\n}\n\nexport interface FormListItemProps\n  extends RcFieldProps,\n    Pick<ListItemProps, 'required' | 'style' | 'thumb' | 'onPress' | 'arrow' | 'backgroundColor'> {\n  /** 表单项标签文本 */\n  label: ReactNode;\n  /** 保持组件原始样式 */\n  noStyle?: boolean;\n  /** 子组件 */\n  children: ReactElement;\n}\n"
  },
  {
    "path": "packages/react-native/src/helpers/index.ts",
    "content": "import { Platform, StyleProp } from 'react-native';\n\nimport { deviceHeight, deviceWidth, ONE_PIXEL, px } from './normalize';\nimport renderNode from './renderNode';\n\n/**\n * 判断是否是IOS系统\n */\nconst isIOS = Platform.OS === 'ios';\n\n/**\n * 根据条件决定样式是否生效\n * @param condition\n * @param style\n */\nconst conditionalStyle = (condition: boolean, style: StyleProp<any>) => (condition ? style : {});\n\nfunction hexToRgba(hex: string, alpha = 1) {\n  let c: any;\n  if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) {\n    let arr = hex.substring(1).split('');\n    if (arr.length == 3) {\n      arr = [arr[0], arr[0], arr[1], arr[1], arr[2], arr[2]];\n    }\n    c = '0x' + arr.join('');\n    return 'rgba(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(',') + `,${alpha})`;\n  }\n  throw new Error('Bad Hex');\n}\n\nexport default {\n  renderNode,\n  px,\n  deviceWidth,\n  deviceHeight,\n  ONE_PIXEL,\n  isIOS,\n  conditionalStyle,\n  hexToRgba,\n};\n"
  },
  {
    "path": "packages/react-native/src/helpers/normalize.ts",
    "content": "import { Dimensions, PixelRatio, StyleSheet } from 'react-native';\n\nconst { width, height } = Dimensions.get('window');\n\n/** design based on iphone6 */\nconst defaultPixelRatio = 1;\nconst designWidth = 375;\nconst designHeight = 667;\n\n// px转换成dp\nconst dpWidth = designWidth / defaultPixelRatio;\nconst dpHeight = designHeight / defaultPixelRatio;\n\n//获取缩放比例\nconst scale = Math.min(height / dpHeight, width / dpWidth);\n\nexport const deviceWidth = width;\nexport const deviceHeight = height;\nexport const ONE_PIXEL = StyleSheet.hairlineWidth;\n\n/**\n * 适配屏幕大小和像素密度的公共方法\n * @param size 设计稿大小\n */\nexport const px = (size: number) => {\n  return Math.round(PixelRatio.roundToNearestPixel(size * scale));\n};\n"
  },
  {
    "path": "packages/react-native/src/helpers/renderNode.tsx",
    "content": "import React, { ComponentProps, ComponentType } from 'react';\n\nconst renderNode = (Component: ComponentType, content: any, defaultProps: ComponentProps<any>) => {\n  if (content == null || content === false) {\n    return null;\n  }\n  if (React.isValidElement(content)) {\n    return content;\n  }\n  if (typeof content === 'function') {\n    return content();\n  }\n  // Just in case\n  if (content === true) {\n    return <Component {...defaultProps} />;\n  }\n  if (typeof content === 'string') {\n    if (content.length === 0) {\n      return null;\n    }\n    return <Component {...defaultProps}>{content}</Component>;\n  }\n  if (typeof content === 'number') {\n    return <Component {...defaultProps}>{content}</Component>;\n  }\n  return <Component {...defaultProps} {...content} />;\n};\n\nexport default renderNode;\n"
  },
  {
    "path": "packages/react-native/src/image/index.md",
    "content": "---\ntitle: Image - 图片组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Image 图片组件\n\n**_Image 组件已经废弃，请直接使用`react-native-fast-image`或者`expo-image`_**\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Image\n  source={{\n    uri: 'https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=100',\n  }}\n  style={{ width: 100, height: 100 }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643176929385118436.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 是否开启点击图片预览大图功能\n\n```tsx | pure\n<Image\n  source={{\n    uri: 'https://images.pexels.com/photos/1702238/pexels-photo-1702238.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=100',\n  }}\n  preview={true}\n  style={{ width: 100, height: 100 }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643177163934025262.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 加载不同类型的图片资源\n\n```tsx | pure\n<WhiteSpace />\n<Text>本地jpg:</Text>\n<Image source={require('../../assets/images/fields.jpg')} style={{ width: 300, height: 300 }} />\n<WhiteSpace />\n<Text>本地png:</Text>\n<Image source={require('../../assets/images/logo.png')} style={{ width: 300, height: 300 }} />\n<WhiteSpace />\n<Text>本地gif:</Text>\n<Image source={require('../../assets/images/jellyfish.gif')} style={{ width: 300, height: 300 }} />\n<WhiteSpace />\n<Text>本地webp:</Text>\n<Image source={require('../../assets/images/fields.webp')} style={{ width: 300, height: 300 }} />\n<WhiteSpace />\n<Text>base64:</Text>\n<Image source={{ uri: base64Img }} style={{ width: 300, height: 300 }} />\n<WhiteSpace />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643177329608859374.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n```ts\nimport { FastImageProps } from 'react-native-fast-image';\n\nexport type ImageProps = FastImageProps & {\n  /** 是否开启点击图片预览大图功能 */\n  preview?: boolean;\n};\n```\n"
  },
  {
    "path": "packages/react-native/src/image-header/AnimateHeader.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport { StyleSheet, TextStyle } from 'react-native';\nimport Animated, { Extrapolate, interpolate, interpolateColor, useAnimatedStyle } from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\n\nconst { px, ONE_PIXEL, deviceWidth } = helpers;\nconst HEADER_HEIGHT = px(44);\nexport interface AnimateHeaderProps {\n  /** 头部文字 */\n  headerTitle: string;\n  /** 头部文字样式 */\n  headerTitleStyle?: TextStyle;\n  /** 滚动距离 */\n  scrollY: Animated.SharedValue<number>;\n  /** 纵向滚动到哪个值时显示ImageHeader */\n  scrollHeight?: number;\n  /** 头部右侧内容 */\n  headerRight?: ReactNode;\n  /** 左侧返回键和字体颜色 */\n  headerLeftColor?: string;\n  /** 头部左侧内容 */\n  headerLeft?: ReactNode;\n  /** 头部底色，默认为透明 */\n  headerBackgroundColor?: string;\n  /** 左侧点击事件 */\n  onPress?: () => void;\n  /** 是否显示左侧图标 */\n  showLeft?: boolean;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nconst AnimateHeader: React.FC<AnimateHeaderProps> = props => {\n  const theme = useTheme<Theme>();\n  const insets = useSafeAreaInsets();\n\n  const {\n    scrollY,\n    headerTitle,\n    headerTitleStyle,\n    scrollHeight = 300,\n    onPress,\n    showLeft = true,\n    headerRight,\n    headerLeftColor = theme.colors.text,\n    headerLeft,\n    headerBackgroundColor = theme.colors.white,\n    activeOpacity = 0.6,\n  } = props;\n\n  const inputRange = [0, scrollHeight];\n  const style = useAnimatedStyle(() => {\n    const opacity = interpolate(scrollY.value, inputRange, [0, 1], Extrapolate.CLAMP);\n    const borderBottomWidth = interpolate(scrollY.value, inputRange, [0, ONE_PIXEL], Extrapolate.CLAMP);\n    const backgroundColor = interpolateColor(scrollY.value, inputRange, ['transparent', headerBackgroundColor]);\n\n    return {\n      borderBottomWidth,\n      backgroundColor,\n      opacity,\n    };\n  });\n\n  const styles = StyleSheet.create({\n    header: {\n      width: deviceWidth,\n      position: 'absolute',\n      top: 0,\n      zIndex: 99,\n      justifyContent: 'center',\n      alignItems: 'center',\n      borderBottomColor: theme.colors.border,\n      paddingTop: insets.top,\n      height: HEADER_HEIGHT + insets.top,\n    },\n  });\n\n  return (\n    <Animated.View style={[styles.header, style]}>\n      <Flex flex={1}>\n        {showLeft ? (\n          <Pressable activeOpacity={activeOpacity} onPress={onPress} style={{ flex: 1 }}>\n            <Flex>\n              <SvgIcon name=\"left\" size={px(24)} color={headerLeftColor} />\n              {typeof headerLeft === 'string' ? (\n                <Text variant=\"p0\" style={{ color: headerLeftColor }}>\n                  {headerLeft}\n                </Text>\n              ) : (\n                headerLeft\n              )}\n            </Flex>\n          </Pressable>\n        ) : (\n          <Box flex={1} />\n        )}\n        <Animated.View style={{ flex: 5, alignItems: 'center' }}>\n          <Text variant=\"h1\" color=\"text\" numberOfLines={1} style={headerTitleStyle}>\n            {headerTitle}\n          </Text>\n        </Animated.View>\n        <Box flex={1} alignItems=\"flex-end\">\n          {headerRight}\n        </Box>\n      </Flex>\n    </Animated.View>\n  );\n};\nAnimateHeader.displayName = 'AnimateHeader';\n\nexport default AnimateHeader;\n"
  },
  {
    "path": "packages/react-native/src/image-header/index.md",
    "content": "---\ntitle: ScrollHeader - 图片头部组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# ImageHeader 图片头部组件\n\n## 效果演示\n\n### 1. 普通 ImageHeader\n\n```tsx | pure\n<ImageHeader headerBackgroundImg={require('../../assets/images/bg_rank.png')} headerHeight={px(161)} {...props}>\n  <Flex justifyContent=\"center\" backgroundColor=\"white\" height={100}>\n    <Text>111</Text>\n  </Flex>\n</ImageHeader>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"header-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609999430064140139.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. ImageHeader 配置 left、right 和 headerLeftColor\n\n```tsx | pure\n<ImageHeader\n  headerBackgroundImg={require('../../assets/images/bg_rank.png')}\n  headerHeight={px(161)}\n  headerLeftColor={theme.colors.white}\n  headerLeft=\"返回\"\n  headerRight={<Icon name=\"delete\" size={px(20)} color={theme.colors.white} />}\n  {...props}\n>\n  <Flex justifyContent=\"center\" backgroundColor=\"white\" height={100}>\n    <Text>111</Text>\n  </Flex>\n</ImageHeader>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"header-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609999550703021067.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. ImageHeader 配置 headerBackgroundColor\n\n```tsx | pure\n<ImageHeader\n  headerBackgroundImg={require('../../assets/images/bg_rank.png')}\n  headerHeight={px(161)}\n  headerBackgroundColor={theme.colors.white}\n  headerLeft=\"返回\"\n  headerRight={<Icon name=\"delete\" size={px(20)} color={theme.colors.white} />}\n  {...props}\n>\n  <Flex justifyContent=\"center\" height={100}>\n    <Text>111</Text>\n  </Flex>\n</ImageHeader>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"header-ios3.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1610000705310241428.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. AnimatedHeader\n\n```tsx | pure\nimport { useScrollHandler } from 'react-native-redash';\nimport Animated from 'react-native-reanimated';\n\nexport default () => {\n  const { scrollHandler, y } = useScrollHandler();\n\n  return (\n    <AnimateHeader\n        scrollY={y}\n        scrollHeight={200}\n        headerTitle=\"测试啊啊啊啊啊\"\n        headerLeft=\"返回\"\n        headerBackgroundColor={theme.colors.white}\n        {...props}\n        headerRight={\n          <TouchableOpacity activeOpacity={0.5} onPress={() => props.navigation.goBack()}>\n            <Icon name=\"delete\" size={px(20)} color={theme.colors.primaryColor} />\n          </TouchableOpacity>\n        }\n      />\n      <Animated.ScrollView {...scrollHandler}>\n        <ImageHeader\n          headerBackgroundImg={require('../../assets/images/bg_rank.png')}\n          headerHeight={px(161)}\n          headerLeftColor={theme.colors.white}\n          headerRight={\n            <TouchableOpacity activeOpacity={0.5} onPress={() => props.navigation.goBack()}>\n              <Icon name=\"delete\" size={px(20)} color={theme.colors.primaryColor} />\n            </TouchableOpacity>\n          }\n          {...props}\n        >\n          <Flex justifyContent=\"center\" height={100}>\n            <Text>111</Text>\n          </Flex>\n        </ImageHeader>\n        <Box width={200} height={900} />\n      </Animated.ScrollView>\n  )\n}\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"header-ios4.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608877076955547998.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## ImageHeader 组件 API\n\n| 属性                  | 必填    | 说明                 | 类型                  | 默认值                      |\n| --------------------- | ------- | -------------------- | --------------------- | --------------------------- |\n| headerTitle           | `false` | 头部文字             | `ReactNode`           |                             |\n| headerRight           | `false` | 头部右侧内容         | `ReactNode`           |                             |\n| headerLeft            | `false` | 头部左侧内容         | `ReactNode`           |                             |\n| headerLeftColor       | `false` | 左侧返回键和字体颜色 | `string`              | `theme.colors.primaryColor` |\n| headerBackgroundColor | `false` | 头部背景颜色         | `string`              | `transparent`               |\n| headerBackgroundImg   | `true`  | 头部背景图片         | `ImageSourcePropType` |                             |\n| headerHeight          | `false` | 头部高度             | `number`              |                             |\n| onPress               | `false` | 左边图标点击事件     | `() => void`          |                             |\n| showLeft              | `false` | 是否显示左边图标     | `boolean`             | `true`                      |\n| activeOpacity         | `false` | 按下时的不透明度     | `number`              | `0.6`                       |\n\n## AnimateHeader 组件 API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| headerTitle | `true` | 头部文字 | `string` |  |\n| headerTitleStyle | `false` | 头部文字样式 | `TextStyle` |  |\n| scrollY | `false` | 滚动距离 | `Animated.SharedValue<number>` | `0` |\n| scrollHeight | `false` | 纵向滚动到哪个值时显示 `ImageHeader` | `number` | `300` |\n| headerRight | `false` | 头部右侧内容 | `ReactNode` |  |\n| headerLeft | `false` | 头部左侧内容 | `ReactNode` |  |\n| headerLeftColor | `false` | 左侧返回键和字体颜色 | `string` | `theme.colors.primaryColor` |\n| headerBackgroundColor | `false` | 头部背景颜色 | `string` | `transparent` |\n| onPress | `false` | 左边按钮点击事件 | `() => void` |  |\n| showLeft | `false` | 是否显示左边图标 | `boolean` | `true` |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n"
  },
  {
    "path": "packages/react-native/src/image-header/index.tsx",
    "content": "import React, { FC, PropsWithChildren, ReactNode, useMemo } from 'react';\nimport { ImageBackground, ImageSourcePropType, StatusBar, StyleSheet } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport WingBlank from '../wing-blank';\n\nconst { px, isIOS } = helpers;\nexport type ImageHeaderProps = PropsWithChildren<{\n  /** 头部右侧内容 */\n  headerRight?: ReactNode;\n  /** 头部左侧内容 */\n  headerLeft?: ReactNode;\n  /** 左侧返回键和字体颜色 */\n  headerLeftColor?: string;\n  /** 头部底色，默认为透明 */\n  headerBackgroundColor?: string;\n  /** 头部背景图片 */\n  headerBackgroundImg: ImageSourcePropType;\n  /** 头部高度 */\n  headerHeight?: number;\n  /** 左侧点击事件 */\n  onPress?: () => void;\n  /** 是否显示左侧图标 */\n  showLeft?: boolean;\n  /** 头部title */\n  headerTitle?: ReactNode;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}>;\n\nconst ImageHeader: FC<ImageHeaderProps> = props => {\n  const theme = useTheme<Theme>();\n  const insets = useSafeAreaInsets();\n\n  const {\n    headerRight,\n    headerLeft,\n    headerLeftColor = theme.colors.icon,\n    headerBackgroundColor = theme.colors.transparent,\n    headerBackgroundImg,\n    headerHeight,\n    children,\n    onPress,\n    showLeft = true,\n    headerTitle,\n    activeOpacity = 0.6,\n  } = props;\n\n  const styles = StyleSheet.create({\n    header: {\n      paddingTop: isIOS ? insets.top + theme.spacing.x2 : theme.spacing.x5 + StatusBar.currentHeight!,\n      paddingBottom: theme.spacing.x2,\n      paddingRight: theme.spacing.x3,\n      backgroundColor: headerBackgroundColor,\n    },\n  });\n\n  const HeaderLeft = useMemo(() => {\n    if (headerLeft) {\n      if (typeof headerLeft === 'string') {\n        return (\n          <Text style={{ color: headerLeftColor }} fontSize={px(16)}>\n            {headerLeft}\n          </Text>\n        );\n      }\n      return headerLeft;\n    }\n    return <SvgIcon name=\"left\" size={px(20)} color={headerLeftColor} />;\n  }, [headerLeft, headerLeftColor]);\n\n  return (\n    <ImageBackground source={headerBackgroundImg} style={{ width: '100%', height: headerHeight }}>\n      <Flex style={styles.header}>\n        {showLeft ? (\n          <Pressable activeOpacity={activeOpacity} onPress={onPress} style={{ flex: 1, paddingLeft: theme.spacing.x2 }}>\n            {HeaderLeft}\n          </Pressable>\n        ) : (\n          <Box flex={1} />\n        )}\n        {typeof headerTitle === 'string' ? (\n          <Text color=\"text\" fontSize={px(16)}>\n            {headerTitle}\n          </Text>\n        ) : (\n          headerTitle\n        )}\n        <Box flex={1} alignItems=\"flex-end\">\n          {headerRight}\n        </Box>\n      </Flex>\n      <WingBlank>{children}</WingBlank>\n    </ImageBackground>\n  );\n};\nImageHeader.displayName = 'ImageHeader';\n\nexport { ImageHeader };\nexport { default as AnimateHeader } from './AnimateHeader';\n"
  },
  {
    "path": "packages/react-native/src/index.ts",
    "content": "// components\nimport { useTheme } from '@shopify/restyle';\nimport type { Rule, Store, ValidateErrorEntity } from 'rc-field-form/es/interface';\n\nimport { default as Accordion } from './accordion';\nimport { default as ActionSheet } from './action-sheet';\nimport { Accessory, Avatar, AvatarGroup } from './avatar';\nimport { default as Badge } from './badge';\nimport { default as Box } from './box';\nimport { default as BoxShadow } from './box-shadow';\nimport { default as Brief } from './brief';\nimport { default as Button } from './button';\nimport { default as ButtonGroup } from './button-group';\nimport { default as Card } from './card';\nimport { default as Carousel } from './carousel';\nimport { default as Center } from './center';\nimport { Checkbox, CheckboxList } from './checkbox';\nimport { default as CollapseText } from './collapse-text';\nimport { CountDown, CountDownItem } from './count-down';\nimport { default as Divider } from './divider';\nimport { default as Empty } from './empty';\nimport { default as ErrorBlock } from './error-block';\nimport Flex from './flex';\nimport { default as FloatButton } from './float-button';\nimport { default as Flow } from './flow';\nimport { Form, FormItem, FormListItem, useForm } from './form';\nimport helpers from './helpers';\nimport { AnimateHeader, ImageHeader } from './image-header';\nimport { default as Indicator } from './indicator';\nimport Input, { InputItem, TextArea } from './input';\nimport { default as Label } from './label';\nimport { default as Link } from './link';\nimport { List, ListHeader } from './list';\nimport { default as ListItem } from './list-item';\nimport { default as Menu } from './menu';\nimport { default as Modal } from './modal';\nimport { default as NoticeBar } from './notice-bar';\nimport { default as Notify } from './notify';\nimport { NumberKeyboardInput, NumberKeyboardItem, NumberKeyboardView } from './number-keyboard';\nimport { default as Pagination } from './pagination';\nimport { default as Passcode } from './passcode';\nimport { default as Portal } from './portal';\nimport { default as Pressable } from './pressable';\nimport { default as Progress } from './progress';\nimport { Radio, RadioList } from './radio';\nimport { default as Result } from './result';\nimport { default as ScrollNumber } from './scroll-number';\nimport { default as SearchBar } from './search-bar';\nimport { default as Slider } from './slider';\nimport { default as Stepper } from './stepper';\nimport { default as SvgIcon } from './svg-icon';\nimport { default as SwipeRow } from './swipe-row';\nimport { default as Switch } from './switch';\nimport { default as Table } from './table';\nimport { default as Tag } from './tag';\nimport { default as Text } from './text';\nimport type { Theme } from './theme';\nimport theme from './theme';\nimport ThemeProvider from './theme-provider';\nimport { default as Timeline } from './timeline';\nimport { default as Toast } from './toast';\nimport { default as Tooltip } from './tooltip';\nimport { default as Tree } from './tree';\nimport { VehicleKeyboardInput, VehicleKeyboardItem, VehicleKeyboardView } from './vehicle-keyboard';\nimport { default as WhiteSpace } from './white-space';\nimport { default as WingBlank } from './wing-blank';\n\nexport {\n  Accordion,\n  ActionSheet,\n  Avatar,\n  AvatarGroup,\n  Accessory,\n  Box,\n  Badge,\n  BoxShadow,\n  Brief,\n  Button,\n  ButtonGroup,\n  Card,\n  Carousel,\n  Center,\n  Checkbox,\n  CheckboxList,\n  CollapseText,\n  CountDown,\n  CountDownItem,\n  Divider,\n  Empty,\n  ErrorBlock,\n  Flex,\n  FloatButton,\n  Flow,\n  Form,\n  FormItem,\n  FormListItem,\n  useForm,\n  useTheme,\n  helpers,\n  ImageHeader,\n  AnimateHeader,\n  Indicator,\n  Input,\n  InputItem,\n  TextArea,\n  Label,\n  Link,\n  List,\n  ListHeader,\n  ListItem,\n  Menu,\n  Modal,\n  NoticeBar,\n  Notify,\n  NumberKeyboardInput,\n  NumberKeyboardItem,\n  NumberKeyboardView,\n  Pagination,\n  Passcode,\n  Portal,\n  Pressable,\n  Progress,\n  Radio,\n  RadioList,\n  Result,\n  ScrollNumber,\n  SearchBar,\n  Slider,\n  Stepper,\n  SvgIcon,\n  SwipeRow,\n  Switch,\n  Table,\n  Tag,\n  Text,\n  theme,\n  ThemeProvider,\n  Timeline,\n  Toast,\n  Tooltip,\n  Tree,\n  VehicleKeyboardInput,\n  VehicleKeyboardItem,\n  VehicleKeyboardView,\n  WhiteSpace,\n  WingBlank,\n};\n\nexport type File = {\n  fileName: string;\n  fileType: string;\n  uri: string;\n  fileSize?: number;\n};\n\nexport type { Theme, Store, ValidateErrorEntity, Rule };\n"
  },
  {
    "path": "packages/react-native/src/indicator/BallIndicator.tsx",
    "content": "import React, { PureComponent } from 'react';\nimport { Animated, StyleSheet } from 'react-native';\n\nimport Box from '../box';\nimport Indicator from './Indicator';\nimport { BallIndicatorProps } from './type';\n\nexport default class BallIndicator extends PureComponent<BallIndicatorProps> {\n  static displayName = 'BallIndicator';\n  static defaultProps = {\n    color: 'rgb(0, 0, 0)',\n    count: 8,\n    size: 36,\n  };\n\n  renderComponent = ({ index, count, progress }: { index: number; count: number; progress: Animated.Value }) => {\n    const { size, color: backgroundColor } = this.props;\n    const angle = (index * 360) / count;\n\n    const layerStyle = {\n      transform: [\n        {\n          rotate: angle + 'deg',\n        },\n      ],\n    };\n\n    const inputRange = Array.from(new Array(count + 1), (_, index) => index / count);\n    const outputRange = Array.from(new Array(count), (_, index) => 1.2 - (0.5 * index) / (count - 1));\n\n    for (let j = 0; j < index; j++) {\n      outputRange.unshift(outputRange.pop()!);\n    }\n\n    outputRange.unshift(...outputRange.slice(-1));\n\n    const ballStyle = {\n      margin: size! / 20,\n      backgroundColor,\n      width: size! / 5,\n      height: size! / 5,\n      borderRadius: size! / 10,\n      transform: [\n        {\n          scale: progress.interpolate({ inputRange, outputRange }),\n        },\n      ],\n    };\n\n    return (\n      <Animated.View style={[styles.layer, layerStyle]} {...{ key: index }}>\n        <Animated.View style={ballStyle} />\n      </Animated.View>\n    );\n  };\n\n  render() {\n    const { style, size: width, size: height, ...props } = this.props;\n\n    return (\n      <Box style={style}>\n        <Indicator style={{ width, height }} renderComponent={this.renderComponent} {...props} />\n      </Box>\n    );\n  }\n}\n\nconst styles = StyleSheet.create({\n  layer: {\n    ...StyleSheet.absoluteFillObject,\n    justifyContent: 'flex-start',\n    alignItems: 'flex-start',\n  },\n});\n"
  },
  {
    "path": "packages/react-native/src/indicator/Indicator.tsx",
    "content": "import React, { PureComponent } from 'react';\nimport { Animated, Easing } from 'react-native';\n\nimport { BaseIndicatorProps } from './type';\n\ninterface IndicatorProps extends BaseIndicatorProps {\n  hideAnimationDuration: number;\n  count: number;\n  renderComponent: (values: { index: number; count: number; progress: Animated.Value }) => JSX.Element;\n}\n\ninterface IndicatorState {\n  progress: Animated.Value;\n  hideAnimation: Animated.Value;\n}\n\nexport default class Indicator extends PureComponent<IndicatorProps, IndicatorState> {\n  static displayName = 'Indicator';\n  static defaultProps = {\n    animationEasing: Easing.linear,\n    animationDuration: 1200,\n    hideAnimationDuration: 200,\n    animating: true,\n    interaction: true,\n    hidesWhenStopped: true,\n    count: 1,\n  };\n\n  animationState: number;\n  savedValue: number;\n\n  constructor(props: IndicatorProps) {\n    super(props);\n\n    /*\n     *  0 -> 1\n     *    | startAnimation\n     *    | resumeAnimation\n     *\n     *  1 -> -1\n     *    | stopAnimation\n     *\n     * -1 -> 0\n     *    | saveAnimation\n     */\n    this.animationState = 0;\n    this.savedValue = 0;\n\n    const { animating } = this.props;\n\n    this.state = {\n      progress: new Animated.Value(0),\n      hideAnimation: new Animated.Value(animating ? 1 : 0),\n    };\n  }\n\n  componentDidMount() {\n    const { animating } = this.props;\n\n    if (animating) {\n      this.startAnimation();\n    }\n  }\n\n  componentDidUpdate(prevProps: IndicatorProps) {\n    const { animating } = this.props;\n\n    if (animating && !prevProps.animating) {\n      this.resumeAnimation();\n    }\n\n    if (!animating && prevProps.animating) {\n      this.stopAnimation();\n    }\n\n    if (animating !== prevProps.animating) {\n      const { hideAnimation } = this.state;\n      const { hideAnimationDuration: duration } = this.props;\n\n      Animated.timing(hideAnimation, { toValue: animating ? 1 : 0, duration, useNativeDriver: true }).start();\n    }\n  }\n\n  startAnimation() {\n    const { progress } = this.state;\n    const { interaction, animationEasing, animationDuration } = this.props;\n\n    if (0 !== this.animationState) {\n      return;\n    }\n\n    const animation = Animated.timing(progress, {\n      duration: animationDuration,\n      easing: animationEasing,\n      useNativeDriver: true,\n      isInteraction: interaction,\n      toValue: 1,\n    });\n\n    Animated.loop(animation).start();\n\n    this.animationState = 1;\n  }\n\n  stopAnimation() {\n    const { progress } = this.state;\n\n    if (1 !== this.animationState) {\n      return;\n    }\n\n    const listener = progress.addListener(({ value }) => {\n      progress.removeListener(listener);\n      progress.stopAnimation(() => this.saveAnimation(value));\n    });\n\n    this.animationState = -1;\n  }\n\n  saveAnimation(value: number) {\n    const { animating } = this.props;\n\n    this.savedValue = value;\n    this.animationState = 0;\n\n    if (animating) {\n      this.resumeAnimation();\n    }\n  }\n\n  resumeAnimation() {\n    const { progress } = this.state;\n    const { interaction, animationDuration } = this.props;\n\n    if (0 !== this.animationState) {\n      return;\n    }\n\n    Animated.timing(progress, {\n      useNativeDriver: true,\n      isInteraction: interaction,\n      duration: (1 - this.savedValue) * animationDuration!,\n      toValue: 1,\n    }).start(({ finished }) => {\n      if (finished) {\n        progress.setValue(0);\n\n        this.animationState = 0;\n        this.startAnimation();\n      }\n    });\n\n    this.savedValue = 0;\n    this.animationState = 1;\n  }\n\n  renderComponent(_: any, index: number) {\n    const { progress } = this.state;\n    const { renderComponent, count } = this.props;\n\n    if ('function' === typeof renderComponent) {\n      return renderComponent({ index, count, progress });\n    }\n\n    return null;\n  }\n\n  render() {\n    const { hideAnimation } = this.state;\n    const { count, hidesWhenStopped, ...props } = this.props;\n\n    const styles: any = props.style ? [props.style] : [];\n    if (hidesWhenStopped) {\n      styles.push({ opacity: hideAnimation });\n    }\n\n    return <Animated.View {...props}>{Array.from(new Array(count), this.renderComponent, this)}</Animated.View>;\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/indicator/MaterialIndicator.tsx",
    "content": "import React, { PureComponent } from 'react';\nimport { Animated, Easing, StyleSheet, ViewStyle } from 'react-native';\n\nimport Box from '../box';\nimport Indicator from './Indicator';\nimport { MaterialIndicatorProps } from './type';\n\nexport default class MaterialIndicator extends PureComponent<MaterialIndicatorProps> {\n  static displayName = 'MaterialIndicator';\n  static defaultProps = {\n    animationDuration: 4000,\n    color: 'rgb(0, 0, 0)',\n    size: 40,\n  };\n\n  _renderComponent = ({ index, progress }: { index: number; progress: Animated.Value }) => {\n    const { size, color, animationDuration } = this.props;\n\n    const frames = (60 * animationDuration!) / 1000;\n    const easing = Easing.bezier(0.4, 0.0, 0.7, 1.0);\n\n    const sa = 7.5;\n    const ea = 30;\n\n    const sequences = 3;\n    const rotations = 5;\n\n    const inputRange = Array.from(new Array(frames), (_, frameIndex) => frameIndex / (frames - 1));\n    const outputRange = Array.from(new Array(frames), (_, frameIndex) => {\n      let _progress = (2 * sequences * frameIndex) / (frames - 1);\n      const rotation = index ? +(360 - sa) : -(180 - sa);\n\n      const sequence = Math.ceil(_progress);\n\n      if (sequence % 2) {\n        _progress = _progress - sequence + 1;\n      } else {\n        _progress = sequence - _progress;\n      }\n\n      const direction = index ? -1 : +1;\n\n      return direction * (180 - (sa + ea)) * easing(_progress) + rotation + 'deg';\n    });\n\n    const layerStyle = {\n      width: size,\n      height: size,\n      transform: [\n        {\n          rotate: 90 - sa + 'deg',\n        },\n        {\n          rotate: progress.interpolate({\n            inputRange: [0, 1],\n            outputRange: ['0deg', 360 * rotations + 'deg'],\n          }),\n        },\n      ],\n    };\n\n    const viewportStyle = {\n      width: size,\n      height: size,\n      transform: [\n        {\n          translateY: index ? -size! / 2 : 0,\n        },\n        {\n          rotate: progress.interpolate({ inputRange, outputRange }),\n        },\n      ],\n    };\n\n    const containerStyle: ViewStyle = {\n      width: size,\n      height: size! / 2,\n      overflow: 'hidden',\n    };\n\n    const offsetStyle = index ? { top: size! / 2 } : null;\n\n    const lineStyle: ViewStyle = {\n      width: size,\n      height: size,\n      borderColor: color,\n      borderRadius: size! / 2,\n      borderWidth: size! / 20,\n    };\n\n    return (\n      <Animated.View style={styles.layer} {...{ key: index }}>\n        <Animated.View style={layerStyle}>\n          <Animated.View style={[containerStyle, offsetStyle]} collapsable={false}>\n            <Animated.View style={viewportStyle}>\n              <Animated.View style={containerStyle} collapsable={false}>\n                <Animated.View style={lineStyle} />\n              </Animated.View>\n            </Animated.View>\n          </Animated.View>\n        </Animated.View>\n      </Animated.View>\n    );\n  };\n\n  render() {\n    const { style, size: width, size: height, ...props } = this.props;\n\n    return (\n      <Box flex={1} justifyContent={'center'} alignItems={'center'} style={style}>\n        <Indicator style={{ width, height }} renderComponent={this._renderComponent} {...props} count={2} />\n      </Box>\n    );\n  }\n}\n\nconst styles = StyleSheet.create({\n  layer: {\n    ...StyleSheet.absoluteFillObject,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n});\n"
  },
  {
    "path": "packages/react-native/src/indicator/UIActivityIndicator.tsx",
    "content": "import React, { PureComponent } from 'react';\nimport { Animated, StyleSheet } from 'react-native';\n\nimport Box from '../box';\nimport Indicator from './Indicator';\nimport { UIActivityIndicatorProps } from './type';\n\nexport default class UIActivityIndicator extends PureComponent<UIActivityIndicatorProps> {\n  static displayName = 'UIActivityIndicator';\n  static defaultProps = {\n    color: 'rgb(0, 0, 0)',\n    count: 12,\n    size: 36,\n  };\n\n  renderComponent = ({ index, count, progress }: { index: number; count: number; progress: Animated.Value }) => {\n    const { size, color: backgroundColor } = this.props;\n    const angle = (index * 360) / count;\n\n    const layerStyle = {\n      transform: [\n        {\n          rotate: angle + 'deg',\n        },\n      ],\n    };\n\n    const inputRange = Array.from(new Array(count + 1), (_, index) => index / count);\n    const outputRange = Array.from(new Array(count), (_, index) => Math.max(1.0 - index * (1 / (count - 1)), 0));\n\n    for (let j = 0; j < index; j++) {\n      outputRange.unshift(outputRange.pop()!);\n    }\n\n    outputRange.unshift(...outputRange.slice(-1));\n\n    const barStyle = {\n      width: size! / 10,\n      height: size! / 4,\n      borderRadius: size! / 20,\n      backgroundColor,\n      opacity: progress.interpolate({ inputRange, outputRange }),\n    };\n\n    return (\n      <Animated.View style={[styles.layer, layerStyle]} {...{ key: index }}>\n        <Animated.View style={barStyle} />\n      </Animated.View>\n    );\n  };\n\n  render() {\n    const { style, size: width, size: height, ...props } = this.props;\n\n    return (\n      <Box style={style}>\n        <Indicator style={{ width, height }} renderComponent={this.renderComponent} {...props} />\n      </Box>\n    );\n  }\n}\n\nconst styles = StyleSheet.create({\n  layer: {\n    ...StyleSheet.absoluteFillObject,\n\n    justifyContent: 'flex-start',\n    alignItems: 'center',\n  },\n});\n"
  },
  {
    "path": "packages/react-native/src/indicator/index.md",
    "content": "---\ntitle: Indicator - 指示器组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 其他组件\n  path: /other\n---\n\n# Indicator 指示器组件\n\n## 效果演示\n\n### 1. BallIndicator\n\n```tsx | pure\n<SafeAreaView style={{ flex: 1 }}>\n  <BallIndicator />\n</SafeAreaView>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"indicator-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1624173464148013948.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. UIActivityIndicator\n\n```tsx | pure\n<SafeAreaView style={{ flex: 1 }}>\n  <UIActivityIndicator />\n</SafeAreaView>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"indicator-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1624173490303265458.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. MaterialIndicator\n\n```tsx | pure\n<SafeAreaView style={{ flex: 1 }}>\n  <MaterialIndicator />\n</SafeAreaView>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"indicator-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643177632601010878.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 修改大小和颜色\n\n```tsx | pure\n<SafeAreaView style={{ flex: 1 }}>\n  <UIActivityIndicator color=\"#ff0000\" size={50} />\n</SafeAreaView>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"indicator-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643177688024869837.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### 公共属性\n\n| 属性              | 必填    | 说明             | 类型             | 默认值          |\n| ----------------- | ------- | ---------------- | ---------------- | --------------- |\n| animationEasing   | `false` | 动画 Easing 效果 | `EasingFunction` | `Easing.linear` |\n| animationDuration | `false` | 动画执行时长     | `number`         | `1200`          |\n| animating         | `false` | 动画是否正在执行 | `boolean`        | `true`          |\n| interaction       | `false` | 是否可以交互     | `boolean`        | `true`          |\n| style             | `false` | 自定义样式       | `ViewStyle`      |                 |\n| hidesWhenStopped  | `false` | 动画停止时隐藏   | `boolean`        | `true`          |\n\n### BallIndicator / UIActivityIndicator 属性\n\n| 属性  | 必填    | 说明     | 类型     | 默认值       |\n| ----- | ------- | -------- | -------- | ------------ |\n| color | `false` | 颜色     | `string` | `rgb(0,0,0)` |\n| count | `false` | 元素数量 | `number` | `12`         |\n| size  | `false` | 大小     | `number` | `36`         |\n\n### MaterialIndicator 属性\n\n| 属性  | 必填    | 说明 | 类型     | 默认值       |\n| ----- | ------- | ---- | -------- | ------------ |\n| color | `false` | 颜色 | `string` | `rgb(0,0,0)` |\n| size  | `false` | 大小 | `number` | `36`         |\n"
  },
  {
    "path": "packages/react-native/src/indicator/index.ts",
    "content": "import { default as BallIndicator } from './BallIndicator';\nimport { default as MaterialIndicator } from './MaterialIndicator';\nimport { default as UIActivityIndicator } from './UIActivityIndicator';\n\nexport default { BallIndicator, UIActivityIndicator, MaterialIndicator };\n"
  },
  {
    "path": "packages/react-native/src/indicator/type.ts",
    "content": "import { EasingFunction, StyleProp, ViewStyle } from 'react-native';\n\nexport interface BaseIndicatorProps {\n  /**\n   * Animation easing function\n   * @default Easing.linear\n   */\n  animationEasing?: EasingFunction;\n\n  /**\n   * Animation duration in ms\n   * @default 1200\n   */\n  animationDuration?: number;\n\n  /**\n   * Animation toggle\n   * @default true\n   */\n  animating?: boolean;\n\n  /**\n   * Animation is interaction\n   * @default true\n   */\n  interaction?: boolean;\n\n  /**\n   * Style is proxied to the underlying View\n   * @default undefined\n   */\n  style?: StyleProp<ViewStyle>;\n\n  /**\n   * Hide when not animating\n   * @default true\n   */\n  hidesWhenStopped?: boolean;\n}\n\nexport interface UIActivityIndicatorProps extends BaseIndicatorProps {\n  /**\n   * @default 'rgb(0, 0, 0)'\n   */\n  color?: string;\n  /**\n   * @default 12\n   */\n  count?: number;\n  /**\n   * @default 36\n   */\n  size?: number;\n}\n\nexport interface BallIndicatorProps extends BaseIndicatorProps {\n  /**\n   * @default 'rgb(0, 0, 0)'\n   */\n  color?: string;\n  /**\n   * @default 8\n   */\n  count?: number;\n  /**\n   * @default 36\n   */\n  size?: number;\n}\n\nexport interface MaterialIndicatorProps extends BaseIndicatorProps {\n  /**\n   * @default 'rgb(0, 0, 0)'\n   */\n  color?: string;\n  /**\n   * @default 36\n   */\n  size?: number;\n}\n"
  },
  {
    "path": "packages/react-native/src/input/InputItem.tsx",
    "content": "import React, { forwardRef, ReactNode } from 'react';\nimport { StyleProp, StyleSheet, TextInput, TextInputProps, TextStyle, ViewStyle } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport { Theme } from '../theme';\nimport useInputItem from './useInputItem';\n\nconst { px } = helpers;\nexport interface InputItemProps\n  extends Omit<TextInputProps, 'placeholderTextColor' | 'onChange' | 'onChangeText' | 'style'> {\n  /** 输入类型。文本输入或者密码输入 */\n  inputType?: 'input' | 'password';\n  /** 输入框自定义样式 */\n  inputStyle?: StyleProp<TextStyle>;\n  /** 左侧图标 */\n  left?: ReactNode;\n  /** 右侧内容 */\n  right?: ReactNode;\n  /** 是否显示清除图标 */\n  allowClear?: boolean;\n  /** 值 */\n  value?: string;\n  /** 输入改变事件 */\n  onChange?: (value: string) => void;\n  /** 清除内容 */\n  onClear?: () => void;\n  /** 容器自定义样式 */\n  style?: StyleProp<ViewStyle>;\n  inForm?: boolean;\n}\nconst InputItem = forwardRef<TextInput, InputItemProps>(\n  (\n    {\n      inputType = 'input',\n      left,\n      right,\n      inputStyle,\n      editable = true,\n      allowClear = true,\n      value,\n      onChange,\n      onClear,\n      style,\n      defaultValue,\n      inForm,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { inputValue, eyeOpen, handleChange, handleInputClear, triggerPasswordType } = useInputItem({\n      inputType,\n      value,\n      defaultValue,\n      onChange,\n      onClear,\n    });\n\n    const styles = StyleSheet.create({\n      input: {\n        paddingHorizontal: theme.spacing.x0,\n        paddingVertical: theme.spacing.x2,\n        fontSize: px(14),\n        color: theme.colors.text,\n      },\n    });\n\n    return (\n      <Flex flexGrow={1} paddingHorizontal={inForm ? 'x0' : 'x1'} style={style}>\n        {left}\n        <Box flexGrow={1}>\n          <TextInput\n            ref={ref}\n            textAlignVertical=\"center\"\n            autoCapitalize=\"none\"\n            autoCorrect={false}\n            autoComplete=\"off\"\n            style={[styles.input, inputStyle]}\n            editable={editable}\n            placeholderTextColor={theme.colors.gray300}\n            selectionColor={theme.colors.primary200}\n            value={inputValue}\n            onChangeText={handleChange}\n            secureTextEntry={eyeOpen}\n            multiline={false}\n            underlineColorAndroid=\"transparent\"\n            {...restProps}\n          />\n        </Box>\n        {inputType === 'password' && (\n          <Pressable activeOpacity={1} onPress={triggerPasswordType} hitOffset={10}>\n            <SvgIcon name={eyeOpen ? 'eyeclose' : 'eyeopen'} color={theme.colors.icon} />\n          </Pressable>\n        )}\n        {allowClear && editable && !!inputValue && (\n          <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n        {right}\n      </Flex>\n    );\n  }\n);\nInputItem.displayName = 'InputItem';\n\nexport default InputItem;\n"
  },
  {
    "path": "packages/react-native/src/input/TextArea.tsx",
    "content": "import React, { forwardRef, ReactNode } from 'react';\nimport { StyleProp, StyleSheet, TextInput, TextInputProps, ViewStyle } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Brief from '../brief';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Label from '../label';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport useTextArea from './useTextArea';\n\nconst { ONE_PIXEL, px } = helpers;\nexport interface TextAreaProps\n  extends Omit<TextInputProps, 'placeholderTextColor' | 'onChange' | 'onChangeText' | 'style'> {\n  /** 标签 */\n  label?: ReactNode;\n  /** 是否必填 */\n  required?: boolean;\n  /** 值 */\n  value?: string;\n  /** 输入改变事件 */\n  onChange?: (value: string) => void;\n  /** 文本域高度 */\n  height?: number;\n  /** 文本长度限制 */\n  limit?: number;\n  /** 是否有边框 */\n  border?: boolean;\n  /** 自定义样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 额外内容 */\n  brief?: ReactNode;\n  /** 在表单项里时 label 的高度应该要跟其他的高度保持一致 */\n  itemHeight?: number;\n}\n\nconst TextArea = forwardRef<TextInput, TextAreaProps>(\n  (\n    {\n      label,\n      height = px(150),\n      limit,\n      value,\n      border = true,\n      onChange,\n      style,\n      brief,\n      required,\n      itemHeight,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { inputValue, handleChange } = useTextArea({ value, onChange });\n\n    const styles = StyleSheet.create({\n      input: {\n        height: '100%',\n        padding: theme.spacing.x2,\n        fontSize: px(14),\n        lineHeight: px(20),\n        color: theme.colors.text,\n      },\n    });\n\n    return (\n      <Box>\n        <Label {...{ label, required, labelHeight: itemHeight }} />\n        <Box borderWidth={border ? ONE_PIXEL : 0} borderColor=\"border\" style={[style, { height }]}>\n          <TextInput\n            ref={ref}\n            textAlignVertical=\"top\"\n            autoCapitalize=\"none\"\n            autoCorrect={false}\n            autoComplete=\"off\"\n            {...restProps}\n            style={styles.input}\n            placeholderTextColor={theme.colors.gray300}\n            selectionColor={theme.colors.primary200}\n            value={inputValue}\n            onChangeText={handleChange}\n            multiline\n            underlineColorAndroid=\"transparent\"\n            maxLength={limit}\n          />\n          {!!limit && (\n            <Flex flexDirection=\"row-reverse\" padding=\"x1\">\n              <Text variant=\"p1\" color=\"text\">\n                {inputValue?.length ?? 0} / {limit}\n              </Text>\n            </Flex>\n          )}\n        </Box>\n        <Brief {...{ brief }} />\n      </Box>\n    );\n  }\n);\nTextArea.displayName = 'TextArea';\n\nexport default TextArea;\n"
  },
  {
    "path": "packages/react-native/src/input/index.md",
    "content": "---\ntitle: Input - 文本输入组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# Input 文本输入组件\n\n## 效果演示\n\n### 1. 只有一个输入框\n\n```tsx | pure\n<Input placeholder=\"请输入姓名\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607934747327132447.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 输入框带标签和左右图标\n\n```tsx | pure\n<Input\n  value={value}\n  onChange={setValue}\n  label=\"姓名\"\n  placeholder=\"请输入姓名\"\n  leftIcon={<Icon name=\"user\" color=\"green\" />}\n  rightIcon={<Icon name=\"customerservice\" color=\"gold\" />}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607934917611994869.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 标签在输入框上方\n\n```tsx | pure\n<Input label=\"姓名\" placeholder=\"请输入姓名\" labelPosition=\"top\" leftIcon={<Icon name=\"user\" color=\"green\" />} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios3.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607934974049162262.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 带冒号和必填标识\n\n```tsx | pure\n<Input\n  colon\n  required\n  value={value}\n  onChange={setValue}\n  label=\"姓名\"\n  placeholder=\"请输入姓名\"\n  leftIcon={<Icon name=\"user\" color=\"green\" />}\n  rightIcon={<Icon name=\"customerservice\" color=\"gold\" />}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios4.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607935036647969320.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 文本域效果\n\n```tsx | pure\n<TextArea label=\"姓名\" placeholder=\"请输入姓名\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios5.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607935124946146557.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 带字数限制的文本域\n\n```tsx | pure\n<TextArea label=\"详情\" placeholder=\"请输入详情\" limit={20} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios6.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607935503663968541.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 7. InputItem 效果\n\n```tsx | pure\n<InputItem label=\"姓名\" placeholder=\"请输入姓名\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios7.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607945199283339224.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 8. InputItem 设置 extra 属性\n\n```tsx | pure\n<InputItem label=\"姓名\" placeholder=\"请输入姓名\" extra={<Text style={{ color: 'green' }}>test</Text>} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios8.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607945333933480168.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 9. 密码输入框\n\n```tsx | pure\n<InputItem label=\"密码\" placeholder=\"请输入密码\" allowClear={false} inputType=\"password\" required colon />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios9.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607945442040887604.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Input 属性\n\n继承`TextInput`组件的属性，但是移除了`placeholderTextColor`、`onChange`、`onChangeText`属性。\n\n参见：[https://reactnative.dev/docs/textinput](https://reactnative.dev/docs/textinput)\n\n| 属性          | 必填    | 说明                                 | 类型                      | 默认值  |\n| ------------- | ------- | ------------------------------------ | ------------------------- | ------- |\n| label         | `false` | 标签                                 | `ReactNode`               |         |\n| labelPosition | `false` | 标签位置。输入框左侧或者顶部         | `left` \\| `top`           | `left`  |\n| inputType     | `false` | 输入框类型。文本输入框或者密码输入框 | `input` \\| `password`     | `input` |\n| inputStyle    | `false` | 输入框自定义样式                     | `TextStyle`               | `input` |\n| leftIcon      | `false` | 左侧图标                             | `ReactNode`               |         |\n| rightIcon     | `false` | 右侧图标                             | `ReactNode`               |         |\n| allowClear    | `false` | 是否显示清除图标                     | `boolean`                 | `true`  |\n| value         | `false` | 输入框的值                           | `string`                  |         |\n| onChange      | `false` | 输入框值改变的回调                   | `(value: string) => void` |         |\n| disabled      | `false` | 是否禁用输入框                       | `boolean`                 | `false` |\n| colon         | `false` | 是否在标签后显示冒号                 | `boolean`                 | `false` |\n| required      | `false` | 是否在标签前显示必填标识             | `boolean`                 | `false` |\n| onClear       | `false` | 清除内容                             | `() => void`              |         |\n| brief         | `false` | 其他内容                             | `ReactNode`               |         |\n\n### InputItem 属性\n\n| 属性       | 必填    | 说明                                 | 类型                      | 默认值  |\n| ---------- | ------- | ------------------------------------ | ------------------------- | ------- |\n| inputType  | `false` | 输入框类型。文本输入框或者密码输入框 | `input` \\| `password`     | `input` |\n| inputStyle | `false` | 输入框自定义样式                     | `TextStyle`               | `input` |\n| extra      | `false` | 其他内容                             | `ReactNode`               |         |\n| allowClear | `false` | 是否显示清除图标                     | `boolean`                 | `true`  |\n| value      | `false` | 输入框的值                           | `string`                  |         |\n| onChange   | `false` | 输入框值改变的回调                   | `(value: string) => void` |         |\n| onClear    | `false` | 点击清除按钮时的回调                 | `() => void`              |         |\n| style      | `false` | 容器自定义样式                       | `ViewStyle`               |         |\n\n_当传递了`onClear`事件时，onChange 不会再自动触发，需要`onClear`事件处理清空`value`的操作。_\n\n### TextArea 属性\n\n| 属性     | 必填    | 说明                           | 类型                      | 默认值  |\n| -------- | ------- | ------------------------------ | ------------------------- | ------- |\n| label    | `false` | 标签                           | `ReactNode`               |         |\n| value    | `false` | 输入框的值                     | `string`                  |         |\n| onChange | `false` | 输入框值改变的回调             | `(value: string) => void` |         |\n| height   | `false` | 文本域高度                     | `number`                  | `150`   |\n| limit    | `false` | 输入文字长度限制。不传时不显示 | `number`                  |         |\n| required | `false` | 是否在标签前显示必填标识       | `boolean`                 | `false` |\n| border   | `false` | 是否有边框                     | `boolean`                 | `true`  |\n| style    | `false` | 容器自定义样式                 | `ViewStyle`               |         |\n| brief    | `false` | 其他内容                       | `ReactNode`               |         |\n"
  },
  {
    "path": "packages/react-native/src/input/index.tsx",
    "content": "import React, { forwardRef, ReactNode } from 'react';\nimport { StyleProp, StyleSheet, TextInput, TextInputProps, TextStyle } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Label from '../label';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport { Theme } from '../theme';\nimport useInput from './useInput';\n\nconst { ONE_PIXEL, px } = helpers;\nexport interface InputProps extends Omit<TextInputProps, 'placeholderTextColor' | 'onChange' | 'onChangeText'> {\n  /** 标签 */\n  label?: ReactNode;\n  /** 标签位置。可选值：左侧/上方 */\n  labelPosition?: 'left' | 'top';\n  /** 输入类型。文本输入或者密码输入 */\n  inputType?: 'input' | 'password';\n  /** 输入框自定义样式 */\n  inputStyle?: StyleProp<TextStyle>;\n  /** 左侧图标 */\n  left?: ReactNode;\n  /** 右侧内容 */\n  right?: ReactNode;\n  /** 是否显示清除图标 */\n  allowClear?: boolean;\n  /** 值 */\n  value?: string;\n  /** 输入改变事件 */\n  onChange?: (value: string) => void;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 是否显示冒号 */\n  colon?: boolean;\n  /** 清除内容 */\n  onClear?: () => void;\n  /** 是否必填项 */\n  required?: boolean;\n  /** 作为FormItem子组件时注入进来的高度 */\n  itemHeight?: number;\n}\n\nconst Input = forwardRef<TextInput, InputProps>(\n  (\n    {\n      label,\n      labelPosition = 'left',\n      left,\n      right,\n      inputType = 'input',\n      inputStyle,\n      disabled = false,\n      allowClear = true,\n      value,\n      onChange,\n      onClear,\n      colon = false,\n      required = false,\n      style,\n      defaultValue,\n      itemHeight,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { inputValue, eyeOpen, handleChange, handleInputClear, triggerPasswordType } = useInput({\n      inputType,\n      value,\n      defaultValue,\n      onChange,\n      onClear,\n    });\n\n    const styles = StyleSheet.create({\n      input: {\n        paddingHorizontal: theme.spacing.x1,\n        paddingVertical: theme.spacing.x2,\n        fontSize: px(14),\n        color: theme.colors.text,\n        includeFontPadding: false,\n        textAlignVertical: 'center',\n      },\n    });\n\n    const InputContent = (\n      <Flex\n        borderWidth={ONE_PIXEL}\n        borderColor=\"border\"\n        borderRadius=\"x1\"\n        position=\"relative\"\n        paddingHorizontal={'x1'}\n        flex={1}\n        style={style}\n      >\n        {left}\n        <Box flexGrow={1}>\n          <TextInput\n            ref={ref}\n            textAlignVertical=\"center\"\n            autoCapitalize=\"none\"\n            autoCorrect={false}\n            autoComplete=\"off\"\n            style={[itemHeight ? { height: itemHeight } : {}, styles.input, inputStyle]}\n            editable={!disabled}\n            placeholderTextColor={theme.colors.gray300}\n            selectionColor={theme.colors.primary200}\n            value={inputValue}\n            onChangeText={handleChange}\n            secureTextEntry={eyeOpen}\n            multiline={false}\n            underlineColorAndroid=\"transparent\"\n            {...restProps}\n          />\n        </Box>\n        {inputType === 'password' && (\n          <Pressable activeOpacity={1} onPress={triggerPasswordType} hitOffset={10}>\n            <SvgIcon name={eyeOpen ? 'eyeclose' : 'eyeopen'} color={theme.colors.icon} />\n          </Pressable>\n        )}\n        {allowClear && !disabled && !!inputValue && (\n          <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n        {right}\n      </Flex>\n    );\n\n    return labelPosition === 'left' ? (\n      <Box>\n        <Flex alignItems=\"center\">\n          <Label {...{ colon, label, required }} />\n          {InputContent}\n        </Flex>\n      </Box>\n    ) : (\n      <Box>\n        <Label {...{ colon, label, required }} />\n        {InputContent}\n      </Box>\n    );\n  }\n);\nInput.displayName = 'Input';\n\nexport default Input;\nexport { default as InputItem } from './InputItem';\nexport { default as TextArea } from './TextArea';\n"
  },
  {
    "path": "packages/react-native/src/input/useInput.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { InputProps } from '.';\n\nexport default function useInput({\n  inputType,\n  value,\n  defaultValue,\n  onChange,\n  onClear,\n}: Pick<InputProps, 'inputType' | 'value' | 'defaultValue' | 'onChange' | 'onClear'>) {\n  const [inputValue, setInputValue] = useSafeState<string>();\n  const [eyeOpen, setEyeOpen] = useSafeState(inputType === 'password');\n\n  useEffect(() => {\n    setInputValue(value ?? defaultValue ?? '');\n  }, [value, defaultValue]);\n\n  const handleChange = (val: string) => {\n    setInputValue(val);\n    onChange?.(val);\n  };\n\n  const handleInputClear = () => {\n    handleChange('');\n    onClear?.();\n  };\n\n  const triggerPasswordType = () => {\n    setEyeOpen(!eyeOpen);\n  };\n\n  return {\n    inputValue,\n    eyeOpen,\n    handleChange: useMemoizedFn(handleChange),\n    handleInputClear: useMemoizedFn(handleInputClear),\n    triggerPasswordType: useMemoizedFn(triggerPasswordType),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/input/useInputItem.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { InputItemProps } from './InputItem';\n\nexport default function useInputItem({\n  inputType,\n  value,\n  defaultValue,\n  onChange,\n  onClear,\n}: Pick<InputItemProps, 'inputType' | 'value' | 'defaultValue' | 'onChange' | 'onClear'>) {\n  const [inputValue, setInputValue] = useSafeState<string>();\n  const [eyeOpen, setEyeOpen] = useSafeState(inputType === 'password');\n\n  useEffect(() => {\n    setInputValue(value ?? defaultValue ?? '');\n  }, [value, defaultValue]);\n\n  const handleChange = (val: string) => {\n    setInputValue(val);\n    onChange?.(val);\n  };\n\n  const handleInputClear = () => {\n    handleChange('');\n    onClear?.();\n  };\n\n  const triggerPasswordType = () => {\n    setEyeOpen(!eyeOpen);\n  };\n\n  return {\n    inputValue,\n    eyeOpen,\n    handleChange: useMemoizedFn(handleChange),\n    handleInputClear: useMemoizedFn(handleInputClear),\n    triggerPasswordType: useMemoizedFn(triggerPasswordType),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/input/useTextArea.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport type { TextAreaProps } from './TextArea';\n\nexport default function useTextArea({ value, onChange }: Pick<TextAreaProps, 'value' | 'onChange'>) {\n  const [inputValue, setInputValue] = useSafeState<string>();\n\n  useEffect(() => {\n    setInputValue(value ?? '');\n  }, [value]);\n\n  const handleChange = (val: string) => {\n    setInputValue(val);\n    onChange?.(val);\n  };\n\n  return {\n    inputValue,\n    handleChange,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/label/index.tsx",
    "content": "import React, { memo, ReactNode } from 'react';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Flex from '../flex';\nimport Text from '../text';\nimport { Theme } from '../theme';\n\nconst Label = memo(\n  ({\n    colon,\n    label,\n    required,\n    labelHeight,\n  }: {\n    colon?: boolean;\n    required?: boolean;\n    label?: ReactNode;\n    labelHeight?: number;\n  }) => {\n    const theme = useTheme<Theme>();\n    const style = {};\n    if (labelHeight) {\n      Object.assign(style, {\n        height: labelHeight,\n      });\n    } else {\n      Object.assign(style, {\n        paddingVertical: theme.spacing.x2,\n      });\n    }\n\n    if (!label) return null;\n\n    if (typeof label === 'string')\n      return (\n        <Flex marginRight=\"x2\" alignItems=\"center\" style={style}>\n          {required && (\n            <Text variant=\"p1\" color=\"func600\">\n              *\n            </Text>\n          )}\n          <Text variant=\"p1\" color=\"text\">\n            {label}\n          </Text>\n          <Text variant=\"p1\" color=\"text\">\n            {colon ? ':' : ''}\n          </Text>\n        </Flex>\n      );\n\n    return (\n      <Flex marginRight=\"x2\" style={style}>\n        {required && (\n          <Text variant=\"p1\" color=\"func600\">\n            *\n          </Text>\n        )}\n        {label}\n        <Text variant=\"p1\" color=\"text\">\n          {colon ? ':' : ''}\n        </Text>\n      </Flex>\n    );\n  }\n);\n\nexport default Label;\n"
  },
  {
    "path": "packages/react-native/src/link/index.md",
    "content": "---\ntitle: Link - 外链组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 其他组件\n  path: /other\n---\n\n# Link 外链组件\n\n该组件暴露了允许在 app 内唤起其他应用的方法。如发送短信、打电话、发邮件、打开外链、打开系统设置。\n\n## 效果演示\n\n### 1. 发送邮件\n\n```tsx | pure\n<Button title=\"发送邮件\" onPress={() => Link.email('929483857@qq.com')} />\n```\n\n### 2. 打开系统设置\n\n```tsx | pure\n<Button title=\"打开系统设置\" onPress={() => Link.settings()} />\n```\n\n### 3. 发送短信\n\n```tsx | pure\n<Button title=\"发送短信\" onPress={() => Link.sms('+8617681820821')} />\n```\n\n### 4. 打电话\n\n```tsx | pure\n<Button title=\"打电话\" onPress={() => Link.call('+8617681820821')} />\n```\n\n### 5. 打开网址\n\n```tsx | pure\n<Button title=\"打开网址\" onPress={() => Link.url('https://www.baidu.com/')} />\n```\n\n## API\n\n### Link.email(email: string)\n\n### Link.settings()\n\n### Link.sms(phoneNumber: string)\n\n### Link.call(phoneNumber: string)\n\n### Link.url(url: string)\n"
  },
  {
    "path": "packages/react-native/src/link/index.ts",
    "content": "import { Linking, Platform } from 'react-native';\n\nexport type LinkType = 'email' | 'phone' | 'sms' | 'url' | 'settings';\n\nexport default {\n  email(address: string) {\n    Linking.openURL('mailto:' + address);\n  },\n  settings() {\n    Linking.openSettings();\n  },\n  async url(url: string) {\n    const canOpen = await Linking.canOpenURL(url);\n    if (canOpen) {\n      Linking.openURL(url);\n    }\n  },\n  sms(phoneNumber: string) {\n    Linking.openURL('sms:' + phoneNumber);\n  },\n  call(phoneNumber: string) {\n    if (Platform.OS === 'android') {\n      Linking.openURL('tel:' + phoneNumber);\n    } else {\n      Linking.openURL('telprompt:' + phoneNumber);\n    }\n  },\n};\n"
  },
  {
    "path": "packages/react-native/src/list/index.md",
    "content": "---\ntitle: List - 列表组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# List 列表组件\n\n## 效果演示\n\n### 1. 只有一个输入框\n\n```tsx | pure\n<List\n  header=\"基础使用\"\n  items={[\n    { title: '主标题主标', extra: <Input placeholder=\"请输入\" style={{ height: px(32) }} /> },\n    {\n      title: '主标题主标题主标题主标题主标题主标题',\n      brief: '主标题下面的副标题主标题下面的副标题',\n      arrow: 'horizontal',\n      onPress: () => console.log('onPress'),\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643178981833863125.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 设置背景色\n\n```tsx | pure\n<List\n  header=\"设置背景色\"\n  itemBackgroundColor=\"primary200\"\n  items={[\n    { title: '主标题主标', extra: <Input placeholder=\"请输入\" style={{ height: px(32) }} /> },\n    {\n      title: '主标题主标题主标题主标题主标题主标题',\n      brief: '主标题下面的副标题主标题下面的副标题',\n      arrow: 'horizontal',\n      onPress: () => console.log('onPress'),\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643179034178291048.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 覆盖背景色\n\n```tsx | pure\n<List\n  header=\"覆盖背景色\"\n  itemBackgroundColor=\"primary200\"\n  items={[\n    { title: '主标题主标', extra: <Input placeholder=\"请输入\" style={{ height: px(32) }} /> },\n    {\n      title: '主标题主标题主标题主标题主标题主标题',\n      brief: '主标题下面的副标题主标题下面的副标题',\n      backgroundColor: 'func200',\n      arrow: 'horizontal',\n      onPress: () => console.log('onPress'),\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643179130096441849.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自定义 header\n\n```tsx | pure\n<List\n  header={<CustomHeader />}\n  items={[\n    { title: '主标题主标', extra: <Input placeholder=\"请输入\" style={{ height: px(32) }} /> },\n    {\n      title: '主标题主标题主标题主标题主标题主标题',\n      brief: '主标题下面的副标题主标题下面的副标题',\n      arrow: 'horizontal',\n      onPress: () => console.log('onPress'),\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643179167773615848.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 单独使用 ListHeader\n\n```tsx | pure\n<ListHeader text=\"只有标题\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643179225562573991.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 标题右侧自定义\n\n```tsx | pure\n<List\n  header=\"只有标题\"\n  extra={<SvgIcon name=\"left\" />}\n  items={[{ title: '主标题主标', extra: <Input placeholder=\"请输入\" style={{ height: px(32) }} /> }]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"input-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643179287406760859.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## List API\n\n| 属性                | 必填    | 说明                 | 类型                    | 默认值 |\n| ------------------- | ------- | -------------------- | ----------------------- | ------ |\n| header              | `false` | 标题                 | `ReactNode`             |        |\n| extra               | `false` | 标题右侧内容         | `ReactNode`             |        |\n| items               | `true`  | 列表项               | `ListItemProps[]`       |        |\n| itemStyle           | `false` | 列表项样式           | `StyleProp<ViewStyle>`  |        |\n| itemBackgroundColor | `false` | 统一设置列表项背景色 | `keyof Theme['colors']` |        |\n\n## ListHeader API\n\n| 属性        | 必填    | 说明           | 类型                   | 默认值 |\n| ----------- | ------- | -------------- | ---------------------- | ------ |\n| text        | `true`  | 标题文本       | `string`               |        |\n| extra       | `false` | 标题右侧内容   | `ReactNode`            |        |\n| textStyle   | `false` | 标题文字的样式 | `StyleProp<TextStyle>` |        |\n| headerStyle | `false` | 标题容器的样式 | `StyleProp<ViewStyle>` |        |\n"
  },
  {
    "path": "packages/react-native/src/list/index.tsx",
    "content": "import React, { FC, memo, ReactNode, useMemo } from 'react';\nimport { StyleProp, TextStyle, ViewStyle } from 'react-native';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport ListItem, { ListItemProps } from '../list-item';\nimport Text from '../text';\n\nconst { ONE_PIXEL } = helpers;\n\ntype ListProps = {\n  /** 标题 */\n  header?: ReactNode;\n  /** 标题右侧内容 */\n  extra?: ReactNode;\n  /** 列表项 */\n  items: ListItemProps[];\n  /** 列表项样式 */\n  itemStyle?: StyleProp<ViewStyle>;\n  /** 列表项背景色 */\n  itemBackgroundColor?: string;\n};\nconst List: FC<ListProps> = ({ header, extra, itemBackgroundColor, itemStyle, items = [] }) => {\n  const Header = useMemo(() => {\n    if (!header) return null;\n    if (typeof header === 'string') {\n      return <ListHeader text={header} extra={extra} />;\n    }\n    return header;\n  }, [header, extra]);\n\n  return (\n    <Box>\n      {Header}\n      {items.map((props, index) => {\n        return (\n          <ListItem key={index} {...props} backgroundColor={itemBackgroundColor} style={[itemStyle, props.style]} />\n        );\n      })}\n    </Box>\n  );\n};\nList.displayName = 'List';\n\nconst ListHeader = memo(\n  ({\n    text,\n    extra,\n    textStyle,\n    headerStyle,\n  }: {\n    /** 标题文本 */\n    text: string;\n    /** 自定义右侧内容 */\n    extra?: ReactNode;\n    /** 文本样式 */\n    textStyle?: StyleProp<TextStyle>;\n    /** 标题样式 */\n    headerStyle?: StyleProp<ViewStyle>;\n  }) => {\n    if (text === '') return null;\n    return (\n      <Flex\n        justifyContent=\"space-between\"\n        alignItems=\"center\"\n        paddingHorizontal=\"x2\"\n        paddingVertical={'x2'}\n        backgroundColor=\"white\"\n        borderBottomWidth={ONE_PIXEL}\n        borderColor={'border'}\n        style={headerStyle}\n      >\n        <Box>\n          <Text variant=\"p1\" color=\"text\" style={textStyle}>\n            {text}\n          </Text>\n        </Box>\n        <Box>{extra}</Box>\n      </Flex>\n    );\n  }\n);\nListHeader.displayName = 'ListHeader';\n\nexport { List, ListHeader };\n"
  },
  {
    "path": "packages/react-native/src/list-item/index.md",
    "content": "---\ntitle: ListItem - 列表展示项组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# ListItem 列表展示项组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```jsx | pure\n\n<ListItem\n  title=\"主标题主标题主标题主标题主标题主标题\"\n  onPress={() => { console.log(111);}}\n/>\n<ListItem title=\"主标题主标题主标题主标题主标题主标题\" brief=\"主标题下面的副标题主标题下面的副标题\" />\n\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"listItem-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643179745264648352.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 左侧添加缩略图、右侧添加图片效果\n\n```jsx | pure\n<ListItem title=\"主标题\" brief=\"主标题下面的副标题\" thumb={imgUrl} />\n<ListItem\n  title=\"extra为Image\"\n  thumb={imgUrl}\n  extra={\n    <Image\n      source={{\n        uri: imgUrl,\n      }}\n      style={{ width: 50, height: 50 }}\n    />\n  }\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"listItem-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643179903725799716.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 右侧组件自定义和指定箭头方向效果\n\n```jsx | pure\n<ListItem title=\"主标题\" extra={<Switch />} />\n<ListItem title=\"主标题\" brief=\"主标题下面的副标题\" arrow=\"down\" />\n<ListItem title=\"主标题\" brief=\"主标题下面的副标题\" arrow=\"horizontal\" />\n<ListItem title=\"主标题\" brief=\"主标题下面的副标题\" arrow=\"up\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"listItem-ios3.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643180063998650000.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 右侧文字换行和过长省略效果、以及添加 required 效果\n\n```jsx | pure\n<ListItem title=\"长内容\" wrap extra=\"httpsos.alipayobjects.com/rmsportal/mOoPurdIfmcuqtr.png\" required />\n<ListItem title=\"长内容\" extra=\"httpsos.alipayobjects.com/rmsportal/mOoPurdIfmcuqtr.png\" arrow=\"horizontal\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"listItem-ios5.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643180141868574568.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性            | 必填    | 说明                       | 类型                                          | 默认值  |\n| --------------- | ------- | -------------------------- | --------------------------------------------- | ------- |\n| title           | `true`  | 主标题                     | `ReactNode`                                   |         |\n| brief           | `false` | 主标题下面的副标题         | `ReactNode`                                   |         |\n| extra           | `false` | 右面的文字或组件           | `ReactNode`                                   |         |\n| thumb           | `false` | 缩略图                     | `ReactNode`                                   |         |\n| onPress         | `false` | 按下的回调函数             | `() => void`                                  |         |\n| minHeight       | `false` | 最小高度                   | `number`                                      |         |\n| style           | `false` | 自定义 style               | `ViewStyle`                                   |         |\n| required        | `false` | 是否必填，必填显示红色\\*号 | `boolean`                                     | `false` |\n| wrap            | `false` | 是否折行                   | `boolean`                                     | `false` |\n| arrow           | `false` | 右侧箭头指示方向           | `horizontal` \\| `down` \\| `up` \\| `ReactNode` |         |\n| activeOpacity   | `false` | 按下时的不透明度 Ï         | `number`                                      | `0.6`   |\n| backgroundColor | `false` | 列表项背景色               | `主题颜色`                                    |         |\n"
  },
  {
    "path": "packages/react-native/src/list-item/index.tsx",
    "content": "import React, { FC, memo, PropsWithChildren, ReactElement, ReactNode, useMemo } from 'react';\nimport { Keyboard, StyleProp, ViewStyle } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon, { IconNames } from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\n\nconst { ONE_PIXEL } = helpers;\n\nconst iconMap: Record<string, IconNames> = {\n  horizontal: 'right',\n  down: 'down',\n  up: 'up',\n};\n\nexport type ListItemProps = {\n  /** 主标题  */\n  title: ReactNode;\n  /** 右面的文字或组件  */\n  extra?: ReactNode;\n  /** 主标题下面的副标题  */\n  brief?: ReactNode;\n  /** 缩略图  */\n  thumb?: ReactElement;\n  /** 按下的回调函数  */\n  onPress?: () => void;\n  /** 自定义style  */\n  style?: StyleProp<ViewStyle>;\n  /** 是否必填，必填显示红色*号 */\n  required?: boolean;\n  /** 右侧箭头指示方向 */\n  arrow?: 'horizontal' | 'down' | 'up' | ReactNode;\n  /** 是否折行  */\n  wrap?: boolean;\n  /** 按下时的不透明度  */\n  activeOpacity?: number;\n  /** 背景色 */\n  backgroundColor?: string;\n  /** 边框颜色 */\n  borderColor?: keyof Theme['colors'];\n  /** 是否显示边框 */\n  bordered?: boolean;\n};\n\nconst Brief: FC<PropsWithChildren<Pick<ListItemProps, 'wrap'>>> = props => {\n  const { children, wrap } = props;\n  const numberOfLines = wrap ? {} : { numberOfLines: 1 };\n  return (\n    <Box marginTop=\"x1\">\n      {typeof children === 'string' ? (\n        <Text {...numberOfLines} variant=\"p2\" color=\"text\">\n          {children}\n        </Text>\n      ) : (\n        children\n      )}\n    </Box>\n  );\n};\n\nconst ListItem = ({\n  title,\n  brief,\n  thumb,\n  onPress,\n  backgroundColor,\n  borderColor = 'border',\n  bordered = true,\n  style,\n  extra,\n  arrow,\n  wrap = false,\n  required = false,\n  activeOpacity = 0.6,\n}: ListItemProps) => {\n  if (!onPress)\n    return (\n      <>\n        <Content {...{ backgroundColor, style, required, title, brief, thumb, extra, arrow, wrap }} />\n        {bordered && <Box width={'100%'} height={ONE_PIXEL} backgroundColor={borderColor} />}\n      </>\n    );\n\n  return (\n    <Pressable\n      activeOpacity={activeOpacity}\n      onPress={() => {\n        Keyboard.dismiss();\n        onPress();\n      }}\n    >\n      <Content {...{ backgroundColor, style, required, title, brief, thumb, extra, arrow, wrap }} />\n      {bordered && <Box width={'100%'} height={ONE_PIXEL} backgroundColor={borderColor} />}\n    </Pressable>\n  );\n};\nListItem.displayName = 'ListItem';\n\nexport default memo(ListItem);\n\nconst Content = ({\n  backgroundColor,\n  style,\n  required,\n  thumb,\n  title,\n  brief,\n  wrap,\n  extra,\n  arrow,\n}: Omit<ListItemProps, 'onPress' | 'activeOpacity'>) => {\n  const theme = useTheme<Theme>();\n\n  const Title = useMemo(\n    () => (\n      <Box paddingLeft={thumb ? 'x1' : 'x0'}>\n        {typeof title === 'string' ? (\n          <Text variant=\"p1\" color=\"text\" numberOfLines={1}>\n            {title}\n          </Text>\n        ) : (\n          title\n        )}\n      </Box>\n    ),\n    [thumb, title]\n  );\n\n  const Extra = useMemo(() => {\n    if (!extra) return null;\n    if (typeof extra === 'string') {\n      const numberOfLines = wrap ? {} : { numberOfLines: 1 };\n      return (\n        <Text\n          variant=\"p1\"\n          color=\"text\"\n          style={{\n            textAlign: 'right',\n            textAlignVertical: 'center',\n          }}\n          {...numberOfLines}\n        >\n          {extra}\n        </Text>\n      );\n    }\n    return extra;\n  }, [extra, wrap]);\n\n  const Arrow = useMemo(() => {\n    if (!arrow) return null;\n    if (typeof arrow === 'string')\n      return (\n        <Box>\n          <SvgIcon name={iconMap[arrow]} color={theme.colors.icon} />\n        </Box>\n      );\n    return arrow;\n  }, [arrow, theme.colors.icon]);\n\n  return (\n    <Box paddingVertical=\"x2\" paddingHorizontal={'x2'} justifyContent=\"center\" style={[{ backgroundColor }, style]}>\n      <Flex>\n        <Flex flex={1}>\n          <Flex marginRight={'x5'} justifyContent=\"center\" alignItems=\"center\">\n            {required && (\n              <Text variant=\"p1\" color=\"func600\">\n                *\n              </Text>\n            )}\n            {thumb}\n            {Title}\n          </Flex>\n          <Box flex={1} alignItems=\"flex-end\">\n            {Extra}\n          </Box>\n        </Flex>\n        {Arrow}\n      </Flex>\n      {!!brief && <Brief wrap={wrap}>{brief}</Brief>}\n    </Box>\n  );\n};\n"
  },
  {
    "path": "packages/react-native/src/menu/Chevron.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport SvgIcon from '../svg-icon';\nimport { Theme } from '../theme';\nimport { mix } from '../utils/redash';\n\nconst Chevron: FC<{ progress: Animated.SharedValue<number> }> = ({ progress }) => {\n  const theme = useTheme<Theme>();\n  const style = useAnimatedStyle(() => ({\n    transform: [{ rotateZ: `${mix(progress.value, 0, Math.PI)}rad` }],\n  }));\n\n  return (\n    <Animated.View style={style}>\n      <SvgIcon name=\"down\" color={theme.colors.gray500} />\n    </Animated.View>\n  );\n};\n\nexport default memo(Chevron);\n"
  },
  {
    "path": "packages/react-native/src/menu/MenuGroup.tsx",
    "content": "import React, { memo, PropsWithChildren } from 'react';\nimport Animated from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport Chevron from './Chevron';\nimport { MenuItemProps } from './type';\nimport useGroup from './useGroup';\n\nconst { ONE_PIXEL } = helpers;\n\nconst MenuGroup = ({\n  activeOpacity,\n  disabled,\n  left,\n  title,\n  openKeys,\n  setOpenKeys,\n  id,\n  level,\n  children,\n}: PropsWithChildren<\n  Omit<MenuItemProps, 'activeColor' | 'activeTextColor' | 'items'> & {\n    openKeys: string[];\n    setOpenKeys: React.Dispatch<React.SetStateAction<string[]>>;\n    level: number;\n  }\n>) => {\n  const theme = useTheme<Theme>();\n  const { bodyStyle, progress, handleLayout, handlePress } = useGroup({ openKeys, setOpenKeys, id });\n\n  return (\n    <Box backgroundColor={'gray50'}>\n      <Pressable\n        activeOpacity={activeOpacity}\n        onPress={handlePress}\n        disabled={disabled}\n        style={{\n          flexDirection: 'row',\n          alignItems: 'center',\n          paddingVertical: theme.spacing.x2,\n          paddingHorizontal: theme.spacing.x2,\n          borderBottomWidth: ONE_PIXEL,\n          borderColor: theme.colors.border,\n        }}\n      >\n        <Box>{left}</Box>\n        <Box flex={1} style={{ paddingLeft: level * theme.spacing.x2 }}>\n          <Text variant=\"p0\" color=\"text\">\n            {title}\n          </Text>\n        </Box>\n        <Chevron {...{ progress }} />\n      </Pressable>\n      <Animated.View style={[{ position: 'relative', overflow: 'hidden' }, bodyStyle]}>\n        <Box position={'absolute'} width=\"100%\" collapsable={false} onLayout={handleLayout}>\n          {children}\n        </Box>\n      </Animated.View>\n    </Box>\n  );\n};\nMenuGroup.displayName = 'MenuGroup';\n\nexport default memo(MenuGroup);\n"
  },
  {
    "path": "packages/react-native/src/menu/MenuItem.tsx",
    "content": "import React, { FC, memo } from 'react';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { MenuItemProps } from './type';\n\nconst { ONE_PIXEL } = helpers;\nconst MenuItem: FC<MenuItemProps & { level: number; currentKey?: string; onSelect: (key: string) => void }> = ({\n  level,\n  title,\n  left,\n  customIcon,\n  onSelect,\n  disabled,\n  id,\n  currentKey,\n  activeOpacity = 0.6,\n  ...restProps\n}) => {\n  const theme = useTheme<Theme>();\n  const { activeColor = theme.colors.primary200, activeTextColor = theme.colors.text_active } = restProps;\n\n  const selected = id === currentKey;\n\n  return (\n    <Pressable\n      key={id}\n      activeOpacity={activeOpacity}\n      onPress={() => onSelect(id)}\n      disabled={disabled}\n      style={{\n        flexDirection: 'row',\n        alignItems: 'center',\n        backgroundColor: selected ? activeColor : theme.colors.white,\n        paddingVertical: theme.spacing.x2,\n        paddingHorizontal: theme.spacing.x2,\n        borderBottomWidth: ONE_PIXEL,\n        borderColor: theme.colors.border,\n      }}\n    >\n      <Box>{left}</Box>\n      <Box flex={1} style={{ paddingLeft: level * theme.spacing.x2 }}>\n        <Text variant=\"p0\" style={{ color: selected ? activeTextColor : theme.colors.text }}>\n          {title}\n        </Text>\n      </Box>\n      <Box>{customIcon ?? <SvgIcon name=\"right\" color={selected ? theme.colors.white : theme.colors.gray500} />}</Box>\n    </Pressable>\n  );\n};\nMenuItem.displayName = 'MenuItem';\n\nexport default memo(MenuItem);\n"
  },
  {
    "path": "packages/react-native/src/menu/index.md",
    "content": "---\ntitle: Menu - 菜单组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# Menu 菜单组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Menu\n  data={[\n    {\n      id: '1',\n      title: 'Akveo React Native',\n      items: [\n        { id: '1-1', title: 'UI Kitten' },\n        {\n          id: '1-2',\n          title: 'Kitten Tricks',\n          items: [\n            { id: '1-2-1', title: 'React Native Paper' },\n            { id: '1-2-2', title: 'TD Design' },\n          ],\n        },\n      ],\n    },\n    {\n      id: '2',\n      title: 'Akveo Angular',\n      items: [\n        { id: '2-1', title: 'Nebular' },\n        { id: '2-2', title: 'ngx-admin' },\n        { id: '2-3', title: 'UI Bakery' },\n      ],\n    },\n    {\n      id: '3',\n      title: 'Akveo Design',\n      items: [\n        { id: '3-1', title: 'Eva Design System' },\n        { id: '3-2', title: 'Eva Icons' },\n      ],\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643182636025692280.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 允许展开多个菜单组\n\n```tsx | pure\n<Menu\n  multiple\n  data={[\n    {\n      id: '1',\n      title: 'Akveo React Native',\n      items: [\n        { id: '1-1', title: 'UI Kitten' },\n        {\n          id: '1-2',\n          title: 'Kitten Tricks',\n          items: [\n            { id: '1-2-1', title: 'React Native Paper' },\n            { id: '1-2-2', title: 'TD Design' },\n          ],\n        },\n      ],\n    },\n    {\n      id: '2',\n      title: 'Akveo Angular',\n      items: [\n        { id: '2-1', title: 'Nebular' },\n        { id: '2-2', title: 'ngx-admin' },\n        { id: '2-3', title: 'UI Bakery' },\n      ],\n    },\n    {\n      id: '3',\n      title: 'Akveo Design',\n      items: [\n        { id: '3-1', title: 'Eva Design System' },\n        { id: '3-2', title: 'Eva Icons' },\n      ],\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643182742563505265.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 默认选中\n\n```tsx | pure\n<Menu\n  defaultSelectedKey=\"1-2-1\"\n  data={[\n    {\n      id: '1',\n      title: 'Akveo React Native',\n      items: [\n        { id: '1-1', title: 'UI Kitten' },\n        {\n          id: '1-2',\n          title: 'Kitten Tricks',\n          items: [\n            { id: '1-2-1', title: 'React Native Paper' },\n            { id: '1-2-2', title: 'TD Design' },\n          ],\n        },\n      ],\n    },\n    {\n      id: '2',\n      title: 'Akveo Angular',\n      items: [\n        { id: '2-1', title: 'Nebular' },\n        { id: '2-2', title: 'ngx-admin' },\n        { id: '2-3', title: 'UI Bakery' },\n      ],\n    },\n    {\n      id: '3',\n      title: 'Akveo Design',\n      items: [\n        { id: '3-1', title: 'Eva Design System' },\n        { id: '3-2', title: 'Eva Icons' },\n      ],\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643182794298569975.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 标题左侧图标\n\n```tsx | pure\n<Menu\n  data={[\n    {\n      id: '1',\n      title: 'Akveo React Native',\n      left: <IconHome />,\n      items: [\n        { id: '1-1', title: 'UI Kitten' },\n        {\n          id: '1-2',\n          title: 'Kitten Tricks',\n          items: [\n            { id: '1-2-1', title: 'React Native Paper' },\n            { id: '1-2-2', title: 'TD Design' },\n          ],\n        },\n      ],\n    },\n    {\n      id: '2',\n      title: 'Akveo Angular',\n      left: <IconNotification />,\n      items: [\n        { id: '2-1', title: 'Nebular' },\n        { id: '2-2', title: 'ngx-admin' },\n        { id: '2-3', title: 'UI Bakery' },\n      ],\n    },\n    {\n      id: '3',\n      title: 'Akveo Design',\n      left: <IconCreate />,\n      items: [\n        { id: '3-1', title: 'Eva Design System' },\n        { id: '3-2', title: 'Eva Icons' },\n      ],\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643182918993710418.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. MenuItem 右侧图标\n\n```tsx | pure\n<Menu\n  data={[\n    {\n      id: '1',\n      title: 'Akveo React Native',\n      customIcon: <IconHome />,\n    },\n    {\n      id: '2',\n      title: 'Akveo Angular',\n      customIcon: <IconNotification />,\n    },\n    {\n      id: '3',\n      title: 'Akveo Design',\n      customIcon: <IconCreate />,\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643182990373408617.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Menu\n\n| 属性               | 必填    | 说明                       | 类型                    | 默认值        |\n| ------------------ | ------- | -------------------------- | ----------------------- | ------------- |\n| data               | `true`  | 菜单数据                   | `MenuItemProps[]`       |               |\n| multiple           | `false` | 是否允许展开多个菜单组     | `boolean`               | `false`       |\n| width              | `false` | 宽度                       | `number`                | `deviceWidth` |\n| selectedKey        | `false` | 选中的菜单                 | `string`                |               |\n| defaultSelectedKey | `false` | 默认选中的菜单             | `string`                |               |\n| onSelect           | `false` | 选中 MenuItem 时触发的事件 | `(key: string) => void` |               |\n| activeColor        | `false` | MenuItem 选中时背景色      | `string`                |               |\n| activeTextColor    | `false` | MenuItem 选中时文字颜色    | `string`                |               |\n| style              | `false` | 自定义样式                 | `ViewStyle`             |               |\n| itemStyle          | `false` | 菜单项样式                 | `ViewStyle`             |               |\n| activeOpacity      | `false` | 菜单项点击时的不透明度     | `number`                | `0.6`         |\n\n### MenuItemProps\n\n| 属性       | 必填    | 说明           | 类型              | 默认值  |\n| ---------- | ------- | -------------- | ----------------- | ------- |\n| id         | `true`  | 唯一标识       | `string`          |         |\n| title      | `true`  | 标题           | `string`          |         |\n| left       | `false` | 自定义左侧内容 | `ReactNode`       |         |\n| customIcon | `false` | 自定义图标     | `ReactNode`       |         |\n| disabled   | `false` | 是否禁用菜单项 | `boolean`         | `false` |\n| items      | `false` | 下级菜单       | `MenuItemProps[]` |         |\n"
  },
  {
    "path": "packages/react-native/src/menu/index.tsx",
    "content": "import React, { FC } from 'react';\nimport { ScrollView } from 'react-native';\n\nimport helpers from '../helpers';\nimport MenuGroup from './MenuGroup';\nimport MenuItem from './MenuItem';\nimport { MenuItemProps, MenuProps } from './type';\nimport useMenu from './useMenu';\n\nconst { deviceWidth } = helpers;\nconst Menu: FC<MenuProps> = props => {\n  const {\n    data,\n    multiple = false,\n    selectedKey,\n    defaultSelectedKey,\n    width = deviceWidth,\n    onSelect,\n    activeOpacity = 0.6,\n    style,\n    itemStyle,\n    activeColor,\n    activeTextColor,\n  } = props;\n  const { currentKey, openKeys, setOpenKeys, handleSelect } = useMenu({\n    selectedKey,\n    defaultSelectedKey,\n    onSelect,\n    data,\n    multiple,\n  });\n\n  const renderItem = (item: MenuItemProps, level: number) => {\n    if (item.items && Array.isArray(item.items) && item.items.length > 0) {\n      return (\n        <MenuGroup\n          key={item.id}\n          {...item}\n          {...{\n            itemStyle,\n            activeOpacity,\n            onSelect: handleSelect,\n            currentKey,\n            openKeys,\n            setOpenKeys,\n            level,\n          }}\n        >\n          {item.items.map(item => renderItem(item, level + 1))}\n        </MenuGroup>\n      );\n    }\n    return (\n      <MenuItem\n        key={item.id}\n        {...item}\n        {...{\n          level,\n          itemStyle,\n          activeOpacity,\n          onSelect: handleSelect,\n          currentKey,\n          activeColor,\n          activeTextColor,\n        }}\n      />\n    );\n  };\n\n  return (\n    <ScrollView bounces={false} horizontal={false} showsVerticalScrollIndicator={false} style={[{ width }, style]}>\n      {data.map(item => renderItem(item, 1))}\n    </ScrollView>\n  );\n};\nMenu.displayName = 'Menu';\n\nexport default Menu;\n"
  },
  {
    "path": "packages/react-native/src/menu/type.ts",
    "content": "import { ReactElement } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nexport interface StyleProps {\n  /** 选中时背景色 */\n  activeColor?: string;\n  /** 选中时文字颜色 */\n  activeTextColor?: string;\n}\n\nexport type MenuProps = StyleProps & {\n  /** 是否允许展开多个菜单组 */\n  multiple?: boolean;\n  /** 子菜单 */\n  data: MenuItemProps[];\n  /** 选中的子菜单的id */\n  selectedKey?: string;\n  /** 默认选中的子菜单的id */\n  defaultSelectedKey?: string;\n  /** 选择一个 MenuItem 的事件 */\n  onSelect?: (selectedIndex: string) => void;\n  /** 宽度 */\n  width?: number;\n  /** 自定义样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 菜单项的样式 */\n  itemStyle?: StyleProp<ViewStyle>;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n};\n\nexport type MenuItemProps = Pick<MenuProps, 'activeOpacity' | 'itemStyle'> &\n  StyleProps & {\n    /** 菜单的唯一标识 */\n    id: string;\n    /** 标题 */\n    title: string;\n    /** 左侧自定义内容，如图标 */\n    left?: ReactElement;\n    /** 右侧自定义内容，如图标 */\n    customIcon?: ReactElement;\n    /** 是否禁用 */\n    disabled?: boolean;\n    /** 子菜单 */\n    items?: MenuItemProps[];\n  };\n"
  },
  {
    "path": "packages/react-native/src/menu/useGroup.ts",
    "content": "import { useEffect } from 'react';\nimport { LayoutChangeEvent } from 'react-native';\nimport { interpolate, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nexport default function useGroup({\n  openKeys,\n  setOpenKeys,\n  id,\n}: {\n  id: string;\n  openKeys: string[];\n  setOpenKeys: React.Dispatch<React.SetStateAction<string[]>>;\n}) {\n  const progress = useSharedValue(0);\n  const [bodySectionHeight, setBodySectionHeight] = useSafeState(0);\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    setBodySectionHeight(Math.ceil(e.nativeEvent.layout.height));\n  };\n\n  const bodyStyle = useAnimatedStyle(() => {\n    return {\n      height: interpolate(progress.value, [0, 1], [0, bodySectionHeight]),\n    };\n  });\n\n  /** 默认展开菜单 */\n  useEffect(() => {\n    if (openKeys.length === 0) return;\n\n    progress.value = withTiming(!openKeys.includes(id) ? 0 : 1);\n  }, [openKeys]);\n\n  const handlePress = () => {\n    if (progress.value === 0) {\n      // 打开菜单\n      setOpenKeys(keys => [...keys, id]);\n      progress.value = withTiming(1);\n    } else {\n      // 关闭菜单\n      setOpenKeys(keys => keys.filter(key => key !== id));\n      progress.value = withTiming(0);\n    }\n  };\n\n  return {\n    bodyStyle,\n    progress,\n\n    handleLayout,\n    handlePress: useMemoizedFn(handlePress),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/menu/useMenu.ts",
    "content": "import { useEffect, useMemo } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { MenuItemProps, MenuProps } from './type';\n\ntype FlattenedMenuItem = MenuItemProps & { parentId?: string };\n\nexport default function useMenu({\n  data,\n  onSelect,\n  selectedKey,\n  defaultSelectedKey,\n  multiple,\n}: Pick<MenuProps, 'data' | 'onSelect' | 'defaultSelectedKey' | 'selectedKey' | 'multiple'>) {\n  const [currentKey, setCurrentKey] = useSafeState<string>();\n  const [openKeys, setOpenKeys] = useSafeState<string[]>([]);\n\n  const flattenItems = useMemo(() => {\n    const flattenItems: FlattenedMenuItem[] = [];\n\n    const flatten = (items: MenuProps['data'], parentId?: string) => {\n      items.forEach(item => {\n        const flattenedItem: FlattenedMenuItem = { ...item, parentId };\n        flattenItems.push(flattenedItem);\n        if (item.items) {\n          flatten(item.items, item.id);\n        }\n      });\n    };\n\n    flatten(data);\n\n    return flattenItems;\n  }, [data]);\n\n  /** 设置当前选中的子菜单 */\n  useEffect(() => {\n    setCurrentKey(selectedKey || defaultSelectedKey);\n  }, [selectedKey, defaultSelectedKey]);\n\n  /** 设置当前展开的菜单组 */\n  useEffect(() => {\n    const openKeys = new Set<string>();\n\n    const findOpenKeys = (key: string) => {\n      const item = flattenItems.find(item => item.id === key);\n      if (item?.parentId) {\n        openKeys.add(item.parentId);\n        findOpenKeys(item.parentId);\n      }\n    };\n\n    if (currentKey) {\n      findOpenKeys(currentKey);\n    }\n\n    if (multiple) {\n      setOpenKeys(keys => [...openKeys, ...keys]);\n    } else {\n      setOpenKeys([...openKeys]);\n    }\n  }, [currentKey, flattenItems]);\n\n  const handleSelect = (key: string) => {\n    setCurrentKey(key);\n    onSelect?.(key);\n  };\n\n  return {\n    currentKey,\n    openKeys,\n    handleSelect: useMemoizedFn(handleSelect),\n    setOpenKeys,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/Modal/ModalView.tsx",
    "content": "import React, { PropsWithChildren } from 'react';\nimport { StyleSheet, TouchableWithoutFeedback } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport { Theme } from '../../theme';\nimport { ModalProps } from '../type';\nimport useModal from './useModal';\n\nexport default function ModalView(props: PropsWithChildren<ModalProps>) {\n  const {\n    bodyContainerStyle,\n    animationType = 'slide',\n    animationDuration = 300,\n    visible = false,\n    maskClosable = true,\n    maskVisible = true,\n    position = 'bottom',\n    onClose,\n    onAnimationEnd,\n    onRequestClose,\n    children,\n  } = props;\n  const theme = useTheme<Theme>();\n  const { modalVisible, wrapStyle, defaultStyle, handleMaskClose, animationStyleMap } = useModal({\n    animationType,\n    animationDuration,\n    visible,\n    maskClosable,\n    position,\n    onClose,\n    onAnimationEnd,\n    onRequestClose,\n  });\n\n  if (!modalVisible) return null;\n\n  const styles = StyleSheet.create({\n    safeArea: { flex: 1, zIndex: 999 },\n  });\n  return (\n    <SafeAreaView edges={[]} style={[styles.safeArea, defaultStyle]}>\n      {maskVisible && (\n        <TouchableWithoutFeedback onPress={handleMaskClose}>\n          <Animated.View style={[StyleSheet.absoluteFill, { backgroundColor: theme.colors.mask }]} />\n        </TouchableWithoutFeedback>\n      )}\n      <Animated.View style={[wrapStyle, bodyContainerStyle, animationStyleMap[animationType]]}>\n        {children}\n      </Animated.View>\n    </SafeAreaView>\n  );\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/Modal/index.tsx",
    "content": "import React, { PropsWithChildren } from 'react';\n\nimport Portal from '../../portal';\nimport { ModalProps } from '../type';\nimport ModalView from './ModalView';\n\nexport default function Modal(props: PropsWithChildren<ModalProps>) {\n  const {\n    animationType = 'slide',\n    animationDuration = 300,\n    visible = false,\n    maskClosable = true,\n    maskVisible = true,\n    position = 'bottom',\n    children,\n    ...rest\n  } = props;\n\n  return (\n    <Portal>\n      <ModalView\n        {...rest}\n        visible={visible}\n        animationType={animationType}\n        animationDuration={animationDuration}\n        maskClosable={maskClosable}\n        maskVisible={maskVisible}\n        position={position}\n      >\n        {children}\n      </ModalView>\n    </Portal>\n  );\n}\n\nModal.displayName = 'Modal';\n"
  },
  {
    "path": "packages/react-native/src/modal/Modal/useModal.ts",
    "content": "import { useEffect } from 'react';\nimport { BackHandler, Dimensions, StyleProp, ViewStyle } from 'react-native';\nimport { runOnJS, useAnimatedStyle, useSharedValue, withSpring, withTiming } from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useMemoizedFn, usePrevious, useSafeState } from '@td-design/rn-hooks';\n\nimport { Theme } from '../../theme';\nimport { ModalProps } from '../type';\n\nconst screen = Dimensions.get('screen');\n\nconst getPosition = (visible: boolean) => {\n  return visible ? 0 : screen.height;\n};\n\nconst getScale = (visible: boolean) => {\n  'worklet';\n  return visible ? 1 : 1.05;\n};\n\nconst getOpacity = (visible: boolean) => {\n  'worklet';\n  return visible ? 1 : 0;\n};\n\nexport default function useModal({\n  animationType,\n  animationDuration,\n  visible,\n  maskClosable,\n  position,\n  onClose,\n  onAnimationEnd,\n  onRequestClose,\n}: ModalProps) {\n  const theme = useTheme<Theme>();\n  const insets = useSafeAreaInsets();\n\n  const prevVisible = usePrevious(visible);\n  const translateY = useSharedValue(0);\n  const scale = useSharedValue(1);\n  const opacity = useSharedValue(1);\n\n  // 通过modalVisible来控制modal的显示和隐藏，之所以要用modalVisible，是想要让modal的显隐有动画效果\n  const [modalVisible, setModalVisible] = useSafeState(visible);\n\n  useEffect(() => {\n    if (visible) {\n      setModalVisible(true);\n    }\n  }, [visible]);\n\n  const onBackAndroid = useMemoizedFn(() => {\n    if (typeof onRequestClose === 'function') {\n      return onRequestClose();\n    }\n    onClose?.();\n\n    return visible ? true : false; // 返回true表示拦截了返回键\n  });\n\n  useEffect(() => {\n    const backHandler = BackHandler.addEventListener('hardwareBackPress', onBackAndroid);\n\n    return () => backHandler.remove();\n  }, [onBackAndroid]);\n\n  const animateCallback = useMemoizedFn((visible: boolean) => {\n    setModalVisible(visible);\n    onAnimationEnd?.(visible);\n  });\n\n  useEffect(() => {\n    if (prevVisible !== visible) {\n      if (animationType === 'slide') {\n        translateY.value = withTiming(\n          getPosition(visible),\n          {\n            duration: animationDuration,\n          },\n          () => {\n            runOnJS(animateCallback)(visible);\n          }\n        );\n      } else if (animationType === 'fade') {\n        opacity.value = withTiming(getOpacity(visible), {\n          duration: animationDuration,\n        });\n        scale.value = withSpring(getScale(visible), {}, () => {\n          runOnJS(animateCallback)(visible);\n        });\n      }\n    }\n  }, [visible, animationType, position, animationDuration]);\n\n  const handleMaskClose = () => {\n    if (maskClosable) {\n      onClose?.();\n    }\n  };\n\n  const slideStyle = useAnimatedStyle(() => {\n    return {\n      transform: [\n        {\n          translateY: translateY.value,\n        },\n      ],\n    };\n  });\n\n  const fadeStyle = useAnimatedStyle(() => {\n    return {\n      transform: [{ scale: scale.value }],\n      opacity: opacity.value,\n    };\n  });\n\n  const animationStyleMap = {\n    slide: slideStyle,\n    fade: fadeStyle,\n  };\n\n  const defaultStyle: StyleProp<ViewStyle> = {\n    flexDirection: position === 'bottom' ? 'column-reverse' : 'column',\n  };\n  const wrapStyle: StyleProp<ViewStyle> = {\n    backgroundColor: theme.colors.white,\n    borderRadius: theme.borderRadii.x3,\n  };\n  switch (position) {\n    case 'top':\n      wrapStyle.paddingTop = insets.top;\n      break;\n    case 'bottom':\n      wrapStyle.paddingBottom = insets.bottom;\n      break;\n    case 'center':\n      defaultStyle.justifyContent = 'center';\n      break;\n    case 'fullscreen':\n      wrapStyle.flex = 1;\n      wrapStyle.paddingTop = insets.top;\n      wrapStyle.paddingBottom = insets.bottom;\n      break;\n  }\n\n  return {\n    modalVisible,\n    wrapStyle,\n    defaultStyle,\n    handleMaskClose,\n    animationStyleMap,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/alert/AlertContainer.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../../box';\nimport Button from '../../button';\nimport Flex from '../../flex';\nimport helpers from '../../helpers';\nimport Text from '../../text';\nimport { Theme } from '../../theme';\nimport ModalView from '../Modal/ModalView';\nimport { AlertProps } from '../type';\n\nconst { ONE_PIXEL } = helpers;\nconst AlertContainer: FC<\n  AlertProps & {\n    onAnimationEnd?: (visible: boolean) => void;\n  }\n> = ({ icon, title, content, confirmText = '确定', onPress, onAnimationEnd }) => {\n  const theme = useTheme<Theme>();\n  const [visible, setVisible] = useSafeState(true);\n  const [loading, setLoading] = useSafeState(false);\n\n  /** 确定操作 */\n  const handlePress = async () => {\n    if (!onPress) {\n      setVisible(false);\n      return;\n    }\n    try {\n      setLoading(true);\n      await onPress();\n      setLoading(false);\n      setVisible(false);\n    } catch (error) {\n      setLoading(false);\n    }\n  };\n\n  const footer = (\n    <Box borderTopWidth={ONE_PIXEL} borderTopColor={'border'}>\n      <Button\n        style={{ paddingVertical: theme.spacing.x3 }}\n        loading={loading}\n        onPress={handlePress}\n        title={confirmText}\n        type=\"secondary\"\n        bordered={false}\n      />\n    </Box>\n  );\n\n  const styles = StyleSheet.create({\n    modal: { marginHorizontal: theme.spacing.x3, borderRadius: theme.borderRadii.x3 },\n  });\n\n  return (\n    <ModalView\n      position=\"center\"\n      visible={visible}\n      maskClosable={false}\n      onAnimationEnd={onAnimationEnd}\n      onClose={() => setVisible(false)}\n      bodyContainerStyle={styles.modal}\n    >\n      <Box marginBottom=\"x3\">\n        {!!icon && <Flex justifyContent=\"center\">{icon}</Flex>}\n        {!!title && (\n          <Flex justifyContent=\"center\" marginVertical=\"x2\">\n            {typeof title === 'string' ? (\n              <Text variant=\"h1\" color=\"text\">\n                {title}\n              </Text>\n            ) : (\n              title\n            )}\n          </Flex>\n        )}\n        {typeof content === 'string' ? (\n          <Flex justifyContent=\"center\">\n            <Text variant=\"p1\" color=\"text\">\n              {content}\n            </Text>\n          </Flex>\n        ) : (\n          content\n        )}\n      </Box>\n      {footer}\n    </ModalView>\n  );\n};\nexport default AlertContainer;\n"
  },
  {
    "path": "packages/react-native/src/modal/alert/index.tsx",
    "content": "import React from 'react';\n\nimport Portal from '../../portal';\nimport { AlertProps } from '../type';\nimport AlertContainer from './AlertContainer';\n\nexport default function alert(props: AlertProps) {\n  const key = Portal.add(\n    <AlertContainer\n      {...props}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/confirm/ConfirmContainer.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../../box';\nimport Button from '../../button';\nimport Flex from '../../flex';\nimport helpers from '../../helpers';\nimport Text from '../../text';\nimport { Theme } from '../../theme';\nimport ModalView from '../Modal/ModalView';\nimport { ConfirmProps } from '../type';\nimport useConfirm from './useConfirm';\n\nconst { ONE_PIXEL } = helpers;\nconst ConfirmContainer: FC<\n  ConfirmProps & {\n    onAnimationEnd?: (visible: boolean) => void;\n  }\n> = ({ icon, title, content, okText, cancelText, onOk, onCancel, onAnimationEnd }) => {\n  const theme = useTheme<Theme>();\n\n  const { visible, okBtnLoading, cancelBtnLoading, hide, handleOk, handleCancel } = useConfirm({ onOk, onCancel });\n\n  const styles = StyleSheet.create({\n    modal: { marginHorizontal: theme.spacing.x3, borderRadius: theme.borderRadii.x3 },\n  });\n\n  return (\n    <ModalView\n      position=\"center\"\n      visible={visible}\n      maskClosable={false}\n      onAnimationEnd={onAnimationEnd}\n      onClose={hide}\n      bodyContainerStyle={styles.modal}\n    >\n      <Box marginBottom=\"x2\">\n        {!!icon && <Flex justifyContent=\"center\">{icon}</Flex>}\n        <Flex flexDirection=\"column\" justifyContent=\"center\" marginVertical=\"x2\">\n          {typeof title === 'string' ? (\n            <Text variant=\"h1\" color=\"text\">\n              {title}\n            </Text>\n          ) : (\n            title\n          )}\n        </Flex>\n        {typeof content === 'string' ? (\n          <Flex justifyContent=\"center\">\n            <Text variant=\"p1\" color=\"text\">\n              {content}\n            </Text>\n          </Flex>\n        ) : (\n          content\n        )}\n      </Box>\n      <Flex borderTopWidth={ONE_PIXEL} borderTopColor=\"border\">\n        <Flex.Item borderRightWidth={ONE_PIXEL} borderRightColor=\"border\">\n          <Button\n            loading={cancelBtnLoading}\n            onPress={handleCancel}\n            title={\n              <Text variant=\"p0\" color=\"text\">\n                {cancelText}\n              </Text>\n            }\n            type=\"secondary\"\n            bordered={false}\n            style={{ paddingVertical: theme.spacing.x3 }}\n          />\n        </Flex.Item>\n        <Flex.Item>\n          <Button\n            loading={okBtnLoading}\n            onPress={handleOk}\n            title={okText}\n            type=\"secondary\"\n            bordered={false}\n            style={{ paddingVertical: theme.spacing.x3 }}\n          />\n        </Flex.Item>\n      </Flex>\n    </ModalView>\n  );\n};\nexport default ConfirmContainer;\n"
  },
  {
    "path": "packages/react-native/src/modal/confirm/index.tsx",
    "content": "import React from 'react';\n\nimport Portal from '../../portal';\nimport { ConfirmProps } from '../type';\nimport ConfirmContainer from './ConfirmContainer';\n\nexport default function confirm({ okText = '确定', cancelText = '取消', ...restProps }: ConfirmProps) {\n  const key = Portal.add(\n    <ConfirmContainer\n      {...{\n        okText,\n        cancelText,\n        ...restProps,\n      }}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/confirm/useConfirm.ts",
    "content": "import { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { ConfirmProps } from '../type';\n\nexport default function useConfirm({ onOk, onCancel }: Pick<ConfirmProps, 'onOk' | 'onCancel'>) {\n  const [visible, setVisible] = useSafeState(true);\n  const [okBtnLoading, setOkBtnLoading] = useSafeState(false);\n  const [cancelBtnLoading, setCancelBtnLoading] = useSafeState(false);\n\n  /** 确定操作 */\n  const handleOk = async () => {\n    if (!onOk) {\n      setVisible(false);\n      return;\n    }\n    try {\n      setOkBtnLoading(true);\n      await onOk();\n      setOkBtnLoading(false);\n      setVisible(false);\n    } catch (error) {\n      setOkBtnLoading(false);\n    }\n  };\n\n  /** 取消操作 */\n  const handleCancel = async () => {\n    if (!onCancel) {\n      setVisible(false);\n      return;\n    }\n    try {\n      setCancelBtnLoading(true);\n      await onCancel();\n      setCancelBtnLoading(false);\n      setVisible(false);\n    } catch (error) {\n      setCancelBtnLoading(false);\n    }\n  };\n\n  return {\n    visible,\n    okBtnLoading,\n    cancelBtnLoading,\n    hide: () => setVisible(false),\n    handleOk: useMemoizedFn(handleOk),\n    handleCancel: useMemoizedFn(handleCancel),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/index.md",
    "content": "---\ntitle: Modal - 弹窗组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 反馈组件\n  path: /feedback\n---\n\n# Modal 弹窗组件\n\n## Modal\n\n### Modal 效果演示\n\n### 1. 内容在底部\n\n```tsx | pure\n<Modal visible={visible1} onClose={() => setVisible1(false)}>\n  <Box height={120} backgroundColor=\"backgroundColor1\">\n    <Text variant=\"primaryBody\">我是内容</Text>\n  </Box>\n</Modal>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609061134516514673.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 内容在中间\n\n```tsx | pure\n<Modal visible={visible2} onClose={() => setVisible2(false)} position=\"center\">\n  <Box height={120} backgroundColor=\"backgroundColor1\">\n    <Text variant=\"primaryBody\">我是内容</Text>\n  </Box>\n</Modal>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609061077323714839.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 内容全屏\n\n```tsx | pure\n<Modal\n  visible={visible3}\n  onClose={() => setVisible3(false)}\n  position=\"fullscreen\"\n  bodyContainerStyle={{ backgroundColor: 'gold' }}\n>\n  <Box height={300} backgroundColor=\"backgroundColor1\">\n    <Text variant=\"primaryBody\">我是内容</Text>\n  </Box>\n  <Button title=\"关闭\" onPress={() => setVisible3(false)} />\n</Modal>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609061034699958617.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 点击蒙层不允许关闭\n\n```tsx | pure\n<Modal\n  visible={visible3}\n  onClose={() => setVisible3(false)}\n  position=\"fullscreen\"\n  bodyContainerStyle={{ backgroundColor: 'gold' }}\n>\n  <Box height={300} backgroundColor=\"backgroundColor1\">\n    <Text variant=\"primaryBody\">我是内容</Text>\n  </Box>\n  <Button title=\"关闭\" onPress={() => setVisible3(false)} />\n</Modal>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609061587754205803.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| visible | `true` | 是否显示弹窗 | `boolean` |  |\n| onClose | `true` | 关闭弹窗事件 | `() => void` |  |\n| maskClosable | `false` | 蒙层是否允许点击关闭弹窗 | `boolean` | `true` |\n| maskVisible | `false` | 是否显示蒙层 | `boolean` | `true` |\n| position | `false` | 内容显示位置 | `bottom` \\| `center` \\| `fullscreen` | `bottom` |\n| bodyContainerStyle | `false` | 弹窗内容容器样式 | `ViewStyle` |  |\n| duration | `false` | 弹窗显示/关闭时长(ms) | `number` | `100` |\n| animationType | `false` | 弹窗动画 | `none`\\|`fade`\\|`slide-up`\\|`slide-down` | `slide-up` |\n| onAnimationEnd | `false ` | 弹窗动画结束后执行 | `(visible: boolean) => void` |  |\n| onRequestClose | `false ` | 在用户按下 Android 设备上的后退按键时触发 | `() => void` |  |\n\n## Modal.alert\n\n### 效果演示\n\n```tsx | pure\nconst handlePress = () => {\n  Modal.alert({\n    title: '我是弹窗',\n    content: '我是内容',\n  });\n};\nreturn (\n  <Container>\n    <Button title=\"弹窗\" onPress={handlePress} />\n  </Container>\n);\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609067662316850211.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### API\n\n| 属性        | 必填    | 说明         | 类型         | 默认值 |\n| ----------- | ------- | ------------ | ------------ | ------ |\n| icon        | `false` | 警示性图标   | `ReactNode`  |        |\n| title       | `true`  | 标题         | `string`     |        |\n| content     | `false` | 内容         | `ReactNode`  |        |\n| onPress     | `false` | 点击回调事件 | `() => void` |        |\n| confirmText | `true`  | 按钮文本     | `string`     | `确定` |\n\n## Modal.confirm\n\n### 效果演示\n\n```tsx | pure\nconst handlePress = () => {\n  Modal.confirm({\n    title: '我是弹窗',\n    content: '我是内容',\n  });\n};\nreturn (\n  <Container>\n    <Button title=\"弹窗\" onPress={handlePress} />\n  </Container>\n);\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609068219999821236.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### API\n\n| 属性       | 必填    | 说明       | 类型                          | 默认值 |\n| ---------- | ------- | ---------- | ----------------------------- | ------ |\n| icon       | `false` | 警示性图标 | `ReactNode`                   |        |\n| title      | `true`  | 标题       | `string`                      |        |\n| content    | `false` | 内容       | `ReactNode`                   |        |\n| onOk       | `false` | 确认事件   | `() => void \\| Promise<void>` |        |\n| onCancel   | `false` | 取消事件   | `() => void \\| Promise<void>` |        |\n| okText     | `false` | 确认文本   | `string`                      | `确定` |\n| cancelText | `false` | 取消文本   | `string`                      | `取消` |\n\n## Modal.prompt\n\n### 效果演示\n\n```tsx | pure\nconst [value, setValue] = useState<string>();\nconst handlePress = () => {\n  Modal.prompt({\n    title: '我是弹窗',\n    content: '我是内容',\n    input: <Input placeholder=\"请输入\" />,\n    onOk: setValue,\n    onCancel: () => console.log(123),\n  });\n};\nreturn (\n  <Container>\n    <Button title=\"弹窗\" onPress={handlePress} />\n    <WhiteSpace />\n    <Text>您输入的是：{value}</Text>\n  </Container>\n);\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609068646112151949.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### API\n\n| 属性       | 必填    | 说明             | 类型                                       | 默认值 |\n| ---------- | ------- | ---------------- | ------------------------------------------ | ------ |\n| title      | `true`  | 标题             | `string`                                   |        |\n| content    | `false` | 内容             | `ReactNode`                                |        |\n| onOk       | `false` | 确认事件         | `(value: string) => void \\| Promise<void>` |        |\n| onCancel   | `false` | 取消事件         | `() => void \\| Promise<void>`              |        |\n| okText     | `false` | 确认文本         | `string`                                   | `确定` |\n| cancelText | `false` | 取消文本         | `string`                                   | `取消` |\n| input      | `false` | 自定义输入框组件 | `ReactElement`                             |        |\n\n## Modal.tip\n\n### 效果演示\n\n```tsx | pure\nconst handlePress = () => {\n  Modal.tip({\n    img: require('../../assets/images/island.jpg'),\n    height: 400,\n    title: '我是弹窗',\n    content: '我是内容',\n  });\n};\nreturn (\n  <Container>\n    <Button title=\"弹窗\" onPress={handlePress} />\n  </Container>\n);\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609068774304649623.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### API\n\n| 属性                   | 必填    | 说明               | 类型                  | 默认值 |\n| ---------------------- | ------- | ------------------ | --------------------- | ------ |\n| title                  | `true`  | 标题               | `string`              |        |\n| content                | `false` | 内容               | `ReactNode`           |        |\n| img                    | `true`  | 背景图             | `ImageSourcePropType` |        |\n| height                 | `true`  | 高度               | `number`              |        |\n| closeIconActiveOpacity | `false` | 关闭图标的不透明度 | `number`              | `0.6`  |\n"
  },
  {
    "path": "packages/react-native/src/modal/index.tsx",
    "content": "import alert from './alert';\nimport confirm from './confirm';\nimport Modal from './Modal';\nimport ModalView from './Modal/ModalView';\nimport prompt from './prompt';\nimport show from './show';\nimport tip from './tip';\n\nexport default Object.assign(Modal, { alert, confirm, prompt, tip, show, Content: ModalView });\n"
  },
  {
    "path": "packages/react-native/src/modal/prompt/PromptContainer.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../../box';\nimport Button from '../../button';\nimport Flex from '../../flex';\nimport helpers from '../../helpers';\nimport Text from '../../text';\nimport { Theme } from '../../theme';\nimport ModalView from '../Modal/ModalView';\nimport { PromptProps } from '../type';\nimport usePrompt from './usePrompt';\n\nconst { ONE_PIXEL } = helpers;\nconst PromptContainer: FC<\n  PromptProps & {\n    onAnimationEnd?: (visible: boolean) => void;\n  }\n> = ({ title, content, okText, cancelText, onOk, onCancel, onAnimationEnd, input }) => {\n  const theme = useTheme<Theme>();\n  const { value, onChange, visible, hide, handleOk, handleCancel, okBtnLoading, cancelBtnLoading } = usePrompt({\n    onOk,\n    onCancel,\n  });\n\n  const InputComp = React.cloneElement(input, {\n    value,\n    onChange,\n  });\n\n  const styles = StyleSheet.create({\n    modal: { marginHorizontal: theme.spacing.x3, borderRadius: theme.borderRadii.x3 },\n  });\n\n  return (\n    <ModalView\n      position=\"center\"\n      visible={visible}\n      maskClosable={false}\n      onAnimationEnd={onAnimationEnd}\n      onClose={hide}\n      bodyContainerStyle={styles.modal}\n    >\n      <Box marginBottom=\"x2\">\n        <Flex flexDirection=\"column\" justifyContent=\"center\" marginBottom=\"x2\">\n          <Flex justifyContent=\"center\" marginVertical=\"x2\">\n            {typeof title === 'string' ? (\n              <Text variant=\"h1\" color=\"text\">\n                {title}\n              </Text>\n            ) : (\n              title\n            )}\n          </Flex>\n          {typeof content === 'string' ? (\n            <Text variant=\"p1\" color=\"text\">\n              {content}\n            </Text>\n          ) : (\n            content\n          )}\n        </Flex>\n        <Box marginHorizontal=\"x3\">{InputComp}</Box>\n      </Box>\n      <Flex borderTopWidth={ONE_PIXEL} borderTopColor=\"border\">\n        <Flex.Item borderRightWidth={ONE_PIXEL} borderRightColor=\"border\">\n          <Button\n            loading={cancelBtnLoading}\n            onPress={handleCancel}\n            title={\n              <Text variant=\"p0\" color=\"text\">\n                {cancelText}\n              </Text>\n            }\n            type=\"secondary\"\n            bordered={false}\n            style={{ paddingVertical: theme.spacing.x3 }}\n          />\n        </Flex.Item>\n        <Flex.Item>\n          <Button\n            loading={okBtnLoading}\n            onPress={handleOk}\n            title={okText}\n            type=\"secondary\"\n            bordered={false}\n            style={{ paddingVertical: theme.spacing.x3 }}\n          />\n        </Flex.Item>\n      </Flex>\n    </ModalView>\n  );\n};\nexport default PromptContainer;\n"
  },
  {
    "path": "packages/react-native/src/modal/prompt/index.tsx",
    "content": "import React from 'react';\n\nimport Portal from '../../portal';\nimport { PromptProps } from '../type';\nimport PromptContainer from './PromptContainer';\n\nexport default function prompt({ okText = '确定', cancelText = '取消', ...restProps }: PromptProps) {\n  const key = Portal.add(\n    <PromptContainer\n      {...{ okText, cancelText, ...restProps }}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/prompt/usePrompt.ts",
    "content": "import { Keyboard } from 'react-native';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport useConfirm from '../confirm/useConfirm';\nimport { PromptProps } from '../type';\n\nexport default function usePrompt({ onOk, onCancel }: Pick<PromptProps, 'onOk' | 'onCancel'>) {\n  const [value, onChange] = useSafeState();\n\n  const okFun = useMemoizedFn(async () => {\n    const result = await onOk?.(value);\n    return result;\n  });\n\n  const {\n    visible,\n    okBtnLoading,\n    cancelBtnLoading,\n    hide,\n    handleOk: _handleOk,\n    handleCancel,\n  } = useConfirm({\n    onOk: okFun,\n    onCancel,\n  });\n\n  const handleOk = useMemoizedFn(() => {\n    Keyboard.dismiss();\n    _handleOk();\n  });\n\n  return {\n    value,\n    visible,\n    okBtnLoading,\n    cancelBtnLoading,\n    hide,\n    onChange,\n    handleOk,\n    handleCancel,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/show/index.tsx",
    "content": "import React from 'react';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Portal from '../../portal';\nimport ModalView from '../Modal/ModalView';\nimport { ImperativeModalChildrenProps, ModalProps } from '../type';\n\nexport default function show(\n  comp: React.ReactElement,\n  props?: Omit<ModalProps, 'onAnimationEnd' | 'visible' | 'onClose'>\n) {\n  const key = Portal.add(\n    <ModalContent\n      {...props}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    >\n      {comp}\n    </ModalContent>\n  );\n}\n\nconst ModalContent = ({\n  children,\n  ...props\n}: Omit<ModalProps, 'visible' | 'onClose'> & { children: React.ReactElement<ImperativeModalChildrenProps<{}>> }) => {\n  const [visible, setVisible] = useSafeState(true);\n\n  return (\n    <ModalView\n      position=\"center\"\n      maskVisible\n      maskClosable\n      animationType=\"slide\"\n      {...props}\n      visible={visible}\n      onClose={() => setVisible(false)}\n    >\n      {React.isValidElement(children)\n        ? React.cloneElement(children, {\n            // Add any props you want to pass to the child here\n            closeModal() {\n              setVisible(false);\n            },\n          })\n        : null}\n    </ModalView>\n  );\n};\n"
  },
  {
    "path": "packages/react-native/src/modal/tip/TipContainer.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Svg, { Circle, ClipPath, Image } from 'react-native-svg';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useBoolean } from '@td-design/rn-hooks';\n\nimport Box from '../../box';\nimport Flex from '../../flex';\nimport Pressable from '../../pressable';\nimport SvgIcon from '../../svg-icon';\nimport Text from '../../text';\nimport { Theme } from '../../theme';\nimport ModalView from '../Modal/ModalView';\nimport { TipProps } from '../type';\n\nconst TipContainer: FC<\n  TipProps & {\n    onAnimationEnd?: (visible: boolean) => void;\n  }\n> = ({ title, content, img, height, onAnimationEnd, closeIconActiveOpacity = 0.6 }) => {\n  const theme = useTheme<Theme>();\n  const [visible, { setFalse }] = useBoolean(true);\n\n  const styles = StyleSheet.create({\n    modal: {\n      marginHorizontal: theme.spacing.x3,\n    },\n  });\n\n  return (\n    <ModalView\n      position=\"center\"\n      visible={visible}\n      maskClosable={false}\n      onClose={setFalse}\n      onAnimationEnd={onAnimationEnd}\n      bodyContainerStyle={styles.modal}\n    >\n      <Box borderRadius=\"x3\" overflow=\"hidden\">\n        {!!img && (\n          <Flex justifyContent=\"center\">\n            <Svg width=\"100%\" height={height}>\n              <ClipPath id=\"clip\">\n                <Circle r={300 + height} cx=\"50%\" cy={-300} />\n              </ClipPath>\n              <Image\n                href={img}\n                width=\"100%\"\n                height={height}\n                clipPath=\"url(#clip)\"\n                preserveAspectRatio=\"xMidYMid slice\"\n              />\n            </Svg>\n          </Flex>\n        )}\n        <Box marginBottom=\"x2\">\n          {!!title && (\n            <Flex justifyContent=\"center\" marginVertical=\"x2\">\n              {typeof title === 'string' ? (\n                <Text variant=\"h1\" color=\"text\">\n                  {title}\n                </Text>\n              ) : (\n                title\n              )}\n            </Flex>\n          )}\n          {typeof content === 'string' ? (\n            <Flex justifyContent=\"center\">\n              <Text variant=\"p1\" color=\"text\">\n                {content}\n              </Text>\n            </Flex>\n          ) : (\n            content\n          )}\n        </Box>\n      </Box>\n      <Flex justifyContent=\"center\" position=\"absolute\" width=\"100%\" bottom={-theme.spacing.x10}>\n        <Pressable hitOffset={20} activeOpacity={closeIconActiveOpacity} onPress={setFalse}>\n          <SvgIcon name=\"closecircleo\" color={theme.colors.gray400} size={theme.spacing.x8} />\n        </Pressable>\n      </Flex>\n    </ModalView>\n  );\n};\nexport default TipContainer;\n"
  },
  {
    "path": "packages/react-native/src/modal/tip/index.tsx",
    "content": "import React from 'react';\n\nimport Portal from '../../portal';\nimport { TipProps } from '../type';\nimport TipContainer from './TipContainer';\n\nexport default function tip(props: TipProps) {\n  const key = Portal.add(\n    <TipContainer\n      {...props}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/react-native/src/modal/type.ts",
    "content": "import { ReactElement, ReactNode } from 'react';\nimport { ImageSourcePropType, StyleProp, TextStyle, ViewStyle } from 'react-native';\n\nexport interface ModalProps {\n  /** 弹窗是否可见 */\n  visible: boolean;\n  /** 点击mask是否可以关闭弹窗 */\n  maskClosable?: boolean;\n  /** 是否显示mask */\n  maskVisible?: boolean;\n  /** 弹窗动画 */\n  animationType?: 'fade' | 'slide';\n  /** 弹窗内容样式 */\n  bodyContainerStyle?: StyleProp<ViewStyle>;\n  /** 关闭弹窗 */\n  onClose?: () => void;\n  /** 弹窗动画结束后执行 */\n  onAnimationEnd?: (visible: boolean) => void;\n  /** 在用户按下 Android 设备上的后退按键时触发 */\n  onRequestClose?: () => boolean;\n  /** 内容显示位置。bottom在底部；center在中间；fullscreen全屏显示 */\n  position?: 'top' | 'bottom' | 'center' | 'fullscreen';\n  /** 动画时长，默认为300ms */\n  animationDuration?: number;\n}\n\nexport interface Action<T = StyleProp<TextStyle>> {\n  text: string;\n  onPress?: () => void | Promise<void>;\n  style?: T;\n}\n\nexport interface AlertProps {\n  /** 警示性图标 */\n  icon?: ReactNode;\n  /** 标题 */\n  title: ReactNode;\n  /** 内容 */\n  content?: ReactNode;\n  /** 按钮文本 */\n  confirmText?: string;\n  /** 确认事件 */\n  onPress?: () => void | Promise<void>;\n}\n\nexport interface ConfirmProps extends Omit<AlertProps, 'onPress' | 'confirmText'> {\n  /** 警示性图标 */\n  icon?: ReactNode;\n  /** 确认事件 */\n  onOk?: () => void | Promise<void>;\n  /** 取消事件 */\n  onCancel?: () => void | Promise<void>;\n  /** 确认文本 */\n  okText?: string;\n  /** 取消文本 */\n  cancelText?: string;\n}\n\nexport interface PromptProps extends Omit<ConfirmProps, 'icon' | 'onOk'> {\n  /** 自定义输入框组件 */\n  input: ReactElement;\n  onOk?: (value?: string) => void | Promise<void>;\n}\n\nexport type TipProps = Omit<AlertProps, 'icon' | 'onPress' | 'confirmText'> & {\n  /** 背景图 */\n  img: ImageSourcePropType;\n  /** 高度 */\n  height: number;\n  /** 关闭图标的不透明度 */\n  closeIconActiveOpacity?: number;\n};\n\nexport type ImperativeModalChildrenProps<P> = P & {\n  /** 在弹窗组件内调用，用以关闭弹窗 */\n  closeModal?: () => void;\n};\n"
  },
  {
    "path": "packages/react-native/src/notice-bar/AnimatedNotice.tsx",
    "content": "import React, { FC, memo, useEffect } from 'react';\nimport { LayoutChangeEvent } from 'react-native';\nimport Animated, {\n  Easing,\n  interpolate,\n  runOnJS,\n  useAnimatedStyle,\n  useSharedValue,\n  withTiming,\n} from 'react-native-reanimated';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { AnimatedNoticeProps } from './type';\n\nconst { deviceWidth } = helpers;\n\nconst AnimatedNotice: FC<AnimatedNoticeProps & { height: number; onContentLayout: (e: LayoutChangeEvent) => void }> = ({\n  icon,\n  text,\n  textColor,\n  animated,\n  height,\n  onContentLayout,\n  duration,\n}) => {\n  const [textWithTail, setTextWithTail] = useSafeState(text);\n\n  useEffect(() => {\n    if (animated) {\n      text = text.replace(/\\s/g, ' ');\n      setTextWithTail(text + ' '.repeat(10));\n    }\n  }, [animated, text]);\n\n  const progress = useSharedValue(0);\n  const [textWidth, setTextWidth] = useSafeState(0);\n\n  const startAnimation = () => {\n    progress.value = withTiming(\n      1,\n      {\n        duration,\n        easing: Easing.linear,\n      },\n      () => {\n        progress.value = 0;\n        runOnJS(startAnimation)();\n      }\n    );\n  };\n\n  useEffect(() => {\n    animated && startAnimation();\n  }, [animated]);\n\n  const animatedStyle = useAnimatedStyle(() => {\n    const translateX = interpolate(progress.value, [0, 1], [0, -textWidth]);\n\n    return {\n      transform: [{ translateX }],\n    };\n  });\n\n  return (\n    <Flex justifyContent={'flex-start'} alignItems={'center'}>\n      <Box\n        backgroundColor=\"func100\"\n        height={height}\n        zIndex={'99'}\n        justifyContent=\"center\"\n        alignItems=\"center\"\n        paddingHorizontal=\"x1\"\n      >\n        {icon}\n      </Box>\n      <Flex width={deviceWidth * 10} onLayout={onContentLayout}>\n        <Animated.View style={animatedStyle}>\n          <Text\n            variant={'p1'}\n            color={textColor}\n            numberOfLines={1}\n            onLayout={e => setTextWidth(e.nativeEvent.layout.width)}\n          >\n            {textWithTail}\n          </Text>\n        </Animated.View>\n        {animated && (\n          <Animated.View style={animatedStyle}>\n            <Text variant={'p1'} color={textColor} numberOfLines={1}>\n              {textWithTail}\n            </Text>\n          </Animated.View>\n        )}\n      </Flex>\n    </Flex>\n  );\n};\nAnimatedNotice.displayName = 'AnimatedNotice';\n\nexport default memo(AnimatedNotice);\n"
  },
  {
    "path": "packages/react-native/src/notice-bar/index.md",
    "content": "---\ntitle: NoticeBar - 通告栏组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# NoticeBar 通告栏组件\n\n在导航栏下方，一般用作系统提醒、活动提醒等通知。需要引起用户关注时使用，重要级别低于 `Modal` ，高于 `Toast`。\n\n## 效果演示\n\n### 1. 默认状态\n\n```tsx | pure\n<NoticeBar text=\"我是通知我是通知我是通知我是通知我是通知我是通知\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"noticeBar-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609761571776347042.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 可关闭\n\n```tsx | pure\n<NoticeBar text=\"我是通知我是通知我是通知我是通知我是通知我是通知\" mode=\"close\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"noticeBar-ios2\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609761722278116352.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 可点击跳转\n\n```tsx | pure\n<NoticeBar\n  text=\"我是通知我是通知我是通知我是通知我是通知我是通知\"\n  mode=\"link\"\n  onPress={() => navigation.navigate('BoxDemo')}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"noticeBar-ios3\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609761868420805782.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 水平滚动 + 可跳转\n\n```tsx | pure\n<NoticeBar\n  text=\"我是通知我是通知我是通知我是通知我是通知我是通知\"\n  mode=\"link\"\n  onPress={() => navigation.navigate('BoxDemo')}\n  animated\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"noticeBar-ios4\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609762001335578050.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 水平滚动 + 可关闭\n\n```tsx | pure\n<NoticeBar text=\"我是通知我是通知我是通知我是通知我是通知我是通知\" mode=\"close\" animated />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"noticeBar-ios5\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609762208777128043.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 自定义图标\n\n```tsx | pure\n<NoticeBar icon={<Icon name=\"user\" />} text=\"我是通知我是通知我是通知我是通知我是通知我是通知22222\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"noticeBar-ios6\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609762306730480022.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 7. 自定义高度\n\n```tsx | pure\n<NoticeBar height={60} text=\"我是通知我是通知我是通知我是通知我是通知我是通知22222\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"noticeBar-ios7\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609762508471573273.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性          | 必填    | 说明             | 类型                      | 默认值  |\n| ------------- | ------- | ---------------- | ------------------------- | ------- |\n| text          | `true`  | 通告栏文本       | `string`                  |         |\n| textColor     | `false` | 通告栏文本颜色   | `keyof Theme['colors']`   |         |\n| icon          | `false` | 左侧图标         | `ReactNode`               |         |\n| mode          | `false` | 通告栏类型       | `close` \\| `link` \\| `''` | `''`    |\n| onPress       | `false` | 通告栏点击事件   | `() => void`              |         |\n| animated      | `false` | 是否启用动画     | `boolean`                 | `false` |\n| duration      | `false` | 动画播放时长     | `number`                  | `5000`  |\n| height        | `false` | 通告栏高度       | `number`                  | `36`    |\n| activeOpacity | `false` | 按下时的不透明度 | `number`                  | `0.6`   |\n| style         | `false` | 自定义样式       | `StyleProp<ViewStyle>`    |         |\n"
  },
  {
    "path": "packages/react-native/src/notice-bar/index.tsx",
    "content": "import React, { FC, PropsWithChildren } from 'react';\nimport { LayoutChangeEvent } from 'react-native';\nimport Animated, { FadeOutRight } from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport { Theme } from '../theme';\nimport AnimatedNotice from './AnimatedNotice';\nimport { NoticeBarProps } from './type';\n\nconst DEFAULT_DURATION = 5000;\n\nconst NoticeBar: FC<NoticeBarProps> = props => {\n  const theme = useTheme<Theme>();\n  const {\n    icon = <SvgIcon name=\"bells\" color={theme.colors.func500} />,\n    mode = '',\n    text = '',\n    textColor = 'text',\n    onPress,\n    duration = DEFAULT_DURATION,\n    animated = false,\n    style,\n    activeOpacity = 0.6,\n  } = props;\n\n  const [visible, setVisible] = useSafeState(true);\n  const [height, setHeight] = useSafeState(0);\n\n  const handleContentLayout = (e: LayoutChangeEvent) => {\n    setHeight(e.nativeEvent.layout.height);\n  };\n\n  if (!visible) return null;\n\n  const BaseContent = (\n    <AnimatedNotice {...{ text, textColor, icon, duration, animated, height, onContentLayout: handleContentLayout }} />\n  );\n\n  switch (mode) {\n    case 'close':\n      return (\n        <WrapComp {...{ onPress, activeOpacity }}>\n          <Animated.View\n            exiting={FadeOutRight}\n            style={[\n              {\n                position: 'relative',\n                backgroundColor: theme.colors.func100,\n                paddingVertical: theme.spacing.x2,\n              },\n              style,\n            ]}\n          >\n            {BaseContent}\n            <Pressable\n              activeOpacity={1}\n              onPress={() => setVisible(false)}\n              style={{\n                height,\n                paddingHorizontal: theme.spacing.x1,\n                position: 'absolute',\n                zIndex: 99,\n                right: 0,\n                top: theme.spacing.x2,\n                justifyContent: 'center',\n                alignItems: 'center',\n                backgroundColor: theme.colors.func100,\n              }}\n            >\n              <SvgIcon name=\"close\" color={theme.colors.func500} />\n            </Pressable>\n          </Animated.View>\n        </WrapComp>\n      );\n\n    case 'link':\n      return (\n        <WrapComp {...{ onPress, activeOpacity }}>\n          <Flex backgroundColor=\"func100\" paddingVertical={'x2'} style={style} position={'relative'} overflow=\"hidden\">\n            {BaseContent}\n            <Box\n              position={'absolute'}\n              right={0}\n              top={theme.spacing.x2}\n              height={height}\n              zIndex=\"99\"\n              paddingHorizontal=\"x1\"\n              justifyContent=\"center\"\n              alignItems={'center'}\n              backgroundColor=\"func100\"\n            >\n              <SvgIcon name=\"right\" color={theme.colors.func500} />\n            </Box>\n          </Flex>\n        </WrapComp>\n      );\n\n    default:\n      return (\n        <WrapComp {...{ onPress, activeOpacity }}>\n          <Box backgroundColor=\"func100\" paddingVertical={'x2'} style={style} overflow=\"hidden\">\n            {BaseContent}\n          </Box>\n        </WrapComp>\n      );\n  }\n};\nNoticeBar.displayName = 'NoticeBar';\n\nexport default NoticeBar;\n\nconst WrapComp = ({\n  children,\n  onPress,\n  activeOpacity,\n}: PropsWithChildren<Pick<NoticeBarProps, 'activeOpacity' | 'onPress'>>) => {\n  if (onPress)\n    return (\n      <Pressable activeOpacity={activeOpacity} onPress={onPress}>\n        {children}\n      </Pressable>\n    );\n  return <>{children}</>;\n};\n"
  },
  {
    "path": "packages/react-native/src/notice-bar/type.ts",
    "content": "import { ReactNode } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nimport { Theme } from '../theme';\n\nexport interface NoticeBarProps {\n  /** 左侧自定义图标 */\n  icon?: ReactNode;\n  /** 通知栏内容 */\n  text: string;\n  /** 文字颜色 */\n  textColor?: keyof Theme['colors'];\n  /** 通知栏模式。close表示可关闭；link表示可点击；默认为空 */\n  mode?: 'close' | 'link' | '';\n  /** 点击事件 */\n  onPress?: () => void;\n  /** 滚动时间 */\n  duration?: number;\n  /** 是否使用动画 */\n  animated?: boolean;\n  /** 自定义样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nexport type AnimatedNoticeProps = Omit<NoticeBarProps, 'mode' | 'onPress' | 'onClose'>;\n"
  },
  {
    "path": "packages/react-native/src/notify/NotifyRoot.tsx",
    "content": "import React, { forwardRef, useImperativeHandle, useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { Shadow } from 'react-native-shadow-2';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { normalShadowOpt, NotifyType } from './constant';\nimport { NotifyProps } from './type';\nimport useNotify from './useNotify';\n\nconst { px, hexToRgba } = helpers;\n\nconst NotifyRoot = forwardRef((_, ref) => {\n  const insets = useSafeAreaInsets();\n  const { show, hide, shadowColor, bgColor, style, visible, options } = useNotify();\n\n  useImperativeHandle(ref, () => ({\n    show,\n  }));\n\n  if (!visible || !options) return null;\n\n  const styles = StyleSheet.create({\n    container: {\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      zIndex: 49,\n      bottom: -insets.bottom,\n    },\n    wrapper: { borderRadius: normalShadowOpt.radius, backgroundColor: bgColor },\n  });\n\n  return (\n    <Animated.View style={[styles.container, style]}>\n      <Shadow distance={8} startColor={hexToRgba(shadowColor, normalShadowOpt.opacity)}>\n        <Flex\n          paddingHorizontal=\"x4\"\n          justifyContent=\"center\"\n          alignItems=\"center\"\n          width={normalShadowOpt.width}\n          height={normalShadowOpt.height}\n          style={styles.wrapper}\n        >\n          <Content {...{ shadowColor, options, hide }} />\n        </Flex>\n      </Shadow>\n    </Animated.View>\n  );\n});\n\nexport default NotifyRoot;\n\n/**\n * 渲染Notify内容。分为以下几种情况：\n * 1. notify的类型不是INFO，这时候直接返回Content\n * 2. notify类型是INFO：\n *    1: onPress有值，Content被TouchableOpacity包裹，同时显示right图标；\n *       如果同时onClose有值，再显示一个close图标，点击可关闭notify\n *    2: onPress没有值，Contentbu包裹，不显示right图标；\n *       如果同时onClose有值，再显示一个close图标，点击可关闭notify\n */\nconst Content = ({\n  shadowColor,\n  options,\n  hide,\n}: {\n  hide: () => void;\n  shadowColor: string;\n  options: NotifyProps & { type: NotifyType };\n}) => {\n  const styles = StyleSheet.create({\n    content: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n    },\n  });\n\n  const BaseContent = useMemo(\n    () => (\n      <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n        {options.type === NotifyType.SUCCESS && (\n          <Box marginRight=\"x1\">\n            <SvgIcon name=\"checkcircle\" color={shadowColor} />\n          </Box>\n        )}\n        {options.type === NotifyType.FAIL && (\n          <Box marginRight=\"x1\">\n            <SvgIcon name=\"closecircleo\" color={shadowColor} />\n          </Box>\n        )}\n        <Box>\n          <Text style={{ fontSize: px(14), color: shadowColor }}>{options.content}</Text>\n        </Box>\n      </Flex>\n    ),\n    [options.type, options.content, shadowColor]\n  );\n\n  if (options.type !== NotifyType.INFO) return BaseContent;\n\n  if (options.onPress) {\n    if (options.onClose) {\n      return (\n        <Pressable activeOpacity={options.activeOpacity} onPress={options.onPress} style={styles.content}>\n          {BaseContent}\n          <Pressable\n            onPress={e => {\n              e.stopPropagation();\n              hide();\n            }}\n          >\n            <SvgIcon name=\"close\" color={shadowColor} />\n          </Pressable>\n          <SvgIcon name=\"right\" color={shadowColor} />\n        </Pressable>\n      );\n    }\n    return (\n      <Pressable activeOpacity={options.activeOpacity} onPress={options.onPress} style={styles.content}>\n        {BaseContent}\n        <SvgIcon name=\"right\" color={shadowColor} />\n      </Pressable>\n    );\n  }\n\n  if (options.onClose) {\n    return (\n      <Flex justifyContent={'center'} alignItems={'center'}>\n        {BaseContent}\n        <Pressable\n          onPress={e => {\n            e.stopPropagation();\n            hide();\n          }}\n        >\n          <SvgIcon name=\"close\" color={shadowColor} />\n        </Pressable>\n      </Flex>\n    );\n  }\n  return BaseContent;\n};\n"
  },
  {
    "path": "packages/react-native/src/notify/constant.ts",
    "content": "import helpers from '../helpers';\n\nconst { px, deviceWidth } = helpers;\n\nexport const normalShadowOpt = {\n  width: deviceWidth - px(32),\n  height: px(40),\n  radius: px(20),\n  opacity: 0.16,\n  border: 12,\n};\n\nexport const SHORT = 3000;\nexport const LONG = 5000;\n\nexport enum NotifyType {\n  INFO = 'info',\n  SUCCESS = 'success',\n  FAIL = 'fail',\n}\n"
  },
  {
    "path": "packages/react-native/src/notify/index.md",
    "content": "---\ntitle: Notify - 提示组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 反馈组件\n  path: /feedback\n---\n\n# Notify 提示组件\n\n## 效果演示\n\n### 1. 消息提示\n\n```tsx | pure\n<Button title=\"info\" onPress={() => Notify.info({ content: '你收到一条抢购消息，请注意查收' })} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"notify-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607588591151277948.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 带关闭效果\n\n```tsx | pure\n<Button\n  title=\"close\"\n  onPress={() =>\n    Notify.info({\n      content: '你收到一条抢购消息，请注意查收',\n      autoClose: false,\n      onClose: () => console.log(222),\n    })\n  }\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"notify-ios2.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607588857557958788.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 带点击跳转效果\n\n```tsx | pure\n<Button\n  title=\"press\"\n  onPress={() =>\n    Notify.info({\n      content: '你收到一条抢购消息，请注意查收',\n      onPress: () => navigation.navigate('BoxDemo'),\n      autoClose: false,\n    })\n  }\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"notify-ios3.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607589050992593024.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 成功提示\n\n```tsx | pure\n<Button title=\"success\" onPress={() => Notify.success({ content: '购买成功' })} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"notify-ios4.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643185000193572589.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 失败提示\n\n```tsx | pure\n<Button title=\"fail\" onPress={() => Notify.fail({ content: '对不起，操作失败' })} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"notify-ios5.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643185067327550797.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性          | 必填    | 说明                 | 类型         | 默认值 |\n| ------------- | ------- | -------------------- | ------------ | ------ |\n| autoClose     | `false` | 是否自动关闭提示     | `boolean`    | `true` |\n| duration      | `false` | 提示显示时长（毫秒） | `number`     | `3000` |\n| content       | `false` | 提示框内容           | `ReactNode`  |        |\n| activeOpacity | `false` | 按下时的不透明度     | `number`     | `0.6`  |\n| onClose       | `false` | 提示框关闭后回调     | `() => void` |        |\n| onPress       | `false` | 提示框点击后回调     | `() => void` |        |\n\n`duration` 有两个常量值：\n\n- Notify.SHORT = 3000\n- Notify.LONG = 5000\n"
  },
  {
    "path": "packages/react-native/src/notify/index.tsx",
    "content": "import { useRef } from 'react';\nimport React from 'react';\n\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport { addNewRef, getRef, removeOldRef } from '../utils/ref-util';\nimport { LONG, SHORT } from './constant';\nimport NotifyRoot from './NotifyRoot';\nimport { NotifyProps } from './type';\n\nexport interface NotifyRef {\n  show: (params: NotifyProps) => void;\n}\n\ntype NotifyRefObj = {\n  current: NotifyRef | null;\n};\n\nlet refs: NotifyRefObj[] = [];\n\nexport default function Notify() {\n  const notifyRef = useRef<NotifyRef | null>(null);\n\n  const setRef = useMemoizedFn((ref: NotifyRef | null) => {\n    if (ref) {\n      notifyRef.current = ref;\n      addNewRef(refs, ref);\n    } else {\n      removeOldRef(refs, notifyRef.current);\n    }\n  });\n\n  return <NotifyRoot ref={setRef} />;\n}\nNotify.displayName = 'Notify';\n\nNotify.SHORT = SHORT;\nNotify.LONG = LONG;\n\nconst defaultProps = {\n  content: '',\n  duration: SHORT,\n  autoClose: true,\n};\n\nNotify.success = (props: NotifyProps) => {\n  getRef(refs)?.show({ ...defaultProps, ...props, type: 'success' });\n};\n\nNotify.fail = (props: NotifyProps) => {\n  getRef(refs)?.show({ ...defaultProps, ...props, type: 'fail' });\n};\n\nNotify.info = (props: NotifyProps) => {\n  getRef(refs)?.show({ ...defaultProps, ...props, type: 'info' });\n};\n"
  },
  {
    "path": "packages/react-native/src/notify/type.ts",
    "content": "import { ReactNode } from 'react';\n\nexport interface NotifyProps {\n  content: ReactNode;\n  duration?: number;\n  autoClose?: boolean;\n  activeOpacity?: number;\n  onClose?: () => void;\n  onPress?: () => void;\n}\n"
  },
  {
    "path": "packages/react-native/src/notify/useNotify.ts",
    "content": "import { useEffect, useMemo, useRef, useState } from 'react';\nimport { Dimensions } from 'react-native';\nimport {\n  Easing,\n  interpolate,\n  runOnJS,\n  useAnimatedStyle,\n  useSharedValue,\n  withSpring,\n  withTiming,\n} from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport helpers from '../helpers';\nimport { Theme } from '../theme';\nimport { normalShadowOpt, NotifyType } from './constant';\nimport { NotifyProps } from './type';\n\nconst screenHeight = Dimensions.get('screen').height;\nconst windowHeight = Dimensions.get('window').height;\nconst bottomNavigatorBarHeight = screenHeight - windowHeight;\n\nexport default function useNotify() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme<Theme>();\n  const timer = useRef<ReturnType<typeof setTimeout>>();\n\n  const [visible, setVisible] = useState(false);\n  const [options, setOptions] = useState<(NotifyProps & { type: NotifyType }) | undefined>(undefined);\n\n  const show = (params: NotifyProps & { type: NotifyType }) => {\n    if (visible) return;\n\n    setOptions(params);\n    setVisible(true);\n  };\n\n  const hide = async () => {\n    options?.onClose?.();\n    setVisible(false);\n    clearTimeout(timer.current);\n  };\n\n  const displayed = useSharedValue(visible ? 1 : 0);\n\n  const handleClose = () => {\n    displayed.value = withTiming(0, { duration: 300, easing: Easing.inOut(Easing.ease) }, finished => {\n      if (finished) {\n        runOnJS(hide)();\n      }\n    });\n  };\n\n  useEffect(() => {\n    if (visible) {\n      displayed.value = withSpring(1);\n    }\n  }, [visible]);\n\n  useEffect(() => {\n    if (!visible || !options?.duration || !options?.autoClose) return;\n\n    timer.current = setTimeout(handleClose, options.duration);\n\n    return () => clearTimeout(timer.current);\n  }, [visible, options?.duration]);\n\n  const startY = options?.type\n    ? [NotifyType.SUCCESS, NotifyType.FAIL].includes(options.type)\n      ? normalShadowOpt.height + helpers.px(50)\n      : normalShadowOpt.height + helpers.px(10)\n    : normalShadowOpt.height;\n\n  const endY = -insets.bottom - bottomNavigatorBarHeight - (helpers.isIOS ? insets.bottom : 0);\n\n  // 提示窗口的位置\n  const style = useAnimatedStyle(() => ({\n    transform: [\n      {\n        translateY: interpolate(displayed.value, [0, 1], [startY, endY]),\n      },\n    ],\n  }));\n\n  // 提示窗口的阴影颜色和背景色\n  const { shadowColor, bgColor } = useMemo(() => {\n    switch (options?.type) {\n      case NotifyType.FAIL:\n        return {\n          shadowColor: theme.colors.func600,\n          bgColor: theme.colors.white,\n        };\n      case NotifyType.INFO:\n      case NotifyType.SUCCESS:\n      default:\n        return {\n          shadowColor: theme.colors.primary200,\n          bgColor: theme.colors.white,\n        };\n    }\n  }, [options?.type, theme]);\n\n  return {\n    options,\n    shadowColor,\n    bgColor,\n    style,\n    visible,\n\n    show: useMemoizedFn(show),\n    hide: useMemoizedFn(handleClose),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/NumberKeyboardInput.tsx",
    "content": "import React, { forwardRef, useImperativeHandle } from 'react';\nimport { Keyboard } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Brief from '../brief';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Label from '../label';\nimport Modal from '../modal';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport NumberKeyboardModal from './NumberKeyboardModal';\nimport { NumberKeyboardInputProps, NumberKeyboardRef } from './type';\nimport useNumberKeyboard from './useNumberKeyboard';\n\nconst { ONE_PIXEL } = helpers;\nconst NumberKeyboardInput = forwardRef<NumberKeyboardRef, NumberKeyboardInputProps>(\n  (\n    {\n      label,\n      labelPosition = 'left',\n      colon = false,\n      required = false,\n      value,\n      onChange,\n      onCheck,\n      placeholder = '请输入',\n      disabled = false,\n      type,\n      style,\n      inputStyle,\n      extra,\n      allowClear = true,\n      digit = 0,\n      brief,\n      activeOpacity = 0.6,\n      itemHeight,\n      allowNegative = false,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n\n    const { currentText, handleSubmit, handleInputClear } = useNumberKeyboard({\n      value,\n      onCheck,\n      onChange,\n      digit,\n      type,\n      placeholder,\n    });\n\n    const show = () => {\n      Keyboard.dismiss();\n      Modal.show(\n        <NumberKeyboardModal\n          {...{\n            ...restProps,\n            type,\n            value: currentText === placeholder ? '' : currentText,\n            onSubmit: handleSubmit,\n            activeOpacity,\n            allowNegative,\n          }}\n        />,\n        { position: 'bottom' }\n      );\n    };\n\n    useImperativeHandle(ref, () => {\n      return {\n        focus: show,\n      };\n    });\n\n    const InputContent = (\n      <Flex borderWidth={ONE_PIXEL} borderColor=\"border\" borderRadius=\"x1\" paddingHorizontal={'x1'} flex={1}>\n        <Pressable\n          activeOpacity={activeOpacity}\n          onPress={show}\n          style={[\n            itemHeight ? { height: itemHeight, justifyContent: 'center' } : {},\n            {\n              flex: 1,\n              paddingVertical: theme.spacing.x2,\n            },\n            style,\n          ]}\n        >\n          <Text variant=\"p1\" color={currentText === placeholder ? 'gray300' : 'text'} style={inputStyle} selectable>\n            {currentText}\n          </Text>\n        </Pressable>\n        {allowClear && !disabled && !!currentText && currentText !== placeholder && (\n          <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10} style={{ alignItems: 'center' }}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n        <Brief brief={extra} />\n      </Flex>\n    );\n\n    if (labelPosition === 'top')\n      return (\n        <Box>\n          <Label {...{ colon, label, required }} />\n          {InputContent}\n          <Brief brief={brief} />\n        </Box>\n      );\n\n    return (\n      <Box>\n        <Flex alignItems=\"center\">\n          <Label {...{ colon, label, required }} />\n          {InputContent}\n        </Flex>\n        <Brief brief={brief} />\n      </Box>\n    );\n  }\n);\n\nNumberKeyboardInput.displayName = 'NumberKeyboardInput';\n\nexport default NumberKeyboardInput;\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/NumberKeyboardItem.tsx",
    "content": "import React, { forwardRef, useImperativeHandle } from 'react';\nimport { Keyboard, StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Brief from '../brief';\nimport Flex from '../flex';\nimport Modal from '../modal';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport NumberKeyboardModal from './NumberKeyboardModal';\nimport { NumberKeyboardItemProps, NumberKeyboardRef } from './type';\nimport useNumberKeyboard from './useNumberKeyboard';\n\nconst NumberKeyboardItem = forwardRef<NumberKeyboardRef, NumberKeyboardItemProps>(\n  (\n    {\n      value,\n      onChange,\n      onCheck,\n      placeholder = '请输入',\n      disabled = false,\n      type,\n      style,\n      inputStyle,\n      extra,\n      allowClear = true,\n      digit = 0,\n      activeOpacity = 0.6,\n      inForm,\n      allowNegative = false,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { currentText, handleSubmit, handleInputClear } = useNumberKeyboard({\n      value,\n      onChange,\n      onCheck,\n      digit,\n      type,\n      placeholder,\n    });\n\n    const show = () => {\n      Keyboard.dismiss();\n      if (disabled) return;\n      Modal.show(\n        <NumberKeyboardModal\n          {...{\n            ...restProps,\n            type,\n            value: currentText === placeholder ? '' : currentText,\n            onSubmit: handleSubmit,\n            activeOpacity,\n            allowNegative,\n          }}\n        />,\n        { position: 'bottom' }\n      );\n    };\n\n    useImperativeHandle(ref, () => {\n      return {\n        focus: show,\n      };\n    });\n\n    const styles = StyleSheet.create({\n      content: {\n        flexGrow: 1,\n        justifyContent: 'center',\n      },\n      clearIcon: { alignItems: 'center' },\n    });\n\n    return (\n      <Box width=\"100%\" paddingHorizontal={inForm ? 'x0' : 'x1'} justifyContent={'center'} style={style}>\n        <Flex>\n          <Pressable activeOpacity={activeOpacity} onPress={show} style={styles.content}>\n            <Text\n              variant=\"p1\"\n              color={currentText === placeholder ? 'gray300' : 'text'}\n              textAlign={'right'}\n              style={inputStyle}\n              selectable\n            >\n              {currentText}\n            </Text>\n          </Pressable>\n          {allowClear && !disabled && !!currentText && currentText !== placeholder && (\n            <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10} style={styles.clearIcon}>\n              <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n            </Pressable>\n          )}\n          <Brief brief={extra} />\n        </Flex>\n      </Box>\n    );\n  }\n);\nNumberKeyboardItem.displayName = 'NumberKeyboardItem';\n\nexport default NumberKeyboardItem;\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/NumberKeyboardModal.tsx",
    "content": "import React, { FC } from 'react';\nimport { Keyboard, StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport type { ImperativeModalChildrenProps } from '../modal/type';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport NumberKeyboardView from './NumberKeyboardView';\nimport { NumberKeyboardModalProps } from './type';\nimport useNumberKeyboardModal from './useNumberKeyboardModal';\n\nconst { px } = helpers;\nconst SIZE = px(48);\nconst NumberKeyboardModal: FC<ImperativeModalChildrenProps<NumberKeyboardModalProps>> = ({\n  type,\n  allowClear = true,\n  allowNegative,\n  value = '',\n  onPress,\n  onDelete,\n  onSubmit,\n  prefixLabel = '当前值',\n  closeModal,\n}) => {\n  const theme = useTheme<Theme>();\n  const { text, handleChange, handleInputClear, handleSubmit, handleDelete } = useNumberKeyboardModal({\n    value,\n    onPress,\n    onDelete,\n    onSubmit,\n    closeModal,\n  });\n\n  const styles = StyleSheet.create({\n    content: {\n      justifyContent: 'center',\n      alignItems: 'flex-end',\n    },\n  });\n\n  return (\n    <Box>\n      <Flex justifyContent=\"space-between\" alignItems=\"center\" height={SIZE} paddingHorizontal=\"x4\">\n        <Box flex={1}>\n          <Text variant=\"p0\" color=\"text\" selectable>\n            {prefixLabel}：{text}\n          </Text>\n        </Box>\n        {allowClear && (\n          <Pressable style={[styles.content, { marginRight: px(8) }]} activeOpacity={1} onPress={handleInputClear}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n        <Pressable\n          style={styles.content}\n          onPress={() => {\n            Keyboard.dismiss();\n            closeModal?.();\n          }}\n          activeOpacity={1}\n        >\n          <SvgIcon name=\"down\" size={px(20)} color={theme.colors.gray500} />\n        </Pressable>\n      </Flex>\n      <NumberKeyboardView\n        type={type}\n        allowNegative={allowNegative}\n        onPress={handleChange}\n        onDelete={handleDelete}\n        onSubmit={handleSubmit}\n      />\n    </Box>\n  );\n};\nNumberKeyboardModal.displayName = 'NumberKeyboardModal';\n\nexport default NumberKeyboardModal;\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/NumberKeyboardView.tsx",
    "content": "import React, { FC, useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport { SvgXml } from 'react-native-svg';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { NumberKeyboardViewProps } from './type';\n\nconst { px, ONE_PIXEL, deviceWidth } = helpers;\nconst keys = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\nconst PER_WIDTH = deviceWidth / 4;\n\nconst NumberKeyboardView: FC<NumberKeyboardViewProps> = ({\n  type = 'number',\n  onPress,\n  onDelete,\n  onSubmit,\n  submitText = '确定',\n  activeOpacity = 0.6,\n  allowNegative,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const styles = StyleSheet.create({\n    close: {\n      justifyContent: 'center',\n      alignItems: 'center',\n      borderTopWidth: ONE_PIXEL,\n      borderRightWidth: ONE_PIXEL,\n      borderColor: theme.colors.border,\n      height: PER_WIDTH * 2,\n    },\n    submit: {\n      backgroundColor: theme.colors.primary200,\n      justifyContent: 'center',\n      alignItems: 'center',\n      borderTopWidth: ONE_PIXEL,\n      borderRightWidth: ONE_PIXEL,\n      borderColor: theme.colors.border,\n      height: PER_WIDTH * 2,\n    },\n  });\n\n  const keyTypes = useMemo(() => {\n    const numberType = allowNegative\n      ? [\n          {\n            key: '0',\n            flex: 1,\n          },\n          {\n            key: '.',\n            flex: 1,\n          },\n          {\n            key: '-',\n            flex: 1,\n          },\n        ]\n      : [\n          {\n            key: '0',\n            flex: 2,\n          },\n          {\n            key: '.',\n            flex: 1,\n          },\n        ];\n    const integerType = allowNegative\n      ? [\n          {\n            key: '0',\n            flex: 2,\n          },\n          {\n            key: '-',\n            flex: 1,\n          },\n        ]\n      : [\n          {\n            key: '0',\n            flex: 1,\n          },\n        ];\n\n    const types = {\n      number: numberType,\n      idcard: [\n        {\n          key: '0',\n          flex: 2,\n        },\n        {\n          key: 'X',\n          flex: 1,\n        },\n      ],\n      integer: integerType,\n    };\n\n    return types;\n  }, [allowNegative]);\n\n  return (\n    <Flex backgroundColor=\"transparent\">\n      <Box width={PER_WIDTH * 3}>\n        <Flex>\n          {keys.slice(0, 3).map(item => (\n            <KeyItem key={item} item={item} onPress={onPress} activeOpacity={activeOpacity} />\n          ))}\n        </Flex>\n        <Flex>\n          {keys.slice(3, 6).map(item => (\n            <KeyItem key={item} item={item} onPress={onPress} activeOpacity={activeOpacity} />\n          ))}\n        </Flex>\n        <Flex>\n          {keys.slice(6, 9).map(item => (\n            <KeyItem key={item} item={item} onPress={onPress} activeOpacity={activeOpacity} />\n          ))}\n        </Flex>\n        <Flex>\n          {keyTypes[type].map(item => (\n            <KeyTypeItem key={item.key} item={item} onPress={onPress} activeOpacity={activeOpacity} />\n          ))}\n        </Flex>\n      </Box>\n      <Box width={PER_WIDTH * 1}>\n        <Pressable activeOpacity={activeOpacity} style={styles.close} onPress={onDelete}>\n          <SvgXml\n            xml={`\n              <svg\n                t=\"1607517664521\"\n                class=\"icon\"\n                viewBox=\"0 0 1579 1024\"\n                version=\"1.1\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                p-id=\"7769\"\n                width=\"200\"\n                height=\"200\"\n              >\n                <path\n                  d=\"M1473.619354 0H499.942734a122.427628 122.427628 0 0 0-94.06463 44.818325L13.044586 478.700403A58.162099 58.162099 0 0 0 15.557763 554.99328l397.261497 437.292818a101.065623 101.065623 0 0 0 72.941974 31.654064h987.85812a109.323205 109.323205 0 0 0 106.331327-111.477356V111.297844A109.263367 109.263367 0 0 0 1473.619354 0z m4.787004 823.544206a87.602174 87.602174 0 0 1-88.021037 86.584936H529.981184a86.345585 86.345585 0 0 1-60.256413-24.533396L141.276456 545.419272a43.083036 43.083036 0 0 1-2.154151-59.239175l324.738386-337.364109a103.638637 103.638637 0 0 1 77.788815-34.825454h849.09484a87.602174 87.602174 0 0 1 88.021037 86.584935v622.968737z\"\n                  fill=\"${theme.colors.gray500}\"\n                  p-id=\"7770\"\n                ></path>\n                <path\n                  d=\"M1192.562379 665.453398a56.965348 56.965348 0 1 1-80.541342 80.541343l-151.508678-151.508678-147.080699 147.260212a56.965348 56.965348 0 0 1-80.541343-80.541343l147.260212-147.260212-151.748028-151.508677a56.90551 56.90551 0 0 1 80.36183-80.541343l151.508678 151.508678 155.577631-155.577631a56.90551 56.90551 0 0 1 80.541343 80.36183l-155.577631 155.577631z\"\n                  fill=\"${theme.colors.gray500}\"\n                  p-id=\"7771\"\n                ></path>\n              </svg>`}\n            width={px(26)}\n            height={px(17)}\n          />\n        </Pressable>\n        <Pressable activeOpacity={activeOpacity} style={styles.submit} onPress={onSubmit}>\n          <Text variant=\"p0\" color=\"text_active\">\n            {submitText}\n          </Text>\n        </Pressable>\n      </Box>\n    </Flex>\n  );\n};\nNumberKeyboardView.displayName = 'NumberKeyboardView';\n\nconst KeyItem = ({\n  item,\n  onPress,\n  activeOpacity,\n}: {\n  item: string;\n  onPress?: (item: string) => void;\n  activeOpacity: number;\n}) => {\n  const theme = useTheme<Theme>();\n\n  const styles = StyleSheet.create({\n    item: {\n      width: PER_WIDTH,\n      height: PER_WIDTH,\n      borderTopWidth: ONE_PIXEL,\n      borderRightWidth: ONE_PIXEL,\n      borderColor: theme.colors.border,\n      justifyContent: 'center',\n      alignItems: 'center',\n    },\n  });\n\n  return (\n    <Pressable\n      activeOpacity={activeOpacity}\n      onPress={() => {\n        onPress?.(item);\n      }}\n      style={styles.item}\n    >\n      <Text variant=\"p0\" color=\"text\">\n        {item}\n      </Text>\n    </Pressable>\n  );\n};\n\nconst KeyTypeItem = ({\n  item,\n  onPress,\n  activeOpacity,\n}: {\n  item: { key: string; flex: number };\n  onPress?: (item: string) => void;\n  activeOpacity: number;\n}) => {\n  const theme = useTheme<Theme>();\n\n  const styles = StyleSheet.create({\n    wrapper: {\n      justifyContent: 'center',\n      alignItems: 'center',\n      flex: item.flex,\n      height: PER_WIDTH,\n      borderTopWidth: ONE_PIXEL,\n      borderRightWidth: ONE_PIXEL,\n      borderBottomWidth: ONE_PIXEL,\n      borderColor: theme.colors.border,\n    },\n  });\n\n  return (\n    <Pressable\n      key={item.key}\n      activeOpacity={activeOpacity}\n      onPress={() => {\n        onPress?.(item.key);\n      }}\n      style={styles.wrapper}\n    >\n      <Text variant=\"p0\" color=\"text\">\n        {item.key}\n      </Text>\n    </Pressable>\n  );\n};\n\nexport default NumberKeyboardView;\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/index.md",
    "content": "---\ntitle: NumberKeyboard - 数字键盘组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# NumberKeyboard 数字键盘组件\n\n## 效果演示\n\n### 1. 默认的数字键盘\n\n```tsx | pure\n<NumberKeyboardInput\n  onPress={e => {\n    Alert.alert(e);\n  }}\n  onDelete={() => {\n    Alert.alert('delete');\n  }}\n  onSubmit={() => {\n    Alert.alert('submit');\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"数字键盘 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609320228495622158.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 身份证键盘\n\n```tsx | pure\n<NumberKeyboardInput\n  type=\"IdCard\"\n  onPress={e => {\n    Alert.alert(e);\n  }}\n  onDelete={() => {\n    Alert.alert('delete');\n  }}\n  onSubmit={() => {\n    Alert.alert('submit');\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"身份证键盘 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609320228906238884.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 整数键盘\n\n```tsx | pure\n<NumberKeyboardInput\n  type=\"integer\"\n  onPress={e => {\n    Alert.alert(e);\n  }}\n  onDelete={() => {\n    Alert.alert('delete');\n  }}\n  onSubmit={() => {\n    Alert.alert('submit');\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"整数键盘 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609320228906451063.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 键盘弹窗\n\n```tsx | pure\n<Button\n  title=\"keyboard\"\n  onPress={() =>\n    showNumberKeyboard({\n      type: 'IdCard',\n      onPress: e => {\n        Alert.alert(e);\n      },\n      onDelete: () => {\n        Alert.alert('delete');\n      },\n      onSubmit: () => {\n        Alert.alert('submit');\n      },\n    })\n  }\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"键盘弹窗 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609320231762702497.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. NumberKeyboardItem\n\n```tsx | pure\n<NumberKeyboardItem type=\"number\" digit={2} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"键盘弹窗 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643186997476238471.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. NumberKeyboardInput\n\n```tsx | pure\n<NumberKeyboardInput label=\"运单量\" type=\"number\" digit={2} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"键盘弹窗 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643187096525786335.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### NumberKeyboardView 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| onPress       | `false` | 按键的回调事件                  | `(key: string) => void`           |          |\n| onDelete      | `false` | 删除按键的回调事件              | `() => void`                      |          |\n| onSubmit      | `false` | 提交按键的回调事件              | `() => void`                      |          |\n| submitText    | `false` | 提交按键的文本                  | `string`                          | `确定`   |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n\n### NumberKeyboardModal 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| onPress       | `false` | 按键的回调事件                  | `(key: string) => void`           |          |\n| onDelete      | `false` | 删除按键的回调事件              | `() => void`                      |          |\n| onSubmit      | `false` | 提交按键的回调事件              | `(value: string) => void`         |          |\n| submitText    | `false` | 提交按键的文本                  | `string`                          | `确定`   |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n| value         | `false` | 输入值                          | `string`                          |          |\n| prefixLabel   | `false` | 输入的值的前置文本              | `string`                          | `当前值` |\n\n### NumberKeyboardItem 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| value         | `false` | 输入值                          | `string`                          |          |\n| onChange      | `false` | 值修改后的回调                  | `(value: string) => void`         |          |\n| onCheck       | `false` | 对值进行校验的回调              | `(value: string) => Promise<any>` |          |\n| placeholder   | `false` | 提示语                          | `string`                          | `请输入` |\n| style         | `false` | 自定义样式                      | `ViewStyle`                       |          |\n| inputStyle    | `false` | 输入框自定义样式                | `TextStyle`                       |          |\n| extra         | `false` | 右侧内容                        | `ReactNode`                       |          |\n| arrowClear    | `false` | 是否允许清空                    | `boolean`                         | `true`   |\n| disabled      | `false` | 是否禁用                        | `boolean`                         | `false`  |\n| digit         | `false` | 保留的小数位数                  | `number`                          | `0`      |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n\n### NumberKeyboardInput 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| value         | `false` | 输入值                          | `string`                          |          |\n| onChange      | `false` | 值修改后的回调                  | `(value: string) => void`         |          |\n| onCheck       | `false` | 对值进行校验的回调              | `(value: string) => Promise<any>` |          |\n| placeholder   | `false` | 提示语                          | `string`                          | `请输入` |\n| style         | `false` | 自定义样式                      | `ViewStyle`                       |          |\n| inputStyle    | `false` | 输入框自定义样式                | `TextStyle`                       |          |\n| extra         | `false` | 右侧内容                        | `ReactNode`                       |          |\n| arrowClear    | `false` | 是否允许清空                    | `boolean`                         | `true`   |\n| disabled      | `false` | 是否禁用                        | `boolean`                         | `false`  |\n| digit         | `false` | 保留的小数位数                  | `number`                          | `0`      |\n| minHeight     | `false` | 最小高度                        | `number`                          | `32`     |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n| label         | `false` | 标签文本                        | `ReactNode`                       |          |\n| labelPosition | `false` | 标签位置。输入框左侧或者顶部    | `left` \\| `top`                   | `left`   |\n| colon         | `false` | 是否在标签后显示冒号            | `boolean`                         | `false`  |\n| required      | `false` | 是否在标签前显示必填标识        | `boolean`                         | `false`  |\n| brief         | `false` | 其他内容                        | `ReactNode`                       |          |\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/index.tsx",
    "content": "export { default as NumberKeyboardView } from './NumberKeyboardView';\nexport { default as NumberKeyboardItem } from './NumberKeyboardItem';\nexport { default as NumberKeyboardInput } from './NumberKeyboardInput';\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/type.ts",
    "content": "import { ReactNode } from 'react';\nimport { StyleProp, TextStyle, ViewStyle } from 'react-native';\n\nexport type NumberKeyBoardType = 'number' | 'idcard' | 'integer';\n\nexport interface NumberKeyboardViewProps {\n  /** 键盘类型 数字 身份证 整数 */\n  type?: NumberKeyBoardType;\n  /** 按键事件 */\n  onPress?: (key: string) => void;\n  /** 删除事件 */\n  onDelete?: () => void;\n  /** 提交事件 */\n  onSubmit?: () => void;\n  /** 确认按钮的文本 */\n  submitText?: string;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n  /** 是否允许负数 */\n  allowNegative?: boolean;\n  /** 是否显示清除按钮 */\n  allowClear?: boolean;\n}\n\nexport interface NumberKeyboardItemProps\n  extends Pick<NumberKeyboardViewProps, 'type' | 'activeOpacity' | 'allowNegative'> {\n  value?: string;\n  onChange?: (value?: string) => void;\n  onCheck?: (value: string) => Promise<any>;\n  placeholder?: string;\n  style?: StyleProp<ViewStyle>;\n  /** 输入框自定义样式 */\n  inputStyle?: StyleProp<TextStyle>;\n  /** 右侧内容 */\n  extra?: ReactNode;\n  /** 是否显示清除图标 */\n  allowClear?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 保留小数位 */\n  digit?: number;\n  inForm?: boolean;\n}\n\nexport interface NumberKeyboardInputProps extends NumberKeyboardItemProps {\n  /** 标签文本 */\n  label?: ReactNode;\n  /** 标签位置。可选值：左侧/上方 */\n  labelPosition?: 'left' | 'top';\n  /** 是否显示冒号 */\n  colon?: boolean;\n  /** 是否必填项 */\n  required?: boolean;\n  /** 其他内容 */\n  brief?: ReactNode;\n  itemHeight?: number;\n}\n\nexport interface NumberKeyboardModalProps extends Omit<NumberKeyboardViewProps, 'onSubmit'> {\n  value?: string;\n  onSubmit: (value: string) => void;\n  prefixLabel?: string;\n}\n\nexport interface NumberKeyboardRef {\n  focus: () => void;\n}\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/useNumberKeyboard.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport Toast from '../toast';\nimport type { NumberKeyboardInputProps } from './type';\nimport { formatValue } from './util';\n\nexport default function useNumberKeyboard({\n  type,\n  value,\n  onChange,\n  onCheck,\n  digit = 0,\n  placeholder = '请输入',\n}: Pick<NumberKeyboardInputProps, 'value' | 'onChange' | 'onCheck' | 'digit' | 'placeholder' | 'type'>) {\n  const [currentText, setCurrentText] = useSafeState<string>();\n\n  useEffect(() => {\n    setCurrentText(value ?? placeholder ?? '');\n  }, [value, placeholder]);\n\n  /**\n   * 根据type对value进行合法性校验\n   */\n  const handleSubmit = async (value: string) => {\n    // 对value进行校验，判断是否是数字，支持负数\n    if (!/^-?\\d*\\.?\\d*$/.test(value)) {\n      Toast.middle({ content: '请输入正确的数字格式' });\n      return;\n    }\n\n    try {\n      const text = formatValue(value, type, digit) + '';\n      await onCheck?.(text);\n      if (onChange) {\n        onChange(`${text}`);\n      } else {\n        setCurrentText(text || placeholder);\n      }\n    } catch (error: any) {\n      Toast.middle({ content: error.message });\n    }\n  };\n\n  const handleInputClear = () => {\n    if (onChange) {\n      onChange();\n    } else {\n      setCurrentText(placeholder);\n    }\n  };\n\n  return {\n    currentText,\n    handleSubmit: useMemoizedFn(handleSubmit),\n    handleInputClear: useMemoizedFn(handleInputClear),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/useNumberKeyboardModal.ts",
    "content": "import { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { ImperativeModalChildrenProps } from '../modal/type';\nimport { NumberKeyboardModalProps } from './type';\n\nexport default function useNumberKeyboardModal({\n  value = '',\n  onPress,\n  onDelete,\n  onSubmit,\n  closeModal,\n}: Pick<\n  ImperativeModalChildrenProps<NumberKeyboardModalProps>,\n  'value' | 'onPress' | 'onDelete' | 'onSubmit' | 'closeModal'\n>) {\n  const [text, setText] = useSafeState(value);\n\n  /** 点击数字，第一次点击的时候，需要把之前的清掉 */\n  const handleChange = (key: string) => {\n    setText(text => text + key);\n    onPress?.(key);\n  };\n\n  const handleInputClear = () => {\n    setText('');\n  };\n\n  const handleDelete = () => {\n    setText(text => (text.length > 0 ? text.slice(0, text.length - 1) : ''));\n    onDelete?.();\n  };\n\n  const handleSubmit = () => {\n    onSubmit?.(text);\n    closeModal?.();\n  };\n\n  return {\n    text,\n    handleInputClear: useMemoizedFn(handleInputClear),\n    handleChange: useMemoizedFn(handleChange),\n    handleSubmit: useMemoizedFn(handleSubmit),\n    handleDelete: useMemoizedFn(handleDelete),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/number-keyboard/util.ts",
    "content": "import { NumberKeyBoardType } from './type';\n\n/**\n * 格式化输入的值\n * @param value 输入的值\n * @param type 类型\n * @param digit 小数位数\n * @returns\n */\nexport function formatValue(value: string, type?: NumberKeyBoardType, digit = 2) {\n  if (!value || !type) return value;\n\n  switch (type) {\n    case 'idcard':\n    default:\n      return value;\n\n    case 'integer':\n      return +value;\n\n    case 'number':\n      return (+value).toFixed(digit);\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/pagination/index.md",
    "content": "---\ntitle: Pagination - 分页器组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 反馈组件\n  path: /feedback\n---\n\n# Pagination 分页器组件\n\n## 效果演示\n\n### 1. 常规的分页器\n\n```tsx | pure\n<Pagination\n  total={66}\n  onChange={e => {\n    Alert.alert(e + '');\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"常规的分页器 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609321630003460726.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 手动设置 page\n\n```tsx | pure\n<Pagination\n  page={3}\n  total={66}\n  onChange={e => {\n    Alert.alert(e + '');\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"手动设置 page ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609321630007353263.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义按钮\n\n```tsx | pure\n<Pagination\n  total={66}\n  onChange={e => {\n    Alert.alert(e + '');\n  }}\n  prevButtonRender={isFirstPage => {\n    return isFirstPage ? <Text>isFirstPage</Text> : <Text>notFirstPage</Text>;\n  }}\n  nextButtonRender={isLastPage => {\n    return isLastPage ? <Text>LastPage</Text> : <Text>notLastPage</Text>;\n  }}\n  counterRender={(currentindex, totalPages) => {\n    return <Text>{currentindex + '/' + totalPages}</Text>;\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义按钮 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609321630007184387.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| page | `false` | 当前页数 | `number` | `1` |\n| total | `false` | 总数量 | `number` |  |\n| pageSize | `false` | 一页的数量 | `number` | `10` |\n| onChange | `false` | 页面改变的事件 | `(page: number) => void` |  |\n| prevButtonText | `false` | 上一页按钮文字 | `string` | `上一页` |\n| nextButtonText | `false` | 下一页按钮文字 | `string` | `下一页` |\n| prevButtonRender | `false` | 自定义上一页按钮 | `(isFirstPage: boolean) => ReactElement` |  |\n| nextButtonRender | `false` | 自定义下一页按钮 | `(isLastPage: boolean) => ReactElement` |  |\n| counterRender | `false` | 自定义计数器 | `(current: number, totalpages: number) => ReactElement` |  |\n| activeOpacity | `false` | 上一页/下一页按下时的不透明度 | `number` | `0.6` |\n"
  },
  {
    "path": "packages/react-native/src/pagination/index.tsx",
    "content": "import React, { FC, ReactElement, useMemo } from 'react';\n\nimport Flex from '../flex';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport usePagination from './usePagination';\n\nexport interface PaginationProps {\n  /** 当前页数 */\n  page?: number;\n  /** 总数量 */\n  total: number;\n  /** 一页的数量 */\n  pageSize?: number;\n  /** 页面改变的事件 */\n  onChange?: (page: number) => void;\n  /** 上一页按钮文字 */\n  prevButtonText?: string;\n  /** 下一页按钮文字 */\n  nextButtonText?: string;\n  /** 自定义上一页按钮 */\n  prevButtonRender?: (isFirstPage: boolean) => ReactElement;\n  /** 自定义下一页按钮 */\n  nextButtonRender?: (isLastPage: boolean) => ReactElement;\n  /** 自定义计数器 */\n  counterRender?: (current: number, totalPage: number) => ReactElement;\n  /** 上一页/下一页按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nconst Pagination: FC<PaginationProps> = ({\n  page = 1,\n  pageSize = 10,\n  total,\n  onChange,\n  prevButtonText = '上一页',\n  nextButtonText = '下一页',\n  prevButtonRender,\n  nextButtonRender,\n  counterRender,\n  activeOpacity = 0.6,\n}) => {\n  const { current, prev, next, totalPage, isFirstPage, isLastPage } = usePagination({\n    page,\n    pageSize,\n    total,\n    onChange,\n  });\n\n  /** 渲染上一页按钮 */\n  const PrevBtn = useMemo(() => {\n    if (prevButtonRender) {\n      return prevButtonRender(isFirstPage);\n    }\n    return (\n      <Text variant=\"p1\" color={isFirstPage ? 'disabled' : 'text'}>\n        {prevButtonText}\n      </Text>\n    );\n  }, [isFirstPage, prevButtonRender, prevButtonText]);\n\n  /** 渲染当前页 */\n  const Current = useMemo(() => {\n    if (counterRender) {\n      return counterRender(current, totalPage);\n    }\n    return (\n      <Flex>\n        <Text variant=\"p1\" color=\"primary200\">\n          {current}\n        </Text>\n        <Text variant=\"p1\" color=\"text\">\n          {' '}\n          / {totalPage}\n        </Text>\n      </Flex>\n    );\n  }, [counterRender, current, totalPage]);\n\n  /** 渲染下一页按钮 */\n  const NextBtn = useMemo(() => {\n    if (nextButtonRender) {\n      return nextButtonRender(isLastPage);\n    }\n    return (\n      <Text variant=\"p1\" color={isLastPage ? 'disabled' : 'text'}>\n        {nextButtonText}\n      </Text>\n    );\n  }, [isLastPage, nextButtonRender, nextButtonText]);\n\n  return (\n    <Flex flexDirection=\"row\" justifyContent=\"space-between\">\n      <Pressable activeOpacity={activeOpacity} disabled={isFirstPage} onPress={prev}>\n        {PrevBtn}\n      </Pressable>\n      {Current}\n      <Pressable disabled={isLastPage} activeOpacity={activeOpacity} onPress={next}>\n        {NextBtn}\n      </Pressable>\n    </Flex>\n  );\n};\nPagination.displayName = 'Pagination';\n\nexport default Pagination;\n"
  },
  {
    "path": "packages/react-native/src/pagination/usePagination.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { PaginationProps } from '.';\n\nexport default function usePagination({\n  page = 1,\n  pageSize = 10,\n  total,\n  onChange,\n}: Pick<PaginationProps, 'page' | 'pageSize' | 'total' | 'onChange'>) {\n  const [current, setCurrent] = useSafeState(page);\n  const [totalPage, setTotalPage] = useSafeState(Math.ceil(total / pageSize));\n\n  useEffect(() => {\n    setCurrent(page);\n  }, [page]);\n\n  useEffect(() => {\n    setTotalPage(Math.ceil(total / pageSize));\n  }, [pageSize, total]);\n\n  const isFirstPage = current === 1;\n  const isLastPage = current === totalPage;\n\n  /** 前一页 */\n  const prev = () => {\n    const perPage = current - 1;\n    setCurrent(perPage);\n    onChange?.(perPage);\n  };\n\n  /** 后一页 */\n  const next = () => {\n    const nextPage = current + 1;\n    setCurrent(nextPage);\n    onChange?.(nextPage);\n  };\n\n  return {\n    current,\n    totalPage,\n    isFirstPage,\n    isLastPage,\n\n    prev: useMemoizedFn(prev),\n    next: useMemoizedFn(next),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/passcode/PasscodeItem.tsx",
    "content": "import React, { forwardRef, memo } from 'react';\nimport { Platform, StyleSheet, TextInput } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useBoolean } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport { ONE_PIXEL, px } from '../helpers/normalize';\nimport { Theme } from '../theme';\nimport type { PasscodeItemProps } from './type';\n\nconst majorVersionIOS: number = parseInt(`${Platform.Version}`, 10);\nconst isOTPSupported: boolean = Platform.OS === 'ios' && majorVersionIOS >= 12;\n\nconst PasscodeItem = forwardRef<TextInput, PasscodeItemProps>(\n  (\n    {\n      inputContainerStyle,\n      focusStyle,\n      inputStyle,\n      inputValue,\n      handleKeyPress,\n      handleChangeText,\n      selectTextOnFocus,\n      ...rest\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const [focused, { setTrue, setFalse }] = useBoolean(false);\n\n    const styles = StyleSheet.create({\n      input: {\n        textAlign: 'center',\n        height: px(40),\n        width: px(40),\n        padding: 0,\n        color: theme.colors.gray500,\n      },\n    });\n\n    return (\n      <Box\n        borderWidth={ONE_PIXEL}\n        borderColor=\"primary200\"\n        borderRadius={'x1'}\n        style={[inputContainerStyle, focused && focusStyle]}\n      >\n        <TextInput\n          ref={ref}\n          textAlignVertical=\"center\"\n          autoCapitalize=\"none\"\n          autoCorrect={false}\n          autoComplete=\"off\"\n          onBlur={setFalse}\n          onFocus={setTrue}\n          onKeyPress={handleKeyPress} // 键盘按下事件， 只用来处理键盘按下删除键的场景\n          onChangeText={handleChangeText} // 输入框内容改变事件, 用来处理输入框内容改变的场景\n          selectionColor={theme.colors.primary200}\n          style={[styles.input, inputStyle]}\n          textContentType={isOTPSupported ? 'oneTimeCode' : 'none'}\n          multiline={false}\n          underlineColorAndroid=\"transparent\"\n          // https://github.com/facebook/react-native/issues/18339\n          selectTextOnFocus={Platform.select({\n            ios: selectTextOnFocus,\n            android: true,\n          })}\n          value={inputValue}\n          {...rest}\n        />\n      </Box>\n    );\n  }\n);\nPasscodeItem.displayName = 'PasscodeItem';\n\nexport default memo(PasscodeItem);\n"
  },
  {
    "path": "packages/react-native/src/passcode/helpers.ts",
    "content": "export const fillOtpCode = (count: number, value?: string) => {\n  const otpCode: { [key: string]: string } = {};\n  for (let i = 0; i < count; i++) {\n    otpCode[`${i}`] = value?.[i] || '';\n  }\n  return otpCode;\n};\n"
  },
  {
    "path": "packages/react-native/src/passcode/index.md",
    "content": "---\ntitle: Passcode - 密码/验证码组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 反馈组件\n  path: /feedback\n---\n\n# Passcode 密码/验证码组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Passcode clearTextOnFocus onChange={handleChange} keyboardType=\"phone-pad\" ref={otpRef} selectTextOnFocus={false} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"默认效果 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643188571380928998.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 修改验证码位数\n\n```tsx | pure\n<Passcode\n  clearTextOnFocus\n  onChange={handleChange}\n  keyboardType=\"phone-pad\"\n  count={4}\n  ref={otpRef}\n  selectTextOnFocus={false}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"修改验证码位数 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643188376632283785.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义样式\n\n```tsx | pure\n<Passcode\n  secureTextEntry={false}\n  ref={otpRef}\n  style={{ margin: 20 }}\n  inputContainerStyle={{ borderWidth: 1, borderColor: 'green' }}\n  focusStyle={{ borderWidth: 1, borderColor: 'red' }}\n  onFinish={() => console.log('222')}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义样式 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643188967829347930.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 密码输入样式\n\n```tsx | pure\n<Passcode\n  secureTextEntry={true}\n  ref={otpRef}\n  style={{ margin: 20 }}\n  inputContainerStyle={{ borderWidth: 1, borderColor: 'green' }}\n  focusStyle={{ borderWidth: 1, borderColor: 'red' }}\n  onFinish={() => console.log('222')}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"手动设置 page ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643189073013519274.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Passcode (继承自 `TextInputProps`)\n\n| 属性                | 必填    | 说明                   | 类型                     | 默认值      |\n| ------------------- | ------- | ---------------------- | ------------------------ | ----------- |\n| keyboardType        | `false` | 键盘类型               | `KeyboardType`           | `phone-pad` |\n| style               | `false` | 容器样式               | `ViewStyle`              |             |\n| focusStyle          | `false` | 聚焦的某个输入框的样式 | `ViewStyle`              |             |\n| value               | `false` | 当前输入的验证码       | `string`                 |             |\n| onChange            | `false` | 验证码输入回调         | `(code: string) => void` |             |\n| inputContainerStyle | `false` | 输入框容器样式         | `ViewStyle`              |             |\n| inputStyle          | `false` | 输入框样式             | `TextStyle`              |             |\n| count               | `false` | 验证码长度             | `number`                 | `6`         |\n| onFinish            | `false` | 验证码输入完成后的回调 | `() => void`             |             |\n\n### PasswordInputRef\n\n| 属性     | 说明                 | 类型            |\n| -------- | -------------------- | --------------- |\n| reset    | 重置验证码           | `() => void;`   |\n| focus    | 聚焦验证码           | `() => void;`   |\n| getValue | 获取当前输入的验证码 | `() => string;` |\n"
  },
  {
    "path": "packages/react-native/src/passcode/index.tsx",
    "content": "import React, { forwardRef } from 'react';\nimport { Platform, TextInput } from 'react-native';\n\nimport Flex from '../flex';\nimport PasscodeItem from './PasscodeItem';\nimport type { PasscodeProps, PasscodeRef } from './type';\nimport usePasscode from './usePasscode';\n\nconst Passcode = forwardRef<PasscodeRef, PasscodeProps>(\n  (\n    {\n      style,\n      keyboardType = 'phone-pad',\n      focusStyle,\n      value,\n      onChange,\n      inputContainerStyle,\n      inputStyle,\n      count = 6,\n      autoFocus = true,\n      autoCapitalize = 'none',\n      clearTextOnFocus = false,\n      placeholder = '',\n      secureTextEntry = false,\n      selectTextOnFocus = true,\n      onFinish,\n      ...restProps\n    },\n    ref\n  ) => {\n    const { otpCode, inputs, handleKeyPress, handleChangeText } = usePasscode({\n      onChange,\n      value,\n      count,\n      ref,\n      onFinish,\n    });\n\n    return (\n      <Flex justifyContent={'space-between'} style={style}>\n        {Array(count)\n          .fill('')\n          .map((_, index) => {\n            const inputValue = otpCode[`${index}`];\n\n            if (!inputs.current[index]) {\n              inputs.current[index] = React.createRef<TextInput>();\n            }\n\n            return (\n              <PasscodeItem\n                key={index}\n                accessible\n                autoCapitalize={autoCapitalize}\n                autoFocus={index === 0 && autoFocus}\n                clearTextOnFocus={clearTextOnFocus}\n                focusStyle={focusStyle}\n                handleKeyPress={handleKeyPress(index)}\n                handleChangeText={handleChangeText(index)}\n                inputContainerStyle={inputContainerStyle}\n                inputStyle={inputStyle}\n                inputValue={inputValue}\n                keyboardType={keyboardType}\n                maxLength={Platform.select({\n                  android: 1,\n                  ios: index === 0 ? count : 1,\n                })}\n                placeholder={placeholder}\n                ref={inputs.current[index]}\n                secureTextEntry={secureTextEntry}\n                selectTextOnFocus={selectTextOnFocus}\n                {...restProps}\n              />\n            );\n          })}\n      </Flex>\n    );\n  }\n);\nPasscode.displayName = 'Passcode';\n\nexport default Passcode;\n\nexport type { PasscodeRef };\n"
  },
  {
    "path": "packages/react-native/src/passcode/reducer.ts",
    "content": "import { fillOtpCode } from './helpers';\n\ntype SetOtpTextForIndexPayload = { index: number; text: string };\ntype SetOtpTextForIndex = {\n  type: 'setOtpTextForIndex';\n  payload: SetOtpTextForIndexPayload;\n};\n\ntype SetOtpCodePayload = { count: number; code: string };\ntype SetOtpCode = {\n  type: 'setOtpCode';\n  payload: SetOtpCodePayload;\n};\n\ntype ClearOtpPayload = number;\ntype ClearOtp = { type: 'clearOtp'; payload: ClearOtpPayload };\n\ntype SetHasKeySupportPayload = boolean;\ntype SetHasKeySupport = { type: 'setHasKeySupport'; payload: SetHasKeySupportPayload };\n\nexport type ReducerState = {\n  otpCode: { [key: string]: string };\n  handleChange?: (otpCode: string) => void;\n  hasKeySupport: boolean;\n};\n\nexport type ActionTypes = {\n  setOtpTextForIndex: 'setOtpTextForIndex';\n  setOtpCode: 'setOtpCode';\n  clearOtp: 'clearOtp';\n  setHasKeySupport: 'setHasKeySupport';\n};\n\nexport type Actions = SetOtpTextForIndex | SetOtpCode | ClearOtp | SetHasKeySupport;\n\nconst ACTION_TYPES: ActionTypes = {\n  setOtpTextForIndex: 'setOtpTextForIndex',\n  setOtpCode: 'setOtpCode',\n  clearOtp: 'clearOtp',\n  setHasKeySupport: 'setHasKeySupport',\n};\n\nexport default (state: ReducerState, { type, payload }: Actions) => {\n  switch (type) {\n    case ACTION_TYPES.setOtpTextForIndex: {\n      const otpCode = {\n        ...state.otpCode,\n        [`${(payload as SetOtpTextForIndexPayload).index}`]: (payload as SetOtpTextForIndexPayload).text,\n      };\n      state.handleChange?.(Object.values(otpCode).join(''));\n\n      return {\n        ...state,\n        otpCode,\n        index: (payload as SetOtpTextForIndexPayload).index,\n      };\n    }\n\n    case ACTION_TYPES.setOtpCode: {\n      const otpCode = fillOtpCode((payload as SetOtpCodePayload).count, (payload as SetOtpCodePayload).code);\n\n      state.handleChange?.(Object.values(otpCode).join(''));\n\n      return {\n        ...state,\n        otpCode,\n      };\n    }\n\n    case ACTION_TYPES.clearOtp: {\n      const otpCode = fillOtpCode(payload as ClearOtpPayload);\n      state.handleChange?.(Object.values(otpCode).join(''));\n\n      return { ...state, otpCode };\n    }\n\n    case ACTION_TYPES.setHasKeySupport: {\n      return { ...state, hasKeySupport: payload as SetHasKeySupportPayload };\n    }\n\n    default:\n      return state;\n  }\n};\n"
  },
  {
    "path": "packages/react-native/src/passcode/type.ts",
    "content": "import {\n  KeyboardType,\n  NativeSyntheticEvent,\n  StyleProp,\n  TextInputKeyPressEventData,\n  TextInputProps,\n  TextStyle,\n  ViewStyle,\n} from 'react-native';\n\nexport interface PasscodeProps extends Omit<TextInputProps, 'onChange' | 'onChangeText'> {\n  /** 键盘类型 */\n  keyboardType?: KeyboardType;\n  /** 容器样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 聚焦的某个输入框的样式 */\n  focusStyle?: StyleProp<ViewStyle>;\n  /** 当前输入的验证码 */\n  value?: string;\n  /** 验证码输入回调 */\n  onChange?: (code: string) => void;\n  /** 输入框容器样式 */\n  inputContainerStyle?: StyleProp<ViewStyle>;\n  /** 输入框样式 */\n  inputStyle?: StyleProp<TextStyle>;\n  /** 验证码长度 */\n  count?: number;\n  /** 验证码输入完成后的回调 */\n  onFinish?: (value: string) => void;\n}\n\nexport interface PasscodeRef {\n  /** 重置验证码 */\n  reset: () => void;\n  /** 聚焦验证码 */\n  focus: () => void;\n  /** 获取当前输入的验证码 */\n  getValue: () => string;\n}\n\nexport interface PasscodeItemProps extends TextInputProps {\n  /** 输入框的样式 */\n  inputContainerStyle?: StyleProp<ViewStyle>;\n  /** 当前输入框的样式 */\n  focusStyle?: StyleProp<ViewStyle>;\n  /** TextInput的样式 */\n  inputStyle?: StyleProp<TextStyle>;\n  /** 输入的值 */\n  inputValue: string;\n  /** 按键按下的回调事件 */\n  handleKeyPress: (keyPressEvent: NativeSyntheticEvent<TextInputKeyPressEventData>) => void;\n  /** 输入框内容改变时的回调事件 */\n  handleChangeText: (text: string) => void;\n}\n"
  },
  {
    "path": "packages/react-native/src/passcode/usePasscode.ts",
    "content": "import { ForwardedRef, RefObject, useEffect, useImperativeHandle, useReducer, useRef } from 'react';\nimport { Keyboard, NativeSyntheticEvent, Platform, TextInput, TextInputKeyPressEventData } from 'react-native';\n\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport { fillOtpCode } from './helpers';\nimport reducer from './reducer';\nimport { PasscodeProps, PasscodeRef } from './type';\n\nexport default function usePasscode({\n  onChange,\n  count,\n  value,\n  ref,\n  onFinish,\n}: Pick<PasscodeProps, 'onChange' | 'value' | 'onFinish'> & {\n  count: number;\n  ref: ForwardedRef<PasscodeRef>;\n}) {\n  const previousCopiedText = useRef<string>('');\n  const inputs = useRef<Array<RefObject<TextInput>>>([]);\n\n  const [{ otpCode, hasKeySupport }, dispatch] = useReducer(reducer, {\n    otpCode: fillOtpCode(count, value),\n    handleChange: onChange,\n    hasKeySupport: Platform.OS === 'ios',\n  });\n\n  useEffect(() => {\n    if (value) {\n      dispatch({\n        type: 'setOtpCode',\n        payload: { count, code: value },\n      });\n    }\n  }, [value, count]);\n\n  useImperativeHandle(ref, () => ({\n    reset: () => {\n      dispatch({ type: 'clearOtp', payload: count });\n      inputs.current.forEach(input => input?.current?.clear());\n      previousCopiedText.current = '';\n    },\n    focus: () => {\n      const firstInput = inputs.current[0];\n      firstInput?.current?.focus();\n    },\n    getValue: () => {\n      return Object.values(otpCode).join('');\n    },\n  }));\n\n  const focusInput = (index: number): void => {\n    if (index >= 0 && index < count) {\n      const input = inputs.current[index];\n      input?.current?.focus();\n    }\n  };\n\n  const handleClearInput = (inputIndex: number) => {\n    const input = inputs.current[inputIndex];\n    input?.current?.clear();\n    dispatch({\n      type: 'setOtpTextForIndex',\n      payload: {\n        index: inputIndex,\n        text: '',\n      },\n    });\n  };\n\n  const handleChangeText = (index: number) => (text: string) => {\n    handleInputTextChange(text, index);\n  };\n\n  const handleKeyPress =\n    (index: number) =>\n    ({ nativeEvent: { key } }: NativeSyntheticEvent<TextInputKeyPressEventData>) => {\n      if (Platform.OS === 'android' && !hasKeySupport && !isNaN(parseInt(key))) {\n        dispatch({ type: 'setHasKeySupport', payload: true });\n      }\n\n      if (key === 'Backspace') {\n        // 当前输入框的值\n        const value = otpCode[`${index}`];\n        // 清除当前输入框的值\n        handleClearInput(index);\n        // 如果当前输入框的值为空，则聚焦上一个输入框\n        if (!value) {\n          focusInput(index - 1);\n        }\n      }\n    };\n\n  const handleInputTextChange = (text: string, index: number): void => {\n    if ([1, 2, 3, 4, 5, 6, 7, 8, 9, 0].includes(parseInt(text))) {\n      dispatch({\n        type: 'setOtpTextForIndex',\n        payload: {\n          text,\n          index,\n        },\n      });\n      focusInput(index + 1);\n    } else {\n      handleClearInput(index);\n    }\n  };\n\n  useEffect(() => {\n    const value = Object.values(otpCode).join('');\n    if (value.length === count) {\n      onFinish?.(value);\n      Keyboard.dismiss();\n    }\n  }, [count, otpCode]);\n\n  return {\n    otpCode,\n    inputs,\n    handleKeyPress: useMemoizedFn(handleKeyPress),\n    handleChangeText: useMemoizedFn(handleChangeText),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/portal/PortalConsumer.tsx",
    "content": "import React, { PropsWithChildren } from 'react';\n\nimport { PortalMethods } from './PortalContext';\n\nexport default class PortalConsumer extends React.Component<PropsWithChildren<{ manager: PortalMethods }>> {\n  private key: any;\n\n  componentDidMount() {\n    this.checkManager();\n\n    this.key = this.props.manager.mount(this.props.children);\n  }\n\n  componentDidUpdate() {\n    this.props.manager.update(this.key, this.props.children);\n  }\n\n  componentWillUnmount() {\n    this.props.manager.unmount(this.key);\n  }\n\n  private checkManager() {\n    if (!this.props.manager) {\n      throw new Error('你好像忘记用Portal.Provider包裹你的应用了。');\n    }\n  }\n\n  render() {\n    return null;\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/portal/PortalContext.ts",
    "content": "import React from 'react';\n\nexport type PortalMethods = {\n  mount: (children: React.ReactNode) => number;\n  update: (key: number, children: React.ReactNode) => void;\n  unmount: (key: number) => void;\n};\n\nexport const PortalContext = React.createContext<PortalMethods>(null as any);\n"
  },
  {
    "path": "packages/react-native/src/portal/PortalGuard.ts",
    "content": "import { DeviceEventEmitter, NativeEventEmitter } from 'react-native';\n\n// 事件名\nexport const ADD_TYPE = 'TD_DESIGN_REACT_NATIVE_ADD_PORTAL';\nexport const REMOVE_TYPE = 'TD_DESIGN_REACT_NATIVE_REMOVE_PORTAL';\n\n// 全局的监听事件\nexport const TopViewEventEmitter = DeviceEventEmitter || new NativeEventEmitter();\n\nclass PortalGuard {\n  private nextKey = 10000;\n\n  add = (e: React.ReactNode) => {\n    const key = this.nextKey++;\n    // 发射监听事件\n    TopViewEventEmitter.emit(ADD_TYPE, e, key);\n    return key;\n  };\n\n  remove = (key: number) => TopViewEventEmitter.emit(REMOVE_TYPE, key);\n}\n\nexport const portal = new PortalGuard();\n"
  },
  {
    "path": "packages/react-native/src/portal/PortalHost.tsx",
    "content": "import React, { PropsWithChildren } from 'react';\nimport { EventSubscription, View } from 'react-native';\n\nimport { PortalContext, PortalMethods } from './PortalContext';\nimport { ADD_TYPE, REMOVE_TYPE, TopViewEventEmitter } from './PortalGuard';\nimport PortalManager from './PortalManager';\n\ntype Operation =\n  | { type: 'mount'; key: number; children: React.ReactNode }\n  | { type: 'update'; key: number; children: React.ReactNode }\n  | { type: 'unmount'; key: number };\n\nexport default class PortalHost extends React.Component<PropsWithChildren<{}>> {\n  static displayName = 'Portal.Host';\n\n  private nextKey = 0;\n  private queue: Operation[] = [];\n  private manager: PortalManager | null | undefined;\n\n  private addListener: EventSubscription | undefined;\n  private removeListener: EventSubscription | undefined;\n\n  componentDidMount() {\n    const manager = this.manager;\n    const queue = this.queue;\n\n    this.addListener = TopViewEventEmitter.addListener(ADD_TYPE, this.mount);\n    this.removeListener = TopViewEventEmitter.addListener(REMOVE_TYPE, this.unmount);\n\n    while (queue.length && manager) {\n      const action = queue.pop();\n      if (!action) {\n        continue;\n      }\n\n      switch (action.type) {\n        case 'mount':\n          manager.mount(action.key, action.children);\n          break;\n\n        case 'update':\n          manager.update(action.key, action.children);\n          break;\n\n        case 'unmount':\n          manager.unmount(action.key);\n          break;\n\n        default:\n          break;\n      }\n    }\n  }\n\n  componentWillUnmount() {\n    this.addListener?.remove();\n    this.removeListener?.remove();\n  }\n\n  private setManager = (manager: PortalManager | undefined | null) => {\n    this.manager = manager;\n  };\n\n  private mount = (children: React.ReactNode, _key?: number) => {\n    const key = _key || this.nextKey++;\n\n    if (this.manager) {\n      this.manager.mount(key, children);\n    } else {\n      this.queue.push({ type: 'mount', key, children });\n    }\n\n    return key;\n  };\n\n  private update = (key: number, children: React.ReactNode) => {\n    if (this.manager) {\n      this.manager.update(key, children);\n    } else {\n      const op: Operation = { type: 'mount', key, children };\n      const index = this.queue.findIndex(o => o.type === 'mount' || (o.type === 'update' && o.key === key));\n\n      if (index > -1) {\n        this.queue[index] = op;\n      } else {\n        this.queue.push(op as Operation);\n      }\n    }\n  };\n\n  private unmount = (key: number) => {\n    if (this.manager) {\n      this.manager.unmount(key);\n    } else {\n      this.queue.push({ type: 'unmount', key });\n    }\n  };\n\n  render() {\n    const manager: PortalMethods = {\n      mount: this.mount,\n      update: this.update,\n      unmount: this.unmount,\n    };\n\n    return (\n      <PortalContext.Provider value={manager}>\n        <View style={{ flex: 1 }} collapsable={false}>\n          {this.props.children}\n        </View>\n        <PortalManager ref={this.setManager} />\n      </PortalContext.Provider>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/portal/PortalManager.tsx",
    "content": "import React from 'react';\nimport { StyleSheet, View } from 'react-native';\n\ntype State = {\n  portals: Array<{\n    key: number;\n    children: React.ReactNode;\n  }>;\n};\n\nexport default class PortalManager extends React.PureComponent<{}, State> {\n  state: State = {\n    portals: [],\n  };\n\n  mount = (key: number, children: React.ReactNode) => {\n    this.setState(state => ({\n      portals: [...state.portals, { key, children }],\n    }));\n  };\n\n  update = (key: number, children: React.ReactNode) =>\n    this.setState(state => ({\n      portals: state.portals.map(item => {\n        if (item.key === key) {\n          return { ...item, children };\n        }\n        return item;\n      }),\n    }));\n\n  unmount = (key: number) =>\n    this.setState(state => ({\n      portals: state.portals.filter(item => item.key !== key),\n    }));\n\n  render() {\n    return this.state.portals.map(({ key, children }) => (\n      <View\n        key={key}\n        /* Need collapsable=false here to clip the elevations, otherwise they appear above sibling components */\n        collapsable={false}\n        pointerEvents=\"box-none\"\n        style={StyleSheet.absoluteFill}\n      >\n        {children}\n      </View>\n    ));\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/portal/index.tsx",
    "content": "import React, { PropsWithChildren } from 'react';\n\nimport PortalConsumer from './PortalConsumer';\nimport { PortalContext } from './PortalContext';\nimport { portal } from './PortalGuard';\nimport PortalHost from './PortalHost';\n\nclass Portal extends React.Component<PropsWithChildren<{}>> {\n  static Host = PortalHost;\n  static add = portal.add;\n  static remove = portal.remove;\n\n  render() {\n    const { children } = this.props;\n\n    return (\n      <PortalContext.Consumer>\n        {manager => <PortalConsumer manager={manager}>{children}</PortalConsumer>}\n      </PortalContext.Consumer>\n    );\n  }\n}\n\nexport default Portal;\n"
  },
  {
    "path": "packages/react-native/src/pressable/index.md",
    "content": "---\ntitle: Pressable - 可点击组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# Pressable 可点击组件\n\n基于[React Native Pressable](https://reactnative.dev/docs/pressable)封装。\n\n**注意：Pressable 是 react-native 在 0.63 版本引入的新功能，也意味着如果你的项目是低于 0.63 版本的话，Pressable 组件无法使用**\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Pressable onPress={handlePress} onLongPress={handleLongPress}>\n  <Box width={90} height={90} backgroundColor=\"gray300\" />\n</Pressable>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"默认效果 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643190132405185135.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性           | 必填    | 说明                               | 类型                                     | 默认值 |\n| -------------- | ------- | ---------------------------------- | ---------------------------------------- | ------ |\n| onPress        | `false` | 点击事件                           | `(event: GestureResponderEvent) => void` |        |\n| onPressIn      | `false` | 点击事件执行前                     | `(event: GestureResponderEvent) => void` |        |\n| onPressOut     | `false` | 点击事件执行后                     | `(event: GestureResponderEvent) => void` |        |\n| onLongPress    | `false` | 长按事件                           | `(event: GestureResponderEvent) => void` |        |\n| disabled       | `false` | 是否禁用                           | `boolean`                                |        |\n| delayLongPress | `false` | 从点击状态进入长按状态的延迟时间   | `number`                                 | 1000   |\n| activeOpacity  | `false` | 点击时的不透明度                   | `number`                                 | 0.5    |\n| pressOffset    | `false` | 手指移出组件但扔持有点击状态的距离 | `number`                                 | 20     |\n| hitOffset      | `false` | 离组件触发 onPressIn 的距离        | `number`                                 | 20     |\n| style          | `false` | 自定义样式                         | `ViewStyle`                              |        |\n"
  },
  {
    "path": "packages/react-native/src/pressable/index.tsx",
    "content": "/**\n * https://github.com/facebook/react-native/blob/16ea9ba8133a5340ed6751ec7d49bf03a0d4c5ea/Libraries/Pressability/Pressability.js#L347\n * # State Machine\n *\n * ┌───────────────┐ ◀──── RESPONDER_RELEASE\n * │ NOT_RESPONDER │\n * └───┬───────────┘ ◀──── RESPONDER_TERMINATED\n *     │\n *     │ RESPONDER_GRANT (HitRect)\n *     │\n *     ▼\n * ┌─────────────────────┐          ┌───────────────────┐              ┌───────────────────┐\n * │ RESPONDER_INACTIVE_ │  DELAY   │ RESPONDER_ACTIVE_ │  T + DELAY   │ RESPONDER_ACTIVE_ │\n * │ PRESS_IN            ├────────▶ │ PRESS_IN          ├────────────▶ │ LONG_PRESS_IN     │\n * └─┬───────────────────┘          └─┬─────────────────┘              └─┬─────────────────┘\n *   │           ▲                    │           ▲                      │           ▲\n *   │LEAVE_     │                    │LEAVE_     │                      │LEAVE_     │\n *   │PRESS_RECT │ENTER_              │PRESS_RECT │ENTER_                │PRESS_RECT │ENTER_\n *   │           │PRESS_RECT          │           │PRESS_RECT            │           │PRESS_RECT\n *   ▼           │                    ▼           │                      ▼           │\n * ┌─────────────┴───────┐          ┌─────────────┴─────┐              ┌─────────────┴─────┐\n * │ RESPONDER_INACTIVE_ │  DELAY   │ RESPONDER_ACTIVE_ │              │ RESPONDER_ACTIVE_ │\n * │ PRESS_OUT           ├────────▶ │ PRESS_OUT         │              │ LONG_PRESS_OUT    │\n * └─────────────────────┘          └───────────────────┘              └───────────────────┘\n *\n * T + DELAY => LONG_PRESS_DELAY + DELAY\n *\n * Not drawn are the side effects of each transition. The most important side\n * effect is the invocation of `onPress` and `onLongPress` that occur when a\n * responder is release while in the \"press in\" states.\n */\nimport React, { memo } from 'react';\nimport { Pressable as RNPressable, PressableProps as RNPressableProps, StyleProp, ViewStyle } from 'react-native';\n\nimport helpers from '../helpers';\n\ntype Rect = {\n  bottom: number;\n  top: number;\n  left: number;\n  right: number;\n};\n\nexport interface PressableProps\n  extends Pick<\n    RNPressableProps,\n    'onPress' | 'onPressIn' | 'onPressOut' | 'onLongPress' | 'disabled' | 'delayLongPress' | 'onLayout' | 'children'\n  > {\n  /** 点击时的不透明度 */\n  activeOpacity?: number;\n  /** 手指移出组件但扔持有点击状态的距离 */\n  pressOffset?: number | Rect;\n  /** 离组件触发 onPressIn 的距离 */\n  hitOffset?: number | Rect;\n  /** 是否激活缩放动效  */\n  scalable?: boolean;\n  style?: StyleProp<ViewStyle>;\n}\n\nconst { px } = helpers;\nfunction Pressable(props: PressableProps) {\n  const {\n    children,\n    activeOpacity = 0.6,\n    pressOffset = px(20),\n    hitOffset,\n    delayLongPress = 1000,\n    style,\n    onPress,\n    ...rest\n  } = props;\n\n  if (!children) return null;\n\n  return (\n    <RNPressable\n      android_disableSound={false}\n      android_ripple={null}\n      pressRetentionOffset={pressOffset}\n      hitSlop={hitOffset}\n      delayLongPress={delayLongPress}\n      style={({ pressed }) => [{ opacity: pressed ? activeOpacity : 1 }, style]}\n      onPress={e => {\n        if (onPress) {\n          setTimeout(() => {\n            onPress(e);\n          }, 100);\n        }\n      }}\n      {...rest}\n    >\n      {children}\n    </RNPressable>\n  );\n}\nPressable.displayName = 'Pressable';\n\nexport default memo(Pressable);\n"
  },
  {
    "path": "packages/react-native/src/progress/CircleProgress.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport Svg, { Circle, Defs, G, LinearGradient, Stop } from 'react-native-svg';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport ReText from '../text/ReText';\nimport { Theme } from '../theme';\nimport { ProgressProps } from './type';\nimport useCircleProgress from './useCircleProgress';\n\nconst { px } = helpers;\nconst AnimatedCircle = Animated.createAnimatedComponent(Circle);\n\nconst CircleProgress: FC<Omit<ProgressProps, 'labelPosition'>> = props => {\n  const theme = useTheme<Theme>();\n  const {\n    width = px(150),\n    color = theme.colors.primary200,\n    bgColor = theme.colors.gray200,\n    strokeWidth = px(8),\n    value = 0,\n    label,\n    showLabel = true,\n    labelStyle,\n    unit,\n  } = props;\n\n  const { radius, textLabel, circumference, animatedProps } = useCircleProgress({\n    width,\n    strokeWidth,\n    unit,\n    value,\n  });\n\n  return (\n    <Box width={width} height={width} position={'relative'}>\n      <Svg width={width} height={width}>\n        <Defs>\n          <LinearGradient id=\"grad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n            <Stop offset=\"0\" stopColor={typeof color === 'string' ? color : color[0]} stopOpacity=\"1\" />\n            <Stop offset=\"1\" stopColor={typeof color === 'string' ? color : color[1]} stopOpacity=\"1\" />\n          </LinearGradient>\n        </Defs>\n        <G rotation=\"-90\" origin={`${width / 2}, ${width / 2}`}>\n          <Circle\n            cx={width / 2}\n            cy={width / 2}\n            r={radius}\n            stroke={bgColor}\n            strokeWidth={strokeWidth}\n            strokeOpacity={1}\n            fill=\"none\"\n          />\n          <AnimatedCircle\n            cx={width / 2}\n            cy={width / 2}\n            r={radius}\n            stroke=\"url(#grad)\"\n            fill=\"none\"\n            strokeLinecap=\"round\"\n            strokeWidth={strokeWidth}\n            strokeDasharray={`${circumference} ${circumference}`}\n            animatedProps={animatedProps}\n          />\n        </G>\n      </Svg>\n      {showLabel ? (\n        <Box\n          style={[\n            StyleSheet.absoluteFillObject,\n            {\n              width: '100%',\n              height: '100%',\n              justifyContent: 'center',\n              alignItems: 'center',\n            },\n            labelStyle,\n          ]}\n        >\n          {typeof label === 'string' ? (\n            <Text variant=\"p1\" color=\"primary_text\">\n              {label}\n            </Text>\n          ) : (\n            label\n          )}\n          <ReText\n            text={textLabel}\n            style={[\n              {\n                fontSize: px(14),\n                color: typeof color === 'string' ? color : theme.colors.primary200,\n                fontWeight: '500',\n                textAlign: 'center',\n              },\n            ]}\n          />\n        </Box>\n      ) : null}\n    </Box>\n  );\n};\nCircleProgress.displayName = 'CircleProgress';\n\nexport default CircleProgress;\n"
  },
  {
    "path": "packages/react-native/src/progress/LineProgress.tsx",
    "content": "import React, { FC } from 'react';\nimport Animated from 'react-native-reanimated';\nimport Svg, { Defs, Line, LinearGradient, Stop } from 'react-native-svg';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport ReText from '../text/ReText';\nimport { Theme } from '../theme';\nimport { ProgressProps } from './type';\nimport useLineProgress from './useLineProgress';\n\nconst { px } = helpers;\nconst AnimatedLine = Animated.createAnimatedComponent(Line);\n\nconst LineProgress: FC<Omit<ProgressProps, 'innerWidth'>> = props => {\n  const theme = useTheme<Theme>();\n  const {\n    width = px(250),\n    color = theme.colors.primary200,\n    bgColor = theme.colors.gray200,\n    strokeWidth = theme.spacing.x2,\n    value = 0,\n    showLabel = true,\n    labelPosition = 'right',\n    unit,\n    label,\n    labelStyle,\n  } = props;\n\n  const { animatedProps, textLabel } = useLineProgress({ width, strokeWidth, unit, value });\n\n  const SvgComp = (\n    <Svg width={width} height={strokeWidth}>\n      <Defs>\n        <LinearGradient id=\"grad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n          <Stop offset=\"0\" stopColor={typeof color === 'string' ? color : color[0]} stopOpacity=\"1\" />\n          <Stop offset=\"1\" stopColor={typeof color === 'string' ? color : color[1]} stopOpacity=\"1\" />\n        </LinearGradient>\n      </Defs>\n      <Line\n        x1={strokeWidth / 2}\n        x2={width - strokeWidth / 2}\n        y1={strokeWidth / 2}\n        y2={strokeWidth / 2}\n        fill=\"none\"\n        stroke={bgColor}\n        strokeWidth={strokeWidth}\n        strokeLinecap=\"round\"\n      />\n      <AnimatedLine\n        x1={strokeWidth / 2}\n        y1={strokeWidth / 2}\n        y2={strokeWidth / 2}\n        fill=\"none\"\n        stroke=\"url(#grad)\"\n        strokeLinecap=\"round\"\n        strokeWidth={strokeWidth}\n        animatedProps={animatedProps}\n      />\n    </Svg>\n  );\n\n  const LabelComp = showLabel ? (\n    <Box style={labelStyle}>\n      {typeof label === 'string' ? (\n        <Text variant=\"p1\" color=\"primary_text\">\n          {label}\n        </Text>\n      ) : (\n        label\n      )}\n      <ReText\n        text={textLabel}\n        style={[\n          {\n            fontSize: px(14),\n            color: typeof color === 'string' ? color : theme.colors.primary200,\n            fontWeight: '500',\n            textAlign: 'center',\n          },\n        ]}\n      />\n    </Box>\n  ) : null;\n\n  if (labelPosition === 'top')\n    return (\n      <Box width={width}>\n        {LabelComp}\n        {SvgComp}\n      </Box>\n    );\n\n  return (\n    <Flex width={width}>\n      {SvgComp}\n      {LabelComp}\n    </Flex>\n  );\n};\nLineProgress.displayName = 'LineProgress';\n\nexport default LineProgress;\n"
  },
  {
    "path": "packages/react-native/src/progress/index.md",
    "content": "---\ntitle: Progress - 进度条组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 反馈组件\n  path: /feedback\n---\n\n# Progress 进度条\n\n## 效果演示\n\n### 1. LineProgress 默认效果\n\n```tsx | pure\n<LineProgress value={70} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609055940832313088.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. LineProgress 值文本在顶部效果\n\n```tsx | pure\n<LineProgress value={100} labelPosition=\"top\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609055836045311052.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. LineProgress 渐变色效果\n\n```tsx | pure\n<LineProgress value={87} color={['#FFD080', 'red']} showLabel labelPosition=\"top\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609055728101996419.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. LineProgress 修改宽度效果\n\n```tsx | pure\n<LineProgress value={87} strokeWidth={16} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609055614844577639.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. CircleProgress 默认效果\n\n```tsx | pure\n<CircleProgress value={80} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609056150372671370.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. CircleProgress 不显示值文本效果\n\n```tsx | pure\n<CircleProgress value={40} showLabel={false} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609056236868086678.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 7. CircleProgress 自定义颜色效果\n\n```tsx | pure\n<CircleProgress value={50} color=\"red\" bgColor=\"green\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609056494084934403.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 8. CircleProgress 渐变色效果\n\n```tsx | pure\n<CircleProgress value={70} strokeWidth={16} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609056864300543651.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 9. CircleProgress 修改宽度效果\n\n```tsx | pure\n<CircleProgress value={70} strokeWidth={16} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609056613317325817.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n```tsx | pure\nexport interface ProgressProps {\n  /** 长度 */\n  width?: number;\n  /** 颜色, 支持渐变 */\n  color?: string | string[];\n  /** 背景色 */\n  bgColor?: string;\n  /** 宽度 */\n  strokeWidth?: number;\n  /** 值 */\n  value?: number;\n  /** 值文本位置 */\n  labelPosition?: 'right' | 'top';\n  /** 是否显示单位 */\n  unit?: string;\n  /** 自定义文本 */\n  label?: ReactNode;\n  /** 是否显示文本 */\n  showLabel?: boolean;\n  /** 文本样式 */\n  labelStyle?: StyleProp<ViewStyle>;\n}\n```\n"
  },
  {
    "path": "packages/react-native/src/progress/index.tsx",
    "content": "import CircleProgress from './CircleProgress';\nimport LineProgress from './LineProgress';\n\nexport default {\n  CircleProgress,\n  LineProgress,\n};\n"
  },
  {
    "path": "packages/react-native/src/progress/type.ts",
    "content": "import { ReactNode } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nexport interface ProgressProps {\n  /** 长度 */\n  width?: number;\n  /** 颜色, 支持渐变 */\n  color?: string | string[];\n  /** 背景色 */\n  bgColor?: string;\n  /** 宽度 */\n  strokeWidth?: number;\n  /** 值 */\n  value?: number;\n  /** 值文本位置 */\n  labelPosition?: 'right' | 'top';\n  /** 是否显示单位 */\n  unit?: string;\n  /** 自定义文本 */\n  label?: ReactNode;\n  /** 是否显示文本 */\n  showLabel?: boolean;\n  /** 文本样式 */\n  labelStyle?: StyleProp<ViewStyle>;\n}\n"
  },
  {
    "path": "packages/react-native/src/progress/useCircleProgress.ts",
    "content": "import { useEffect } from 'react';\nimport { useAnimatedProps, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { ProgressProps } from './type';\n\nexport default function useCircleProgress({\n  width = 0,\n  strokeWidth = 0,\n  value = 0,\n  unit,\n}: Pick<ProgressProps, 'width' | 'strokeWidth' | 'value' | 'unit'>) {\n  const radius = (width - strokeWidth) / 2;\n  const circumference = 2 * Math.PI * radius;\n\n  const progress = useSharedValue(0);\n  const textLabel = useSharedValue('');\n\n  useEffect(() => {\n    progress.value = withTiming(value, { duration: 600 });\n    textLabel.value = unit ? `${value}${unit}` : `${value}`;\n  }, [value, unit]);\n\n  const animatedProps = useAnimatedProps(() => ({\n    strokeDashoffset: circumference - (progress.value * circumference) / 100,\n  }));\n\n  return { radius, textLabel, circumference, animatedProps };\n}\n"
  },
  {
    "path": "packages/react-native/src/progress/useLineProgress.ts",
    "content": "import { useEffect } from 'react';\nimport { useAnimatedProps, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { ProgressProps } from './type';\n\nexport default function useLineProgress({\n  width = 0,\n  strokeWidth = 0,\n  value = 0,\n  unit,\n}: Pick<ProgressProps, 'width' | 'strokeWidth' | 'value' | 'unit'>) {\n  const progress = useSharedValue(0);\n  const textLabel = useSharedValue('');\n\n  useEffect(() => {\n    progress.value = withTiming((value * width) / 100 - strokeWidth / 2, { duration: 600 });\n    textLabel.value = unit ? `${value}${unit}` : `${value}`;\n  }, [value, width, strokeWidth, unit]);\n\n  const animatedProps = useAnimatedProps(() => ({\n    x2: progress.value,\n  }));\n\n  return { textLabel, animatedProps };\n}\n"
  },
  {
    "path": "packages/react-native/src/radio/RadioItem.tsx",
    "content": "import React, { FC, memo, useMemo } from 'react';\nimport { Keyboard, StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport Pressable from '../pressable';\nimport SvgIcon, { IconNames } from '../svg-icon';\nimport Text from '../text';\nimport type { Theme } from '../theme';\nimport type { RadioItemProps } from './type';\n\nconst mapping: Record<string, IconNames> = {\n  checked: 'radio-checked',\n  unchecked: 'radio-unchecked',\n};\n\nconst RadioItem: FC<RadioItemProps> = ({\n  mode,\n  size,\n  status,\n  label,\n  value,\n  isLast = false,\n  disabled,\n  itemStyle,\n  labelStyle,\n  onChange,\n  activeOpacity,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const handleChange = () => {\n    Keyboard.dismiss();\n    if (disabled) return;\n    onChange?.(value, status);\n  };\n\n  const styles = StyleSheet.create({\n    list: { width: '100%', flex: 1 },\n  });\n\n  const Label = useMemo(() => {\n    if (typeof label === 'string') {\n      return (\n        <Text\n          variant=\"p1\"\n          color={disabled ? 'disabled' : 'text'}\n          style={labelStyle}\n          numberOfLines={1}\n          ellipsizeMode=\"tail\"\n        >\n          {label}\n        </Text>\n      );\n    }\n    return label;\n  }, [disabled, label, labelStyle]);\n\n  if (!disabled)\n    return (\n      <Pressable\n        onPress={handleChange}\n        activeOpacity={activeOpacity}\n        style={[mode === 'list' && styles.list, itemStyle]}\n      >\n        <Flex marginRight={isLast ? 'x0' : 'x2'} style={mode === 'list' && styles.list}>\n          <Box marginRight=\"x1\">\n            <SvgIcon name={mapping[status]} color={theme.colors.primary200} size={size} />\n          </Box>\n          {Label}\n        </Flex>\n      </Pressable>\n    );\n\n  return (\n    <Box style={[mode === 'list' && styles.list, itemStyle]}>\n      <Flex marginRight={isLast ? 'x0' : 'x2'} style={mode === 'list' && styles.list}>\n        <Box marginRight=\"x1\">\n          <SvgIcon name={mapping[status]} color={theme.colors.disabled} size={size} />\n        </Box>\n        {Label}\n      </Flex>\n    </Box>\n  );\n};\nRadioItem.displayName = 'RadioItem';\n\nexport default memo(RadioItem);\n"
  },
  {
    "path": "packages/react-native/src/radio/RadioList.tsx",
    "content": "import React, { FC } from 'react';\n\nimport Box from '../box';\nimport { ONE_PIXEL, px } from '../helpers/normalize';\nimport RadioItem from './RadioItem';\nimport type { RadioProps } from './type';\nimport useRadio from './useRadio';\n\nconst RadioList: FC<RadioProps> = ({\n  value,\n  disabledValue,\n  defaultValue,\n  containerStyle,\n  options,\n  size = px(24),\n  onChange,\n  itemStyle,\n  activeOpacity = 0.6,\n  ...restProps\n}) => {\n  const { transformedOptions = [], handleChange } = useRadio({\n    options,\n    disabledValue,\n    defaultValue,\n    onChange,\n    value,\n  });\n\n  return (\n    <Box style={containerStyle}>\n      {transformedOptions.map(option => {\n        return (\n          <Box\n            key={option.value}\n            style={itemStyle}\n            height={px(50)}\n            justifyContent=\"center\"\n            alignItems=\"flex-start\"\n            paddingLeft=\"x1\"\n          >\n            <RadioItem\n              mode=\"list\"\n              {...option}\n              size={size}\n              onChange={handleChange}\n              {...{ activeOpacity }}\n              {...restProps}\n            />\n            <Box width={'100%'} height={ONE_PIXEL} backgroundColor=\"border\" />\n          </Box>\n        );\n      })}\n    </Box>\n  );\n};\nRadioList.displayName = 'RadioList';\n\nexport default RadioList;\n"
  },
  {
    "path": "packages/react-native/src/radio/index.md",
    "content": "---\ntitle: Radio - 单选框\nnav:\n  title: RN 组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# Radio 单选框\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Radio\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643191517006751379.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 默认选中\n\n```tsx | pure\n<Radio\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n  defaultValue={'Pear'}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643248707596340144.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 禁用某项\n\n```tsx | pure\n<Radio\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n  disabledValue={['Apple']}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643248779441131355.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. RadioList\n\n```tsx | pure\n<RadioList\n  options={[\n    { label: 'Apple', value: 'Apple' },\n    { label: 'Pear', value: 'Pear' },\n    { label: 'Orange', value: 'Orange' },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643248840301238393.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Radio / RadioList\n\n| 属性           | 必填    | 说明                     | 类型                         | 默认值 |\n| -------------- | ------- | ------------------------ | ---------------------------- | ------ |\n| options        | `true`  | 指定可选项               | `RadioOption[]`              |        |\n| value          | `false` | 选中的项                 | `ReactText`                  |        |\n| onChange       | `false` | 选中单选框触发的回调函数 | `(value: ReactText) => void` |        |\n| defaultValue   | `false` | 默认选中的项             | `ReactText`                  |        |\n| size           | `false` | 图标大小                 | `number`                     |        |\n| disabledValue  | `false` | 设置禁用的项             | `ReactText[]`                |        |\n| containerStyle | `false` | 自定义容器样式           | `ViewStyle`                  |        |\n| itemStyle      | `false` | 自定义单个单选框样式     | `ViewStyle`                  |        |\n| labelStyle     | `false` | 自定义文本样式           | `TextStyle`                  |        |\n| activeOpacity  | `false` | 未禁用时的不透明度       | `number`                     | `0.6`  |\n\n### RadioItem\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| itemStyle | `false` | 自定义单个单选框样式 | `ViewStyle` |  |\n| labelStyle | `false` | 自定义文本样式 | `TextStyle` |  |\n| size | `false` | 图标大小 | `number` |  |\n| activeOpacity | `false` | 未禁用时的不透明度 | `number` | `0.6` |\n| label | `true` | 单选框文本 | `ReactNode` |  |\n| value | `true` | 单选框的值 | `ReactText` |  |\n| status | `true` | 单选框选中状态 | `'checked' \\| 'unchecked'` |  |\n| disabled | `true` | 单选框禁用状态 | `boolean` |  |\n| mode | `false` | 单选框模式，list 表示以列表展示 | `'list' \\| 'row'` |  |\n| onChange | `false` | 选中单选框触发的回调函数 | `(value: ReactText, status: RadioStatus) => void` |  |\n| isLast | `false` | 是否是最后一个 | `boolean` | `false` |\n"
  },
  {
    "path": "packages/react-native/src/radio/index.tsx",
    "content": "import React, { forwardRef } from 'react';\n\nimport Flex from '../flex';\nimport { px } from '../helpers/normalize';\nimport RadioItem from './RadioItem';\nimport type { RadioProps } from './type';\nimport useRadio from './useRadio';\n\nconst Radio = forwardRef<unknown, RadioProps>(\n  (\n    {\n      value,\n      disabledValue,\n      defaultValue,\n      containerStyle,\n      options,\n      size = px(24),\n      onChange,\n      activeOpacity = 0.6,\n      ...restProps\n    },\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _ref\n  ) => {\n    const { transformedOptions = [], handleChange } = useRadio({\n      options,\n      disabledValue,\n      defaultValue,\n      onChange,\n      value,\n    });\n\n    return (\n      <Flex flexWrap=\"wrap\" style={containerStyle}>\n        {transformedOptions.map((option, index, array) => {\n          return (\n            <RadioItem\n              key={option.value}\n              {...option}\n              size={size}\n              onChange={handleChange}\n              isLast={index === array.length - 1}\n              {...{ activeOpacity }}\n              {...restProps}\n            />\n          );\n        })}\n      </Flex>\n    );\n  }\n);\nRadio.displayName = 'Radio';\n\nexport { Radio };\nexport { default as RadioList } from './RadioList';\n"
  },
  {
    "path": "packages/react-native/src/radio/type.ts",
    "content": "import type { ReactNode, ReactText } from 'react';\nimport type { StyleProp, TextStyle, ViewStyle } from 'react-native';\n\nexport type RadioStatus = 'checked' | 'unchecked';\n\nexport interface RadioOption {\n  label: ReactNode;\n  value: ReactText;\n}\nexport interface TransformedOption extends RadioOption {\n  /** 是否选中 */\n  status: RadioStatus;\n  /** 是否禁用 */\n  disabled: boolean;\n}\n\nexport interface RadioProps {\n  /** 选中的项 */\n  value?: ReactText;\n  /** 选中单选框时的回调函数  */\n  onChange?: (value: ReactText) => void;\n  /** 自定义单个单选框样式 */\n  itemStyle?: StyleProp<ViewStyle>;\n  /** 图标大小 */\n  size?: number;\n  /** 自定义文本样式 */\n  labelStyle?: StyleProp<TextStyle>;\n  /** 指定可选项 */\n  options: RadioOption[];\n  /** 默认选中的项 */\n  defaultValue?: ReactText;\n  /** 设置禁用的项  */\n  disabledValue?: ReactText[];\n  /** 自定义容器样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n  /** 未禁用时的不透明度 */\n  activeOpacity?: number;\n}\n\nexport type RadioItemProps = Pick<RadioProps, 'itemStyle' | 'labelStyle' | 'size' | 'activeOpacity'> &\n  TransformedOption & {\n    mode?: 'list' | 'row';\n    onChange: (value: ReactText, status: RadioStatus) => void;\n    isLast?: boolean;\n  };\n"
  },
  {
    "path": "packages/react-native/src/radio/useRadio.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { RadioProps, RadioStatus, TransformedOption } from './type';\n\nexport default function useRadio({\n  value,\n  options,\n  disabledValue,\n  defaultValue,\n  onChange,\n}: Pick<RadioProps, 'value' | 'options' | 'disabledValue' | 'defaultValue' | 'onChange'>) {\n  const [transformedOptions, setTransformedOptions] = useSafeState<TransformedOption[]>([]);\n\n  useEffect(() => {\n    const checkedValue = value ?? defaultValue;\n    const newOptions: TransformedOption[] = options.map(option => {\n      const checked = checkedValue === option.value;\n      return {\n        ...option,\n        disabled: !!disabledValue?.includes(option.value),\n        status: checked ? 'checked' : 'unchecked',\n      };\n    });\n    setTransformedOptions(newOptions);\n  }, [options, value, defaultValue, disabledValue]);\n\n  /**\n   * 1. 选中状态下，设置为未选中\n   * 2. 未选中状态下，设置为选中\n   */\n  const handleChange = (value: string | number, status: RadioStatus) => {\n    if (status === 'unchecked') {\n      if (onChange) {\n        onChange(value);\n      } else {\n        const newOptions: TransformedOption[] = transformedOptions.map(option => {\n          if (option.disabled || option.value !== value)\n            return {\n              ...option,\n              status: 'unchecked',\n            };\n          return {\n            ...option,\n            status: 'checked',\n          };\n        });\n        setTransformedOptions(newOptions);\n      }\n    }\n  };\n\n  return {\n    transformedOptions,\n    handleChange: useMemoizedFn(handleChange),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/result/index.md",
    "content": "---\ntitle: Result - 结果页组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Result 结果页组件\n\n## 效果演示\n\n### 1. 成功页\n\n```tsx | pure\n<Result type=\"success\" title=\"成功\" content=\"你可以点击按钮查看更多哦\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249037068921509.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 失败页\n\n```tsx | pure\n<Result type=\"fail\" title=\"失败\" content=\"你可以点击按钮查看更多哦\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249107809767840.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 进行中\n\n```tsx | pure\n<Result type=\"process\" title=\"进行中\" content=\"你可以点击按钮查看更多哦\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249187446619416.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 显示操作项\n\n```tsx | pure\n<Result type=\"process\" title=\"进行中\" content=\"你可以点击按钮查看更多哦\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249229841624313.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性           | 必填    | 说明                               | 类型                             | 默认值 |\n| -------------- | ------- | ---------------------------------- | -------------------------------- | ------ |\n| type           | `true`  | 结果页的类型（成功、失败、进行中） | `success` \\| `fail` \\| `process` |        |\n| title          | `false` | 主文字                             | `ReactNode`                      |        |\n| content        | `false` | 内容文字                           | `ReactNode`                      |        |\n| imgSource      | `false` | 自定义图片                         | `Source`                         |        |\n| actions        | `false` | 操作项按钮组                       | `ActionButtonProps`              |        |\n| containerStyle | `false` | 容器样式                           | `ViewStyle`                      |        |\n\n### ActionButtonProps\n\n| 属性    | 必填   | 说明         | 类型                     | 默认值 |\n| ------- | ------ | ------------ | ------------------------ | ------ |\n| title   | `true` | 按钮文本     | `string`                 |        |\n| type    | `true` | 按钮类型     | `primary` \\| `secondary` |        |\n| onPress | `true` | 按钮点击事件 | `() => void`             |        |\n"
  },
  {
    "path": "packages/react-native/src/result/index.tsx",
    "content": "import React, { FC, memo, ReactNode, useMemo } from 'react';\nimport { Image, ImageSourcePropType, StyleProp, ViewStyle } from 'react-native';\nimport { SvgXml } from 'react-native-svg';\n\nimport Box from '../box';\nimport Button from '../button';\nimport { px } from '../helpers/normalize';\nimport Text from '../text';\n\nexport interface ActionButtonProps {\n  title: string;\n  type: 'primary' | 'secondary';\n  onPress: () => void;\n}\n\nexport interface ResultProps {\n  /** 主文字 */\n  title?: ReactNode;\n  /** 内容文字 */\n  content?: ReactNode;\n  /** 自定义图片 */\n  imgSource?: ImageSourcePropType;\n  /** 类型（成功、失败、进行中） */\n  type: 'success' | 'fail' | 'process';\n  /** 操作项 */\n  actions?: ActionButtonProps[];\n  /** 容器样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n}\n\nconst Result: FC<ResultProps> = ({ actions = [], type, title, content, imgSource, containerStyle }) => {\n  const ImgByType = useMemo(() => {\n    if (imgSource) return <Image source={imgSource} style={{ width: px(190), height: px(190) }} resizeMode=\"contain\" />;\n\n    switch (type) {\n      case 'success':\n        return <SuccessImg />;\n      case 'fail':\n        return <FailImg />;\n      case 'process':\n        return <ProcessImg />;\n      default:\n        return null;\n    }\n  }, [imgSource, type]);\n\n  const Title = useMemo(() => {\n    if (!title) return null;\n    if (typeof title === 'string') {\n      return (\n        <Text variant=\"h1\" color=\"text\" marginBottom=\"x2\">\n          {title}\n        </Text>\n      );\n    }\n    return title;\n  }, [title]);\n\n  const Content = useMemo(() => {\n    if (!content) return null;\n    if (typeof content === 'string') {\n      return (\n        <Text variant=\"p1\" color=\"text\" marginBottom=\"x2\">\n          {content}\n        </Text>\n      );\n    }\n    return content;\n  }, [content]);\n\n  return (\n    <Box padding=\"x6\" marginTop=\"x6\" justifyContent=\"center\" alignItems=\"center\" style={containerStyle}>\n      {ImgByType}\n      {Title}\n      {Content}\n      {actions.length > 0 && (\n        <Box width=\"100%\">\n          {actions.map((action, index) => (\n            <Box key={index} marginBottom=\"x2\">\n              <Button title={action.title} type={action.type} onPress={action.onPress} />\n            </Box>\n          ))}\n        </Box>\n      )}\n    </Box>\n  );\n};\nResult.displayName = 'Result';\n\nexport default Result;\n\nconst SuccessImg = memo(() => {\n  const xml = `\n    <svg width=\"190\" height=\"190\" viewBox=\"0 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <g clip-path=\"url(#clip0_732_1683)\">\n      <g clip-path=\"url(#clip1_732_1683)\">\n      <path d=\"M64.5907 77.5247V76.7148H57.5844V77.6553H56.0454V99.7025H66.2698V77.5247H64.5907ZM65.3839 97.1755H56.8244V96.5224H65.3839V97.1755ZM65.3839 94.164H56.8244V93.5109H65.3839V94.164ZM65.3839 91.1525H56.8244V90.4994H65.3839V91.1525ZM65.3839 88.2217H56.8244V87.5686H65.3839V88.2217ZM65.3839 85.2981H56.8244V84.645H65.3839V85.2981ZM65.3839 82.2866H56.8244V81.6335H65.3839V82.2866ZM65.3839 79.3558H56.8244V78.7027H65.3839V79.3558Z\" fill=\"url(#paint0_linear_732_1683)\"/>\n      <path d=\"M50.8181 89.8295V64.1368H43.0399V62.061H39.7482V74.7269H38.8623V113.475H52.7584V89.8295H50.8181ZM45.0017 97.3844H43.0399V95.482H45.0017V97.3844ZM45.0017 94.4085H43.0399V92.5061H45.0017V94.4085ZM45.0017 91.4469H43.0399V89.5445H45.0017V91.4469ZM45.0017 88.4924H43.0399V86.59H45.0017V88.4924ZM45.0017 85.5165H43.0399V83.6141H45.0017V85.5165ZM45.0017 79.579H43.0399V77.6767H45.0017V79.579ZM45.0017 76.6032H43.0399V74.7008H45.0017V76.6032ZM45.0017 73.6392H43.0399V71.7368H45.0017V73.6392ZM45.0017 70.6847H43.0399V68.7823H45.0017V70.6847ZM45.0017 67.7088H43.0399V65.8064H45.0017V67.7088ZM47.9348 97.3844H45.9731V95.482H47.9348V97.3844ZM47.9348 94.4085H45.9731V92.5061H47.9348V94.4085ZM47.9348 91.4469H45.9731V89.5445H47.9348V91.4469ZM47.9348 88.4924H45.9731V86.59H47.9348V88.4924ZM47.9348 85.5165H45.9731V83.6141H47.9348V85.5165ZM47.9348 79.579H45.9731V77.6767H47.9348V79.579ZM47.9348 76.6032H45.9731V74.7008H47.9348V76.6032ZM47.9348 73.6392H45.9731V71.7368H47.9348V73.6392ZM47.9348 70.6847H45.9731V68.7823H47.9348V70.6847ZM47.9348 67.7088H45.9731V65.8064H47.9348V67.7088Z\" fill=\"url(#paint1_linear_732_1683)\"/>\n      <path d=\"M127.367 103.338C127.452 102.234 127.367 66.1743 127.367 66.1743H131.768V74.1804H138.774V90.9123H142.747V103.338H127.367Z\" fill=\"url(#paint2_linear_732_1683)\"/>\n      <path d=\"M156.156 87.1551V86.0032H154.969V75.9498H152.071V74.8336H150.117V73.1924H149.098V68.4092H148.364V73.2257H147.428V74.8668H144.531V77.5553H142.856V108.722H156.959V87.1527H156.156V87.1551ZM145.348 99.6903H144.393V96.0708H145.348V99.6903ZM145.348 95.2609H144.393V91.6414H145.348V95.2609ZM145.348 90.8316H144.393V87.2121H145.348V90.8316ZM145.348 86.3238H144.393V82.7043H145.348V86.3238ZM145.348 81.8137H144.393V78.1942H145.348V81.8137ZM147.314 99.6903H146.36V96.0708H147.314V99.6903ZM147.314 95.2609H146.36V91.6414H147.314V95.2609ZM147.314 90.8316H146.36V87.2121H147.314V90.8316ZM147.314 86.3238H146.36V82.7043H147.314V86.3238ZM147.314 81.8137H146.36V78.1942H147.314V81.8137ZM149.278 99.6903H148.324V96.0708H149.278V99.6903ZM149.278 95.2609H148.324V91.6414H149.278V95.2609ZM149.278 90.8316H148.324V87.2121H149.278V90.8316ZM149.278 86.3238H148.324V82.7043H149.278V86.3238ZM149.278 81.8137H148.324V78.1942H149.278V81.8137ZM151.245 99.6903H150.29V96.0708H151.245V99.6903ZM151.245 95.2609H150.29V91.6414H151.245V95.2609ZM151.245 90.8316H150.29V87.2121H151.245V90.8316ZM151.245 86.3238H150.29V82.7043H151.245V86.3238ZM151.245 81.8137H150.29V78.1942H151.245V81.8137ZM153.211 99.6903H152.257V96.0708H153.211V99.6903ZM153.211 95.2609H152.257V91.6414H153.211V95.2609ZM153.211 90.8316H152.257V87.2121H153.211V90.8316ZM153.211 86.3238H152.257V82.7043H153.211V86.3238ZM153.211 81.8137H152.257V78.1942H153.211V81.8137Z\" fill=\"url(#paint3_linear_732_1683)\"/>\n      <path d=\"M22.7646 118.717V97.4511H25.2014V86.5973L33.5756 82.9707V97.2801H35.4115V118.717H22.7646Z\" fill=\"url(#paint4_linear_732_1683)\"/>\n      <path d=\"M166.398 114.774H159.049V85.5308L166.398 89.0861V114.774Z\" fill=\"url(#paint5_linear_732_1683)\"/>\n      <path d=\"M21.5342 44.2816C21.5342 44.2816 23.7525 38.2301 29.2055 40.6051C30.4642 39.3274 32.0222 38.3987 34.1288 38.8167C36.2355 39.2371 37.594 40.8141 38.0547 41.8639C38.715 41.833 44.0017 42.0087 44.0017 47.4926C44.0017 52.9765 37.6035 52.872 37.1403 52.4374C36.5703 52.9456 33.8296 55.703 30.5046 52.5561C29.785 53.1712 27.4337 55.7766 23.7168 52.1809C21.995 52.9005 17.9028 53.4539 17.1096 49.2287C16.3163 45.006 20.3847 43.8114 21.5342 44.2816Z\" fill=\"url(#paint6_linear_732_1683)\"/>\n      <path d=\"M144.338 35.537C144.338 35.537 146.557 29.4855 152.01 31.8605C153.268 30.5827 154.826 29.6541 156.933 30.0721C159.04 30.4901 160.398 32.0695 160.859 33.1192C161.519 33.0884 166.806 33.2641 166.806 38.748C166.806 44.2319 160.408 44.125 159.945 43.6903C159.375 44.1986 156.634 46.956 153.309 43.8091C152.589 44.4242 150.238 47.0296 146.521 43.4338C144.799 44.1535 140.707 44.7069 139.914 40.4817C139.121 36.2614 143.189 35.0667 144.338 35.537Z\" fill=\"url(#paint7_linear_732_1683)\"/>\n      <path d=\"M115.995 48.4854C115.995 48.4854 117.601 44.1035 121.548 45.8254C122.46 44.8992 123.586 44.227 125.113 44.531C126.637 44.835 127.621 45.9774 127.953 46.735C128.431 46.7137 132.259 46.8395 132.259 50.8082C132.259 54.7768 127.628 54.7008 127.293 54.3873C126.88 54.7554 124.897 56.7504 122.488 54.4752C121.968 54.9193 120.265 56.8074 117.577 54.2044C116.33 54.7245 113.368 55.1259 112.794 52.0669C112.216 49.0103 115.164 48.1458 115.995 48.4854Z\" fill=\"url(#paint8_linear_732_1683)\"/>\n      <path d=\"M95.4657 177.989C144.126 177.989 183.573 159.268 183.573 136.175C183.573 113.082 144.126 94.3608 95.4657 94.3608C46.8051 94.3608 7.35791 113.082 7.35791 136.175C7.35791 159.268 46.8051 177.989 95.4657 177.989Z\" fill=\"url(#paint9_linear_732_1683)\"/>\n      <path d=\"M35.1264 131.062C35.1264 131.062 34.2881 132.252 35.6893 134.023C36.9386 135.6 38.9122 135.294 39.5677 134.788C39.7696 136.161 41.4534 139.054 44.1182 137.417C46.6238 135.881 45.4173 133.544 44.6169 132.625C46.1821 132.183 47.3482 128.433 43.7572 127.138C44.2892 125.59 44.3842 124.889 43.6052 123.497C42.8547 122.158 41.6221 121.944 39.6556 122.759L36.8127 123.958L35.0006 120.576L34.0316 121.137L36.1216 124.367L33.3523 125.756C33.3523 125.756 30.9844 126.682 32.0057 129.224C32.9509 131.577 35.1264 131.062 35.1264 131.062Z\" fill=\"url(#paint10_linear_732_1683)\"/>\n      <path d=\"M30.3073 116.641H38.8716C38.8716 116.641 41.6385 116.719 42.1895 113.558C42.7951 110.088 40.2704 109.611 40.2704 109.611C40.2704 109.611 41.7905 108.913 41.4603 106.288C41.1278 103.666 38.8193 103.334 37.8574 103.455C38.0142 101.899 38.3419 98.3772 34.6844 98.3416C31.1528 98.3059 31.1742 101.861 31.4378 103.263C30.1791 103.277 26.3767 105.165 29.0509 109.307C27.5951 110.554 26.9799 111.273 27.0441 113.071C27.1058 114.872 28.2078 116.641 30.3073 116.641Z\" fill=\"url(#paint11_linear_732_1683)\"/>\n      <path d=\"M38.6602 111.834L35.0075 114.237L34.9077 111.915L37.2162 109.193L34.8721 111.088L34.5681 103.987L34.3449 111.136L31.8796 109.174L34.3211 111.862L34.2475 114.254L30.4902 111.494L34.219 115.116L34.0314 121.139H35.302L35.0455 115.154L38.6602 111.834Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M159.203 126.713C159.203 126.713 158.431 127.81 159.721 129.44C160.87 130.893 162.689 130.61 163.293 130.143C163.478 131.406 165.031 134.068 167.485 132.565C169.791 131.15 168.682 128.998 167.943 128.152C169.385 127.746 170.458 124.291 167.152 123.101C167.644 121.676 167.732 121.03 167.012 119.75C166.321 118.517 165.186 118.317 163.376 119.07L160.754 120.175L159.084 117.061L158.194 117.576L160.117 120.55L157.569 121.83C157.569 121.83 155.389 122.683 156.329 125.024C157.198 127.188 159.203 126.713 159.203 126.713Z\" fill=\"url(#paint12_linear_732_1683)\"/>\n      <path d=\"M154.762 113.434H162.647C162.647 113.434 165.195 113.508 165.701 110.596C166.257 107.402 163.934 106.963 163.934 106.963C163.934 106.963 165.335 106.319 165.029 103.904C164.723 101.488 162.597 101.182 161.711 101.296C161.856 99.8637 162.158 96.6194 158.79 96.5862C155.539 96.5529 155.558 99.8257 155.8 101.118C154.641 101.13 151.138 102.868 153.603 106.685C152.263 107.832 151.696 108.497 151.755 110.15C151.817 111.805 152.831 113.434 154.762 113.434Z\" fill=\"url(#paint13_linear_732_1683)\"/>\n      <path d=\"M162.455 109.007L159.092 111.221L159.001 109.081L161.127 106.575L158.968 108.321L158.688 101.78L158.481 108.364L156.213 106.556L158.46 109.034L158.391 111.238L154.933 108.694L158.367 112.031L158.192 117.576H159.365L159.127 112.064L162.455 109.007Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M54.8244 105.291C54.8244 105.291 54.4088 105.88 55.1023 106.756C55.7198 107.537 56.6959 107.385 57.0213 107.134C57.121 107.813 57.9546 109.243 59.2728 108.435C60.5125 107.675 59.9164 106.519 59.5198 106.065C60.294 105.846 60.8711 103.992 59.0946 103.353C59.3583 102.588 59.4058 102.241 59.0186 101.552C58.6481 100.89 58.0378 100.783 57.0664 101.187L55.658 101.78L54.7626 100.108L54.2829 100.386L55.316 101.982L53.9456 102.669C53.9456 102.669 52.7748 103.127 53.2806 104.383C53.7485 105.547 54.8244 105.291 54.8244 105.291Z\" fill=\"url(#paint14_linear_732_1683)\"/>\n      <path d=\"M52.4397 98.1586H56.6743C56.6743 98.1586 58.0423 98.1966 58.3154 96.6339C58.6147 94.9168 57.3654 94.6817 57.3654 94.6817C57.3654 94.6817 58.1183 94.3349 57.9544 93.0382C57.7906 91.7414 56.6482 91.5775 56.1732 91.6369C56.2516 90.8674 56.4131 89.1242 54.6033 89.1075C52.8553 89.0909 52.8672 90.8484 52.9978 91.5419C52.3756 91.549 50.4946 92.4824 51.8174 94.532C51.0978 95.1472 50.7914 95.5058 50.8247 96.394C50.8556 97.2823 51.4018 98.1586 52.4397 98.1586Z\" fill=\"url(#paint15_linear_732_1683)\"/>\n      <path d=\"M56.5697 95.7811L54.7647 96.971L54.7148 95.8215L55.8572 94.4749L54.6982 95.413L54.5462 91.9004L54.4369 95.4344L53.2162 94.4654L54.425 95.7954L54.387 96.9781L52.5298 95.6125L54.3752 97.4056L54.2802 100.384H54.9095L54.7837 97.4222L56.5697 95.7811Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M112.5 95.5L162.173 138.613L97.5 157.5L74 95.5H112.5Z\" fill=\"url(#paint16_linear_732_1683)\"/>\n      <path d=\"M95.3502 105.3C112.83 105.3 127 91.1298 127 73.65C127 56.1702 112.83 42 95.3502 42C77.8704 42 63.7002 56.1702 63.7002 73.65C63.7002 91.1298 77.8704 105.3 95.3502 105.3Z\" fill=\"url(#paint17_linear_732_1683)\"/>\n      <path d=\"M95.3502 105.3C112.83 105.3 127 91.1298 127 73.65C127 56.1702 112.83 42 95.3502 42C77.8704 42 63.7002 56.1702 63.7002 73.65C63.7002 91.1298 77.8704 105.3 95.3502 105.3Z\" fill=\"url(#paint18_linear_732_1683)\"/>\n      <path d=\"M95.3498 98.288C108.957 98.288 119.988 87.257 119.988 73.6496C119.988 60.0422 108.957 49.0112 95.3498 49.0112C81.7424 49.0112 70.7114 60.0422 70.7114 73.6496C70.7114 87.257 81.7424 98.288 95.3498 98.288Z\" fill=\"url(#paint19_linear_732_1683)\"/>\n      <path d=\"M91.484 86.4606C90.1207 86.4606 88.8246 85.9633 87.8022 85.0415C87.7407 84.9856 87.6848 84.9353 87.629 84.8739L79.7514 76.5996C78.5726 75.3593 78.6228 73.4039 79.8575 72.225C81.0923 71.0462 83.0533 71.0965 84.2321 72.3312L91.4728 79.935L105.34 63.8335C106.457 62.5373 108.407 62.392 109.703 63.5094C110.999 64.6268 111.144 66.5766 110.027 67.8728L95.6742 84.5386C94.6965 85.6728 93.3388 86.3488 91.8415 86.4438C91.7242 86.455 91.6069 86.4606 91.484 86.4606Z\" fill=\"url(#paint20_linear_732_1683)\"/>\n      </g>\n      </g>\n      <defs>\n      <linearGradient id=\"paint0_linear_732_1683\" x1=\"61.1566\" y1=\"99.7028\" x2=\"61.1566\" y2=\"76.7155\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint1_linear_732_1683\" x1=\"45.8101\" y1=\"113.476\" x2=\"45.8101\" y2=\"62.0596\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint2_linear_732_1683\" x1=\"135.058\" y1=\"103.339\" x2=\"135.058\" y2=\"66.1751\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint3_linear_732_1683\" x1=\"149.908\" y1=\"108.723\" x2=\"149.908\" y2=\"68.41\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint4_linear_732_1683\" x1=\"29.0887\" y1=\"118.717\" x2=\"29.0887\" y2=\"82.9705\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint5_linear_732_1683\" x1=\"162.724\" y1=\"114.773\" x2=\"162.724\" y2=\"85.5296\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint6_linear_732_1683\" x1=\"30.5049\" y1=\"54.0441\" x2=\"30.5049\" y2=\"38.7156\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint7_linear_732_1683\" x1=\"153.309\" y1=\"45.2994\" x2=\"153.309\" y2=\"29.9709\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint8_linear_732_1683\" x1=\"122.488\" y1=\"55.553\" x2=\"122.488\" y2=\"44.4577\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint9_linear_732_1683\" x1=\"95.4647\" y1=\"177.99\" x2=\"95.4647\" y2=\"94.3595\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4065\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DAE4EF\"/>\n      </linearGradient>\n      <linearGradient id=\"paint10_linear_732_1683\" x1=\"45.8105\" y1=\"136.061\" x2=\"33.5944\" y2=\"121.502\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint11_linear_732_1683\" x1=\"27.0365\" y1=\"107.492\" x2=\"42.2808\" y2=\"107.492\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint12_linear_732_1683\" x1=\"169.04\" y1=\"131.317\" x2=\"157.79\" y2=\"117.911\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint13_linear_732_1683\" x1=\"151.752\" y1=\"105.009\" x2=\"165.79\" y2=\"105.009\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint14_linear_732_1683\" x1=\"60.1076\" y1=\"107.764\" x2=\"54.0653\" y2=\"100.563\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"1.4385e-07\" stop-color=\"#EAEFF6\"/>\n      <stop offset=\"1\" stop-color=\"#CDDAE9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint15_linear_732_1683\" x1=\"50.8215\" y1=\"93.6338\" x2=\"58.3617\" y2=\"93.6338\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint16_linear_732_1683\" x1=\"131.177\" y1=\"149.02\" x2=\"115.399\" y2=\"93.9966\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.0938\" stop-color=\"white\"/>\n      <stop offset=\"0.9362\" stop-color=\"#BBCBE0\"/>\n      </linearGradient>\n      <linearGradient id=\"paint17_linear_732_1683\" x1=\"63.7009\" y1=\"73.6475\" x2=\"127.001\" y2=\"73.6475\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint18_linear_732_1683\" x1=\"63.7009\" y1=\"73.6475\" x2=\"127.001\" y2=\"73.6475\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint19_linear_732_1683\" x1=\"70.7114\" y1=\"73.6471\" x2=\"119.989\" y2=\"73.6471\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#DDE5F0\"/>\n      <stop offset=\"1\" stop-color=\"#9FB7CE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint20_linear_732_1683\" x1=\"78.901\" y1=\"74.6114\" x2=\"110.783\" y2=\"74.6114\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1453\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D8E3EF\"/>\n      </linearGradient>\n      <clipPath id=\"clip0_732_1683\">\n      <rect width=\"190\" height=\"190\" fill=\"white\"/>\n      </clipPath>\n      <clipPath id=\"clip1_732_1683\">\n      <rect width=\"190\" height=\"190\" fill=\"white\" transform=\"translate(0 -5)\"/>\n      </clipPath>\n      </defs>\n    </svg>\n  `;\n\n  return <SvgXml xml={xml} width={190} height={190} />;\n});\n\nconst FailImg = memo(() => {\n  const xml = `\n    <svg width=\"190\" height=\"190\" viewBox=\"0 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <g clip-path=\"url(#clip0_732_1682)\">\n      <g clip-path=\"url(#clip1_732_1682)\">\n      <path d=\"M64.5907 77.5247V76.7148H57.5844V77.6553H56.0454V99.7025H66.2698V77.5247H64.5907ZM65.3839 97.1755H56.8244V96.5224H65.3839V97.1755ZM65.3839 94.164H56.8244V93.5109H65.3839V94.164ZM65.3839 91.1525H56.8244V90.4994H65.3839V91.1525ZM65.3839 88.2217H56.8244V87.5686H65.3839V88.2217ZM65.3839 85.2981H56.8244V84.645H65.3839V85.2981ZM65.3839 82.2866H56.8244V81.6335H65.3839V82.2866ZM65.3839 79.3558H56.8244V78.7027H65.3839V79.3558Z\" fill=\"url(#paint0_linear_732_1682)\"/>\n      <path d=\"M50.8181 89.8295V64.1368H43.0399V62.061H39.7482V74.7269H38.8623V113.475H52.7584V89.8295H50.8181ZM45.0017 97.3844H43.0399V95.482H45.0017V97.3844ZM45.0017 94.4085H43.0399V92.5061H45.0017V94.4085ZM45.0017 91.4469H43.0399V89.5445H45.0017V91.4469ZM45.0017 88.4924H43.0399V86.59H45.0017V88.4924ZM45.0017 85.5165H43.0399V83.6141H45.0017V85.5165ZM45.0017 79.579H43.0399V77.6767H45.0017V79.579ZM45.0017 76.6032H43.0399V74.7008H45.0017V76.6032ZM45.0017 73.6392H43.0399V71.7368H45.0017V73.6392ZM45.0017 70.6847H43.0399V68.7823H45.0017V70.6847ZM45.0017 67.7088H43.0399V65.8064H45.0017V67.7088ZM47.9348 97.3844H45.9731V95.482H47.9348V97.3844ZM47.9348 94.4085H45.9731V92.5061H47.9348V94.4085ZM47.9348 91.4469H45.9731V89.5445H47.9348V91.4469ZM47.9348 88.4924H45.9731V86.59H47.9348V88.4924ZM47.9348 85.5165H45.9731V83.6141H47.9348V85.5165ZM47.9348 79.579H45.9731V77.6767H47.9348V79.579ZM47.9348 76.6032H45.9731V74.7008H47.9348V76.6032ZM47.9348 73.6392H45.9731V71.7368H47.9348V73.6392ZM47.9348 70.6847H45.9731V68.7823H47.9348V70.6847ZM47.9348 67.7088H45.9731V65.8064H47.9348V67.7088Z\" fill=\"url(#paint1_linear_732_1682)\"/>\n      <path d=\"M127.367 103.338C127.452 102.234 127.367 66.1743 127.367 66.1743H131.768V74.1804H138.774V90.9123H142.747V103.338H127.367Z\" fill=\"url(#paint2_linear_732_1682)\"/>\n      <path d=\"M156.156 87.1551V86.0032H154.969V75.9498H152.071V74.8336H150.117V73.1924H149.098V68.4092H148.364V73.2257H147.428V74.8668H144.531V77.5553H142.856V108.722H156.959V87.1527H156.156V87.1551ZM145.348 99.6903H144.393V96.0708H145.348V99.6903ZM145.348 95.2609H144.393V91.6414H145.348V95.2609ZM145.348 90.8316H144.393V87.2121H145.348V90.8316ZM145.348 86.3238H144.393V82.7043H145.348V86.3238ZM145.348 81.8137H144.393V78.1942H145.348V81.8137ZM147.314 99.6903H146.36V96.0708H147.314V99.6903ZM147.314 95.2609H146.36V91.6414H147.314V95.2609ZM147.314 90.8316H146.36V87.2121H147.314V90.8316ZM147.314 86.3238H146.36V82.7043H147.314V86.3238ZM147.314 81.8137H146.36V78.1942H147.314V81.8137ZM149.278 99.6903H148.324V96.0708H149.278V99.6903ZM149.278 95.2609H148.324V91.6414H149.278V95.2609ZM149.278 90.8316H148.324V87.2121H149.278V90.8316ZM149.278 86.3238H148.324V82.7043H149.278V86.3238ZM149.278 81.8137H148.324V78.1942H149.278V81.8137ZM151.245 99.6903H150.29V96.0708H151.245V99.6903ZM151.245 95.2609H150.29V91.6414H151.245V95.2609ZM151.245 90.8316H150.29V87.2121H151.245V90.8316ZM151.245 86.3238H150.29V82.7043H151.245V86.3238ZM151.245 81.8137H150.29V78.1942H151.245V81.8137ZM153.211 99.6903H152.257V96.0708H153.211V99.6903ZM153.211 95.2609H152.257V91.6414H153.211V95.2609ZM153.211 90.8316H152.257V87.2121H153.211V90.8316ZM153.211 86.3238H152.257V82.7043H153.211V86.3238ZM153.211 81.8137H152.257V78.1942H153.211V81.8137Z\" fill=\"url(#paint3_linear_732_1682)\"/>\n      <path d=\"M22.7646 118.717V97.4511H25.2014V86.5973L33.5756 82.9707V97.2801H35.4115V118.717H22.7646Z\" fill=\"url(#paint4_linear_732_1682)\"/>\n      <path d=\"M166.398 114.774H159.049V85.5308L166.398 89.0861V114.774Z\" fill=\"url(#paint5_linear_732_1682)\"/>\n      <path d=\"M21.5342 44.2816C21.5342 44.2816 23.7525 38.2301 29.2055 40.6051C30.4642 39.3274 32.0222 38.3987 34.1288 38.8167C36.2355 39.2371 37.594 40.8141 38.0547 41.8639C38.715 41.833 44.0017 42.0087 44.0017 47.4926C44.0017 52.9765 37.6035 52.872 37.1403 52.4374C36.5703 52.9456 33.8296 55.703 30.5046 52.5561C29.785 53.1712 27.4337 55.7766 23.7168 52.1809C21.995 52.9005 17.9028 53.4539 17.1096 49.2287C16.3163 45.006 20.3847 43.8114 21.5342 44.2816Z\" fill=\"url(#paint6_linear_732_1682)\"/>\n      <path d=\"M144.338 35.537C144.338 35.537 146.557 29.4855 152.01 31.8605C153.268 30.5827 154.826 29.6541 156.933 30.0721C159.04 30.4901 160.398 32.0695 160.859 33.1192C161.519 33.0884 166.806 33.2641 166.806 38.748C166.806 44.2319 160.408 44.125 159.945 43.6903C159.375 44.1986 156.634 46.956 153.309 43.8091C152.589 44.4242 150.238 47.0296 146.521 43.4338C144.799 44.1535 140.707 44.7069 139.914 40.4817C139.121 36.2614 143.189 35.0667 144.338 35.537Z\" fill=\"url(#paint7_linear_732_1682)\"/>\n      <path d=\"M115.995 48.4854C115.995 48.4854 117.601 44.1035 121.548 45.8254C122.46 44.8992 123.586 44.227 125.113 44.531C126.637 44.835 127.621 45.9774 127.953 46.735C128.431 46.7137 132.259 46.8395 132.259 50.8082C132.259 54.7768 127.628 54.7008 127.293 54.3873C126.88 54.7554 124.897 56.7504 122.488 54.4752C121.968 54.9193 120.265 56.8074 117.577 54.2044C116.33 54.7245 113.368 55.1259 112.794 52.0669C112.216 49.0103 115.164 48.1458 115.995 48.4854Z\" fill=\"url(#paint8_linear_732_1682)\"/>\n      <path d=\"M95.4657 177.989C144.126 177.989 183.573 159.268 183.573 136.175C183.573 113.082 144.126 94.3608 95.4657 94.3608C46.8051 94.3608 7.35791 113.082 7.35791 136.175C7.35791 159.268 46.8051 177.989 95.4657 177.989Z\" fill=\"url(#paint9_linear_732_1682)\"/>\n      <path d=\"M35.1264 131.062C35.1264 131.062 34.2881 132.252 35.6893 134.023C36.9386 135.6 38.9122 135.294 39.5677 134.788C39.7696 136.161 41.4534 139.054 44.1182 137.417C46.6238 135.881 45.4173 133.544 44.6169 132.625C46.1821 132.183 47.3482 128.433 43.7572 127.138C44.2892 125.59 44.3842 124.889 43.6052 123.497C42.8547 122.158 41.6221 121.944 39.6556 122.759L36.8127 123.958L35.0006 120.576L34.0316 121.137L36.1216 124.367L33.3523 125.756C33.3523 125.756 30.9844 126.682 32.0057 129.224C32.9509 131.577 35.1264 131.062 35.1264 131.062Z\" fill=\"url(#paint10_linear_732_1682)\"/>\n      <path d=\"M30.3073 116.641H38.8716C38.8716 116.641 41.6385 116.719 42.1895 113.558C42.7951 110.088 40.2704 109.611 40.2704 109.611C40.2704 109.611 41.7905 108.913 41.4603 106.288C41.1278 103.666 38.8193 103.334 37.8574 103.455C38.0142 101.899 38.3419 98.3772 34.6844 98.3416C31.1528 98.3059 31.1742 101.861 31.4378 103.263C30.1791 103.277 26.3767 105.165 29.0509 109.307C27.5951 110.554 26.9799 111.273 27.0441 113.071C27.1058 114.872 28.2078 116.641 30.3073 116.641Z\" fill=\"url(#paint11_linear_732_1682)\"/>\n      <path d=\"M38.6602 111.834L35.0075 114.237L34.9077 111.915L37.2162 109.193L34.8721 111.088L34.5681 103.987L34.3449 111.136L31.8796 109.174L34.3211 111.862L34.2475 114.254L30.4902 111.494L34.219 115.116L34.0314 121.139H35.302L35.0455 115.154L38.6602 111.834Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M159.203 126.713C159.203 126.713 158.431 127.81 159.721 129.44C160.87 130.893 162.689 130.61 163.293 130.143C163.478 131.406 165.031 134.068 167.485 132.565C169.791 131.15 168.682 128.998 167.943 128.152C169.385 127.746 170.458 124.291 167.152 123.101C167.644 121.676 167.732 121.03 167.012 119.75C166.321 118.517 165.186 118.317 163.376 119.07L160.754 120.175L159.084 117.061L158.194 117.576L160.117 120.55L157.569 121.83C157.569 121.83 155.389 122.683 156.329 125.024C157.198 127.188 159.203 126.713 159.203 126.713Z\" fill=\"url(#paint12_linear_732_1682)\"/>\n      <path d=\"M154.762 113.434H162.647C162.647 113.434 165.195 113.508 165.701 110.596C166.257 107.402 163.934 106.963 163.934 106.963C163.934 106.963 165.335 106.319 165.029 103.904C164.723 101.488 162.597 101.182 161.711 101.296C161.856 99.8637 162.158 96.6194 158.79 96.5862C155.539 96.5529 155.558 99.8257 155.8 101.118C154.641 101.13 151.138 102.868 153.603 106.685C152.263 107.832 151.696 108.497 151.755 110.15C151.817 111.805 152.831 113.434 154.762 113.434Z\" fill=\"url(#paint13_linear_732_1682)\"/>\n      <path d=\"M162.455 109.007L159.092 111.221L159.001 109.081L161.127 106.575L158.968 108.321L158.688 101.78L158.481 108.364L156.213 106.556L158.46 109.034L158.391 111.238L154.933 108.694L158.367 112.031L158.192 117.576H159.365L159.127 112.064L162.455 109.007Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M54.8244 105.291C54.8244 105.291 54.4088 105.88 55.1023 106.756C55.7198 107.537 56.6959 107.385 57.0213 107.134C57.121 107.813 57.9546 109.243 59.2728 108.435C60.5125 107.675 59.9164 106.519 59.5198 106.065C60.294 105.846 60.8711 103.992 59.0946 103.353C59.3583 102.588 59.4058 102.241 59.0186 101.552C58.6481 100.89 58.0378 100.783 57.0664 101.187L55.658 101.78L54.7626 100.108L54.2829 100.386L55.316 101.982L53.9456 102.669C53.9456 102.669 52.7748 103.127 53.2806 104.383C53.7485 105.547 54.8244 105.291 54.8244 105.291Z\" fill=\"url(#paint14_linear_732_1682)\"/>\n      <path d=\"M52.4397 98.1586H56.6743C56.6743 98.1586 58.0423 98.1966 58.3154 96.6339C58.6147 94.9168 57.3654 94.6817 57.3654 94.6817C57.3654 94.6817 58.1183 94.3349 57.9544 93.0382C57.7906 91.7414 56.6482 91.5775 56.1732 91.6369C56.2516 90.8674 56.4131 89.1242 54.6033 89.1075C52.8553 89.0909 52.8672 90.8484 52.9978 91.5419C52.3756 91.549 50.4946 92.4824 51.8174 94.532C51.0978 95.1472 50.7914 95.5058 50.8247 96.394C50.8556 97.2823 51.4018 98.1586 52.4397 98.1586Z\" fill=\"url(#paint15_linear_732_1682)\"/>\n      <path d=\"M56.5697 95.7811L54.7647 96.971L54.7148 95.8215L55.8572 94.4749L54.6982 95.413L54.5462 91.9004L54.4369 95.4344L53.2162 94.4654L54.425 95.7954L54.387 96.9781L52.5298 95.6125L54.3752 97.4056L54.2802 100.384H54.9095L54.7837 97.4222L56.5697 95.7811Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M112.5 95.5L162.173 138.613L97.5 157.5L74 95.5H112.5Z\" fill=\"url(#paint16_linear_732_1682)\"/>\n      <path d=\"M95.3502 105.3C112.83 105.3 127 91.1298 127 73.65C127 56.1702 112.83 42 95.3502 42C77.8704 42 63.7002 56.1702 63.7002 73.65C63.7002 91.1298 77.8704 105.3 95.3502 105.3Z\" fill=\"url(#paint17_linear_732_1682)\"/>\n      <path d=\"M95.3502 105.3C112.83 105.3 127 91.1298 127 73.65C127 56.1702 112.83 42 95.3502 42C77.8704 42 63.7002 56.1702 63.7002 73.65C63.7002 91.1298 77.8704 105.3 95.3502 105.3Z\" fill=\"url(#paint18_linear_732_1682)\"/>\n      <path d=\"M95.3498 98.288C108.957 98.288 119.988 87.257 119.988 73.6496C119.988 60.0422 108.957 49.0112 95.3498 49.0112C81.7424 49.0112 70.7114 60.0422 70.7114 73.6496C70.7114 87.257 81.7424 98.288 95.3498 98.288Z\" fill=\"url(#paint19_linear_732_1682)\"/>\n      <path d=\"M106.93 81.2844L99.4247 74.7086L106 67.2033C107.139 65.9031 107.01 63.9207 105.71 62.7763C104.41 61.6374 102.428 61.7663 101.283 63.0665L94.7079 70.5718L87.203 63.9959C85.9029 62.8569 83.9206 62.9859 82.7763 64.286C81.6374 65.5861 81.7663 67.5686 83.0664 68.7129L90.5713 75.2888L83.9958 82.7941C82.8569 84.0942 82.9858 86.0767 84.2859 87.221C84.8822 87.7421 85.6182 88 86.3542 88C87.2245 88 88.0947 87.64 88.7125 86.9309L95.2881 79.4256L102.793 86.0014C103.389 86.5226 104.125 86.7804 104.861 86.7804C105.732 86.7804 106.602 86.4205 107.22 85.7113C108.364 84.4058 108.235 82.4288 106.93 81.2844Z\" fill=\"url(#paint20_linear_732_1682)\"/>\n      </g>\n      </g>\n      <defs>\n      <linearGradient id=\"paint0_linear_732_1682\" x1=\"61.1566\" y1=\"99.7028\" x2=\"61.1566\" y2=\"76.7155\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint1_linear_732_1682\" x1=\"45.8101\" y1=\"113.476\" x2=\"45.8101\" y2=\"62.0596\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint2_linear_732_1682\" x1=\"135.058\" y1=\"103.339\" x2=\"135.058\" y2=\"66.1751\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint3_linear_732_1682\" x1=\"149.908\" y1=\"108.723\" x2=\"149.908\" y2=\"68.41\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint4_linear_732_1682\" x1=\"29.0887\" y1=\"118.717\" x2=\"29.0887\" y2=\"82.9705\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint5_linear_732_1682\" x1=\"162.724\" y1=\"114.773\" x2=\"162.724\" y2=\"85.5296\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint6_linear_732_1682\" x1=\"30.5049\" y1=\"54.0441\" x2=\"30.5049\" y2=\"38.7156\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint7_linear_732_1682\" x1=\"153.309\" y1=\"45.2994\" x2=\"153.309\" y2=\"29.9709\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint8_linear_732_1682\" x1=\"122.488\" y1=\"55.553\" x2=\"122.488\" y2=\"44.4577\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint9_linear_732_1682\" x1=\"95.4647\" y1=\"177.99\" x2=\"95.4647\" y2=\"94.3595\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4065\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DAE4EF\"/>\n      </linearGradient>\n      <linearGradient id=\"paint10_linear_732_1682\" x1=\"45.8105\" y1=\"136.061\" x2=\"33.5944\" y2=\"121.502\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint11_linear_732_1682\" x1=\"27.0365\" y1=\"107.492\" x2=\"42.2808\" y2=\"107.492\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint12_linear_732_1682\" x1=\"169.04\" y1=\"131.317\" x2=\"157.79\" y2=\"117.911\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint13_linear_732_1682\" x1=\"151.752\" y1=\"105.009\" x2=\"165.79\" y2=\"105.009\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint14_linear_732_1682\" x1=\"60.1076\" y1=\"107.764\" x2=\"54.0653\" y2=\"100.563\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"1.4385e-07\" stop-color=\"#EAEFF6\"/>\n      <stop offset=\"1\" stop-color=\"#CDDAE9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint15_linear_732_1682\" x1=\"50.8215\" y1=\"93.6338\" x2=\"58.3617\" y2=\"93.6338\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint16_linear_732_1682\" x1=\"131.177\" y1=\"149.02\" x2=\"115.399\" y2=\"93.9966\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.0938\" stop-color=\"white\"/>\n      <stop offset=\"0.9362\" stop-color=\"#BBCBE0\"/>\n      </linearGradient>\n      <linearGradient id=\"paint17_linear_732_1682\" x1=\"63.7009\" y1=\"73.6475\" x2=\"127.001\" y2=\"73.6475\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint18_linear_732_1682\" x1=\"63.7009\" y1=\"73.6475\" x2=\"127.001\" y2=\"73.6475\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint19_linear_732_1682\" x1=\"70.7114\" y1=\"73.6471\" x2=\"119.989\" y2=\"73.6471\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#DDE5F0\"/>\n      <stop offset=\"1\" stop-color=\"#9FB7CE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint20_linear_732_1682\" x1=\"82.0014\" y1=\"75.0016\" x2=\"107.999\" y2=\"75.0016\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1453\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D8E3EF\"/>\n      </linearGradient>\n      <clipPath id=\"clip0_732_1682\">\n      <rect width=\"190\" height=\"190\" fill=\"white\"/>\n      </clipPath>\n      <clipPath id=\"clip1_732_1682\">\n      <rect width=\"190\" height=\"190\" fill=\"white\" transform=\"translate(0 -5)\"/>\n      </clipPath>\n      </defs>\n    </svg>\n  `;\n\n  return <SvgXml xml={xml} width={190} height={190} />;\n});\n\nconst ProcessImg = memo(() => {\n  const xml = `\n    <svg width=\"190\" height=\"190\" viewBox=\"0 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <g clip-path=\"url(#clip0_732_1681)\">\n      <g clip-path=\"url(#clip1_732_1681)\">\n      <path d=\"M64.5907 77.5247V76.7148H57.5844V77.6553H56.0454V99.7025H66.2698V77.5247H64.5907ZM65.3839 97.1755H56.8244V96.5224H65.3839V97.1755ZM65.3839 94.164H56.8244V93.5109H65.3839V94.164ZM65.3839 91.1525H56.8244V90.4994H65.3839V91.1525ZM65.3839 88.2217H56.8244V87.5686H65.3839V88.2217ZM65.3839 85.2981H56.8244V84.645H65.3839V85.2981ZM65.3839 82.2866H56.8244V81.6335H65.3839V82.2866ZM65.3839 79.3558H56.8244V78.7027H65.3839V79.3558Z\" fill=\"url(#paint0_linear_732_1681)\"/>\n      <path d=\"M50.8181 89.8295V64.1368H43.0399V62.061H39.7482V74.7269H38.8623V113.475H52.7584V89.8295H50.8181ZM45.0017 97.3844H43.0399V95.482H45.0017V97.3844ZM45.0017 94.4085H43.0399V92.5061H45.0017V94.4085ZM45.0017 91.4469H43.0399V89.5445H45.0017V91.4469ZM45.0017 88.4924H43.0399V86.59H45.0017V88.4924ZM45.0017 85.5165H43.0399V83.6141H45.0017V85.5165ZM45.0017 79.579H43.0399V77.6767H45.0017V79.579ZM45.0017 76.6032H43.0399V74.7008H45.0017V76.6032ZM45.0017 73.6392H43.0399V71.7368H45.0017V73.6392ZM45.0017 70.6847H43.0399V68.7823H45.0017V70.6847ZM45.0017 67.7088H43.0399V65.8064H45.0017V67.7088ZM47.9348 97.3844H45.9731V95.482H47.9348V97.3844ZM47.9348 94.4085H45.9731V92.5061H47.9348V94.4085ZM47.9348 91.4469H45.9731V89.5445H47.9348V91.4469ZM47.9348 88.4924H45.9731V86.59H47.9348V88.4924ZM47.9348 85.5165H45.9731V83.6141H47.9348V85.5165ZM47.9348 79.579H45.9731V77.6767H47.9348V79.579ZM47.9348 76.6032H45.9731V74.7008H47.9348V76.6032ZM47.9348 73.6392H45.9731V71.7368H47.9348V73.6392ZM47.9348 70.6847H45.9731V68.7823H47.9348V70.6847ZM47.9348 67.7088H45.9731V65.8064H47.9348V67.7088Z\" fill=\"url(#paint1_linear_732_1681)\"/>\n      <path d=\"M127.367 103.338C127.452 102.234 127.367 66.1743 127.367 66.1743H131.768V74.1804H138.774V90.9123H142.747V103.338H127.367Z\" fill=\"url(#paint2_linear_732_1681)\"/>\n      <path d=\"M156.156 87.1551V86.0032H154.969V75.9498H152.071V74.8336H150.117V73.1924H149.098V68.4092H148.364V73.2257H147.428V74.8668H144.531V77.5553H142.856V108.722H156.959V87.1527H156.156V87.1551ZM145.348 99.6903H144.393V96.0708H145.348V99.6903ZM145.348 95.2609H144.393V91.6414H145.348V95.2609ZM145.348 90.8316H144.393V87.2121H145.348V90.8316ZM145.348 86.3238H144.393V82.7043H145.348V86.3238ZM145.348 81.8137H144.393V78.1942H145.348V81.8137ZM147.314 99.6903H146.36V96.0708H147.314V99.6903ZM147.314 95.2609H146.36V91.6414H147.314V95.2609ZM147.314 90.8316H146.36V87.2121H147.314V90.8316ZM147.314 86.3238H146.36V82.7043H147.314V86.3238ZM147.314 81.8137H146.36V78.1942H147.314V81.8137ZM149.278 99.6903H148.324V96.0708H149.278V99.6903ZM149.278 95.2609H148.324V91.6414H149.278V95.2609ZM149.278 90.8316H148.324V87.2121H149.278V90.8316ZM149.278 86.3238H148.324V82.7043H149.278V86.3238ZM149.278 81.8137H148.324V78.1942H149.278V81.8137ZM151.245 99.6903H150.29V96.0708H151.245V99.6903ZM151.245 95.2609H150.29V91.6414H151.245V95.2609ZM151.245 90.8316H150.29V87.2121H151.245V90.8316ZM151.245 86.3238H150.29V82.7043H151.245V86.3238ZM151.245 81.8137H150.29V78.1942H151.245V81.8137ZM153.211 99.6903H152.257V96.0708H153.211V99.6903ZM153.211 95.2609H152.257V91.6414H153.211V95.2609ZM153.211 90.8316H152.257V87.2121H153.211V90.8316ZM153.211 86.3238H152.257V82.7043H153.211V86.3238ZM153.211 81.8137H152.257V78.1942H153.211V81.8137Z\" fill=\"url(#paint3_linear_732_1681)\"/>\n      <path d=\"M22.7646 118.717V97.4511H25.2014V86.5973L33.5756 82.9707V97.2801H35.4115V118.717H22.7646Z\" fill=\"url(#paint4_linear_732_1681)\"/>\n      <path d=\"M166.398 114.774H159.049V85.5308L166.398 89.0861V114.774Z\" fill=\"url(#paint5_linear_732_1681)\"/>\n      <path d=\"M21.5342 44.2816C21.5342 44.2816 23.7525 38.2301 29.2055 40.6051C30.4642 39.3274 32.0222 38.3987 34.1288 38.8167C36.2355 39.2371 37.594 40.8141 38.0547 41.8639C38.715 41.833 44.0017 42.0087 44.0017 47.4926C44.0017 52.9765 37.6035 52.872 37.1403 52.4374C36.5703 52.9456 33.8296 55.703 30.5046 52.5561C29.785 53.1712 27.4337 55.7766 23.7168 52.1809C21.995 52.9005 17.9028 53.4539 17.1096 49.2287C16.3163 45.006 20.3847 43.8114 21.5342 44.2816Z\" fill=\"url(#paint6_linear_732_1681)\"/>\n      <path d=\"M144.338 35.537C144.338 35.537 146.557 29.4855 152.01 31.8605C153.268 30.5827 154.826 29.6541 156.933 30.0721C159.04 30.4901 160.398 32.0695 160.859 33.1192C161.519 33.0884 166.806 33.2641 166.806 38.748C166.806 44.2319 160.408 44.125 159.945 43.6903C159.375 44.1986 156.634 46.956 153.309 43.8091C152.589 44.4242 150.238 47.0296 146.521 43.4338C144.799 44.1535 140.707 44.7069 139.914 40.4817C139.121 36.2614 143.189 35.0667 144.338 35.537Z\" fill=\"url(#paint7_linear_732_1681)\"/>\n      <path d=\"M115.995 48.4854C115.995 48.4854 117.601 44.1035 121.548 45.8254C122.46 44.8992 123.586 44.227 125.113 44.531C126.637 44.835 127.621 45.9774 127.953 46.735C128.431 46.7137 132.259 46.8395 132.259 50.8082C132.259 54.7768 127.628 54.7008 127.293 54.3873C126.88 54.7554 124.897 56.7504 122.488 54.4752C121.968 54.9193 120.265 56.8074 117.577 54.2044C116.33 54.7245 113.368 55.1259 112.794 52.0669C112.216 49.0103 115.164 48.1458 115.995 48.4854Z\" fill=\"url(#paint8_linear_732_1681)\"/>\n      <path d=\"M95.4657 177.989C144.126 177.989 183.573 159.268 183.573 136.175C183.573 113.082 144.126 94.3608 95.4657 94.3608C46.8051 94.3608 7.35791 113.082 7.35791 136.175C7.35791 159.268 46.8051 177.989 95.4657 177.989Z\" fill=\"url(#paint9_linear_732_1681)\"/>\n      <path d=\"M35.1264 131.062C35.1264 131.062 34.2881 132.252 35.6893 134.023C36.9386 135.6 38.9122 135.294 39.5677 134.788C39.7696 136.161 41.4534 139.054 44.1182 137.417C46.6238 135.881 45.4173 133.544 44.6169 132.625C46.1821 132.183 47.3482 128.433 43.7572 127.138C44.2892 125.59 44.3842 124.889 43.6052 123.497C42.8547 122.158 41.6221 121.944 39.6556 122.759L36.8127 123.958L35.0006 120.576L34.0316 121.137L36.1216 124.367L33.3523 125.756C33.3523 125.756 30.9844 126.682 32.0057 129.224C32.9509 131.577 35.1264 131.062 35.1264 131.062Z\" fill=\"url(#paint10_linear_732_1681)\"/>\n      <path d=\"M30.3073 116.641H38.8716C38.8716 116.641 41.6385 116.719 42.1895 113.558C42.7951 110.088 40.2704 109.611 40.2704 109.611C40.2704 109.611 41.7905 108.913 41.4603 106.288C41.1278 103.666 38.8193 103.334 37.8574 103.455C38.0142 101.899 38.3419 98.3772 34.6844 98.3416C31.1528 98.3059 31.1742 101.861 31.4378 103.263C30.1791 103.277 26.3767 105.165 29.0509 109.307C27.5951 110.554 26.9799 111.273 27.0441 113.071C27.1058 114.872 28.2078 116.641 30.3073 116.641Z\" fill=\"url(#paint11_linear_732_1681)\"/>\n      <path d=\"M38.6602 111.834L35.0075 114.237L34.9077 111.915L37.2162 109.193L34.8721 111.088L34.5681 103.987L34.3449 111.136L31.8796 109.174L34.3211 111.862L34.2475 114.254L30.4902 111.494L34.219 115.116L34.0314 121.139H35.302L35.0455 115.154L38.6602 111.834Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M159.203 126.713C159.203 126.713 158.431 127.81 159.721 129.44C160.87 130.893 162.689 130.61 163.293 130.143C163.478 131.406 165.031 134.068 167.485 132.565C169.791 131.15 168.682 128.998 167.943 128.152C169.385 127.746 170.458 124.291 167.152 123.101C167.644 121.676 167.732 121.03 167.012 119.75C166.321 118.517 165.186 118.317 163.376 119.07L160.754 120.175L159.084 117.061L158.194 117.576L160.117 120.55L157.569 121.83C157.569 121.83 155.389 122.683 156.329 125.024C157.198 127.188 159.203 126.713 159.203 126.713Z\" fill=\"url(#paint12_linear_732_1681)\"/>\n      <path d=\"M154.762 113.434H162.647C162.647 113.434 165.195 113.508 165.701 110.596C166.257 107.402 163.934 106.963 163.934 106.963C163.934 106.963 165.335 106.319 165.029 103.904C164.723 101.488 162.597 101.182 161.711 101.296C161.856 99.8637 162.158 96.6194 158.79 96.5862C155.539 96.5529 155.558 99.8257 155.8 101.118C154.641 101.13 151.138 102.868 153.603 106.685C152.263 107.832 151.696 108.497 151.755 110.15C151.817 111.805 152.831 113.434 154.762 113.434Z\" fill=\"url(#paint13_linear_732_1681)\"/>\n      <path d=\"M162.455 109.007L159.092 111.221L159.001 109.081L161.127 106.575L158.968 108.321L158.688 101.78L158.481 108.364L156.213 106.556L158.46 109.034L158.391 111.238L154.933 108.694L158.367 112.031L158.192 117.576H159.365L159.127 112.064L162.455 109.007Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M54.8244 105.291C54.8244 105.291 54.4088 105.88 55.1023 106.756C55.7198 107.537 56.6959 107.385 57.0213 107.134C57.121 107.813 57.9546 109.243 59.2728 108.435C60.5125 107.675 59.9164 106.519 59.5198 106.065C60.294 105.846 60.8711 103.992 59.0946 103.353C59.3583 102.588 59.4058 102.241 59.0186 101.552C58.6481 100.89 58.0378 100.783 57.0664 101.187L55.658 101.78L54.7626 100.108L54.2829 100.386L55.316 101.982L53.9456 102.669C53.9456 102.669 52.7748 103.127 53.2806 104.383C53.7485 105.547 54.8244 105.291 54.8244 105.291Z\" fill=\"url(#paint14_linear_732_1681)\"/>\n      <path d=\"M52.4397 98.1586H56.6743C56.6743 98.1586 58.0423 98.1966 58.3154 96.6339C58.6147 94.9168 57.3654 94.6817 57.3654 94.6817C57.3654 94.6817 58.1183 94.3349 57.9544 93.0382C57.7906 91.7414 56.6482 91.5775 56.1732 91.6369C56.2516 90.8674 56.4131 89.1242 54.6033 89.1075C52.8553 89.0909 52.8672 90.8484 52.9978 91.5419C52.3756 91.549 50.4946 92.4824 51.8174 94.532C51.0978 95.1472 50.7914 95.5058 50.8247 96.394C50.8556 97.2823 51.4018 98.1586 52.4397 98.1586Z\" fill=\"url(#paint15_linear_732_1681)\"/>\n      <path d=\"M56.5697 95.7811L54.7647 96.971L54.7148 95.8215L55.8572 94.4749L54.6982 95.413L54.5462 91.9004L54.4369 95.4344L53.2162 94.4654L54.425 95.7954L54.387 96.9781L52.5298 95.6125L54.3752 97.4056L54.2802 100.384H54.9095L54.7837 97.4222L56.5697 95.7811Z\" fill=\"#C6D5E6\"/>\n      <path d=\"M112.5 95.5L162.173 138.613L97.5 157.5L74 95.5H112.5Z\" fill=\"url(#paint16_linear_732_1681)\"/>\n      <path d=\"M95.3502 105.3C112.83 105.3 127 91.1298 127 73.65C127 56.1702 112.83 42 95.3502 42C77.8704 42 63.7002 56.1702 63.7002 73.65C63.7002 91.1298 77.8704 105.3 95.3502 105.3Z\" fill=\"url(#paint17_linear_732_1681)\"/>\n      <path d=\"M95.3502 105.3C112.83 105.3 127 91.1298 127 73.65C127 56.1702 112.83 42 95.3502 42C77.8704 42 63.7002 56.1702 63.7002 73.65C63.7002 91.1298 77.8704 105.3 95.3502 105.3Z\" fill=\"url(#paint18_linear_732_1681)\"/>\n      <path d=\"M95.3498 98.288C108.957 98.288 119.988 87.257 119.988 73.6496C119.988 60.0422 108.957 49.0112 95.3498 49.0112C81.7424 49.0112 70.7114 60.0422 70.7114 73.6496C70.7114 87.257 81.7424 98.288 95.3498 98.288Z\" fill=\"url(#paint19_linear_732_1681)\"/>\n      <path d=\"M102.274 87.0823H88.2069C86.1509 87.0823 84.4805 85.4094 84.4805 83.3559C84.4805 81.4526 85.9158 79.8767 87.7608 79.6561V78.1577C87.7608 76.3612 88.3936 74.6422 89.5307 73.2797C88.396 71.9171 87.7608 70.1981 87.7608 68.4016V66.9033C85.9158 66.6826 84.4805 65.1067 84.4805 63.2035C84.4805 61.1475 86.1534 59.4771 88.2069 59.4771H102.274C104.33 59.4771 106 61.1499 106 63.2035C106 65.0049 104.715 66.5129 103.013 66.8572V68.404C103.013 70.2006 102.38 71.9195 101.243 73.2821C102.378 74.6447 103.013 76.3636 103.013 78.1602V79.707C104.715 80.0513 106 81.5593 106 83.3607C106 85.4094 104.33 87.0823 102.274 87.0823ZM88.2069 82.0515C87.4893 82.0515 86.905 82.6358 86.905 83.3534C86.905 84.0711 87.4893 84.6554 88.2069 84.6554H102.274C102.991 84.6554 103.576 84.0711 103.576 83.3534C103.576 82.6358 102.991 82.0515 102.274 82.0515H101.801C101.132 82.0515 100.589 81.5084 100.589 80.8392V78.1553C100.589 76.6352 99.922 75.1926 98.7583 74.1986C98.4892 73.9682 98.334 73.6312 98.334 73.2772C98.334 72.9233 98.4892 72.5863 98.7583 72.3559C99.922 71.3619 100.589 69.9218 100.589 68.4016V65.7177C100.589 65.0485 101.132 64.5054 101.801 64.5054H102.274C102.991 64.5054 103.576 63.9211 103.576 63.2035C103.576 62.4858 102.991 61.9015 102.274 61.9015H88.2069C87.4893 61.9015 86.905 62.4858 86.905 63.2035C86.905 63.9211 87.4893 64.5054 88.2069 64.5054H88.9731C89.6422 64.5054 90.1853 65.0485 90.1853 65.7177V68.4016C90.1853 69.9218 90.852 71.3643 92.0158 72.3559C92.2849 72.5863 92.4401 72.9233 92.4401 73.2772C92.4401 73.6312 92.2849 73.9682 92.0158 74.1986C90.852 75.1926 90.1853 76.6327 90.1853 78.1529V80.8368C90.1853 81.506 89.6422 82.0491 88.9731 82.0491H88.2069V82.0515Z\" fill=\"url(#paint20_linear_732_1681)\"/>\n      </g>\n      </g>\n      <defs>\n      <linearGradient id=\"paint0_linear_732_1681\" x1=\"61.1566\" y1=\"99.7028\" x2=\"61.1566\" y2=\"76.7155\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint1_linear_732_1681\" x1=\"45.8101\" y1=\"113.476\" x2=\"45.8101\" y2=\"62.0596\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint2_linear_732_1681\" x1=\"135.058\" y1=\"103.339\" x2=\"135.058\" y2=\"66.1751\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint3_linear_732_1681\" x1=\"149.908\" y1=\"108.723\" x2=\"149.908\" y2=\"68.41\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DBE3EE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint4_linear_732_1681\" x1=\"29.0887\" y1=\"118.717\" x2=\"29.0887\" y2=\"82.9705\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint5_linear_732_1681\" x1=\"162.724\" y1=\"114.773\" x2=\"162.724\" y2=\"85.5296\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"5.35827e-07\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#EDF1F9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint6_linear_732_1681\" x1=\"30.5049\" y1=\"54.0441\" x2=\"30.5049\" y2=\"38.7156\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint7_linear_732_1681\" x1=\"153.309\" y1=\"45.2994\" x2=\"153.309\" y2=\"29.9709\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint8_linear_732_1681\" x1=\"122.488\" y1=\"55.553\" x2=\"122.488\" y2=\"44.4577\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.2332\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D3DFEE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint9_linear_732_1681\" x1=\"95.4647\" y1=\"177.99\" x2=\"95.4647\" y2=\"94.3595\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4065\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#DAE4EF\"/>\n      </linearGradient>\n      <linearGradient id=\"paint10_linear_732_1681\" x1=\"45.8105\" y1=\"136.061\" x2=\"33.5944\" y2=\"121.502\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint11_linear_732_1681\" x1=\"27.0365\" y1=\"107.492\" x2=\"42.2808\" y2=\"107.492\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint12_linear_732_1681\" x1=\"169.04\" y1=\"131.317\" x2=\"157.79\" y2=\"117.911\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.4034\" stop-color=\"#EFF4F8\"/>\n      <stop offset=\"1\" stop-color=\"#D4DFEC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint13_linear_732_1681\" x1=\"151.752\" y1=\"105.009\" x2=\"165.79\" y2=\"105.009\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint14_linear_732_1681\" x1=\"60.1076\" y1=\"107.764\" x2=\"54.0653\" y2=\"100.563\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"1.4385e-07\" stop-color=\"#EAEFF6\"/>\n      <stop offset=\"1\" stop-color=\"#CDDAE9\"/>\n      </linearGradient>\n      <linearGradient id=\"paint15_linear_732_1681\" x1=\"50.8215\" y1=\"93.6338\" x2=\"58.3617\" y2=\"93.6338\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1022\" stop-color=\"#F0F5F8\"/>\n      <stop offset=\"1\" stop-color=\"#B4C7DC\"/>\n      </linearGradient>\n      <linearGradient id=\"paint16_linear_732_1681\" x1=\"131.177\" y1=\"149.02\" x2=\"115.399\" y2=\"93.9966\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.0938\" stop-color=\"white\"/>\n      <stop offset=\"0.9362\" stop-color=\"#BBCBE0\"/>\n      </linearGradient>\n      <linearGradient id=\"paint17_linear_732_1681\" x1=\"63.7009\" y1=\"73.6475\" x2=\"127.001\" y2=\"73.6475\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint18_linear_732_1681\" x1=\"63.7009\" y1=\"73.6475\" x2=\"127.001\" y2=\"73.6475\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#EFF3F9\"/>\n      <stop offset=\"1\" stop-color=\"#B6C9DE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint19_linear_732_1681\" x1=\"70.7114\" y1=\"73.6471\" x2=\"119.989\" y2=\"73.6471\" gradientUnits=\"userSpaceOnUse\">\n      <stop stop-color=\"#DDE5F0\"/>\n      <stop offset=\"1\" stop-color=\"#9FB7CE\"/>\n      </linearGradient>\n      <linearGradient id=\"paint20_linear_732_1681\" x1=\"84.4816\" y1=\"73.2814\" x2=\"106\" y2=\"73.2814\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0.1453\" stop-color=\"white\"/>\n      <stop offset=\"1\" stop-color=\"#D8E3EF\"/>\n      </linearGradient>\n      <clipPath id=\"clip0_732_1681\">\n      <rect width=\"190\" height=\"190\" fill=\"white\"/>\n      </clipPath>\n      <clipPath id=\"clip1_732_1681\">\n      <rect width=\"190\" height=\"190\" fill=\"white\" transform=\"translate(0 -5)\"/>\n      </clipPath>\n      </defs>\n    </svg>\n  `;\n\n  return <SvgXml xml={xml} width={190} height={190} />;\n});\n"
  },
  {
    "path": "packages/react-native/src/scroll-number/index.md",
    "content": "---\ntitle: ScrollNumber - 滚动数字组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 其他组件\n  path: /other\n---\n\n# ScrollNumber 滚动数字组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<ScrollNumber value={value} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249493948238930.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 修改样式\n\n```tsx | pure\n<ScrollNumber\n  value={value}\n  height={100}\n  containerStyle={{\n    width: 100,\n    marginRight: 10,\n    borderWidth: 1,\n    borderColor: 'red',\n  }}\n  textStyle={{ fontSize: 80, color: '#0000ff' }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249734059808402.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 修改动画类型\n\n```tsx | pure\n<ScrollNumber\n  value={value}\n  height={100}\n  animationType=\"spring\"\n  containerStyle={{\n    width: 100,\n    marginRight: 10,\n    borderWidth: 1,\n    borderColor: 'red',\n  }}\n  textStyle={{ fontSize: 80, color: '#0000ff' }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249831745364916.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自定义数字\n\n```tsx | pure\n<ScrollNumber\n  numberRange={['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']}\n  value={value2}\n  textStyle={{ fontSize: 80, color: '#ff0000' }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643249981055369644.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性           | 必填    | 说明                                     | 类型               | 默认值   |\n| -------------- | ------- | ---------------------------------------- | ------------------ | -------- |\n| numberRange    | `false` | 滚动的文字区间。默认是 0-9 的数字        | `string[]`         | `[0-9]`  |\n| value          | `true`  | 当前值                                   | `string`           |          |\n| height         | `false` | 显示高度（不传的时候默认计算文字的高度） | `number`           | `0`      |\n| containerStyle | `false` | 容器样式                                 | `ViewStyle`        |          |\n| textStyle      | `false` | 文字样式                                 | `TextStyle`        |          |\n| animationType  | `false` | 滚动动画类型                             | `timing \\| spring` | `timing` |\n"
  },
  {
    "path": "packages/react-native/src/scroll-number/index.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { LayoutChangeEvent, StyleProp, StyleSheet, TextStyle, ViewStyle } from 'react-native';\nimport Animated, { useAnimatedStyle, withSpring, withTiming } from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useBoolean, useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { Theme } from '../theme';\n\nconst { px } = helpers;\n\nexport interface ScrollNumberProps {\n  /** 滚动的文字区间。默认是0-9的数字  */\n  numberRange?: string[];\n  /** 当前值 */\n  value: string | number;\n  /** 显示高度（不传的时候默认计算文字的高度） */\n  height?: number;\n  /** 容器样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n  /** 文字样式 */\n  textStyle?: StyleProp<TextStyle>;\n  /** 滚动动画类型 */\n  animationType?: 'timing' | 'spring';\n}\n\nconst defaultNumberRange = Array(10)\n  .fill('')\n  .map((_, index) => index.toString());\n\nconst ScrollNumber: FC<ScrollNumberProps> = ({\n  numberRange = defaultNumberRange,\n  value,\n  height = 0,\n  containerStyle,\n  textStyle,\n  animationType = 'timing',\n}) => {\n  const theme = useTheme<Theme>();\n  const [measured, { setTrue }] = useBoolean(!!height);\n  const [currentHeight, setCurrentHeight] = useSafeState(height);\n\n  const handleLayout = useMemoizedFn((e: LayoutChangeEvent) => {\n    if (height) return;\n    const layoutHeight = e.nativeEvent.layout.height;\n    setCurrentHeight(layoutHeight);\n    setTrue();\n  });\n\n  const styles = StyleSheet.create({\n    height: {\n      height: currentHeight,\n    },\n    opacity: {\n      opacity: 0,\n    },\n    text: { fontSize: 18, color: theme.colors.gray500 },\n  });\n\n  return (\n    <Box overflow=\"hidden\" style={measured ? styles.height : styles.opacity}>\n      <Flex>\n        {value\n          .toString()\n          .split('')\n          .map((item, index) => (\n            <Box key={index} overflow=\"hidden\" style={[containerStyle, measured ? styles.height : styles.opacity]}>\n              <Tick value={item} height={currentHeight} {...{ numberRange, textStyle, animationType }} />\n            </Box>\n          ))}\n      </Flex>\n      <Box opacity={0} style={!!height && { height }}>\n        <Text fontSize={px(18)} color=\"text\" style={textStyle} onLayout={handleLayout}>\n          {numberRange[0]}\n        </Text>\n      </Box>\n    </Box>\n  );\n};\nScrollNumber.displayName = 'ScrollNumber';\n\nexport default ScrollNumber;\n\nexport interface TickProps\n  extends Pick<ScrollNumberProps, 'numberRange' | 'containerStyle' | 'textStyle' | 'animationType'> {\n  value: string;\n  height: number;\n}\nconst Tick: FC<TickProps> = memo(({ numberRange, value, height, containerStyle, textStyle, animationType }) => {\n  const getPosition = (value: string, height: number) => {\n    'worklet';\n    const index = numberRange?.findIndex(item => item === value);\n    if (index && index > -1) return index * height * -1;\n    return 0;\n  };\n\n  const animatedStyle = useAnimatedStyle(() => {\n    const position = getPosition(value, height);\n    return {\n      transform: [\n        {\n          translateY: animationType === 'timing' ? withTiming(position) : withSpring(position),\n        },\n      ],\n    };\n  });\n\n  if (!numberRange || numberRange.length === 0) return null;\n\n  return (\n    <Animated.View style={[animatedStyle]}>\n      {numberRange.map(i => (\n        <Box key={i} justifyContent={'center'} alignItems={'center'} style={[containerStyle, !!height && { height }]}>\n          <Text fontSize={px(18)} color=\"text\" style={textStyle}>\n            {i}\n          </Text>\n        </Box>\n      ))}\n    </Animated.View>\n  );\n});\n"
  },
  {
    "path": "packages/react-native/src/search-bar/index.md",
    "content": "---\ntitle: SearchBar - 搜索栏组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# SearchBar 搜索栏组件\n\n## 效果演示\n\n### 1. 默认配置\n\n```tsx | pure\n<SearchBar onChange={value => console.log(value)} onSearch={value => console.log(value)} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"searchBar-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608868154498024610.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 配置 placeholder、cancelTitle\n\n```tsx | pure\n<SearchBar placeholder=\"请输入酒店/关键词\" cancelTitle=\"cancel\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"searchBar-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608868196958509649.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 配置 placeholderPosition\n\n```tsx | pure\n<SearchBar placeholderPosition=\"center\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"searchBar-ios3.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608868215970101527.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 配置 defaultValue、autoFocus\n\n```tsx | pure\n<SearchBar defaultValue=\"美团酒店\" autoFocus />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"searchBar-ios4.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608868232946037474.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 配置 children\n\n```tsx | pure\n<SearchBar inputContainerStyle={{ flex: 6 }} containerStyle={{ height: px(40) }}>\n  <>\n    <Flex flex={1}>\n      <Icon name=\"left\" />\n    </Flex>\n    <Flex flex={2} height={px(40)} justifyContent=\"center\">\n      <Text>请入住</Text>\n    </Flex>\n  </>\n</SearchBar>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"searchBar-ios5.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608868245196272524.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性             | 必填    | 说明                     | 类型                     | 默认值    |\n| ---------------- | ------- | ------------------------ | ------------------------ | --------- |\n| placeholder      | `false` | 搜索框的 placeholder     | `string`                 | `搜索`    |\n| showCancelButton | `false` | 是否展示取消按钮         | `boolean`                | `true`    |\n| allowClear       | `false` | 是否允许清除             | `boolean`                | `true`    |\n| disabled         | `false` | 搜索框是否禁用           | `boolean`                | `false`   |\n| defaultValue     | `false` | 搜索框的默认值           | `string`                 |           |\n| autoFocus        | `false` | 是否自动 focus           | `boolean`                | `false`   |\n| cancelText       | `false` | 取消文字                 | `string`                 | `取消`    |\n| returnKeyType    | `false` | 键盘下方的按钮类型       | `ReturnKeyTypeOptions`   | `search`  |\n| keyboardType     | `false` | 弹出键盘类型             | `KeyboardTypeOptions`    | `default` |\n| style            | `false` | 最外层 view 的样式       | `ViewStyle`              |           |\n| inputStyle       | `false` | input 的样式             | `TextStyle`              |           |\n| onChange         | `false` | 输入改变时的回调         | `(text: string) => void` |           |\n| onSearch         | `false` | 提交时的搜索             | `(text: string) => void` |           |\n| activeOpacity    | `false` | 取消按钮按下时的不透明度 | `number`                 | `0.6`     |\n"
  },
  {
    "path": "packages/react-native/src/search-bar/index.tsx",
    "content": "import React, { FC, PropsWithChildren, useMemo } from 'react';\nimport { KeyboardTypeOptions, ReturnKeyTypeOptions, StyleProp, StyleSheet, TextStyle, ViewStyle } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport InputItem from '../input/InputItem';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport useSearchBar from './useSearchBar';\n\nconst { ONE_PIXEL } = helpers;\n\nexport type SearchBarProps = PropsWithChildren<{\n  /** 搜索框的placeholder */\n  placeholder?: string;\n  /** 是否展示取消按钮 */\n  showCancelButton?: boolean;\n  /** 是否允许清除 */\n  allowClear?: boolean;\n  /** 搜索框是否禁用 */\n  disabled?: boolean;\n  /** 搜索框的默认值 */\n  defaultValue?: string;\n  /** 是否自动focus */\n  autoFocus?: boolean;\n  /** 取消文字 */\n  cancelText?: string;\n  /** 键盘下方的按钮类型，默认为搜索 */\n  returnKeyType?: ReturnKeyTypeOptions;\n  /** 弹出键盘类型 */\n  keyboardType?: KeyboardTypeOptions;\n  /** 最外层view的样式 */\n  style?: StyleProp<ViewStyle>;\n  /** input框的样式 */\n  inputStyle?: StyleProp<TextStyle>;\n  /** 输入改变时的回调 */\n  onChange?: (text: string) => void;\n  /** 提交时的搜索 */\n  onSearch?: (text: string) => void;\n  /** 取消按钮按下时的不透明度 */\n  activeOpacity?: number;\n}>;\n\nconst SearchBar: FC<SearchBarProps> = props => {\n  const {\n    placeholder = '搜索',\n    showCancelButton = true,\n    allowClear = true,\n    disabled = false,\n    defaultValue,\n    autoFocus = false,\n    cancelText = '取消',\n    returnKeyType = 'search',\n    keyboardType = 'default',\n    style,\n    inputStyle,\n    onChange,\n    onSearch,\n    children,\n    activeOpacity = 0.6,\n  } = props;\n\n  const theme = useTheme<Theme>();\n  const { inputRef, focused, keywords, onFocus, onBlur, onCancel, setKeywords } = useSearchBar({\n    autoFocus,\n    defaultValue,\n    onChange,\n    onSearch,\n  });\n\n  const styles = StyleSheet.create({\n    container: {\n      overflow: 'hidden',\n      paddingVertical: theme.spacing.x1,\n      backgroundColor: theme.colors.gray50,\n    },\n    textInput: {\n      flex: 1,\n      textAlign: 'left',\n      borderBottomWidth: 0,\n    },\n  });\n\n  const CancelBtn = useMemo(() => {\n    if (!showCancelButton || !focused) return null;\n    return (\n      <Pressable\n        onPress={onCancel}\n        activeOpacity={activeOpacity}\n        style={{\n          marginLeft: allowClear ? 0 : theme.spacing.x1,\n          marginRight: theme.spacing.x1,\n        }}\n      >\n        <Text variant=\"p0\" color=\"primary200\">\n          {cancelText}\n        </Text>\n      </Pressable>\n    );\n  }, [showCancelButton, focused, activeOpacity, theme.spacing.x1, cancelText, onCancel, allowClear]);\n\n  return (\n    <Flex style={[styles.container, style]}>\n      {!!children && (\n        <Box\n          justifyContent=\"center\"\n          alignItems=\"center\"\n          marginHorizontal={'x1'}\n          borderRightWidth={ONE_PIXEL}\n          borderRightColor={'gray500'}\n        >\n          {children}\n        </Box>\n      )}\n      {/* 搜索小图标 */}\n      <SvgIcon name=\"search\" color={theme.colors.icon} style={{ marginHorizontal: theme.spacing.x1 }} />\n      <InputItem\n        ref={inputRef}\n        style={styles.textInput}\n        inputStyle={inputStyle}\n        placeholder={placeholder}\n        editable={!disabled}\n        autoFocus={autoFocus}\n        value={keywords}\n        returnKeyType={returnKeyType}\n        keyboardType={keyboardType}\n        allowClear={allowClear}\n        onFocus={onFocus}\n        onBlur={onBlur}\n        onChange={setKeywords}\n        onSubmitEditing={e => onSearch?.(e.nativeEvent.text)}\n        onClear={onCancel}\n      />\n      {/* 取消按钮 */}\n      {CancelBtn}\n    </Flex>\n  );\n};\nSearchBar.displayName = 'SearchBar';\n\nexport default SearchBar;\n"
  },
  {
    "path": "packages/react-native/src/search-bar/useSearchBar.ts",
    "content": "import { useEffect, useRef } from 'react';\nimport { TextInput } from 'react-native';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { SearchBarProps } from '.';\n\nexport default function useSearchBar({\n  autoFocus = false,\n  defaultValue,\n  onChange,\n  onSearch,\n}: Pick<SearchBarProps, 'autoFocus' | 'onChange' | 'defaultValue' | 'onSearch'>) {\n  const inputRef = useRef<TextInput>(null);\n\n  const [keywords, setKeywords] = useSafeState<string>();\n  const [focused, setFocused] = useSafeState(autoFocus);\n\n  useEffect(() => {\n    setKeywords(defaultValue);\n  }, [defaultValue]);\n\n  useEffect(() => {\n    if (autoFocus) {\n      inputRef.current?.focus();\n      setFocused(true);\n    }\n  }, [autoFocus]);\n\n  /** 聚焦 */\n  const onFocus = () => {\n    setFocused(true);\n    inputRef.current?.focus();\n  };\n\n  /** 失焦 */\n  const onBlur = () => {\n    setFocused(false);\n    inputRef.current?.blur();\n  };\n\n  const onCancel = () => {\n    inputRef.current?.clear();\n    inputRef.current?.blur();\n    setFocused(false);\n    setKeywords('');\n    onChange?.('');\n    onSearch?.('');\n  };\n\n  return {\n    onFocus: useMemoizedFn(onFocus),\n    onBlur: useMemoizedFn(onBlur),\n    onCancel: useMemoizedFn(onCancel),\n    setKeywords,\n    inputRef,\n    focused,\n    keywords,\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/slider/index.md",
    "content": "---\ntitle: Slider - 滑块组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# Slider 滑块组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Slider />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"slider-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608032620330195137.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 默认值 45\n\n```tsx | pure\n<Slider value={45} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"slider-io21.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608032749566957647.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 最大最小值\n\n```tsx | pure\n<Slider min={20} max={80} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"slider-ios3.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608032808179563288.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自定义颜色\n\n```tsx | pure\n<Slider value={45} foregroundColor=\"gold\" backgroundColor=\"red\" borderColor=\"blue\" handleBackground=\"pink\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"slider-ios4.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608032929313069066.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 不显示滑块数字\n\n```tsx | pure\n<Slider value={45} showLabel={false} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"slider-ios5.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608033028156894177.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 数字在右边\n\n```tsx | pure\n<Slider value={45} labelPosition=\"right\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"slider-ios6.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608033111344004697.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性             | 必填    | 说明               | 类型                                   | 默认值    |\n| ---------------- | ------- | ------------------ | -------------------------------------- | --------- |\n| min              | `false` | 最小值             | `number`                               | `0`       |\n| max              | `false` | 最大值             | `number`                               | `100`     |\n| value            | `false` | 当前值             | `number`                               | `0`       |\n| width            | `false` | 宽度               | `number`                               | `px(250)` |\n| labelWidth       | `false` | 文本宽度           | `number`                               | `px(40)`  |\n| height           | `false` | 高度               | `number`                               | `20`      |\n| onChange         | `false` | 滑块拖动后触发事件 | `(value: number) => void`              |           |\n| foregroundColor  | `false` | 滑块左侧颜色       | `string`                               | `主题色`  |\n| backgroundColor  | `false` | 滑块右侧颜色       | `string`                               | `#fff`    |\n| handleBackground | `false` | 滑块背景色         | `string`                               | `#fff`    |\n| showText         | `false` | 是否显示滑块数字   | `boolean`                              | `true`    |\n| textPosition     | `false` | 滑块数字显示位置   | `top` \\| `left` \\| `right` \\| `bottom` | `top`     |\n| textStyle        | `false` | 文本样式           | `TextStyle`                            |           |\n"
  },
  {
    "path": "packages/react-native/src/slider/index.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, TextStyle } from 'react-native';\nimport { PanGestureHandler } from 'react-native-gesture-handler';\nimport Animated from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport ReText from '../text/ReText';\nimport { Theme } from '../theme';\nimport useSlider from './useSlider';\n\nconst { px } = helpers;\n\nexport interface SliderProps {\n  /** 最小值 */\n  min?: number;\n  /** 最大值 */\n  max?: number;\n  /** 当前值 */\n  value?: number;\n  /** 宽度 */\n  width?: number;\n  /** 标签文本宽度 */\n  labelWidth?: number;\n  /** 高度 */\n  height?: number;\n  /** 滑块拖动后触发事件 */\n  onChange?: (value: number) => void;\n  /** 滑块左侧颜色 */\n  foregroundColor?: string;\n  /** 滑块右侧颜色 */\n  backgroundColor?: string;\n  /** 滑块背景色 */\n  handleBackground?: string;\n  /** 是否显示滑块数字 */\n  showText?: boolean;\n  /** 滑块数字显示位置 */\n  textPosition?: 'top' | 'left' | 'right' | 'bottom';\n  /** 文本样式 */\n  textStyle?: TextStyle;\n}\n\nconst SLIDER_HEIGHT = px(20);\n\nconst Slider: FC<SliderProps> = props => {\n  const theme = useTheme<Theme>();\n  const {\n    min = 0,\n    max = 100,\n    value = 0,\n    onChange,\n    width = px(250),\n    labelWidth = px(40),\n    height = SLIDER_HEIGHT,\n    backgroundColor = theme.colors.gray200,\n    foregroundColor = theme.colors.primary200,\n    handleBackground = theme.colors.white,\n    showText = true,\n    textPosition = 'top',\n    textStyle,\n  } = props;\n  const KNOB_WIDTH = height;\n  const sliderRange = width - KNOB_WIDTH;\n  const oneStepValue = Math.ceil(sliderRange / (max - min)) || 1;\n\n  const { progressStyle, knobStyle, onGestureEvent, label } = useSlider({\n    min,\n    max,\n    value,\n    onChange,\n    oneStepValue,\n    knobWidth: KNOB_WIDTH,\n  });\n\n  const styles = StyleSheet.create({\n    progress: {\n      backgroundColor: foregroundColor,\n      borderRadius: KNOB_WIDTH,\n    },\n    knob: {\n      height: KNOB_WIDTH,\n      width: KNOB_WIDTH,\n      borderRadius: KNOB_WIDTH,\n      borderColor: foregroundColor,\n      borderWidth: 1,\n      backgroundColor: handleBackground,\n      justifyContent: 'center',\n      alignItems: 'center',\n    },\n    content: {\n      borderRadius: KNOB_WIDTH,\n      backgroundColor,\n    },\n  });\n\n  const SliderContent = (\n    <Box width={width} height={KNOB_WIDTH} style={styles.content}>\n      <Animated.View style={[StyleSheet.absoluteFillObject, styles.progress, progressStyle]} />\n      <PanGestureHandler onGestureEvent={onGestureEvent}>\n        <Animated.View style={[styles.knob, knobStyle]} />\n      </PanGestureHandler>\n    </Box>\n  );\n\n  const Label = <ReText style={{ fontSize: px(14), color: theme.colors.gray500, ...textStyle }} text={label} />;\n\n  if (!showText) return SliderContent;\n\n  if (textPosition === 'top' || textPosition === 'bottom')\n    return (\n      <Box>\n        {textPosition === 'top' && <Box marginBottom=\"x1\">{Label}</Box>}\n        {SliderContent}\n        {textPosition === 'bottom' && <Box marginTop=\"x1\">{Label}</Box>}\n      </Box>\n    );\n\n  return (\n    <Flex position={'relative'}>\n      {textPosition === 'left' && (\n        <Box width={labelWidth} alignItems={'flex-start'}>\n          {Label}\n        </Box>\n      )}\n      {SliderContent}\n      {textPosition === 'right' && (\n        <Box width={labelWidth} alignItems={'flex-end'}>\n          {Label}\n        </Box>\n      )}\n    </Flex>\n  );\n};\nSlider.displayName = 'Slider';\n\nexport default Slider;\n"
  },
  {
    "path": "packages/react-native/src/slider/useSlider.ts",
    "content": "import { useEffect } from 'react';\nimport {\n  runOnJS,\n  useAnimatedGestureHandler,\n  useAnimatedStyle,\n  useDerivedValue,\n  useSharedValue,\n} from 'react-native-reanimated';\n\nimport type { SliderProps } from '.';\nimport { clamp } from '../utils/redash';\n\nexport default function useSlider({\n  min = 0,\n  max = 100,\n  value = 0,\n  onChange,\n  oneStepValue,\n  knobWidth,\n}: Pick<SliderProps, 'min' | 'max' | 'value' | 'onChange'> & { oneStepValue: number; knobWidth: number }) {\n  const translateX = useSharedValue(0);\n\n  useEffect(() => {\n    translateX.value = value * oneStepValue;\n  }, [value, oneStepValue]);\n\n  const progressStyle = useAnimatedStyle(() => ({\n    width: translateX.value + knobWidth,\n  }));\n  const knobStyle = useAnimatedStyle(() => {\n    return {\n      transform: [{ translateX: translateX.value }],\n    };\n  });\n\n  const label = useDerivedValue(() => {\n    const step = Math.ceil(translateX.value / oneStepValue);\n    return String(step);\n  });\n\n  const onGestureEvent = useAnimatedGestureHandler({\n    onStart(_, ctx: Record<string, number>) {\n      ctx.offsetX = translateX.value;\n    },\n    onActive(event, ctx) {\n      translateX.value = clamp(event.translationX + ctx.offsetX, min * oneStepValue, max * oneStepValue);\n    },\n    onEnd() {\n      // 判断当前停留的位置处于第几步\n      const currentStep = translateX.value / oneStepValue;\n      // 取余数进行判断，是否超过一半\n      const remainder = currentStep % 1;\n      if (remainder >= 0.5) {\n        translateX.value = Math.ceil(currentStep) * oneStepValue;\n      } else {\n        translateX.value = Math.floor(currentStep) * oneStepValue;\n      }\n\n      if (onChange) {\n        runOnJS(onChange)(translateX.value / oneStepValue);\n      }\n    },\n  });\n\n  return { progressStyle, knobStyle, onGestureEvent, label };\n}\n"
  },
  {
    "path": "packages/react-native/src/stepper/index.md",
    "content": "---\ntitle: Stepper - 步进器组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# Stepper 步进器组件\n\n## 效果演示\n\n### 1. 最大值 20，最小值 0，步进 3\n\n```tsx | pure\n<Stepper step={3} max={20} min={0} value={value} onChange={setValue} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643252047758854553.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 不显示清除图标\n\n```tsx | pure\n<Stepper width={px(100)} allowClear={false} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643252117315903116.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 禁用\n\n```tsx | pure\n<Stepper disabled />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643252184309611034.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 不允许用户输入\n\n```tsx | pure\n<Stepper width={px(100)} editable={false} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643252252170355408.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性          | 必填    | 说明                       | 类型                       | 默认值  |\n| ------------- | ------- | -------------------------- | -------------------------- | ------- |\n| min           | `false` | 最小值                     | `number`                   |         |\n| max           | `false` | 最大值                     | `number`                   |         |\n| defaultValue  | `false` | 默认值                     | `number` \\| `string`       |         |\n| value         | `false` | 当前值                     | `number` \\| `string`       |         |\n| onChange      | `false` | 修改后回调函数             | `(value?: number) => void` |         |\n| step          | `false` | 每次改变步数，可以为小数   | `number`                   | `1`     |\n| disabled      | `false` | 是否禁用                   | `boolean`                  | `false` |\n| width         | `false` | 宽度                       | `number`                   | `200`   |\n| allowClear    | `false` | 是否显示清除图标           | `boolean`                  | `true`  |\n| editable      | `false` | 是否允许手动输入           | `boolean`                  | `true`  |\n| activeOpacity | `false` | 加号、减号按下时的不透明度 | `number`                   | `0.6`   |\n"
  },
  {
    "path": "packages/react-native/src/stepper/index.tsx",
    "content": "import React, { forwardRef } from 'react';\n\nimport { composeRestyleFunctions, layout, useRestyle, useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Input from '../input';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport { Theme } from '../theme';\nimport useStepper, { StepperProps } from './useStepper';\n\nconst { ONE_PIXEL, px } = helpers;\n\nconst Stepper = forwardRef<unknown, StepperProps>(\n  (\n    {\n      min = Number.NEGATIVE_INFINITY,\n      max = Number.POSITIVE_INFINITY,\n      value,\n      onChange,\n      step = 1,\n      width = px(200),\n      defaultValue,\n      disabled = false,\n      allowClear = true,\n      editable = true,\n      activeOpacity = 0.6,\n      ...layoutProps\n    },\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _\n  ) => {\n    const restyleFunctions = composeRestyleFunctions([layout]);\n\n    const theme = useTheme<Theme>();\n    const props = useRestyle(restyleFunctions as any, layoutProps);\n    const { current, handleAdd, handleMinus, handleChange } = useStepper({\n      defaultValue,\n      value,\n      min,\n      max,\n      onChange,\n      step,\n    });\n\n    return (\n      <Flex {...props} width={width} minWidth={px(120)}>\n        <Pressable activeOpacity={activeOpacity} onPress={handleMinus} disabled={disabled || +current - step < min}>\n          <Box\n            padding=\"x2\"\n            justifyContent=\"center\"\n            alignItems=\"center\"\n            borderWidth={ONE_PIXEL}\n            borderColor=\"border\"\n            borderRadius=\"x1\"\n          >\n            <SvgIcon name=\"minus\" color={disabled ? theme.colors.disabled : theme.colors.gray500} />\n          </Box>\n        </Pressable>\n        <Box flex={1} minWidth={px(80)} paddingHorizontal=\"x1\">\n          <Input\n            keyboardType=\"number-pad\"\n            value={String(current)}\n            onChange={handleChange}\n            disabled={disabled || !editable}\n            {...{ allowClear }}\n            inputStyle={{\n              textAlign: 'center',\n            }}\n          />\n        </Box>\n        <Pressable activeOpacity={activeOpacity} onPress={handleAdd} disabled={disabled || +current + step > max}>\n          <Box\n            padding=\"x2\"\n            justifyContent=\"center\"\n            alignItems=\"center\"\n            borderWidth={ONE_PIXEL}\n            borderColor=\"border\"\n            borderRadius=\"x1\"\n          >\n            <SvgIcon name=\"plus\" color={disabled ? theme.colors.disabled : theme.colors.gray500} />\n          </Box>\n        </Pressable>\n      </Flex>\n    );\n  }\n);\nStepper.displayName = 'Stepper';\n\nexport default Stepper;\n"
  },
  {
    "path": "packages/react-native/src/stepper/useStepper.ts",
    "content": "import { Keyboard } from 'react-native';\n\nimport { LayoutProps } from '@shopify/restyle';\nimport { useCounter, useMemoizedFn } from '@td-design/rn-hooks';\n\nimport { Theme } from '../theme';\n\nexport type StepperProps = Omit<LayoutProps<Theme>, 'width' | 'minWidth'> & {\n  /** 最小值 */\n  min?: number;\n  /** 最大值 */\n  max?: number;\n  /** 默认值 */\n  defaultValue?: number;\n  /** 当前值 */\n  value?: number;\n  /** 修改事件 */\n  onChange?: (value?: number) => void;\n  /** 每次改变步数，可以为小数 */\n  step?: number;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 宽度 */\n  width?: number;\n  /** 是否显示清除图标 */\n  allowClear?: boolean;\n  /** 是否允许手动输入 */\n  editable?: boolean;\n  /** 加号、减号按下时的不透明度 */\n  activeOpacity?: number;\n};\n\nexport default function useStepper({\n  defaultValue,\n  value,\n  min,\n  max,\n  onChange,\n  step = 1,\n}: Pick<StepperProps, 'defaultValue' | 'value' | 'min' | 'max' | 'step' | 'onChange'>) {\n  const [current, { set }] = useCounter(value ?? defaultValue, { min, max });\n\n  const handleMinus = () => {\n    Keyboard.dismiss();\n    const value = +current - step;\n    if (onChange) {\n      onChange(value);\n    } else {\n      set(value);\n    }\n  };\n\n  const handleAdd = () => {\n    Keyboard.dismiss();\n    const value = +current + step;\n    if (onChange) {\n      onChange(value);\n    } else {\n      set(value);\n    }\n  };\n\n  const handleChange = (val: string) => {\n    // 先校验是否是数字\n    if (Number.isNaN(+val)) {\n      onChange?.(defaultValue);\n    } else {\n      if (onChange) {\n        onChange(+val);\n      } else {\n        set(+val);\n      }\n    }\n  };\n\n  return {\n    current,\n\n    handleAdd: useMemoizedFn(handleAdd),\n    handleMinus: useMemoizedFn(handleMinus),\n    handleChange: useMemoizedFn(handleChange),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconArrowdown.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconArrowdown: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.2743 4C12.6885 4 13.0243 4.33579 13.0243 4.75V19.75C13.0243 20.1642 12.6885 20.5 12.2743 20.5C11.8601 20.5 11.5243 20.1642 11.5243 19.75V4.75C11.5243 4.33579 11.8601 4 12.2743 4Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5.72046 13.1688C6.01396 12.8765 6.48884 12.8775 6.78112 13.171L12.2747 18.6873L17.7672 13.171C18.0595 12.8775 18.5344 12.8765 18.8279 13.1687C19.1214 13.461 19.1224 13.9359 18.8302 14.2294L12.8062 20.2794C12.6654 20.4207 12.4742 20.5002 12.2747 20.5002C12.0753 20.5002 11.884 20.4208 11.7433 20.2794L5.71827 14.2294C5.42598 13.9359 5.42696 13.4611 5.72046 13.1688Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconArrowdown.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconArrowdown);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconBells.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconBells: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M6.10087 7.4947C6.04619 8.12236 6.04571 8.76474 6.04571 9.43598C6.04571 9.48719 6.04047 9.53827 6.03006 9.58842C5.82754 10.564 5.36706 11.4681 4.69707 12.2105C4.43131 12.6259 4.27805 13.0998 4.25083 13.5878V13.7871L4.25065 13.8032C4.23617 14.4778 4.46335 15.1375 4.89505 15.6674C5.51797 16.3056 6.35615 16.706 7.25858 16.7918L7.26762 16.7927L7.26762 16.7927C10.4099 17.1298 13.5802 17.1298 16.7224 16.7927L16.7344 16.7914L16.7344 16.7915C17.6375 16.7093 18.4764 16.308 19.0961 15.6664C19.5354 15.1376 19.766 14.4743 19.7491 13.7963L19.7489 13.7776V13.586C19.7242 13.1016 19.5711 12.631 19.3037 12.2208C18.6354 11.4737 18.1751 10.5673 17.97 9.59004C17.9631 9.55719 17.9584 9.52391 17.956 9.49042C17.9306 9.14215 17.932 8.79495 17.9332 8.48039C17.9333 8.46309 17.9333 8.44589 17.9334 8.42879C17.9346 8.09141 17.9341 7.78927 17.9087 7.4958C17.6426 4.76888 14.8891 2.75 12.0387 2.75H11.9611C9.10946 2.75 6.35777 4.76959 6.10087 7.4947ZM4.6072 7.35703C4.95318 3.66609 8.54591 1.25 11.9611 1.25H12.0387C15.4546 1.25 19.0451 3.66625 19.402 7.35479L19.4027 7.36176L19.4027 7.36177C19.4351 7.73367 19.4346 8.1017 19.4334 8.43421L19.4333 8.4672C19.4321 8.77778 19.4311 9.05746 19.4486 9.33068C19.6073 10.0442 19.9521 10.7068 20.4512 11.2534C20.4756 11.2801 20.498 11.3086 20.5183 11.3385C20.96 11.9905 21.2128 12.7497 21.2481 13.5344C21.2486 13.5456 21.2489 13.5569 21.2489 13.5681V13.7687C21.2727 14.8207 20.9091 15.844 20.228 16.6511C20.2182 16.6627 20.208 16.674 20.1975 16.685C19.3245 17.6004 18.1428 18.1681 16.8766 18.2848C13.6313 18.6325 10.3572 18.6324 7.11194 18.2846C5.84852 18.1634 4.66977 17.5973 3.7946 16.6873C3.78197 16.6741 3.76982 16.6605 3.75818 16.6465C3.08842 15.8399 2.73043 14.8239 2.75083 13.7794V13.5681C2.75083 13.5557 2.75113 13.5434 2.75175 13.531C2.79062 12.7471 3.04185 11.9886 3.47823 11.3337C3.50011 11.3009 3.52455 11.2698 3.55132 11.2408C4.04504 10.7061 4.38701 10.0562 4.54572 9.35566C4.54578 8.71786 4.54772 8.03783 4.60677 7.36177L4.60719 7.35703L4.6072 7.35703Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.08759 20.265C9.41155 20.0069 9.88342 20.0603 10.1415 20.3842C10.516 20.8543 11.0689 21.1618 11.6799 21.2337C12.291 21.3056 12.9043 21.1351 13.3838 20.7634L13.3949 20.7548L13.395 20.7549C13.5402 20.6467 13.6704 20.5212 13.7828 20.3815C14.0424 20.0587 14.5146 20.0076 14.8373 20.2672C15.16 20.5269 15.2112 20.999 14.9515 21.3217C14.7609 21.5586 14.541 21.7708 14.2972 21.9533C13.5053 22.5647 12.5008 22.8406 11.5046 22.7234C10.5059 22.6059 9.5924 22.1022 8.96834 21.3189C8.71023 20.995 8.76362 20.5231 9.08759 20.265Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconBells.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconBells);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconCheck.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconCheck: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M19.8198 6.19526C20.0601 6.45561 20.0601 6.87772 19.8198 7.13807L9.9736 17.8047C9.73328 18.0651 9.34364 18.0651 9.10332 17.8047L4.18024 12.4714C3.93992 12.2111 3.93992 11.7889 4.18024 11.5286C4.42056 11.2682 4.8102 11.2682 5.05053 11.5286L9.53846 16.3905L18.9495 6.19526C19.1898 5.93491 19.5794 5.93491 19.8198 6.19526Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconCheck.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconCheck);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconCheckboxChecked.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconCheckboxChecked: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\">\n    <path d=\"M10 17l-5-5l1.41-1.42L10 14.17l7.59-7.59L19 8m0-5H5c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z\" fill=\"${getIconColor(\n      color,\n      0,\n      '#999999'\n    )}\"></path>\n  </svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconCheckboxChecked.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconCheckboxChecked);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconCheckboxHalfchecked.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconCheckboxHalfchecked: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\">\n    <path d=\"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zm0 16H5V5h14v14zm-2-2H7V7h10v10z\" fill=\"${getIconColor(\n      color,\n      0,\n      '#999999'\n    )}\"></path>\n  </svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconCheckboxHalfchecked.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconCheckboxHalfchecked);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconCheckboxUnchecked.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconCheckboxUnchecked: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\">\n    <path d=\"M19 3H5c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m0 2v14H5V5h14z\" fill=\"${getIconColor(\n      color,\n      0,\n      '#999999'\n    )}\"></path>\n  </svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconCheckboxUnchecked.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconCheckboxUnchecked);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconCheckcircle.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconCheckcircle: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12ZM7.53034 11.7105C7.82323 11.4176 8.29811 11.4176 8.591 11.7105L11.0303 14.1498L16.6495 8.53052C16.9424 8.23763 17.4173 8.23763 17.7102 8.53052C18.0031 8.82341 18.0031 9.29829 17.7102 9.59118L11.5909 15.7105C11.3542 15.9471 10.9988 15.9926 10.7165 15.8469C10.6101 15.8112 10.5101 15.7509 10.4253 15.6662L7.53034 12.7712C7.23745 12.4783 7.23745 12.0034 7.53034 11.7105Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconCheckcircle.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconCheckcircle);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconCheckcircleo.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconCheckcircleo: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 20.5C16.6944 20.5 20.5 16.6944 20.5 12C20.5 7.30558 16.6944 3.5 12 3.5C7.30558 3.5 3.5 7.30558 3.5 12C3.5 16.6944 7.30558 20.5 12 20.5ZM12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path d=\"M7.53034 11.7105C7.82323 11.4176 8.29811 11.4176 8.591 11.7105L11.486 14.6055C11.7789 14.8984 11.7789 15.3733 11.486 15.6662V15.6662C11.1931 15.959 10.7182 15.959 10.4253 15.6662L7.53034 12.7712C7.23745 12.4783 7.23745 12.0034 7.53034 11.7105V11.7105Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n<path d=\"M10.5302 15.7105C10.2373 15.4176 10.2373 14.9427 10.5302 14.6498L16.6495 8.53052C16.9424 8.23763 17.4173 8.23763 17.7102 8.53052V8.53052C18.0031 8.82341 18.0031 9.29829 17.7102 9.59118L11.5909 15.7105C11.298 16.0034 10.8231 16.0034 10.5302 15.7105V15.7105Z\" fill=\"${getIconColor(\n    color,\n    2,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconCheckcircleo.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconCheckcircleo);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconClockcircleo.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconClockcircleo: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.9998 3.50049C7.305 3.50049 3.49979 7.3057 3.49979 12.0005C3.49979 16.6953 7.305 20.5005 11.9998 20.5005C16.6946 20.5005 20.4998 16.6953 20.4998 12.0005C20.4998 7.3057 16.6946 3.50049 11.9998 3.50049ZM1.99979 12.0005C1.99979 6.47727 6.47657 2.00049 11.9998 2.00049C17.523 2.00049 21.9998 6.47727 21.9998 12.0005C21.9998 17.5237 17.523 22.0005 11.9998 22.0005C6.47657 22.0005 1.99979 17.5237 1.99979 12.0005Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.6614 7.09668C12.0756 7.09668 12.4114 7.43247 12.4114 7.84668V12.2678L15.8156 14.2986C16.1713 14.5108 16.2877 14.9712 16.0755 15.3269C15.8633 15.6826 15.4029 15.799 15.0471 15.5868L11.2771 13.3378C11.0503 13.2025 10.9114 12.9578 10.9114 12.6937V7.84668C10.9114 7.43247 11.2472 7.09668 11.6614 7.09668Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconClockcircleo.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconClockcircleo);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconClose.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconClose: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.22676 4.22676C4.5291 3.92441 5.01929 3.92441 5.32163 4.22676L12 10.9051L18.6784 4.22676C18.9807 3.92441 19.4709 3.92441 19.7732 4.22676C20.0756 4.5291 20.0756 5.01929 19.7732 5.32163L13.0949 12L19.7732 18.6784C20.0756 18.9807 20.0756 19.4709 19.7732 19.7732C19.4709 20.0756 18.9807 20.0756 18.6784 19.7732L12 13.0949L5.32163 19.7732C5.01929 20.0756 4.5291 20.0756 4.22676 19.7732C3.92441 19.4709 3.92441 18.9807 4.22676 18.6784L10.9051 12L4.22676 5.32163C3.92441 5.01929 3.92441 4.5291 4.22676 4.22676Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconClose.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconClose);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconClosecircleo.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconClosecircleo: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12ZM7.53034 7.53033C7.82323 7.23744 8.29811 7.23744 8.591 7.53033L11.8033 10.7427L15.0156 7.5304C15.3085 7.23751 15.7834 7.23751 16.0763 7.5304C16.3692 7.82329 16.3692 8.29817 16.0763 8.59106L12.864 11.8033L16.0156 14.955C16.3085 15.2478 16.3085 15.7227 16.0156 16.0156C15.7227 16.3085 15.2479 16.3085 14.955 16.0156L11.8033 12.864L8.65166 16.0157C8.35877 16.3086 7.88389 16.3086 7.591 16.0157C7.29811 15.7228 7.29811 15.2479 7.591 14.955L10.7427 11.8033L7.53034 8.59099C7.23745 8.2981 7.23745 7.82322 7.53034 7.53033Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconClosecircleo.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconClosecircleo);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconDate.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconDate: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.34265 9.4043C2.34265 8.99008 2.67844 8.6543 3.09265 8.6543H20.9166C21.3308 8.6543 21.6666 8.99008 21.6666 9.4043C21.6666 9.81851 21.3308 10.1543 20.9166 10.1543H3.09265C2.67844 10.1543 2.34265 9.81851 2.34265 9.4043Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.6921 13.3096C15.6921 12.8954 16.0279 12.5596 16.4421 12.5596H16.4513C16.8656 12.5596 17.2013 12.8954 17.2013 13.3096C17.2013 13.7238 16.8656 14.0596 16.4513 14.0596H16.4421C16.0279 14.0596 15.6921 13.7238 15.6921 13.3096Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.2546 13.3096C11.2546 12.8954 11.5904 12.5596 12.0046 12.5596H12.0139C12.4281 12.5596 12.7639 12.8954 12.7639 13.3096C12.7639 13.7238 12.4281 14.0596 12.0139 14.0596H12.0046C11.5904 14.0596 11.2546 13.7238 11.2546 13.3096Z\" fill=\"${getIconColor(\n    color,\n    2,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M6.80789 13.3096C6.80789 12.8954 7.14368 12.5596 7.55789 12.5596H7.56716C7.98137 12.5596 8.31716 12.8954 8.31716 13.3096C8.31716 13.7238 7.98137 14.0596 7.56716 14.0596H7.55789C7.14368 14.0596 6.80789 13.7238 6.80789 13.3096Z\" fill=\"${getIconColor(\n    color,\n    3,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.6921 17.1963C15.6921 16.7821 16.0279 16.4463 16.4421 16.4463H16.4513C16.8656 16.4463 17.2013 16.7821 17.2013 17.1963C17.2013 17.6105 16.8656 17.9463 16.4513 17.9463H16.4421C16.0279 17.9463 15.6921 17.6105 15.6921 17.1963Z\" fill=\"${getIconColor(\n    color,\n    4,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.2546 17.1963C11.2546 16.7821 11.5904 16.4463 12.0046 16.4463H12.0139C12.4281 16.4463 12.7639 16.7821 12.7639 17.1963C12.7639 17.6105 12.4281 17.9463 12.0139 17.9463H12.0046C11.5904 17.9463 11.2546 17.6105 11.2546 17.1963Z\" fill=\"${getIconColor(\n    color,\n    5,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M6.80789 17.1963C6.80789 16.7821 7.14368 16.4463 7.55789 16.4463H7.56716C7.98137 16.4463 8.31716 16.7821 8.31716 17.1963C8.31716 17.6105 7.98137 17.9463 7.56716 17.9463H7.55789C7.14368 17.9463 6.80789 17.6105 6.80789 17.1963Z\" fill=\"${getIconColor(\n    color,\n    6,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.0437 1.25C16.4579 1.25 16.7937 1.58579 16.7937 2V5.29078C16.7937 5.70499 16.4579 6.04078 16.0437 6.04078C15.6295 6.04078 15.2937 5.70499 15.2937 5.29078V2C15.2937 1.58579 15.6295 1.25 16.0437 1.25Z\" fill=\"${getIconColor(\n    color,\n    7,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.96552 1.25C8.37973 1.25 8.71552 1.58579 8.71552 2V5.29078C8.71552 5.70499 8.37973 6.04078 7.96552 6.04078C7.5513 6.04078 7.21552 5.70499 7.21552 5.29078V2C7.21552 1.58579 7.5513 1.25 7.96552 1.25Z\" fill=\"${getIconColor(\n    color,\n    8,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M3.76749 4.22937C4.76914 3.2772 6.16751 2.8291 7.77096 2.8291H16.2383C17.8457 2.8291 19.2449 3.27686 20.2448 4.23009C21.2504 5.18867 21.7548 6.56549 21.75 8.22317V17.3474C21.75 19.0051 21.243 20.3834 20.2371 21.3438C19.2366 22.2991 17.8377 22.7499 16.229 22.7499H7.77096C6.16301 22.7499 4.76302 22.2898 3.76225 21.3198C2.75774 20.3462 2.25 18.9507 2.25 17.2718V8.22213C2.25 6.5633 2.76004 5.18705 3.76749 4.22937ZM4.80096 5.31654C4.1571 5.9286 3.75 6.87387 3.75 8.22213V17.2718C3.75 18.6472 4.1594 19.6158 4.8062 20.2427C5.45673 20.8732 6.44222 21.2499 7.77096 21.2499H16.229C17.5663 21.2499 18.5528 20.878 19.2013 20.2589C19.8444 19.6448 20.25 18.6968 20.25 17.3474V8.22213L20.25 8.21982C20.2541 6.87097 19.8507 5.92673 19.2098 5.31582C18.5631 4.69931 17.5768 4.3291 16.2383 4.3291H7.77096C6.43772 4.3291 5.45061 4.69897 4.80096 5.31654Z\" fill=\"${getIconColor(\n    color,\n    9,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconDate.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconDate);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconDown.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconDown: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.46967 7.96967C4.76256 7.67678 5.23744 7.67678 5.53033 7.96967L12 14.4393L18.4697 7.96967C18.7626 7.67678 19.2374 7.67678 19.5303 7.96967C19.8232 8.26256 19.8232 8.73744 19.5303 9.03033L12.5303 16.0303C12.2374 16.3232 11.7626 16.3232 11.4697 16.0303L4.46967 9.03033C4.17678 8.73744 4.17678 8.26256 4.46967 7.96967Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconDown.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconDown);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconEllipsis.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconEllipsis: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4.5 12C4.5 12.825 5.175 13.5 6 13.5C6.825 13.5 7.5 12.825 7.5 12C7.5 11.175 6.825 10.5 6 10.5C5.175 10.5 4.5 11.175 4.5 12ZM10.5 12C10.5 12.825 11.175 13.5 12 13.5C12.825 13.5 13.5 12.825 13.5 12C13.5 11.175 12.825 10.5 12 10.5C11.175 10.5 10.5 11.175 10.5 12ZM16.5 12C16.5 12.825 17.175 13.5 18 13.5C18.825 13.5 19.5 12.825 19.5 12C19.5 11.175 18.825 10.5 18 10.5C17.175 10.5 16.5 11.175 16.5 12Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconEllipsis.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconEllipsis);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconEyeclose.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconEyeclose: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.9996 9.72168C10.6623 9.72168 9.5856 10.7984 9.5856 12.1377C9.5856 12.8053 9.85048 13.3967 10.2905 13.8359C10.5836 14.1285 10.584 14.6034 10.2914 14.8965C9.99876 15.1897 9.52388 15.1901 9.23073 14.8975C8.52072 14.1887 8.0856 13.22 8.0856 12.1377C8.0856 9.97093 9.83293 8.22168 11.9996 8.22168C13.0699 8.22168 14.0598 8.65501 14.7641 9.37056C15.0547 9.66575 15.0509 10.1406 14.7557 10.4312C14.4605 10.7218 13.9857 10.718 13.6951 10.4228C13.2694 9.99035 12.6633 9.72168 11.9996 9.72168Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.2376 11.9607C15.6452 12.034 15.9163 12.4239 15.843 12.8316C15.5556 14.4294 14.2989 15.6889 12.7018 15.9788C12.2942 16.0528 11.9038 15.7824 11.8299 15.3748C11.7559 14.9673 12.0263 14.5769 12.4338 14.5029C13.4147 14.3249 14.19 13.5483 14.3666 12.5661C14.44 12.1584 14.8299 11.8874 15.2376 11.9607Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.9996 5.58398C10.2877 5.58398 8.6177 6.19775 7.14904 7.36009L7.14725 7.36151C5.73326 8.47357 4.49976 10.0919 3.56954 12.1378C4.49016 14.1728 5.71443 15.7803 7.11776 16.8821C7.44355 17.1379 7.5003 17.6093 7.24451 17.9351C6.98872 18.2609 6.51725 18.3177 6.19145 18.0619C4.48829 16.7247 3.07443 14.795 2.06042 12.4328C1.97911 12.2434 1.97934 12.0289 2.06104 11.8397C3.08485 9.46849 4.50709 7.52987 6.21908 6.18315C7.92423 4.83395 9.91584 4.08398 11.9996 4.08398C14.0974 4.08398 16.0881 4.84602 17.8013 6.20308C18.126 6.46027 18.1807 6.93198 17.9235 7.25667C17.6663 7.58136 17.1946 7.63608 16.8699 7.37889C15.3891 6.20595 13.7198 5.58398 11.9996 5.58398Z\" fill=\"${getIconColor(\n    color,\n    2,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M18.9966 8.39155C19.3275 8.14245 19.7977 8.20878 20.0468 8.53972C20.7743 9.50615 21.4081 10.6137 21.938 11.8391C22.0201 12.0289 22.0202 12.2441 21.9382 12.434C19.8963 17.1644 16.2027 20.1888 11.9996 20.1888C11.0549 20.1888 10.1238 20.0354 9.23018 19.7372C8.83727 19.6061 8.62506 19.1812 8.75619 18.7883C8.88732 18.3954 9.31213 18.1832 9.70504 18.3143C10.4474 18.5621 11.2183 18.6888 11.9996 18.6888C15.3326 18.6888 18.5199 16.3345 20.4292 12.137C19.9703 11.129 19.4394 10.2269 18.8484 9.44181C18.5993 9.11088 18.6656 8.64066 18.9966 8.39155Z\" fill=\"${getIconColor(\n    color,\n    3,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.4173 3.71918C20.7102 4.01207 20.7102 4.48695 20.4173 4.77984L4.64334 20.5538C4.35044 20.8467 3.87557 20.8467 3.58268 20.5538C3.28978 20.2609 3.28978 19.7861 3.58268 19.4932L19.3567 3.71918C19.6496 3.42629 20.1244 3.42629 20.4173 3.71918Z\" fill=\"${getIconColor(\n    color,\n    4,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconEyeclose.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconEyeclose);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconEyeopen.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconEyeopen: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M12 16.0002C11.2267 16.0002 10.4707 15.7709 9.82772 15.3412C9.18472 14.9116 8.68357 14.3009 8.38763 13.5865C8.09169 12.872 8.01426 12.0858 8.16513 11.3274C8.316 10.5689 8.68839 9.87221 9.23521 9.32539C9.78203 8.77857 10.4787 8.40618 11.2372 8.25531C11.9957 8.10444 12.7818 8.18187 13.4963 8.47781C14.2107 8.77375 14.8214 9.2749 15.251 9.9179C15.6807 10.5609 15.91 11.3169 15.91 12.0902C15.91 13.1272 15.4981 14.1217 14.7648 14.855C14.0315 15.5882 13.037 16.0002 12 16.0002ZM12 9.68018C11.5233 9.68018 11.0574 9.82152 10.6611 10.0863C10.2648 10.3511 9.95585 10.7275 9.77345 11.1679C9.59104 11.6083 9.54332 12.0929 9.63631 12.5603C9.7293 13.0278 9.95883 13.4573 10.2959 13.7943C10.6329 14.1313 11.0623 14.3609 11.5298 14.4539C11.9973 14.5469 12.4819 14.4991 12.9223 14.3167C13.3626 14.1343 13.739 13.8254 14.0038 13.4291C14.2687 13.0328 14.41 12.5668 14.41 12.0902C14.4153 11.7703 14.3569 11.4526 14.2382 11.1556C14.1194 10.8586 13.9427 10.5882 13.7184 10.3601C13.4941 10.1321 13.2266 9.95098 12.9316 9.82738C12.6366 9.70377 12.3199 9.64013 12 9.64018V9.68018Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path d=\"M12 20.11C7.86 20.11 4.15 17.2 2.06 12.35C2.02067 12.2566 2.00041 12.1563 2.00041 12.055C2.00041 11.9537 2.02067 11.8534 2.06 11.76C4.15 6.9 7.86 4 12 4C16.14 4 19.85 6.9 21.94 11.76C21.9793 11.8534 21.9996 11.9537 21.9996 12.055C21.9996 12.1563 21.9793 12.2566 21.94 12.35C19.85 17.2 16.14 20.1 12 20.11V20.11ZM3.57 12.05C5.43 16.16 8.57 18.6 12 18.61C15.43 18.62 18.57 16.16 20.43 12.05C18.57 7.94 15.44 5.5 12 5.5C8.56 5.5 5.43 7.94 3.57 12.05Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconEyeopen.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconEyeopen);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconLeft.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconLeft: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.0303 4.46967C16.3232 4.76256 16.3232 5.23744 16.0303 5.53033L9.56066 12L16.0303 18.4697C16.3232 18.7626 16.3232 19.2374 16.0303 19.5303C15.7374 19.8232 15.2626 19.8232 14.9697 19.5303L7.96967 12.5303C7.67678 12.2374 7.67678 11.7626 7.96967 11.4697L14.9697 4.46967C15.2626 4.17678 15.7374 4.17678 16.0303 4.46967Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconLeft.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconLeft);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconMinus.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconMinus: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M19 14H5C4.73481 14 4.48049 13.8946 4.29299 13.7071C4.10549 13.5195 4.00015 13.2652 4.00015 13C4.00015 12.7348 4.10549 12.4805 4.29299 12.2929C4.48049 12.1054 4.73481 12 5 12H19C19.2652 12 19.5195 12.1054 19.707 12.2929C19.8945 12.4805 19.9998 12.7348 19.9998 13C19.9998 13.2652 19.8945 13.5195 19.707 13.7071C19.5195 13.8946 19.2652 14 19 14Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconMinus.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconMinus);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconPlus.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconPlus: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M20 13H13V20C13 20.55 12.55 21 12 21C11.45 21 11 20.55 11 20V13H4C3.45 13 3 12.55 3 12C3 11.45 3.45 11 4 11H11V4C11 3.45 11.45 3 12 3C12.55 3 13 3.45 13 4V11H20C20.55 11 21 11.45 21 12C21 12.55 20.55 13 20 13Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconPlus.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconPlus);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconRadioChecked.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconRadioChecked: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20ZM12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 7C9.24 7 7 9.24 7 12C7 14.76 9.24 17 12 17C14.76 17 17 14.76 17 12C17 9.24 14.76 7 12 7Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconRadioChecked.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconRadioChecked);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconRadioUnchecked.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconRadioUnchecked: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20ZM12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconRadioUnchecked.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconRadioUnchecked);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconReload.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconReload: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M17.738 6C16.208 4.764 14.097 4 12 4C10.4177 4 8.87103 4.46919 7.55544 5.34824C6.23984 6.22729 5.21446 7.47672 4.60896 8.93853C4.00346 10.4003 3.84504 12.0089 4.15372 13.5607C4.4624 15.1126 5.22433 16.538 6.34315 17.6569C7.46197 18.7757 8.88743 19.5376 10.4393 19.8463C11.9911 20.155 13.5997 19.9965 15.0615 19.391C16.5233 18.7855 17.7727 17.7602 18.6518 16.4446C19.5308 15.129 20 13.5822 20 12C20 11.7348 20.1054 11.4804 20.2929 11.2929C20.4804 11.1054 20.7348 11 21 11C21.2652 11 21.5196 11.1054 21.7071 11.2929C21.8946 11.4804 22 11.7348 22 12C22 17.523 17.523 22 12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C14.549 2 17.107 2.916 19 4.449V3C19 2.73481 19.1054 2.4805 19.2929 2.29299C19.4805 2.10549 19.7348 2.00015 20 2.00015C20.2652 2.00015 20.5195 2.10549 20.7071 2.29299C20.8946 2.4805 21 2.73481 21 3V7C21 7.26522 20.8946 7.51957 20.7071 7.70711C20.5196 7.89464 20.2652 8 20 8H16C15.7348 7.99996 15.4805 7.89458 15.293 7.70705C15.1055 7.51952 15.0002 7.26519 15.0002 7C15.0002 6.73481 15.1055 6.48048 15.293 6.29295C15.4805 6.10541 15.7348 6.00004 16 6H17.738Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconReload.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconReload);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconRight.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconRight: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.96967 19.5303C7.67678 19.2374 7.67678 18.7626 7.96967 18.4697L14.4393 12L7.96967 5.53033C7.67678 5.23744 7.67678 4.76256 7.96967 4.46967C8.26256 4.17678 8.73744 4.17678 9.03033 4.46967L16.0303 11.4697C16.3232 11.7626 16.3232 12.2374 16.0303 12.5303L9.03033 19.5303C8.73744 19.8232 8.26256 19.8232 7.96967 19.5303Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconRight.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconRight);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconSearch.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconSearch: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.7666 3.52783C7.21657 3.52783 3.52805 7.21636 3.52805 11.7664C3.52805 16.3164 7.21657 20.0049 11.7666 20.0049C16.3166 20.0049 20.0052 16.3164 20.0052 11.7664C20.0052 7.21636 16.3166 3.52783 11.7666 3.52783ZM2.02805 11.7664C2.02805 6.38793 6.38815 2.02783 11.7666 2.02783C17.1451 2.02783 21.5052 6.38793 21.5052 11.7664C21.5052 17.1448 17.1451 21.5049 11.7666 21.5049C6.38815 21.5049 2.02805 17.1448 2.02805 11.7664Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.4873 17.9552C17.7798 17.6619 18.2547 17.6613 18.548 17.9538L22.072 21.4687C22.3653 21.7612 22.3659 22.2361 22.0734 22.5294C21.7808 22.8227 21.306 22.8233 21.0127 22.5308L17.4887 19.0159C17.1954 18.7234 17.1948 18.2485 17.4873 17.9552Z\" fill=\"${getIconColor(\n    color,\n    1,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconSearch.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconSearch);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/IconUp.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps, SvgXml } from 'react-native-svg';\n\nimport { px } from '../helpers/normalize';\nimport { getIconColor } from './helper';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  color?: string | string[];\n}\n\nlet IconUp: FC<SvgIconProps> = ({ size, color, ...rest }) => {\n  const xml = `\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"  xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M19.5303 16.0303C19.2374 16.3232 18.7626 16.3232 18.4697 16.0303L12 9.56066L5.53033 16.0303C5.23744 16.3232 4.76256 16.3232 4.46967 16.0303C4.17678 15.7374 4.17678 15.2626 4.46967 14.9697L11.4697 7.96967C11.7626 7.67678 12.2374 7.67678 12.5303 7.96967L19.5303 14.9697C19.8232 15.2626 19.8232 15.7374 19.5303 16.0303Z\" fill=\"${getIconColor(\n    color,\n    0,\n    '#999999'\n  )}\"/>\n</svg>\n`;\n\n  return <SvgXml xml={xml} width={size} height={size} {...rest} />;\n};\n\nIconUp.defaultProps = {\n  size: px(16),\n};\n\nexport default memo(IconUp);\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/helper.ts",
    "content": "/* tslint:disable */\n/* eslint-disable */\n\nexport const getIconColor = (color: string | string[] | undefined, index: number, defaultColor: string) => {\n  return color ? (typeof color === 'string' ? color : color[index] || defaultColor) : defaultColor;\n};\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/index.md",
    "content": "---\ntitle: SvgIcon - 内置图标\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# SvgIcon 内置图标\n\n## 效果演示\n\n### 1. 所有图标\n\n```tsx | pure\n<SvgIcon name=\"arrowdown\" />\n<SvgIcon name=\"bells\" />\n<SvgIcon name=\"clockcircleo\" />\n<SvgIcon name=\"close\" />\n<SvgIcon name=\"closecircleo\" />\n<SvgIcon name=\"date\" />\n<SvgIcon name=\"down\" />\n<SvgIcon name=\"ellipsis\" />\n<SvgIcon name=\"eyeclose\" />\n<SvgIcon name=\"eyeopen\" />\n<SvgIcon name=\"left\" />\n<SvgIcon name=\"minus\" />\n<SvgIcon name=\"plus\" />\n<SvgIcon name=\"radio-checked\" />\n<SvgIcon name=\"radio-unchecked\" />\n<SvgIcon name=\"reload\" />\n<SvgIcon name=\"right\" />\n<SvgIcon name=\"search\" />\n<SvgIcon name=\"up\" />\n<SvgIcon name=\"checkboxChecked\" />\n<SvgIcon name=\"checkboxHalfchecked\" />\n<SvgIcon name=\"checkboxUnchecked\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644811316900828860.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 修改大小\n\n```tsx | pure\n<SvgIcon name=\"arrowdown\" size={50} />\n<SvgIcon name=\"bells\" size={50} />\n<SvgIcon name=\"clockcircleo\" size={50} />\n<SvgIcon name=\"close\" size={50} />\n<SvgIcon name=\"closecircleo\" size={50} />\n<SvgIcon name=\"date\" size={50} />\n<SvgIcon name=\"down\" size={50} />\n<SvgIcon name=\"ellipsis\" size={50} />\n<SvgIcon name=\"eyeclose\" size={50} />\n<SvgIcon name=\"eyeopen\" size={50} />\n<SvgIcon name=\"left\" size={50} />\n<SvgIcon name=\"minus\" size={50} />\n<SvgIcon name=\"plus\" size={50} />\n<SvgIcon name=\"radio-checked\" size={50} />\n<SvgIcon name=\"radio-unchecked\" size={50} />\n<SvgIcon name=\"reload\" size={50} />\n<SvgIcon name=\"right\" size={50} />\n<SvgIcon name=\"search\" size={50} />\n<SvgIcon name=\"up\" size={50} />\n<SvgIcon name=\"checkboxChecked\" size={50} />\n<SvgIcon name=\"checkboxHalfchecked\" size={50} />\n<SvgIcon name=\"checkboxUnchecked\" size={50} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644811378389797518.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 修改颜色\n\n```tsx | pure\n<SvgIcon name=\"arrowdown\" color=\"#ff0000\" />\n<SvgIcon name=\"bells\" color=\"#ff0000\" />\n<SvgIcon name=\"clockcircleo\" color=\"#ff0000\" />\n<SvgIcon name=\"close\" color=\"#ff0000\" />\n<SvgIcon name=\"closecircleo\" color=\"#ff0000\" />\n<SvgIcon name=\"date\" color=\"#ff0000\" />\n<SvgIcon name=\"down\" color=\"#ff0000\" />\n<SvgIcon name=\"ellipsis\" color=\"#ff0000\" />\n<SvgIcon name=\"eyeclose\" color=\"#ff0000\" />\n<SvgIcon name=\"eyeopen\" color=\"#ff0000\" />\n<SvgIcon name=\"left\" color=\"#ff0000\" />\n<SvgIcon name=\"minus\" color=\"#ff0000\" />\n<SvgIcon name=\"plus\" color=\"#ff0000\" />\n<SvgIcon name=\"radio-checked\" color=\"#ff0000\" />\n<SvgIcon name=\"radio-unchecked\" color=\"#ff0000\" />\n<SvgIcon name=\"reload\" color=\"#ff0000\" />\n<SvgIcon name=\"right\" color=\"#ff0000\" />\n<SvgIcon name=\"search\" color=\"#ff0000\" />\n<SvgIcon name=\"up\" color=\"#ff0000\" />\n<SvgIcon name=\"checkboxChecked\" color=\"#ff0000\" />\n<SvgIcon name=\"checkboxHalfchecked\" color=\"#ff0000\" />\n<SvgIcon name=\"checkboxUnchecked\" color=\"#ff0000\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644811418530083524.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| name | `true` | 图标名称 | `'arrowdown' \\| 'bells' \\| 'check' \\| 'checkcircle' \\| 'checkcircleo' \\| 'checkboxChecked' \\| 'checkboxHalfchecked' \\| 'checkboxUnchecked' \\| 'clockcircleo' \\| 'close' \\| 'closecircleo' \\| 'date' \\| 'down' \\| 'ellipsis' \\| 'eyeclose' \\| 'eyeopen' \\| 'left' \\| 'minus' \\| 'plus' \\| 'radio-checked' \\| 'radio-unchecked' \\| 'reload' \\| 'right' \\| 'search' \\| 'up'` |\n| size | `false` | 图标大小 | `number` | `16` |\n| color | `false` | 图标颜色 | `string` \\| `string[]` |  |\n"
  },
  {
    "path": "packages/react-native/src/svg-icon/index.tsx",
    "content": "/* tslint:disable */\n\n/* eslint-disable */\nimport React, { FC, memo } from 'react';\nimport { ViewProps } from 'react-native';\nimport { GProps } from 'react-native-svg';\n\nimport IconArrowdown from './IconArrowdown';\nimport IconBells from './IconBells';\nimport IconCheck from './IconCheck';\nimport IconCheckboxChecked from './IconCheckboxChecked';\nimport IconCheckboxHalfchecked from './IconCheckboxHalfchecked';\nimport IconCheckboxUnchecked from './IconCheckboxUnchecked';\nimport IconCheckcircle from './IconCheckcircle';\nimport IconCheckcircleo from './IconCheckcircleo';\nimport IconClockcircleo from './IconClockcircleo';\nimport IconClose from './IconClose';\nimport IconClosecircleo from './IconClosecircleo';\nimport IconDate from './IconDate';\nimport IconDown from './IconDown';\nimport IconEllipsis from './IconEllipsis';\nimport IconEyeclose from './IconEyeclose';\nimport IconEyeopen from './IconEyeopen';\nimport IconLeft from './IconLeft';\nimport IconMinus from './IconMinus';\nimport IconPlus from './IconPlus';\nimport IconRadioChecked from './IconRadioChecked';\nimport IconRadioUnchecked from './IconRadioUnchecked';\nimport IconReload from './IconReload';\nimport IconRight from './IconRight';\nimport IconSearch from './IconSearch';\nimport IconUp from './IconUp';\n\nexport type IconNames =\n  | 'arrowdown'\n  | 'bells'\n  | 'check'\n  | 'checkcircle'\n  | 'checkcircleo'\n  | 'checkboxChecked'\n  | 'checkboxHalfchecked'\n  | 'checkboxUnchecked'\n  | 'clockcircleo'\n  | 'close'\n  | 'closecircleo'\n  | 'date'\n  | 'down'\n  | 'ellipsis'\n  | 'eyeclose'\n  | 'eyeopen'\n  | 'left'\n  | 'minus'\n  | 'plus'\n  | 'radio-checked'\n  | 'radio-unchecked'\n  | 'reload'\n  | 'right'\n  | 'search'\n  | 'up';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  name: IconNames;\n  size?: number;\n  color?: string | string[];\n}\n\nconst SvgIcon: FC<SvgIconProps> = ({ name, ...rest }) => {\n  switch (name) {\n    case 'arrowdown':\n      return <IconArrowdown {...rest} />;\n    case 'bells':\n      return <IconBells {...rest} />;\n    case 'check':\n      return <IconCheck {...rest} />;\n    case 'checkcircle':\n      return <IconCheckcircle {...rest} />;\n    case 'checkcircleo':\n      return <IconCheckcircleo {...rest} />;\n    case 'clockcircleo':\n      return <IconClockcircleo {...rest} />;\n    case 'close':\n      return <IconClose {...rest} />;\n    case 'closecircleo':\n      return <IconClosecircleo {...rest} />;\n    case 'date':\n      return <IconDate {...rest} />;\n    case 'down':\n      return <IconDown {...rest} />;\n    case 'ellipsis':\n      return <IconEllipsis {...rest} />;\n    case 'eyeclose':\n      return <IconEyeclose {...rest} />;\n    case 'eyeopen':\n      return <IconEyeopen {...rest} />;\n    case 'left':\n      return <IconLeft {...rest} />;\n    case 'minus':\n      return <IconMinus {...rest} />;\n    case 'plus':\n      return <IconPlus {...rest} />;\n    case 'radio-checked':\n      return <IconRadioChecked {...rest} />;\n    case 'radio-unchecked':\n      return <IconRadioUnchecked {...rest} />;\n    case 'reload':\n      return <IconReload {...rest} />;\n    case 'right':\n      return <IconRight {...rest} />;\n    case 'search':\n      return <IconSearch {...rest} />;\n    case 'up':\n      return <IconUp {...rest} />;\n    case 'checkboxChecked':\n      return <IconCheckboxChecked {...rest} />;\n    case 'checkboxHalfchecked':\n      return <IconCheckboxHalfchecked {...rest} />;\n    case 'checkboxUnchecked':\n      return <IconCheckboxUnchecked {...rest} />;\n    default:\n      return null;\n  }\n};\nSvgIcon.displayName = 'SvgIcon';\n\nexport default memo(SvgIcon);\n"
  },
  {
    "path": "packages/react-native/src/swipe-row/context.tsx",
    "content": "import React, { PropsWithChildren, useMemo } from 'react';\n\nimport { useMemoizedFn, usePrevious, useSafeState } from '@td-design/rn-hooks';\n\nexport const SwipeRowContext = React.createContext<{\n  id?: string | number;\n  changeState: (id: string | number) => void;\n  multiple?: boolean;\n}>({\n  id: undefined,\n  changeState: (id: string | number) => {\n    console.log('id', id);\n  },\n  multiple: false,\n});\n\nexport const SwipeRowContextProvider = ({\n  children,\n  multiple,\n}: PropsWithChildren<{\n  /** 是否允许多开 */\n  multiple?: boolean;\n}>) => {\n  const [currentId, setCurrentId] = useSafeState<string | number>('');\n  const previous = usePrevious(currentId);\n\n  const changeState = useMemoizedFn((id: string | number) => {\n    setCurrentId(id);\n  });\n\n  const value = useMemo(() => ({ changeState, id: previous, multiple }), [previous, multiple]);\n\n  return <SwipeRowContext.Provider value={value}>{children}</SwipeRowContext.Provider>;\n};\n"
  },
  {
    "path": "packages/react-native/src/swipe-row/index.md",
    "content": "---\ntitle: SwipeRow - 滑动操作\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# SwipeRow 滑动操作\n\n## 效果演示\n\n### 1. 默认效果（默认带删除操作项）\n\n```tsx | pure\n<SwipeRowContextProvider>\n  <FlatList\n    data={[\n      { id: 1, name: 'zhangsan' },\n      { id: 2, name: 'lisi' },\n    ]}\n    keyExtractor={item => item.id.toString()}\n    renderItem={({ item, index }) => (\n      <SwipeRow anchor={item.id} height={80}>\n        <View style={styles.rowContent}>\n          <View style={styles.rowIcon} />\n          <View>\n            <Text style={styles.rowTitle}>{item.name}</Text>\n            <Text style={styles.rowSubtitle}>Drag the row left and right</Text>\n          </View>\n        </View>\n      </SwipeRow>\n    )}\n  />\n</SwipeRowContextProvider>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643252811536164582.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 右滑操作项\n\n```tsx | pure\n<SwipeRowContextProvider>\n  <FlatList\n    data={[\n      { id: 1, name: 'zhangsan' },\n      { id: 2, name: 'lisi' },\n    ]}\n    keyExtractor={item => item.id.toString()}\n    renderItem={({ item, index }) => (\n      <SwipeRow\n        anchor={item.id}\n        actions={[\n          {\n            label: '警告',\n            onPress: () => console.log('warn'),\n            backgroundColor: '#4f7db0',\n          },\n        ]}\n        height={80}\n      >\n        <View style={styles.rowContent}>\n          <View style={styles.rowIcon} />\n          <View>\n            <Text style={styles.rowTitle}>{item.name}</Text>\n            <Text style={styles.rowSubtitle}>Drag the row left and right</Text>\n          </View>\n        </View>\n      </SwipeRow>\n    )}\n  />\n</SwipeRowContextProvider>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643252879087664662.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 覆盖默认操作项\n\n```tsx | pure\n<SwipeRowContextProvider>\n  <FlatList\n    data={[\n      { id: 1, name: 'zhangsan' },\n      { id: 2, name: 'lisi' },\n    ]}\n    keyExtractor={item => item.id.toString()}\n    renderItem={({ item, index }) => (\n      <SwipeRow\n        anchor={item.id}\n        actions={[\n          {\n            label: '警告',\n            onPress: () => console.log('warn'),\n            backgroundColor: '#4f7db0',\n          },\n        ]}\n        height={80}\n        overwriteDefaultActions\n      >\n        <View style={styles.rowContent}>\n          <View style={styles.rowIcon} />\n          <View>\n            <Text style={styles.rowTitle}>{item.name}</Text>\n            <Text style={styles.rowSubtitle}>Drag the row left and right</Text>\n          </View>\n        </View>\n      </SwipeRow>\n    )}\n  />\n</SwipeRowContextProvider>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643253019661089047.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### SwipeRow\n\n| 属性                    | 必填    | 说明                       | 类型            | 默认值   |\n| ----------------------- | ------- | -------------------------- | --------------- | -------- |\n| anchor                  | `true`  | 作为滑动操作互斥的判断依据 | `ReactText`     |          |\n| actions                 | `false` | 右侧滑出的操作项           | `SwipeAction[]` | `[]`     |\n| height                  | `false` | 行高                       | `number`        | `60`     |\n| actionWidth             | `false` | 每个操作项的宽度           | `number`        | `height` |\n| onRemove                | `false` | 删除事件                   | `() => void`    |          |\n| overwriteDefaultActions | `false` | 是否覆盖默认操作项         | `boolean`       | `false`  |\n| containerStyle          | `false` | 滑动条样式                 | `ViewStyle`     |          |\n| contentContainerStyle   | `false` | 滑动条子组件样式           | `ViewStyle`     |          |\n\n### SwipeAction\n\n| 属性            | 必填    | 说明           | 类型         | 默认值 |\n| --------------- | ------- | -------------- | ------------ | ------ |\n| label           | `true`  | 操作项文本     | `string`     |        |\n| textStyle       | `false` | 操作项文本样式 | `TextStyle`  |        |\n| onPress         | `true`  | 操作项点击事件 | `() => void` |        |\n| backgroundColor | `true`  | 背景色         | `string`     |        |\n"
  },
  {
    "path": "packages/react-native/src/swipe-row/index.tsx",
    "content": "import React, { FC, PropsWithChildren } from 'react';\nimport { Animated as RNAnimated, StyleProp, StyleSheet, TextStyle, ViewStyle } from 'react-native';\nimport { RectButton } from 'react-native-gesture-handler';\nimport Swipeable from 'react-native-gesture-handler/Swipeable';\nimport Animated from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { SwipeRowContextProvider } from './context';\nimport useSwipeRow from './useSwipeRow';\n\nconst { px } = helpers;\n\nexport interface SwipeAction {\n  /** 操作项文本 */\n  label: string;\n  /** 操作项文本样式 */\n  textStyle?: StyleProp<TextStyle>;\n  /** 操作项点击事件 */\n  onPress: () => void;\n  /** 背景色 */\n  backgroundColor: string;\n}\n\nexport type SwipeRowProps = PropsWithChildren<{\n  /** 必传，作为互斥的判断标准 */\n  anchor: string | number;\n  /** 右侧滑出的操作项 */\n  actions?: SwipeAction[];\n  /** 每个操作项的宽度 */\n  actionWidth: number;\n  /** 删除事件 */\n  onRemove?: () => Promise<boolean>;\n  /** 是否覆盖默认操作项 */\n  overwriteDefaultActions?: boolean;\n  /** Swipeable自身的样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n  /** Swipeable的子组件样式 */\n  contentContainerStyle?: StyleProp<ViewStyle>;\n}>;\n\nconst SwipeRow: FC<SwipeRowProps> = ({\n  anchor,\n  actions = [],\n  actionWidth,\n  onRemove,\n  overwriteDefaultActions = false,\n  children,\n  containerStyle,\n  contentContainerStyle,\n}) => {\n  const theme = useTheme<Theme>();\n  const { swipeableRef, animatedStyle, changeState, handleLayout, handleRemove } = useSwipeRow({ anchor, onRemove });\n\n  const renderRightAction = (\n    props: SwipeAction & { x: number; progress: RNAnimated.AnimatedInterpolation<number> }\n  ) => {\n    const styles = StyleSheet.create({\n      container: {\n        flex: 1,\n      },\n      rect: {\n        flex: 1,\n        backgroundColor: props.backgroundColor,\n        justifyContent: 'center',\n        alignItems: 'center',\n      },\n    });\n\n    const trans = props.progress.interpolate({\n      inputRange: [0, 1],\n      outputRange: [props.x, 0],\n      extrapolate: 'clamp',\n    });\n\n    return (\n      <RNAnimated.View key={props.x} style={[styles.container, { transform: [{ translateX: trans }] }]}>\n        <RectButton style={styles.rect} onPress={props.onPress}>\n          <Text fontSize={px(16)} color=\"white\" style={props.textStyle}>\n            {props.label}\n          </Text>\n        </RectButton>\n      </RNAnimated.View>\n    );\n  };\n\n  /** 操作按钮 */\n  const actionButtons = overwriteDefaultActions\n    ? actions\n    : actions.concat({\n        label: '删除',\n        onPress: handleRemove,\n        backgroundColor: theme.colors.func600,\n      });\n\n  const renderRightActions = (\n    progress: RNAnimated.AnimatedInterpolation<number>,\n    _dragAnimatedValue: RNAnimated.AnimatedInterpolation<number>\n  ) => (\n    <Flex width={actionWidth * actionButtons.length}>\n      {actionButtons.map((item, index) => {\n        const x = (actionButtons.length - index) * actionWidth;\n        return renderRightAction({ ...item, progress, x });\n      })}\n    </Flex>\n  );\n\n  if (!children) return null;\n\n  return (\n    <Swipeable\n      ref={swipeableRef}\n      friction={1}\n      overshootFriction={10}\n      useNativeAnimations={true}\n      enableTrackpadTwoFingerGesture\n      rightThreshold={60}\n      renderRightActions={renderRightActions}\n      onSwipeableWillOpen={() => changeState(anchor)}\n      containerStyle={containerStyle}\n    >\n      <Animated.View style={[contentContainerStyle, animatedStyle]} onLayout={handleLayout}>\n        {children}\n      </Animated.View>\n    </Swipeable>\n  );\n};\nSwipeRow.displayName = 'SwipeRow';\n\nexport default Object.assign(SwipeRow, { Provider: SwipeRowContextProvider });\n"
  },
  {
    "path": "packages/react-native/src/swipe-row/useSwipeRow.ts",
    "content": "import { useContext, useEffect, useRef } from 'react';\nimport { LayoutChangeEvent } from 'react-native';\nimport { Swipeable } from 'react-native-gesture-handler';\nimport { interpolate, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { SwipeRowProps } from '.';\nimport { SwipeRowContext } from './context';\n\nexport default function useSwipeRow({ anchor, onRemove }: Pick<SwipeRowProps, 'onRemove' | 'anchor'>) {\n  const swipeableRef = useRef<Swipeable>(null);\n  const isRemoving = useSharedValue(0);\n  const [height, setHeight] = useSafeState(0);\n  const { changeState, id, multiple } = useContext(SwipeRowContext);\n\n  useEffect(() => {\n    if (anchor === id && !multiple) {\n      swipeableRef.current?.close();\n    }\n  }, [anchor, id, multiple]);\n\n  const handleRemove = async () => {\n    await onRemove?.();\n    isRemoving.value = withTiming(1, { duration: 200 });\n    swipeableRef.current?.close();\n  };\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    setHeight(e.nativeEvent.layout.height);\n  };\n\n  const animatedStyle = useAnimatedStyle(() => {\n    if (isRemoving.value) {\n      return {\n        height: interpolate(isRemoving.value, [0, 1], [height, 0]),\n      };\n    }\n\n    return {};\n  });\n\n  return {\n    swipeableRef,\n    animatedStyle,\n\n    changeState,\n    handleLayout: useMemoizedFn(handleLayout),\n    handleRemove: useMemoizedFn(handleRemove),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/switch/index.md",
    "content": "---\ntitle: Switch - 滑动开关组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# Switch 滑动开关组件\n\n## 效果演示\n\n### 1. 组件的基本使用\n\n```tsx | pure\n<Switch\n  checked={checked}\n  onChange={checked => {\n    setChecked(checked);\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"组件的基本使用 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609318446877640981.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 组件禁用\n\n```tsx | pure\n<Switch\n  checked={checked1}\n  disabled\n  onChange={checked => {\n    setChecked1(checked);\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"组件禁用 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609318447298320601.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义背景\n\n```tsx | pure\n<Switch\n  checked={checked2}\n  color=\"#875467\"\n  onChange={checked => {\n    setChecked2(checked);\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义背景 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609318447852753425.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自定义 label\n\n```tsx | pure\n<Switch\n  checked={checked3}\n  showText\n  onText=\"ON\"\n  offText=\"OFF\"\n  onChange={checked => {\n    setChecked3(checked);\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义 label ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609318447361108824.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性             | 必填    | 说明                     | 类型                         | 默认值  |\n| ---------------- | ------- | ------------------------ | ---------------------------- | ------- |\n| checked          | `false` | 当前是否选中             | `boolean`                    | `false` |\n| disabled         | `false` | 当前是否禁用             | `boolean`                    | `false` |\n| onChange         | `false` | 状态改变时的事件处理函数 | `(checked: boolean) => void` |         |\n| activeBackground | `false` | 是否选时的背景颜色       | `string`                     |         |\n| showText         | `false` | 是否显示文字             | `boolean`                    | `false` |\n| onText           | `false` | 开关打开时文本           | `string`                     | `开`    |\n| offText          | `false` | 开关关闭时文本           | `string`                     | `关`    |\n| width            | `false` | 宽度                     | `number`                     | `50`    |\n"
  },
  {
    "path": "packages/react-native/src/switch/index.tsx",
    "content": "import React, { forwardRef, useMemo } from 'react';\nimport { StyleSheet, TouchableWithoutFeedback } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { mix, mixColor } from '../utils/redash';\nimport useSwitch from './useSwitch';\n\nconst { px } = helpers;\nexport interface SwitchProps {\n  /** 选中改变事件 */\n  onChange?: (checked: boolean) => void;\n  /** 是否选中 */\n  checked?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 选中背景颜色 */\n  activeBackground?: string;\n  /** 是否显示文字 */\n  showText?: boolean;\n  /** 开关打开时的文字 */\n  onText?: string;\n  /** 开关关闭时的文字 */\n  offText?: string;\n  /** 宽度 */\n  width?: number;\n}\n\nconst SWITCH_WIDTH = px(50);\n\nconst Switch = forwardRef<unknown, SwitchProps>(\n  (\n    {\n      checked = false,\n      disabled = false,\n      onChange,\n      activeBackground,\n      showText = false,\n      onText = '开',\n      offText = '关',\n      width = SWITCH_WIDTH,\n    },\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _ref\n  ) => {\n    const theme = useTheme<Theme>();\n\n    const { progress, toggle } = useSwitch({ onChange, checked });\n\n    const HEIGHT = width / 2;\n    const HANDLER_SIZE = HEIGHT;\n\n    const handlerStyle = useAnimatedStyle(() => ({\n      borderWidth: 1,\n      borderColor: mixColor(\n        progress.value,\n        disabled ? theme.colors.disabled : theme.colors.gray50,\n        disabled ? theme.colors.primary400 : activeBackground ?? theme.colors.primary200\n      ),\n      transform: [\n        {\n          translateX: mix(progress.value, 0, width / 2),\n        },\n      ],\n    }));\n\n    const containerStyle = useAnimatedStyle(() => ({\n      backgroundColor: mixColor(\n        progress.value,\n        disabled ? theme.colors.disabled : theme.colors.gray50,\n        disabled ? theme.colors.primary400 : activeBackground ?? theme.colors.primary200\n      ) as any,\n    }));\n\n    const styles = StyleSheet.create({\n      content: {\n        width,\n        height: HEIGHT,\n        borderRadius: HEIGHT,\n        justifyContent: 'center',\n      },\n      handler: {\n        width: HANDLER_SIZE,\n        height: HANDLER_SIZE,\n        borderRadius: HANDLER_SIZE,\n        backgroundColor: disabled ? theme.colors.gray50 : theme.colors.white,\n        justifyContent: 'center',\n        alignItems: 'center',\n      },\n      text: { fontSize: HANDLER_SIZE / 2, color: theme.colors.primary200 },\n    });\n\n    const Content = useMemo(() => {\n      return (\n        <Animated.View style={[styles.content, containerStyle]}>\n          <Animated.View style={[styles.handler, handlerStyle]}>\n            {showText ? (\n              checked ? (\n                <Text style={styles.text}>{offText}</Text>\n              ) : (\n                <Text style={styles.text}>{onText}</Text>\n              )\n            ) : (\n              <Box />\n            )}\n          </Animated.View>\n        </Animated.View>\n      );\n    }, [checked, disabled, showText, onText, offText, containerStyle, handlerStyle]);\n\n    if (disabled) {\n      return Content;\n    }\n    return <TouchableWithoutFeedback onPress={toggle}>{Content}</TouchableWithoutFeedback>;\n  }\n);\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n"
  },
  {
    "path": "packages/react-native/src/switch/useSwitch.ts",
    "content": "import { useEffect } from 'react';\nimport { Keyboard } from 'react-native';\nimport { useDerivedValue, useSharedValue, withSpring } from 'react-native-reanimated';\n\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport type { SwitchProps } from '.';\n\nconst springConfig = {\n  mass: 1,\n  damping: 15,\n  stiffness: 120,\n  overshootClamping: false,\n  restSpeedThreshold: 0.001,\n  restDisplacementThreshold: 0.001,\n};\n\nexport default function useSwitch({ checked, onChange }: Pick<SwitchProps, 'onChange' | 'checked'>) {\n  const opened = useSharedValue<boolean>(false);\n  const progress = useDerivedValue(() => (opened.value ? withSpring(1, springConfig) : withSpring(0, springConfig)));\n\n  useEffect(() => {\n    opened.value = checked ?? false;\n  }, [checked]);\n\n  const toggle = () => {\n    Keyboard.dismiss();\n    if (onChange) {\n      onChange(!checked);\n    } else {\n      opened.value = !opened.value;\n    }\n  };\n\n  return { progress, toggle: useMemoizedFn(toggle) };\n}\n"
  },
  {
    "path": "packages/react-native/src/table/Cell.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nimport Box from '../box';\nimport Text from '../text';\nimport { ColumnProps } from './type';\n\ninterface CellProps {\n  data: { [key: string]: string };\n  column: ColumnProps;\n  style?: StyleProp<ViewStyle>;\n}\n\nexport const Cell: FC<CellProps> = memo(({ data, column, style }) => {\n  return (\n    <Box style={style}>\n      {column.render ? (\n        <Text\n          numberOfLines={column.numberOfLines}\n          ellipsizeMode={column.ellipsisMode}\n          textAlign={column.textAlign || 'center'}\n          variant=\"p1\"\n          color=\"gray500\"\n        >\n          {column.render(data[column.dataIndex], column)}\n        </Text>\n      ) : (\n        <Text\n          numberOfLines={column.numberOfLines}\n          ellipsizeMode={column.ellipsisMode}\n          textAlign={column.textAlign || 'center'}\n          variant=\"p1\"\n          color=\"gray500\"\n        >\n          {column.renderText ? column.renderText(data[column.dataIndex], column) : data[column.dataIndex] ?? '-'}\n        </Text>\n      )}\n    </Box>\n  );\n});\n"
  },
  {
    "path": "packages/react-native/src/table/Head.tsx",
    "content": "import React, { FC, memo, useContext, useMemo } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport { ColumnContext, computeWidth } from './utils';\n\nconst { ONE_PIXEL } = helpers;\n\ninterface HeadProps {\n  headerStyle?: StyleProp<ViewStyle>;\n}\n\nexport const Head: FC<HeadProps> = memo(({ headerStyle }) => {\n  const { columns, cellWidth } = useContext(ColumnContext);\n\n  const cellRender = useMemo(() => {\n    if (!(columns instanceof Array)) {\n      throw new Error('columns 需要是数组');\n    }\n    return columns.map((item, index) => {\n      const styles = computeWidth(cellWidth, item.width);\n      return (\n        <Box key={item.dataIndex ?? index} justifyContent=\"center\" style={styles}>\n          <Text\n            variant=\"h3\"\n            color=\"gray500\"\n            numberOfLines={item.numberOfLines}\n            ellipsizeMode={item.ellipsisMode}\n            textAlign={item.textAlign || 'center'}\n          >\n            {item.title}\n          </Text>\n        </Box>\n      );\n    });\n  }, [columns, cellWidth]);\n\n  return (\n    <Box\n      flexDirection=\"row\"\n      paddingVertical=\"x4\"\n      style={headerStyle}\n      borderBottomWidth={ONE_PIXEL}\n      borderColor=\"border\"\n      backgroundColor=\"background\"\n    >\n      {cellRender}\n    </Box>\n  );\n});\n"
  },
  {
    "path": "packages/react-native/src/table/Rows.tsx",
    "content": "import React, { FC, memo, useContext, useMemo } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport { Cell } from './Cell';\nimport { ColumnContext, computeWidth } from './utils';\n\nconst { ONE_PIXEL } = helpers;\n\ninterface RowsProps {\n  data: { [key: string]: string };\n  rowStyle?: StyleProp<ViewStyle>;\n}\n\nexport const Rows: FC<RowsProps> = memo(({ data, rowStyle }) => {\n  const { columns, cellWidth } = useContext(ColumnContext);\n\n  const cellRender = useMemo(() => {\n    if (!(columns instanceof Array)) {\n      throw new Error('columns 需要是数组');\n    }\n    return columns.map((item, index) => {\n      const styles = computeWidth(cellWidth, item.width);\n      return <Cell style={styles} key={item.dataIndex || index} data={data} column={item} />;\n    });\n  }, [columns, data, cellWidth]);\n\n  return (\n    <Box\n      flexDirection=\"row\"\n      flexGrow={1}\n      borderBottomWidth={ONE_PIXEL}\n      borderColor=\"border\"\n      paddingVertical=\"x4\"\n      alignItems=\"center\"\n      style={rowStyle}\n    >\n      {cellRender}\n    </Box>\n  );\n});\n"
  },
  {
    "path": "packages/react-native/src/table/index.md",
    "content": "---\ntitle: Table - 表格组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Table 表格组件\n\n## 效果演示\n\n### 1. 基本的用法\n\n```tsx | pure\n  const columns = [\n    {\n      title: '管理员',\n      dataIndex: 'userInfo',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '角色',\n      dataIndex: 'roleName',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '部门',\n      dataIndex: 'opDepartmentName',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '操作内容',\n      dataIndex: 'opContent',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '业务模块',\n      dataIndex: 'businessModule',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n  ];\n\n  const dataSource = [\n    {\n      id: 4694447,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '',\n      opType: '解除封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:17:22.000+08:00',\n    },\n    {\n      id: 4694446,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '117569,[2, 1, 4],11',\n      opType: '封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:17:09.000+08:00',\n    },\n    {\n      id: 4694443,\n      userId: 116969,\n      userName: 'zhuxc',\n      nickName: 'zhuxc',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 4,\n      opDepartmentName: '根部门1',\n      accountType: 1,\n      opResources: 'zhuxc',\n      opType: '运营商用户名密码登录',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '用户登录',\n      loginIp: '60.12.241.84',\n      loginCity: null,\n      createdAt: '2020-12-01T17:15:09.000+08:00',\n    },\n    {\n      id: 4694369,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '117569,[4],11',\n      opType: '封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:00:21.000+08:00',\n    },\n    {\n      id: 4694357,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '',\n      opType: '查看黑白名单列表',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '黑白名单',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T16:59:43.000+08:00',\n    }]\n<WingBlank>\n  <Table columns={columns} dataSource={data} height={300} />\n</WingBlank>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"基本的用法 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608881149351049415.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. columns 属性\n\n```tsx | pure\n  const columns = [\n     {\n      title: '管理员',\n      dataIndex: 'userInfo',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n      width: 100,\n      flex: 2,\n    },\n    {\n      title: '角色',\n      dataIndex: 'roleName',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n      width: 50,\n    },\n    {\n      title: '部门',\n      dataIndex: 'opDepartmentName',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n      width: 20,\n    },\n    {\n      title: '操作内容',\n      dataIndex: 'opContent',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '业务模块',\n      dataIndex: 'businessModule',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '操作时间',\n      dataIndex: 'createdAt',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'dateTimeRange',\n    },\n    {\n      title: 'IP地址',\n      dataIndex: 'loginIp',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n  ];\n\n  const dataSource = [\n    {\n      id: 4694447,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '',\n      opType: '解除封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:17:22.000+08:00',\n    },\n    {\n      id: 4694446,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '117569,[2, 1, 4],11',\n      opType: '封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:17:09.000+08:00',\n    },\n    {\n      id: 4694443,\n      userId: 116969,\n      userName: 'zhuxc',\n      nickName: 'zhuxc',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 4,\n      opDepartmentName: '根部门1',\n      accountType: 1,\n      opResources: 'zhuxc',\n      opType: '运营商用户名密码登录',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '用户登录',\n      loginIp: '60.12.241.84',\n      loginCity: null,\n      createdAt: '2020-12-01T17:15:09.000+08:00',\n    },\n    {\n      id: 4694369,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '117569,[4],11',\n      opType: '封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:00:21.000+08:00',\n    },\n    {\n      id: 4694357,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '',\n      opType: '查看黑白名单列表',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '黑白名单',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T16:59:43.000+08:00',\n    }]\n<WingBlank>\n  <Table columns={columns} dataSource={data} height={300} />\n</WingBlank>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"columns 属性 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608881149467256102.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 横向滚动\n\n```tsx | pure\n  const columns = [\n     {\n      title: '管理员',\n      dataIndex: 'userInfo',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n      width: 100,\n      flex: 2,\n    },\n    {\n      title: '角色',\n      dataIndex: 'roleName',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n      width: 50,\n    },\n    {\n      title: '部门',\n      dataIndex: 'opDepartmentName',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n      width: 20,\n    },\n    {\n      title: '操作内容',\n      dataIndex: 'opContent',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '业务模块',\n      dataIndex: 'businessModule',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n    {\n      title: '操作时间',\n      dataIndex: 'createdAt',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'dateTimeRange',\n    },\n    {\n      title: 'IP地址',\n      dataIndex: 'loginIp',\n      align: 'left',\n      ellipsis: false,\n      copyable: false,\n      valueType: 'text',\n      hideInSearch: false,\n    },\n  ];\n\n  const dataSource = [\n    {\n      id: 4694447,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '',\n      opType: '解除封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:17:22.000+08:00',\n    },\n    {\n      id: 4694446,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '117569,[2, 1, 4],11',\n      opType: '封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:17:09.000+08:00',\n    },\n    {\n      id: 4694443,\n      userId: 116969,\n      userName: 'zhuxc',\n      nickName: 'zhuxc',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 4,\n      opDepartmentName: '根部门1',\n      accountType: 1,\n      opResources: 'zhuxc',\n      opType: '运营商用户名密码登录',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '用户登录',\n      loginIp: '60.12.241.84',\n      loginCity: null,\n      createdAt: '2020-12-01T17:15:09.000+08:00',\n    },\n    {\n      id: 4694369,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '117569,[4],11',\n      opType: '封禁会员账号、漫克',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '会员模块',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T17:00:21.000+08:00',\n    },\n    {\n      id: 4694357,\n      userId: 117676,\n      userName: 'sxj',\n      nickName: 'sxj',\n      roleId: 519,\n      roleName: '超级管理员角色',\n      opDepartmentId: 22,\n      opDepartmentName: 'lw是',\n      accountType: 1,\n      opResources: '',\n      opType: '查看黑白名单列表',\n      deviceNo: null,\n      deviceSystem: null,\n      clientId: 'manke-management',\n      groupId: null,\n      businessModule: '黑白名单',\n      loginIp: '222.173.46.190',\n      loginCity: null,\n      createdAt: '2020-12-01T16:59:43.000+08:00',\n    }]\n<WingBlank>\n  <Table columns={columns} dataSource={data}  height={300} />\n</WingBlank>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"横向滚动 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608881149887640842.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 空状态\n\n```tsx | pure\nconst columns = [\n  {\n    title: '管理员',\n    dataIndex: 'userInfo',\n    align: 'left',\n    ellipsis: false,\n    copyable: false,\n    valueType: 'text',\n    hideInSearch: false,\n    width: 100,\n    flex: 2,\n  },\n  {\n    title: '角色',\n    dataIndex: 'roleName',\n    align: 'left',\n    ellipsis: false,\n    copyable: false,\n    valueType: 'text',\n    hideInSearch: false,\n    width: 50,\n  },\n  {\n    title: '部门',\n    dataIndex: 'opDepartmentName',\n    align: 'left',\n    ellipsis: false,\n    copyable: false,\n    valueType: 'text',\n    hideInSearch: false,\n    width: 20,\n  },\n  {\n    title: '操作内容',\n    dataIndex: 'opContent',\n    align: 'left',\n    ellipsis: false,\n    copyable: false,\n    valueType: 'text',\n    hideInSearch: false,\n  },\n  {\n    title: '业务模块',\n    dataIndex: 'businessModule',\n    align: 'left',\n    ellipsis: false,\n    copyable: false,\n    valueType: 'text',\n    hideInSearch: false,\n  },\n  {\n    title: '操作时间',\n    dataIndex: 'createdAt',\n    align: 'left',\n    ellipsis: false,\n    copyable: false,\n    valueType: 'dateTimeRange',\n  },\n  {\n    title: 'IP地址',\n    dataIndex: 'loginIp',\n    align: 'left',\n    ellipsis: false,\n    copyable: false,\n    valueType: 'text',\n    hideInSearch: false,\n  },\n];\n\n<WingBlank>\n  <Table columns={columns} dataSource={[]} height={300} />\n</WingBlank>;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"空状态 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608881148736057650.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### table 组件 API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| columns | `true` | 表格的列定义 | `ColumnProps[]` |  |\n| dataSource | `true` | 表格的数据 | `[{ [key: string]: string }]` |  |\n| keyExtractor | `true` | 指定 Table 的唯一标识字段 | `(item: T, index: number) => string` |  |\n| headerStyle | `false` | 表单头部样式 | `ViewStyle` |  |\n| rowStyle | `false` | 数据行样式 | `ViewStyle` |  |\n| onRefresh | `false` | 表格下拉刷新 | `() => void` |  |\n| onEndReached | `false` | 表格上拉加载 | `() => void` |  |\n| refreshing | `false` | 刷新状态 | `boolean` | `false` |\n| height | `false` | 表单的高度 （如果不填则为 flex:1，由外部容器决定） | `number` | `deviceHeight` |\n| fixedHeader | `false` | 是否固定头部 | `boolean` | `false` |\n| showHeader | `false` | 是否显示表头 | `boolean` | `false` |\n| emptyComponent | `false` | 空状态的视图 | `ReactElement` |  |\n\n### ColumnProps 属性\n\n| 属性          | 必填    | 说明             | 类型                                               | 默认值 |\n| ------------- | ------- | ---------------- | -------------------------------------------------- | ------ |\n| title         | `true`  | 表单的列标题     | `string`                                           |        |\n| dataIndex     | `true`  | 数据的 key 值    | `string`                                           |        |\n| numberOfLines | `false` | 文字行数         | `number`                                           |        |\n| ellipsisMode  | `false` | 超出后的截取方式 | `head` \\| `middle` \\| `tail` \\| `clip`             |        |\n| textAlign     | `false` | 文字对其方式     | `center` \\| `left` \\| `right`                      |        |\n| width         | `false` | 列的宽度         | `number`                                           |        |\n| renderText    | `false` | 自定义文本       | `(item: any, column: ColumnProps) => string`       |        |\n| render        | `false` | 自定义组件       | `(item: any, column: ColumnProps) => ReactElement` |        |\n"
  },
  {
    "path": "packages/react-native/src/table/index.tsx",
    "content": "import React from 'react';\nimport { FlatList, ScrollView, StyleSheet } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Center from '../center';\nimport Empty from '../empty';\nimport helpers from '../helpers';\nimport { Theme } from '../theme';\nimport { Head } from './Head';\nimport { Rows } from './Rows';\nimport { TableProps } from './type';\nimport useTable from './useTable';\nimport { ColumnContext } from './utils';\n\nconst { deviceHeight } = helpers;\n\nfunction Table<T extends Record<string, any>>(props: TableProps<T>) {\n  const {\n    columns = [],\n    dataSource = [],\n    headerStyle = {},\n    rowStyle = {},\n    onRefresh,\n    onEndReached,\n    refreshing = false,\n    height = deviceHeight,\n    fixedHeader = true,\n    showHeader = true,\n    emptyComponent,\n    keyExtractor,\n  } = props;\n  const theme = useTheme<Theme>();\n  const { contentHeight, handleHeaderLayout, handleLayout, cellWidth } = useTable({ columns });\n\n  const styles = StyleSheet.create({\n    contentContainer: {\n      flexGrow: 1,\n      flexDirection: 'column',\n      height: height,\n    },\n  });\n\n  return (\n    <ColumnContext.Provider value={{ columns: columns, cellWidth: cellWidth }}>\n      <ScrollView\n        horizontal\n        onContentSizeChange={handleLayout}\n        contentContainerStyle={styles.contentContainer}\n        showsHorizontalScrollIndicator={false}\n        showsVerticalScrollIndicator={false}\n        scrollEnabled={true}\n        bounces={false}\n      >\n        <FlatList<T>\n          scrollEnabled={dataSource.length > 0}\n          nestedScrollEnabled\n          stickyHeaderIndices={fixedHeader && showHeader ? [0] : []}\n          showsVerticalScrollIndicator={false}\n          showsHorizontalScrollIndicator={false}\n          contentContainerStyle={{\n            flexGrow: 1,\n            backgroundColor: theme.colors.white,\n          }}\n          ListHeaderComponent={\n            showHeader ? (\n              <Box onLayout={handleHeaderLayout}>\n                <Head headerStyle={headerStyle}></Head>\n              </Box>\n            ) : null\n          }\n          data={dataSource}\n          bounces={false}\n          ListEmptyComponent={\n            emptyComponent ? (\n              emptyComponent\n            ) : (\n              <Center height={contentHeight}>\n                <Empty />\n              </Center>\n            )\n          }\n          renderItem={({ item }) => {\n            return <Rows data={item} rowStyle={rowStyle}></Rows>;\n          }}\n          onRefresh={onRefresh}\n          onEndReached={onEndReached}\n          refreshing={refreshing}\n          keyExtractor={keyExtractor}\n        />\n      </ScrollView>\n    </ColumnContext.Provider>\n  );\n}\nTable.displayName = 'Table';\n\nexport default Table;\n"
  },
  {
    "path": "packages/react-native/src/table/type.ts",
    "content": "import { ReactElement } from 'react';\nimport { ViewStyle } from 'react-native';\n\nexport interface ColumnProps {\n  /** 表单标题 */\n  title: string;\n  /** 数组下标 */\n  dataIndex: string;\n  /** 文字行数  */\n  numberOfLines?: number;\n  /** 超出后的截取 */\n  ellipsisMode?: 'head' | 'middle' | 'tail' | 'clip';\n  /** 文字对其方式 */\n  textAlign?: 'center' | 'left' | 'right';\n  /** 列的宽度 */\n  width?: number;\n  /** 自定义文本 */\n  renderText?: (item: string, column: ColumnProps) => string;\n  /** 自定义组件 */\n  render?: (item: string, column: ColumnProps) => ReactElement;\n}\n\nexport interface TableProps<T> {\n  /** 列定义 */\n  columns: Array<ColumnProps>;\n  /** 表格数据 */\n  dataSource: T[];\n\n  /** 表单头部样式 */\n  headerStyle?: ViewStyle;\n  /** 数据行样式 */\n  rowStyle?: ViewStyle;\n  /** 下拉刷新 */\n  onRefresh?: () => void;\n  /** 上拉加载 */\n  onEndReached?: () => void;\n  /** 刷新状态 */\n  refreshing?: boolean;\n  /** 表单的高度 */\n  height?: number;\n  /** 是否固定头部 */\n  fixedHeader?: boolean;\n  /** 是否显示表头 */\n  showHeader?: boolean;\n  /** 空状态的视图 */\n  emptyComponent?: ReactElement;\n  /** 指定Table的唯一标识字段 */\n  keyExtractor: (item: T, index: number) => string;\n}\n"
  },
  {
    "path": "packages/react-native/src/table/useTable.ts",
    "content": "import { useCallback } from 'react';\nimport { LayoutChangeEvent } from 'react-native';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport { TableProps } from './type';\nimport { computeCellWidth } from './utils';\n\nexport default function useTable<T extends Record<string, any>>({ columns }: Pick<TableProps<T>, 'columns'>) {\n  /**当前容器的宽度，用来计算表格的长度 */\n  const [containerWidth, setContainerWidth] = useSafeState(0);\n  const [headerHeight, setHeaderHeight] = useSafeState(0);\n  const [containerHeight, setContainerHeight] = useSafeState(0);\n\n  const contentHeight = containerHeight - headerHeight;\n  /** 计算单元格的长度 */\n  const cellWidth = computeCellWidth(containerWidth, columns);\n\n  /** 获取容器宽度 如果有tableWidth则用tableWidth */\n  const handleLayout = useCallback((w: number, h: number) => {\n    setContainerWidth(w);\n    setContainerHeight(h);\n  }, []);\n\n  return {\n    contentHeight,\n    handleLayout,\n    cellWidth,\n    handleHeaderLayout: useCallback((e: LayoutChangeEvent) => setHeaderHeight(e.nativeEvent.layout.height), []),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/table/utils.ts",
    "content": "import { createContext } from 'react';\n\nimport { ColumnProps } from './type';\n\nexport const ColumnContext = createContext<{ columns: ColumnProps[]; cellWidth: number }>({\n  columns: [],\n  cellWidth: 0,\n});\n\nexport function computeWidth(cellWidth: number, width?: number) {\n  const styles = {};\n  if (width) {\n    Object.assign(styles, {\n      width: width,\n    });\n  } else {\n    Object.assign(styles, {\n      width: cellWidth,\n    });\n  }\n  return styles;\n}\n\nexport function computeCellWidth(wrapWidth: number, columns: ColumnProps[]): number {\n  let needWidth = 0;\n  let count = columns.length;\n\n  for (let i = 0; i < columns.length; i++) {\n    if (columns[i] && 'number' === typeof columns[i].width) {\n      needWidth += columns[i].width!;\n      count--;\n    }\n  }\n  // 所有的列都给了width不需要去计算剩下的长度\n  if (count <= 0) {\n    return 0;\n  }\n\n  // 如果当前长度小于表格需要的宽度,未给长度列的默认给一个最小单位 50 表单需要滚动\n  if (wrapWidth <= needWidth) {\n    return 50;\n  }\n\n  // 如果剩下的太小给一个固定的\n  const width = (wrapWidth - needWidth) / count;\n  return width < 20 ? 20 : width;\n}\n"
  },
  {
    "path": "packages/react-native/src/tag/index.md",
    "content": "---\ntitle: Tag - 标签组件\nnav:\n  title: RN 组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Tag 标签组件\n\n## 效果演示\n\n### 1. 大中小标签默认效果\n\n```tsx | pure\n<Flex justifyContent=\"space-around\">\n  <Tag size=\"small\">magenta</Tag>\n  <Tag>magenta</Tag>\n  <Tag size=\"large\">magenta</Tag>\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643253782367453494.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 自定义背景色\n\n```jsx | pure\n<Flex justifyContent=\"space-between\">\n  <Tag backgroundColor=\"func200\" text=\"标签\" />\n  <Tag backgroundColor=\"func300\" text=\"标签\" />\n  <Tag backgroundColor=\"func500\" text=\"小标签标签\" />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643253837366314688.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义文字颜色\n\n```jsx | pure\n<Flex justifyContent=\"space-between\">\n  <Tag color=\"func200\" text=\"标签\" />\n  <Tag color=\"func300\" text=\"标签\" />\n  <Tag color=\"func500\" text=\"标签\" />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643253869655478919.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 镂空标签\n\n```jsx | pure\n<Flex justifyContent=\"space-between\">\n  <Tag backgroundColor=\"func200\" ghost text=\"标签\" />\n  <Tag backgroundColor=\"func300\" ghost text=\"标签\" />\n  <Tag backgroundColor=\"func500\" ghost text=\"标签\" />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643253904141084290.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. disabled 效果\n\n```jsx | pure\n<Flex justifyContent=\"space-between\">\n  <Tag disabled text=\"标签\" />\n  <Tag backgroundColor=\"func300\" disabled text=\"标签\" />\n  <Tag backgroundColor=\"func500\" disabled text=\"标签\" />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643253934714157704.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 选中效果\n\n```jsx | pure\n<Flex justifyContent=\"space-between\">\n  <Tag selected text=\"标签\" />\n  <Tag backgroundColor=\"func300\" selected text=\"标签\" />\n  <Tag backgroundColor=\"func500\" selected text=\"标签\" />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643253992253997438.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 7. 可删除效果\n\n```jsx | pure\n<Flex justifyContent=\"space-between\">\n  <Tag closable text=\"标签\" />\n  <Tag backgroundColor=\"func300\" closable text=\"标签\" />\n  <Tag backgroundColor=\"func500\" closable text=\"标签\" />\n</Flex>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643254041176615517.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性          | 必填    | 说明               | 类型                          | 默认值   |\n| ------------- | ------- | ------------------ | ----------------------------- | -------- |\n| size          | `false` | 标签的大小         | `large`\\| `small` \\| `middle` | `middle` |\n| text          | `false` | 指定标签文本       | `string`                      |          |\n| ghost         | `false` | 是否背景镂空       | `boolean`                     | `false`  |\n| disabled      | `false` | 设置禁用           | `boolean`                     | `false`  |\n| closable      | `false` | 是否可关闭         | `boolean`                     | `false`  |\n| selectable    | `false` | 是否可选中         | `boolean`                     | `false`  |\n| selected      | `false` | 设置标签的选中状态 | `boolean`                     | `false`  |\n| onClose       | `false` | 点击关闭的回调函数 | `() => void`                  |          |\n| onSelect      | `false` | 点击标签的回调函数 | `(selected: boolean) => void` |          |\n| activeOpacity | `false` | 按下时的不透明度   | `number`                      | `0.6`    |\n"
  },
  {
    "path": "packages/react-native/src/tag/index.tsx",
    "content": "import React, { FC, useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Svg, { Path } from 'react-native-svg';\n\nimport {\n  backgroundColor,\n  BackgroundColorProps,\n  border,\n  BorderProps,\n  color,\n  ColorProps,\n  createRestyleComponent,\n  layout,\n  LayoutProps,\n  typography,\n  TypographyProps,\n  useTheme,\n} from '@shopify/restyle';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport useTag from './useTag';\n\ntype TagSize = 'large' | 'middle' | 'small';\nexport interface TagProps {\n  text: string;\n  /** 标签大小，决定padding的大小 */\n  size?: TagSize;\n  /** 是否背景镂空 */\n  ghost?: boolean;\n  /** 设置禁用 */\n  disabled?: boolean;\n  /** 是否可关闭 */\n  closable?: boolean;\n  /** 是否可选中 */\n  selectable?: boolean;\n  /** 设置标签的选中状态 */\n  selected?: boolean;\n  /** 点击关闭的回调函数 */\n  onClose?: () => void;\n  /** 点击标签的回调函数 */\n  onSelect?: (selected: boolean) => void;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\ntype BaseTagProps = BorderProps<Theme> &\n  BackgroundColorProps<Theme> &\n  ColorProps<Theme> &\n  LayoutProps<Theme> &\n  TypographyProps<Theme>;\n\nconst BaseTag = createRestyleComponent<BaseTagProps, Theme>([border, backgroundColor, color, layout, typography]);\n\nconst { px, ONE_PIXEL } = helpers;\nconst Tag: FC<TagProps & BaseTagProps> = ({\n  text,\n  size = 'middle',\n  ghost = false,\n  closable = false,\n  selectable = true,\n  activeOpacity = 0.6,\n  disabled = false,\n  selected = false,\n  onClose,\n  onSelect,\n  ...restProps\n}) => {\n  const theme = useTheme<Theme>();\n\n  const { handleDelete, handlePress, checked, closed } = useTag({ selected, disabled, selectable, onClose, onSelect });\n\n  if (closed) return null;\n\n  const {\n    fontFamily,\n    fontSize = px(12),\n    fontStyle,\n    fontWeight,\n    letterSpacing,\n    lineHeight,\n    textAlign,\n    textDecorationLine,\n    textDecorationStyle,\n    textTransform,\n    color = disabled ? 'disabled' : 'primary100',\n    backgroundColor,\n    borderWidth = ONE_PIXEL,\n    justifyContent = 'center',\n    alignItems = 'center',\n    borderRadius = 'x1',\n    ...rest\n  } = restProps;\n\n  let borderColor = rest.borderColor ?? color;\n  if (ghost && disabled) {\n    borderColor = 'disabled';\n  } else if (checked) {\n    borderColor = 'primary200';\n  }\n\n  const { paddingHorizontal, paddingVertical } = getBySize(size);\n\n  const styles = StyleSheet.create({\n    iconBtn: {\n      position: 'absolute',\n      width: px(8),\n      height: px(8),\n      top: -px(4),\n      right: -px(4),\n      justifyContent: 'center',\n      alignItems: 'center',\n    },\n    iconWrap: {\n      backgroundColor: theme.colors.icon,\n      borderRadius: px(8),\n    },\n    check: {\n      position: 'absolute',\n      bottom: 0,\n      right: 0,\n    },\n  });\n\n  /** 删除的图标组件 */\n  const ClosableIcon = useMemo(() => {\n    if (closable && !disabled)\n      return (\n        <Pressable activeOpacity={1} hitOffset={5} onPress={handleDelete} style={styles.iconBtn}>\n          <Box style={styles.iconWrap}>\n            <SvgIcon name=\"close\" color={theme.colors.white} size={px(10)} />\n          </Box>\n        </Pressable>\n      );\n    return null;\n  }, [closable, disabled, styles.iconBtn, styles.iconWrap, theme.colors.white]);\n\n  /** 选中的图标组件 */\n  const CheckedIcon = useMemo(() => {\n    if (checked)\n      return (\n        <Box style={styles.check}>\n          <Svg viewBox=\"0 0 1040 1024\" width={px(28)} height={px(28)}>\n            <Path\n              d=\"M1023.83 474.655l-549.255 549.283h549.255V474.655zM783.16 979.732l-96.896-96.933 36.335-36.35 60.56 60.583L952.729 737.4l36.335 36.35L783.16 979.731z\"\n              fill={theme.colors.primary200}\n            />\n          </Svg>\n        </Box>\n      );\n    return null;\n  }, [checked, styles.check, theme.colors.primary200]);\n\n  const Content = (\n    <BaseTag\n      {...rest}\n      {...{\n        justifyContent,\n        alignItems,\n        borderColor,\n        borderWidth,\n        borderRadius,\n        paddingVertical,\n        paddingHorizontal,\n      }}\n      {...{ backgroundColor: ghost ? 'transparent' : backgroundColor }}\n    >\n      <Text\n        {...{\n          fontFamily,\n          fontSize,\n          fontStyle,\n          fontWeight,\n          letterSpacing,\n          lineHeight,\n          textAlign,\n          textDecorationLine,\n          textDecorationStyle,\n          textTransform,\n          color,\n        }}\n      >\n        {text}\n      </Text>\n    </BaseTag>\n  );\n\n  if (selectable)\n    return (\n      <Box>\n        <Pressable disabled={disabled} activeOpacity={activeOpacity} onPress={handlePress}>\n          {Content}\n        </Pressable>\n        {ClosableIcon}\n        {CheckedIcon}\n      </Box>\n    );\n\n  return (\n    <Box>\n      {Content}\n      {ClosableIcon}\n      {CheckedIcon}\n    </Box>\n  );\n};\nTag.displayName = 'Tag';\n\nexport default Tag;\n\nfunction getBySize(size: TagSize) {\n  switch (size) {\n    case 'large':\n      return {\n        paddingHorizontal: px(16),\n        paddingVertical: px(8),\n      };\n\n    case 'middle':\n    default:\n      return {\n        paddingHorizontal: px(12),\n        paddingVertical: px(6),\n      };\n\n    case 'small':\n      return {\n        paddingHorizontal: px(4),\n        paddingVertical: px(4),\n      };\n  }\n}\n"
  },
  {
    "path": "packages/react-native/src/tag/useTag.ts",
    "content": "import { useBoolean, useMemoizedFn } from '@td-design/rn-hooks';\n\nimport type { TagProps } from '.';\n\nexport default function useTag({\n  selected = false,\n  disabled = false,\n  selectable = true,\n  onClose,\n  onSelect,\n}: Pick<TagProps, 'selected' | 'selectable' | 'disabled' | 'onClose' | 'onSelect'>) {\n  const [checked, { set: setChecked }] = useBoolean(selected);\n  const [closed, { set: setClosed }] = useBoolean(false);\n\n  /** 点击事件 */\n  const handlePress = () => {\n    if (disabled || !selectable) return;\n\n    setChecked(!checked);\n    onSelect?.(!checked);\n  };\n\n  /** 删除事件 */\n  const handleDelete = () => {\n    setClosed(!closed);\n    onClose?.();\n  };\n\n  return {\n    checked,\n    closed,\n    handlePress: useMemoizedFn(handlePress),\n    handleDelete: useMemoizedFn(handleDelete),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/text/ReText.tsx",
    "content": "import React from 'react';\nimport type { TextProps as RNTextProps, TextInputProps } from 'react-native';\nimport { StyleSheet, TextInput } from 'react-native';\nimport Animated, { useAnimatedProps } from 'react-native-reanimated';\n\nconst styles = StyleSheet.create({\n  baseStyle: {\n    color: 'black',\n  },\n});\nAnimated.addWhitelistedNativeProps({ text: true });\n\ninterface TextProps extends Omit<TextInputProps, 'value' | 'style'> {\n  text: Animated.SharedValue<string>;\n  style?: Animated.AnimateProps<RNTextProps>['style'];\n}\n\nconst AnimatedTextInput = Animated.createAnimatedComponent(TextInput);\n\nconst ReText = (props: TextProps) => {\n  const { style, text, ...rest } = props;\n  const animatedProps = useAnimatedProps(() => {\n    return {\n      text: text.value,\n      // Here we use any because the text prop is not available in the type\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } as any;\n  });\n  return (\n    <AnimatedTextInput\n      underlineColorAndroid=\"transparent\"\n      editable={false}\n      value={text.value}\n      style={[styles.baseStyle, style || undefined]}\n      {...rest}\n      {...{ animatedProps }}\n    />\n  );\n};\n\nexport default ReText;\n"
  },
  {
    "path": "packages/react-native/src/text/index.md",
    "content": "---\ntitle: Text - 文本组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n---\n\n# Text 文本组件\n\n文本组件主要基于`restyle`封装，替换`react-native`默认的`Text`组件。\n\n**注意：Text组件移除了`onLongPress`/`onPress`/`onPressIn`/`onPressOut`这些属性（[Why](https://twitter.com/fernandotherojo/status/1707762822015267219?s=42)）。所以您无法直接在Text组件上使用点击事件，需要的话，请使用`Pressable`或者`Touchable*`等组件包裹Text组件以实现相同的效果。**\n\n## 效果演示\n\n### 1. 字体大小 32\n\n```tsx | pure\n<Text fontSize={32}>你好，我是文字</Text>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"text-ios1\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607501774750024490.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 颜色为蓝色，字体加粗\n\n```tsx | pure\n<Text fontSize={30} color=\"primaryColor\" fontWeight=\"bold\">\n  你好，我是文字\n</Text>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"text-ios2\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607501844581287741.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. variant 使用示例\n\n```tsx | pure\n<Text variant=\"primaryBody\">你好，我是文字</Text>\n```\n\n`primaryBody`在`Theme`里面的定义为：\n\n```tsx | pure\nprimaryBody: {\n  fontSize: 16,\n  color: 'primaryTextColor',\n},\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"text-ios3\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607502418897079606.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n除样式属性外，其他属性和`TextProps`保持一致。样式属性基于`restyle`，把原来用`style`包裹的属性展平，同时采用`Theme`里面定义的约束。\n\n### 特有属性\n\n| 属性    | 必填    | 说明                                                 | 类型     | 默认值 |\n| ------- | ------- | ---------------------------------------------------- | -------- | ------ |\n| variant | `false` | 取值为定义在`Theme`里的`textVariants`对象里的 key 值 | `string` |        |\n\n### 文本属性\n\n定义参见：[https://reactnative.dev/docs/text-style-props](https://reactnative.dev/docs/text-style-props)\n\n| 属性                | 必填    | 说明                                      | 类型      | 默认值 |\n| ------------------- | ------- | ----------------------------------------- | --------- | ------ |\n| color               | `false` | 文本颜色。取值为 Theme 里面的`colors`     | `string`  |        |\n| opacity             | `false` | 透明度。取值 0 - 1                        | `number`  | `1`    |\n| visible             | `false` | 是否可见                                  | `boolean` | `true` |\n| fontFamily          | `false` |                                           |           |        |\n| fontSize            | `false` |                                           |           |        |\n| fontStyle           | `false` |                                           |           |        |\n| fontWeight          | `false` |                                           |           |        |\n| letterSpacing       | `false` |                                           |           |        |\n| lineHeight          | `false` |                                           |           |        |\n| textAlign           | `false` |                                           |           |        |\n| textDecorationLine  | `false` |                                           |           |        |\n| textDecorationStyle | `false` |                                           |           |        |\n| textTransform       | `false` |                                           |           |        |\n| textShadowOffset    | `false` |                                           |           |        |\n| textShadowRadius    | `false` |                                           |           |        |\n| textShadowColor     | `false` | 文本阴影颜色。取值为 Theme 里面的`colors` |           |        |\n\n### 内边距、外边距相关属性\n\n取值为 Theme 里面的`spacing`。\n\n定义参见：[https://reactnative.dev/docs/layout-props](https://reactnative.dev/docs/layout-props)\n\n| 属性              | 必填    | 说明 | 类型 | 默认值 |\n| ----------------- | ------- | ---- | ---- | ------ |\n| margin            | `false` |      |      |        |\n| marginStart       | `false` |      |      |        |\n| marginEnd         | `false` |      |      |        |\n| marginHorizontal  | `false` |      |      |        |\n| marginVertical    | `false` |      |      |        |\n| marginLeft        | `false` |      |      |        |\n| marginRight       | `false` |      |      |        |\n| marginBottom      | `false` |      |      |        |\n| marginTop         | `false` |      |      |        |\n| padding           | `false` |      |      |        |\n| paddingStart      | `false` |      |      |        |\n| paddingEnd        | `false` |      |      |        |\n| paddingHorizontal | `false` |      |      |        |\n| paddingVertical   | `false` |      |      |        |\n| paddingLeft       | `false` |      |      |        |\n| paddingRight      | `false` |      |      |        |\n| paddingBottom     | `false` |      |      |        |\n| paddingTop        | `false` |      |      |        |\n"
  },
  {
    "path": "packages/react-native/src/text/index.tsx",
    "content": "import React, { memo, PropsWithChildren } from 'react';\nimport { TextProps as RNTextProps } from 'react-native';\n// @ts-ignore\nimport { NativeText } from 'react-native/Libraries/Text/TextNativeComponent';\n\nimport { createText, TextProps } from '@shopify/restyle';\n\nimport { Theme } from '../theme';\n\ntype Props = TextProps<Theme> & Omit<RNTextProps, 'onLongPress' | 'onPress' | 'onPressIn' | 'onPressOut'>;\n\nconst BaseText = createText<Theme>(NativeText);\n\nconst Text = memo(({ children, style, ...props }: PropsWithChildren<Props>) => {\n  return (\n    <BaseText\n      {...props}\n      style={[\n        {\n          includeFontPadding: false,\n          textAlignVertical: 'center',\n          fontVariant: ['tabular-nums'],\n        },\n        style,\n      ]}\n    >\n      {children}\n    </BaseText>\n  );\n});\nText.displayName = 'Text';\n\nexport default Text;\n"
  },
  {
    "path": "packages/react-native/src/theme/index.ts",
    "content": "import { createTheme } from '@shopify/restyle';\n\nimport helpers from '../helpers';\n\nconst { px } = helpers;\n\nconst basePalette = {\n  // 基础色\n  white: '#FFFFFF',\n  black: '#000000',\n  transparent: 'transparent',\n  // 功能色\n  func50: '#FBF5F5',\n  func100: '#FFF7E3',\n  func200: '#FFD21D',\n  func300: '#52C41A',\n  func400: '#1890FF',\n  func500: '#F86E21',\n  func600: '#F4333C',\n  func700: 'transparent',\n  func800: 'transparent',\n  func900: 'transparent',\n};\n\n/** 默认调色板 */\nconst palette = {\n  ...basePalette,\n  // 主色\n  primary50: '#E5F1FF',\n  primary100: '#3AA3FF',\n  primary200: '#005DFF',\n  primary300: 'rgba(0, 93, 255, 0.7)',\n  primary400: 'rgba(0, 93, 255, 0.4)',\n  primary500: 'transparent',\n  primary600: 'transparent',\n  primary700: 'transparent',\n  primary800: 'transparent',\n  primary900: 'transparent',\n\n  // 中性色\n  gray50: '#F5F5F5',\n  gray100: '#E5E5E5',\n  gray200: '#CCCCCC',\n  gray300: '#999999',\n  gray400: '#666666',\n  gray500: '#333333',\n  gray600: 'rgba(0, 0, 0, 0.4)',\n  gray700: 'rgba(0, 0, 0, 0.04)',\n  gray800: 'transparent',\n  gray900: 'transparent',\n};\n\nconst lightTheme = createTheme({\n  spacing: {\n    x0: 0,\n    x1: px(4),\n    x2: px(8),\n    x3: px(12),\n    x4: px(16),\n    x5: px(20),\n    x6: px(24),\n    x7: px(28),\n    x8: px(32),\n    x9: px(36),\n    x10: px(40),\n  },\n  borderRadii: {\n    x0: 0,\n    x1: px(4),\n    x2: px(8),\n    x3: px(12),\n    x4: px(16),\n    x5: px(20),\n    x6: px(24),\n    x7: px(28),\n    x8: px(32),\n    x9: px(36),\n    x10: px(40),\n  },\n  zIndices: {\n    '1': 1,\n    '9': 9,\n    '19': 9,\n    '29': 9,\n    '39': 9,\n    '49': 9,\n    '59': 9,\n    '69': 9,\n    '79': 9,\n    '89': 9,\n    '99': 99,\n    '199': 199,\n    '299': 299,\n    '399': 399,\n    '499': 499,\n    '599': 599,\n    '699': 699,\n    '799': 799,\n    '899': 899,\n    '999': 999,\n  },\n  breakpoints: {\n    phone: 0,\n    tablet: 768,\n    largeTablet: 1024,\n  },\n  colors: {\n    ...palette,\n    background: palette.gray50,\n    mask: palette.gray600,\n    border: palette.gray200,\n    icon: palette.gray300,\n    disabled: palette.gray300,\n    text: palette.gray500,\n    text_active: palette.white,\n    primary_text: palette.black,\n    primary_background: palette.white,\n  },\n  textVariants: {\n    defaults: {},\n    h0: {\n      fontWeight: 'bold',\n      fontSize: px(28),\n      lineHeight: px(40),\n    },\n    h1: {\n      fontWeight: 'bold',\n      fontSize: px(18),\n      lineHeight: px(26),\n    },\n    h2: {\n      fontWeight: 'bold',\n      fontSize: px(16),\n      lineHeight: px(22),\n    },\n    h3: {\n      fontWeight: 'bold',\n      fontSize: px(14),\n      lineHeight: px(20),\n    },\n    h4: {},\n    h5: {},\n    h6: {},\n    h7: {},\n    h8: {},\n    h9: {},\n    p0: {\n      fontSize: px(16),\n      lineHeight: px(22),\n    },\n    p1: {\n      fontSize: px(14),\n      lineHeight: px(20),\n    },\n    p2: {\n      fontSize: px(12),\n      lineHeight: px(16),\n    },\n    p3: {\n      fontSize: px(10),\n      lineHeight: px(14),\n    },\n    p4: {},\n    p5: {},\n    p6: {},\n    p7: {},\n    p8: {},\n    p9: {},\n    d0: {\n      fontWeight: 'bold',\n      fontSize: px(24),\n      lineHeight: px(32),\n    },\n    d1: {\n      fontWeight: 'bold',\n      fontSize: px(18),\n      lineHeight: px(26),\n    },\n    d2: {\n      fontWeight: 'bold',\n      fontSize: px(12),\n      lineHeight: px(20),\n    },\n    d3: {},\n    d4: {},\n    d5: {},\n    d6: {},\n    d7: {},\n    d8: {},\n    d9: {},\n  },\n  theme: 'light',\n});\nexport type Theme = typeof lightTheme;\nexport type Spacing = keyof Theme['spacing'];\nexport type Color = keyof Theme['colors'];\nexport type Variant = keyof Omit<Theme['textVariants'], 'defaults'>;\nexport type BorderRadius = keyof Theme['borderRadii'];\n\n/** 深色调色板 */\nconst darkPalette = {\n  ...basePalette,\n  // 主色\n  primary50: 'rgba(0, 93, 255, 0.3)',\n  primary100: '#3AA3FF',\n  primary200: '#005DFF',\n  primary300: 'rgba(0, 93, 255, 0.7)',\n  primary400: 'rgba(0, 93, 255, 0.4)',\n  primary500: 'transparent',\n  primary600: 'transparent',\n  primary700: 'transparent',\n  primary800: 'transparent',\n  primary900: 'transparent',\n\n  // 中性色\n  gray50: '#131C22',\n  gray100: 'rgba(255, 255, 255, 0.15)',\n  gray200: 'rgba(255, 255, 255, 0.25)',\n  gray300: 'rgba(255, 255, 255, 0.4)',\n  gray400: 'rgba(255, 255, 255, 0.6)',\n  gray500: 'rgba(255, 255, 255, 0.8)',\n  gray600: 'rgba(0, 0, 0, 0.4)',\n  gray700: 'rgba(0, 0, 0, 0.04)',\n  gray800: 'transparent',\n  gray900: 'transparent',\n};\n\nconst darkTheme: Theme = {\n  ...lightTheme,\n  colors: {\n    ...darkPalette,\n    background: darkPalette.gray50,\n    mask: darkPalette.gray600,\n    border: darkPalette.gray400,\n    icon: darkPalette.gray300,\n    disabled: darkPalette.gray300,\n    text: darkPalette.gray500,\n    text_active: darkPalette.white,\n    primary_text: palette.white,\n    primary_background: palette.black,\n  },\n  theme: 'dark',\n};\n\nexport default {\n  lightTheme,\n  darkTheme,\n};\n"
  },
  {
    "path": "packages/react-native/src/theme-provider/index.tsx",
    "content": "import React, { FC, PropsWithChildren } from 'react';\n\nimport { ThemeProvider as ShopifyThemeProvider } from '@shopify/restyle';\n\nimport Notify from '../notify';\nimport Portal from '../portal';\nimport theme, { Theme } from '../theme';\nimport Toast from '../toast';\n\nconst { lightTheme } = theme;\nconst ThemeProvider: FC<\n  PropsWithChildren<{\n    theme?: Theme;\n  }>\n> = ({ theme = lightTheme, children }) => {\n  return (\n    <ShopifyThemeProvider theme={theme}>\n      <Toast />\n      <Notify />\n      <Portal.Host>{children}</Portal.Host>\n    </ShopifyThemeProvider>\n  );\n};\nThemeProvider.displayName = 'ThemeProvider';\n\nexport default ThemeProvider;\n"
  },
  {
    "path": "packages/react-native/src/timeline/HorizontalTimeline.tsx",
    "content": "import React, { memo } from 'react';\nimport { LayoutChangeEvent, NativeSyntheticEvent, ScrollView, TextLayoutEventData } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useMap, useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { TimelineProps, TimelineStepProps } from './type';\n\nconst HorizontalTimeline = ({ data, customIcon, lineStyle }: Omit<TimelineProps, 'direction'>) => {\n  const [_, { set, get }] = useMap();\n\n  const handleDateLayout = (e: NativeSyntheticEvent<TextLayoutEventData>, index: number) => {\n    const textWidth = e.nativeEvent.lines[0].width;\n    set(index, Math.floor(textWidth));\n  };\n\n  const renderItem = (item: TimelineStepProps, index: number) => {\n    return (\n      <Box key={String(index)} maxWidth={120} marginRight={'x2'}>\n        <DateAndTime {...item} onLayout={e => handleDateLayout(e, index)} />\n        <CircleAndLine\n          width={get(index) || 0}\n          isLast={index === data.length - 1}\n          customIcon={customIcon}\n          lineStyle={lineStyle}\n        />\n        <TitleAndDescription {...item} />\n      </Box>\n    );\n  };\n\n  return (\n    <ScrollView style={{ flex: 1 }} horizontal showsHorizontalScrollIndicator={false}>\n      {data.map((item, index) => renderItem(item, index))}\n    </ScrollView>\n  );\n};\nHorizontalTimeline.displayName = 'HorizontalTimeline';\n\nexport default HorizontalTimeline;\n\nconst DateAndTime = memo(\n  ({\n    date,\n    time,\n    onLayout,\n  }: TimelineStepProps & { onLayout: (event: NativeSyntheticEvent<TextLayoutEventData>) => void }) => {\n    return (\n      <Box paddingLeft={'x1'}>\n        <Text variant=\"p0\" color=\"text\" numberOfLines={1} onTextLayout={onLayout}>\n          {date}\n        </Text>\n        <Text variant={'p2'} color=\"text\">\n          {time}\n        </Text>\n      </Box>\n    );\n  }\n);\n\nconst TitleAndDescription = memo(({ title, description }: TimelineStepProps) => {\n  return (\n    <Box paddingLeft={'x1'}>\n      <Text variant={'p0'} color={'text'}>\n        {title}\n      </Text>\n      <Text variant={'p2'} color={'text'}>\n        {description}\n      </Text>\n    </Box>\n  );\n});\n\nconst CircleAndLine = memo(\n  ({\n    isLast,\n    width,\n    customIcon,\n    lineStyle,\n  }: Pick<TimelineProps, 'customIcon' | 'lineStyle'> & { isLast: boolean; width: number }) => {\n    const theme = useTheme<Theme>();\n    const [iconWidth, setIconWidth] = useSafeState(theme.borderRadii.x2);\n\n    const handleLayout = (e: LayoutChangeEvent) => {\n      setIconWidth(Math.floor(e.nativeEvent.layout.width));\n    };\n\n    return (\n      <Flex left={width / 2 - iconWidth / 2} paddingVertical={'x1'} alignItems={'center'}>\n        {customIcon ? (\n          <Box backgroundColor={'white'} onLayout={handleLayout}>\n            {customIcon}\n          </Box>\n        ) : (\n          <Box\n            width={theme.borderRadii.x2}\n            height={theme.borderRadii.x2}\n            backgroundColor=\"primary200\"\n            borderRadius=\"x2\"\n          />\n        )}\n        {!isLast && <Box width={120 + theme.spacing.x2} height={1} backgroundColor={'border'} style={lineStyle} />}\n      </Flex>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/react-native/src/timeline/VerticalTimeline.tsx",
    "content": "import React, { memo, useRef } from 'react';\nimport { LayoutChangeEvent, ScrollView } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\nimport { useMap, useSafeState } from '@td-design/rn-hooks';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { TimelineProps, TimelineStepProps } from './type';\n\nconst VerticalTimeline = ({ data, customIcon, lineStyle }: Omit<TimelineProps, 'direction'>) => {\n  const titleMeasured = useRef(false);\n  const [titleHeight, setTitleHeight] = useSafeState(0);\n\n  const handleTitleLayout = (e: LayoutChangeEvent) => {\n    if (!titleMeasured.current) {\n      titleMeasured.current = true;\n      setTitleHeight(Math.floor(e.nativeEvent.layout.height));\n    }\n  };\n\n  const [_, { set, get }] = useMap();\n  const handleEventLayout = (e: LayoutChangeEvent, index: number) => {\n    set(index, Math.floor(e.nativeEvent.layout.height));\n  };\n\n  const renderItem = (item: TimelineStepProps, index: number) => {\n    return (\n      <Flex key={String(index)} alignItems=\"flex-start\">\n        <DateAndTime {...item} />\n        <CircleAndLine\n          height={get(index) || 0}\n          isLast={index === data.length - 1}\n          titleHeight={titleHeight}\n          customIcon={customIcon}\n          lineStyle={lineStyle}\n        />\n        <Event {...item} onTitleLayout={handleTitleLayout} onLayout={e => handleEventLayout(e, index)} />\n      </Flex>\n    );\n  };\n\n  return (\n    <ScrollView style={{ flex: 1 }} horizontal={false} showsVerticalScrollIndicator={false}>\n      {data.map((item, index) => renderItem(item, index))}\n    </ScrollView>\n  );\n};\nVerticalTimeline.displayName = 'VerticalTimeline';\n\nexport default VerticalTimeline;\n\nconst DateAndTime = memo(({ date, time }: TimelineStepProps) => {\n  return (\n    <Box paddingLeft={'x1'} alignItems={'flex-end'}>\n      <Text variant=\"p0\" color=\"text\" numberOfLines={1}>\n        {date}\n      </Text>\n      <Text variant={'p2'} color=\"text\">\n        {time}\n      </Text>\n    </Box>\n  );\n});\n\nconst Event = memo(\n  ({\n    title,\n    description,\n    onLayout,\n    onTitleLayout,\n  }: TimelineStepProps & {\n    onTitleLayout: (event: LayoutChangeEvent) => void;\n    onLayout: (event: LayoutChangeEvent) => void;\n  }) => {\n    return (\n      <Box onLayout={onLayout} flex={1}>\n        <Text variant=\"p0\" color=\"text\" onLayout={onTitleLayout} numberOfLines={1}>\n          {title}\n        </Text>\n        <Text variant=\"p2\" color=\"text\">\n          {description}\n        </Text>\n      </Box>\n    );\n  }\n);\n\nconst CircleAndLine = memo(\n  ({\n    height,\n    isLast,\n    titleHeight,\n    customIcon,\n    lineStyle,\n  }: { height: number; isLast: boolean; titleHeight: number } & Pick<TimelineProps, 'customIcon' | 'lineStyle'>) => {\n    const theme = useTheme<Theme>();\n    const [iconHeight, setIconHeight] = useSafeState(theme.borderRadii.x2);\n\n    const handleLayout = (e: LayoutChangeEvent) => {\n      setIconHeight(Math.floor(e.nativeEvent.layout.height));\n    };\n\n    return (\n      <Box\n        alignItems={'center'}\n        style={{\n          paddingHorizontal: theme.spacing.x2,\n          top: titleHeight / 2 - iconHeight / 2,\n        }}\n      >\n        {customIcon ? (\n          <Box backgroundColor={'white'} onLayout={handleLayout}>\n            {customIcon}\n          </Box>\n        ) : (\n          <Box\n            width={theme.borderRadii.x2}\n            height={theme.borderRadii.x2}\n            backgroundColor=\"primary200\"\n            borderRadius=\"x2\"\n          />\n        )}\n        {!isLast && <Box width={1} height={height} backgroundColor={'border'} style={lineStyle} />}\n      </Box>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/react-native/src/timeline/index.md",
    "content": "---\ntitle: Timeline - 时间轴组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 其他组件\n  path: /other\n---\n\n# Timeline 时间轴组件\n\n## 效果演示\n\n### 1. 基本的使用\n\n```tsx | pure\n  const steps = [\n    {\n      title: '第一步',\n      description: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',\n      date: '12-12',\n      time: '10:10',\n    },\n    {\n      title: '第二步',\n      description: '测试',\n      date: '12-12',\n      time: '10:11',\n    },\n    {\n      title: '第三步',\n      description: '测试',\n      date: '12-12',\n      time: '10:12',\n    },\n    {\n      title: '第四步',\n      description: '测试',\n      date: '12-12',\n      time: '10:13',\n    },\n  ];\n\n  <Text>基本:</Text>\n  <WhiteSpace />\n  <Timeline data={steps} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"基本使用\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1690955876588834535.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 横向滑动\n\n```tsx | pure\n  const steps = [\n    {\n      title: '第一步',\n      description: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',\n      date: '12-12',\n      time: '10:10',\n    },\n    {\n      title: '第二步',\n      description: '测试',\n      date: '12-12',\n      time: '10:11',\n    },\n    {\n      title: '第三步',\n      description: '测试',\n      date: '12-12',\n      time: '10:12',\n    },\n    {\n      title: '第四步',\n      description: '测试',\n      date: '12-12',\n      time: '10:13',\n    },\n  ];\n\n  <Text>横向滑动:</Text>\n  <Timeline data={steps} direction=\"horizontal\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"横向滑动\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1690955933959678499.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义小图标\n\n```tsx | pure\n  const steps = [\n    {\n      title: '第一步',\n      description: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',\n      date: '12-12',\n      time: '10:10',\n    },\n    {\n      title: '第二步',\n      description: '测试',\n      date: '12-12',\n      time: '10:11',\n    },\n    {\n      title: '第三步',\n      description: '测试',\n      date: '12-12',\n      time: '10:12',\n    },\n    {\n      title: '第四步',\n      description: '测试',\n      date: '12-12',\n      time: '10:13',\n    },\n  ];\n  <Text>自定义小图标:</Text>\n  <WhiteSpace />\n  <Timeline data={steps} customIcon={<SvgIcon name=\"bells\">} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义小图标\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1690955975758328071.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自定义线条样式\n\n```tsx | pure\n  const steps = [\n    {\n      title: '第一步',\n      description: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',\n      date: '12-12',\n      time: '10:10',\n    },\n    {\n      title: '第二步',\n      description: '测试',\n      date: '12-12',\n      time: '10:11',\n    },\n    {\n      title: '第三步',\n      description: '测试',\n      date: '12-12',\n      time: '10:12',\n    },\n    {\n      title: '第四步',\n      description: '测试',\n      date: '12-12',\n      time: '10:13',\n    },\n  ];\n  <Text>自定义线条样式:</Text>\n  <WhiteSpace />\n  <Timeline data={steps} lineStyle={{backgroundColor: 'red'}} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"自定义线条样式\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1690955996117908526.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### TimelineProps\n\n| 属性       | 必填    | 说明           | 类型                       | 默认值     |\n| ---------- | ------- | -------------- | -------------------------- | ---------- |\n| data       | `true`  | 时间轴节点数据 | `TimelineStepProps[]`      |            |\n| direction  | `false` | 时间轴排序方向 | `horizontal` \\| `vertical` | `vertical` |\n| customIcon | `false` | 自定义 icon    | `ReactElement`             |            |\n| lineStyle  | `false` | 线条样式       | `StyleProp<ViewStyle>`     |            |\n\n### TimelineStepProps\n\n| 属性        | 必填    | 说明                 | 类型     | 默认值 |\n| ----------- | ------- | -------------------- | -------- | ------ |\n| title       | `false` | 时间轴节点的标题     | `string` |        |\n| description | `false` | 时间轴节点的副标题   | `string` |        |\n| date        | `false` | 时间轴节点左边的日期 | `string` |        |\n| time        | `false` | 时间轴节点左边的时间 | `string` |        |\n"
  },
  {
    "path": "packages/react-native/src/timeline/index.tsx",
    "content": "import React from 'react';\n\nimport HorizontalTimeline from './HorizontalTimeline';\nimport { TimelineProps } from './type';\nimport VerticalTimeline from './VerticalTimeline';\n\nconst Timeline = ({ data, customIcon, direction = 'vertical', lineStyle }: TimelineProps) => {\n  if (direction === 'vertical') return <VerticalTimeline {...{ data, customIcon, lineStyle }} />;\n\n  return <HorizontalTimeline {...{ data, customIcon, lineStyle }} />;\n};\nTimeline.displayName = 'Timeline';\n\nexport default Timeline;\n"
  },
  {
    "path": "packages/react-native/src/timeline/type.ts",
    "content": "import { StyleProp, ViewStyle } from 'react-native';\n\nexport interface TimelineStepProps {\n  /** 标题 */\n  title: string;\n  /** 介绍 */\n  description?: string;\n  /** 日期 */\n  date: string;\n  /** 时间 */\n  time?: string;\n}\n\nexport interface TimelineProps {\n  /** 时间轴节点 */\n  data: TimelineStepProps[];\n  /** 时间轴方向 */\n  direction?: 'horizontal' | 'vertical';\n  /** 自定义icon */\n  customIcon?: React.ReactElement;\n  /** 线条样式 */\n  lineStyle?: StyleProp<ViewStyle>;\n}\n"
  },
  {
    "path": "packages/react-native/src/toast/ToastRoot.tsx",
    "content": "import React, { forwardRef, useImperativeHandle } from 'react';\nimport { ActivityIndicator, StyleSheet } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport useToast from './useToast';\n\nconst ToastRoot = forwardRef((_, ref) => {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const { show, hide, visible, options } = useToast();\n\n  useImperativeHandle(ref, () => ({\n    show,\n    hide,\n  }));\n\n  if (!visible || !options) return null;\n\n  let contentStyle = {};\n  switch (options.position) {\n    case 'top':\n      contentStyle = {\n        top: insets.top + helpers.px(100),\n      };\n      break;\n    case 'bottom':\n      contentStyle = {\n        bottom: insets.bottom + helpers.px(50),\n      };\n      break;\n    case 'middle':\n      contentStyle = {\n        top: helpers.deviceHeight / 2,\n      };\n      break;\n    default:\n      contentStyle = {};\n  }\n\n  const styles = StyleSheet.create({\n    content: {\n      justifyContent: 'center',\n      alignItems: 'center',\n      position: 'absolute',\n      width: helpers.deviceWidth,\n      zIndex: 49,\n    },\n  });\n\n  const Content = (\n    <Animated.View style={[styles.content, contentStyle]}>\n      <Box\n        minWidth={helpers.px(80)}\n        padding=\"x3\"\n        borderRadius=\"x1\"\n        justifyContent=\"center\"\n        alignItems=\"center\"\n        backgroundColor=\"gray500\"\n        position=\"absolute\"\n      >\n        {!!options.indicator && (\n          <Box marginBottom={'x2'}>\n            <ActivityIndicator size={helpers.px(20)} color={theme.colors.gray50} />\n          </Box>\n        )}\n        {typeof options.content === 'string' ? (\n          <Text variant=\"p1\" color=\"gray50\">\n            {options.content}\n          </Text>\n        ) : (\n          <>{options.content}</>\n        )}\n      </Box>\n    </Animated.View>\n  );\n\n  if (options.mask) {\n    return (\n      <Box style={StyleSheet.absoluteFill} pointerEvents=\"box-only\" zIndex={'59'} backgroundColor=\"mask\">\n        {Content}\n      </Box>\n    );\n  }\n  return Content;\n});\n\nexport default ToastRoot;\n"
  },
  {
    "path": "packages/react-native/src/toast/constant.ts",
    "content": "export const SHORT = 1500;\nexport const LONG = 3000;\nexport const INFINITY = Infinity;\n"
  },
  {
    "path": "packages/react-native/src/toast/index.md",
    "content": "---\ntitle: Toast - 提示组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 反馈组件\n  path: /feedback\n---\n\n# Toast 提示组件\n\n## 效果演示\n\n### 1. 显示在顶部\n\n```jsx | pure\n<Button title=\"top\" onPress={() => (keyRef.current = Toast.top({ content: '提示内容1111' }))} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643254392066258035.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 显示在中间\n\n```jsx | pure\n<Button title=\"middle\" onPress={() => (keyRef.current = Toast.middle({ content: '提示内容222222' }))} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643254458823053269.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 显示在底部\n\n```jsx | pure\n<Button title=\"bottom\" onPress={() => (keyRef.current = Toast.bottom({ content: '提示内容333333333' }))} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643254509842898005.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 显示加载中效果\n\n```jsx | pure\n<Button title=\"loading\" onPress={() => (keyRef.current = Toast.process())} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643254564477916502.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 弹窗中再弹出提示\n\n```jsx | pure\n<Button title=\"内容在底部\" onPress={() => setVisible1(true)} />\n<Modal visible={visible1} onClose={() => setVisible1(false)} position=\"bottom\">\n  <Box height={190}>\n    <Text variant=\"p0\" color=\"gray500\">\n      我是内容\n    </Text>\n    <WhiteSpace />\n    <Button title=\"submitting\" onPress={() => (keyRef.current = Toast.process('提交中...'))} />\n  </Box>\n</Modal>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643254676457406203.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 修改提示显示时长\n\n```jsx | pure\n<Button title=\"top\" onPress={() => (keyRef.current = Toast.top({ content: '提示内容1111', duration: Toast.LONG }))} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643254765688963868.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Toast.top({ duration, content}: { duration: number, content: string })\n\n### Toast.middle({ duration, content}: { duration: number, content: string })\n\n### Toast.bottom({ duration, content}: { duration: number, content: string })\n\n### Toast.process(content: string)\n\n### Toast.hide()\n\n`duration` 有三个常量值：\n\n- Toast.SHORT = 1500\n- Toast.LONG = 3000\n- Toast.INFINITY = INFINITY\n"
  },
  {
    "path": "packages/react-native/src/toast/index.tsx",
    "content": "import React, { useRef } from 'react';\n\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport { addNewRef, getRef, removeOldRef } from '../utils/ref-util';\nimport { INFINITY, LONG, SHORT } from './constant';\nimport ToastRoot from './ToastRoot';\nimport { ToastProps } from './type';\n\nexport interface ToastRef {\n  show: (params: ToastProps) => void;\n  hide: () => void;\n}\n\ntype ToastRefObj = {\n  current: ToastRef | null;\n};\n\nlet refs: ToastRefObj[] = [];\n\nexport default function Toast() {\n  const toastRef = useRef<ToastRef | null>(null);\n\n  const setRef = useMemoizedFn((ref: ToastRef | null) => {\n    if (ref) {\n      toastRef.current = ref;\n      addNewRef(refs, ref);\n    } else {\n      removeOldRef(refs, toastRef.current);\n    }\n  });\n\n  return <ToastRoot ref={setRef} />;\n}\nToast.displayName = 'Toast';\n\nToast.hide = () => {\n  getRef(refs)?.hide();\n};\n\nToast.top = ({ duration = SHORT, content }: Partial<ToastProps>) => {\n  getRef(refs)?.show({ content, duration, position: 'top' });\n};\n\nToast.middle = ({ duration = SHORT, content }: Partial<ToastProps>) => {\n  getRef(refs)?.show({ content, duration, position: 'middle' });\n};\n\nToast.bottom = ({ duration = SHORT, content }: Partial<ToastProps>) => {\n  getRef(refs)?.show({ content, duration, position: 'bottom' });\n};\n\nToast.process = (content = '加载中...') => {\n  getRef(refs)?.show({\n    content,\n    duration: INFINITY,\n    position: 'middle',\n    mask: true,\n    indicator: true,\n  });\n};\n\nToast.custom = (props: Omit<ToastProps, 'indicator'>) => {\n  getRef(refs)?.show({\n    duration: INFINITY,\n    position: 'middle',\n    mask: true,\n    ...props,\n    indicator: false,\n  });\n};\n\nToast.SHORT = SHORT;\nToast.LONG = LONG;\nToast.INFINITY = INFINITY;\n"
  },
  {
    "path": "packages/react-native/src/toast/type.ts",
    "content": "import { ReactNode } from 'react';\n\nexport interface ToastProps {\n  content: ReactNode;\n  position?: 'top' | 'middle' | 'bottom';\n  duration?: number;\n  mask?: boolean;\n  indicator?: boolean;\n}\n"
  },
  {
    "path": "packages/react-native/src/toast/useToast.ts",
    "content": "import { useEffect, useRef, useState } from 'react';\nimport { BackHandler, NativeEventSubscription } from 'react-native';\n\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport { INFINITY } from './constant';\nimport { ToastProps } from './type';\n\nexport default function useToast() {\n  const timer = useRef<ReturnType<typeof setTimeout>>();\n\n  const [visible, setVisible] = useState(false);\n  const [options, setOptions] = useState<ToastProps | undefined>(undefined);\n\n  const hide = () => {\n    if (!visible) return;\n\n    setVisible(false);\n    clearTimeout(timer.current);\n  };\n\n  /** 每次显示前，先隐藏之前的Toast */\n  const show = (params: ToastProps) => {\n    if (visible) {\n      hide();\n    }\n\n    setOptions(params);\n    setVisible(true);\n  };\n\n  useEffect(() => {\n    if (!options || options.duration === INFINITY) return;\n\n    if (visible) {\n      timer.current = setTimeout(() => {\n        setVisible(false);\n      }, options.duration);\n    } else {\n      clearTimeout(timer.current);\n    }\n\n    return () => clearTimeout(timer.current);\n  }, [visible, options]);\n\n  /** 当Toast显示的时候，不允许安卓物理返回键可用 */\n  useEffect(() => {\n    let backHandler: NativeEventSubscription | undefined;\n    if (visible) {\n      backHandler = BackHandler.addEventListener('hardwareBackPress', () => true);\n    } else {\n      backHandler?.remove();\n    }\n\n    return () => backHandler?.remove();\n  }, [visible]);\n\n  return {\n    visible,\n    options,\n\n    show: useMemoizedFn(show),\n    hide: useMemoizedFn(hide),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/tooltip/Triangle.tsx",
    "content": "import React, { memo } from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\n\nimport Box from '../box';\n\ntype Props = {\n  style?: StyleProp<ViewStyle>;\n  isDown: boolean;\n};\n\nconst Triangle = memo(({ style, isDown }: Props) => (\n  <Box style={[styles.triangle, style, isDown ? styles.down : {}]} />\n));\n\nconst styles = StyleSheet.create({\n  down: {\n    transform: [{ rotate: '180deg' }],\n  },\n  triangle: {\n    width: 0,\n    height: 0,\n    backgroundColor: 'transparent',\n    borderStyle: 'solid',\n    borderLeftWidth: 8,\n    borderRightWidth: 8,\n    borderBottomWidth: 15,\n    borderLeftColor: 'transparent',\n    borderRightColor: 'transparent',\n    borderBottomColor: 'white',\n  },\n});\n\nexport default Triangle;\n"
  },
  {
    "path": "packages/react-native/src/tooltip/getTooltipCoordinate.tsx",
    "content": "const getArea = (a: number, b: number): number => a * b;\n\nconst getPointDistance = (a: number[], b: number[]): number =>\n  Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));\n\n/*\n  ~Tooltip coordinate system:~\n  The tooltip coordinates are based on the element which it is wrapping.\n  We take the x and y coordinates of the element and find the best position\n  to place the tooltip. To find the best position we look for the side with the\n  most space. In order to find the side with the most space we divide the the\n  surroundings in four quadrants and check for the one with biggest area.\n  Once we know the quandrant with the biggest area it place the tooltip in that\n  direction.\n  To find the areas we first get 5 coordinate points. The center and the other 4 extreme points\n  which together make a perfect cross shape.\n  Once we know the coordincates we can get the length of the vertices which form each quadrant.\n  Since they are squares we only need two.\n*/\nconst getTooltipCoordinate = (\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  ScreenWidth: number,\n  ScreenHeight: number,\n  tooltipWidth: number,\n  withPointer: boolean\n) => {\n  // The following are point coordinates: [x, y]\n  const center = [x + width / 2, y + height / 2];\n  const pOne = [center[0], 0];\n  const pTwo = [ScreenWidth, center[1]];\n  const pThree = [center[0], ScreenHeight];\n  const pFour = [0, center[1]];\n\n  // vertices\n  const vOne = getPointDistance(center, pOne);\n  const vTwo = getPointDistance(center, pTwo);\n  const vThree = getPointDistance(center, pThree);\n  const vFour = getPointDistance(center, pFour);\n\n  // Quadrant areas.\n  type Areas = {\n    area: number;\n    id: number;\n  };\n\n  const areas: Areas[] = [getArea(vOne, vFour), getArea(vOne, vTwo), getArea(vTwo, vThree), getArea(vThree, vFour)].map(\n    (each, index) => ({ area: each, id: index })\n  );\n\n  const sortedArea = areas.sort((a, b) => b.area - a.area);\n\n  // deslocated points\n  const dX = 0.001;\n  const dY = height / 2;\n\n  // Deslocate the coordinates in the direction of the quadrant.\n  const directionCorrection = [\n    [-1, -1],\n    [1, -1],\n    [1, 1],\n    [-1, 1],\n  ];\n  const deslocateReferencePoint = [\n    [-tooltipWidth, 0],\n    [0, 0],\n    [0, 0],\n    [-tooltipWidth, 0],\n  ];\n\n  // current quadrant index\n  const qIndex = sortedArea[0].id;\n\n  const getWithPointerOffsetY = () => (withPointer ? 10 * directionCorrection[qIndex][1] : 0);\n  const getWithPointerOffsetX = () => (withPointer ? center[0] - 18 * directionCorrection[qIndex][0] : center[0]);\n\n  const newX = getWithPointerOffsetX() + (dX * directionCorrection[qIndex][0] + deslocateReferencePoint[qIndex][0]);\n\n  return {\n    x: constraintX(newX, qIndex, ScreenWidth, tooltipWidth),\n    y: center[1] + (dY * directionCorrection[qIndex][1] + deslocateReferencePoint[qIndex][1]) + getWithPointerOffsetY(),\n  };\n};\n\nconst constraintX = (newX: number, qIndex: number, ScreenWidth: number, tooltipWidth: number): number => {\n  switch (qIndex) {\n    // 0 and 3 are the left side quadrants.\n    case 0:\n    case 3: {\n      const maxWidth = newX > ScreenWidth ? ScreenWidth - 10 : newX;\n      return newX < 1 ? 10 : maxWidth;\n    }\n    // 1 and 2 are the right side quadrants\n    case 1:\n    case 2: {\n      const leftOverSpace = ScreenWidth - newX;\n      return leftOverSpace >= tooltipWidth ? newX : newX - (tooltipWidth - leftOverSpace + 10);\n    }\n    default: {\n      return 0;\n    }\n  }\n};\n\nexport default getTooltipCoordinate;\n"
  },
  {
    "path": "packages/react-native/src/tooltip/index.md",
    "content": "---\ntitle: Tooltip - 文字提示\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 交互组件\n  path: /interaction\n---\n\n# Tooltip 文字提示\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Tooltip content=\"InfoInfoInfo\">\n  <Text variant=\"p0\" color=\"primary200\">\n    press me\n  </Text>\n</Tooltip>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643255311776720439.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 修改背景色\n\n```tsx | pure\n<Tooltip content=\"InfoInfoInfo\" backgroundColor=\"red\">\n  <Text variant=\"p0\" color=\"primary200\">\n    press me\n  </Text>\n</Tooltip>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643255473060587128.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性            | 必填    | 说明                    | 类型                       | 默认值                      |\n| --------------- | ------- | ----------------------- | -------------------------- | --------------------------- |\n| content         | `true`  | 提示文字                | `ReactNode`                |                             |\n| width           | `false` | tooltip 宽度            | `number`                   | `40`                        |\n| height          | `false` | tooltip 高度            | `number`                   | `150`                       |\n| backgroundColor | `false` | tooltip 背景色          | `string`                   | `#617080`                   |\n| containerStyle  | `false` | tooltip 容器样式        | `StyleProp<ViewStyle>`     |                             |\n| withOverlay     | `false` | 是否显示遮罩层          | `boolean`                  | `true`                      |\n| withCaret       | `false` | 是否显示小三角          | `boolean`                  | `true`                      |\n| overlayColor    | `false` | 遮罩层颜色              | `string`                   | `rgba(250, 250, 250, 0.70)` |\n| actionType      | `false` | 触发 tooltip 的点击方式 | `onPress` \\| `onLongPress` | `onPress`                   |\n| onClose         | `false` | tooltip 关闭时触发事件  | `() => void`               |                             |\n"
  },
  {
    "path": "packages/react-native/src/tooltip/index.tsx",
    "content": "import React, { FC, memo, PropsWithChildren, ReactNode, Reducer, useMemo, useReducer, useRef } from 'react';\nimport { Dimensions, LayoutChangeEvent, Modal, Pressable, StyleProp, View, ViewStyle } from 'react-native';\n\nimport Box from '../box';\nimport helpers from '../helpers';\nimport Text from '../text';\nimport getTooltipCoordinate from './getTooltipCoordinate';\nimport Triangle from './Triangle';\n\nconst { width: ScreenWidth, height: ScreenHeight } = Dimensions.get('window');\nconst { px } = helpers;\n\nexport interface TooltipProps {\n  withCaret?: boolean;\n  content: ReactNode;\n  height?: number;\n  width?: number;\n  containerStyle?: StyleProp<ViewStyle>;\n  onClose?: () => void;\n  withOverlay?: boolean;\n  overlayColor?: string;\n  backgroundColor?: string;\n  actionType?: 'onPress' | 'onLongPress';\n}\n\ntype State = {\n  visible: boolean;\n  elementWidth: number;\n  elementHeight: number;\n  offsetX: number;\n  offsetY: number;\n};\n\ntype Action =\n  | {\n      type: 'toggle';\n    }\n  | {\n      type: 'computePosition';\n      payload: Omit<State, 'visible'>;\n    };\n\nconst reducer: Reducer<State, Action> = (prevState, action) => {\n  switch (action.type) {\n    case 'toggle':\n      return { ...prevState, visible: !prevState.visible };\n    case 'computePosition':\n      return { ...prevState, ...action.payload };\n  }\n};\n\nconst Tooltip: FC<PropsWithChildren<TooltipProps>> = props => {\n  const {\n    content,\n    withOverlay = true,\n    withCaret = true,\n    actionType = 'onPress',\n    height = px(40),\n    width = px(150),\n    backgroundColor = '#617080',\n    overlayColor = 'rgba(250, 250, 250, 0.70)',\n    children,\n    containerStyle,\n    onClose,\n  } = props;\n\n  const [{ visible, elementWidth, elementHeight, offsetX, offsetY }, dispatch] = useReducer(reducer, {\n    visible: false,\n    elementWidth: 0,\n    elementHeight: 0,\n    offsetX: 0,\n    offsetY: 0,\n  });\n\n  const boxRef = useRef<View>(null);\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    dispatch({\n      type: 'computePosition',\n      payload: {\n        elementWidth: e.nativeEvent.layout.width,\n        elementHeight: e.nativeEvent.layout.height,\n        offsetX: e.nativeEvent.layout.x,\n        offsetY: e.nativeEvent.layout.y,\n      },\n    });\n  };\n\n  const toggleTooltip = () => {\n    if (boxRef.current) {\n      boxRef.current.measureInWindow((pageOffsetX, pageOffsetY, width, height) => {\n        dispatch({\n          type: 'computePosition',\n          payload: {\n            offsetX: pageOffsetX,\n            offsetY: pageOffsetY,\n            elementWidth: width,\n            elementHeight: height,\n          },\n        });\n      });\n    }\n\n    if (visible) {\n      onClose?.();\n    }\n\n    dispatch({ type: 'toggle' });\n  };\n\n  const Content = useMemo(() => {\n    const { x, y } = getTooltipCoordinate(\n      offsetX,\n      offsetY,\n      elementWidth,\n      elementHeight,\n      ScreenWidth,\n      ScreenHeight,\n      width,\n      withCaret\n    );\n\n    const tooltipStyle: StyleProp<ViewStyle> = {\n      position: 'absolute',\n      left: x,\n      width,\n      height,\n      backgroundColor,\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      borderRadius: px(4),\n    };\n\n    const pastCenterLine = offsetX > x;\n    const pastMiddleLine = offsetY > y;\n\n    if (pastMiddleLine) {\n      tooltipStyle.top = y - height;\n    } else {\n      tooltipStyle.top = y;\n    }\n\n    return (\n      <>\n        <Box\n          style={{\n            position: 'absolute',\n            left: offsetX,\n            top: offsetY,\n            overflow: 'visible',\n            width: elementWidth,\n            height: elementHeight,\n          }}\n        >\n          {children}\n        </Box>\n        <Pointer\n          {...{\n            withCaret,\n            pastCenterLine,\n            pastMiddleLine,\n            offsetY,\n            offsetX,\n            elementHeight,\n            elementWidth,\n            backgroundColor,\n          }}\n        />\n        <Box style={[tooltipStyle, containerStyle]}>\n          {typeof content === 'string' ? (\n            <Text variant={'p1'} color=\"text_active\">\n              {content}\n            </Text>\n          ) : (\n            content\n          )}\n        </Box>\n      </>\n    );\n  }, [offsetX, offsetY, elementWidth, elementHeight, ScreenWidth, ScreenHeight, width, withCaret, backgroundColor]);\n\n  const pressableProps = {\n    [actionType]: toggleTooltip,\n  };\n\n  return (\n    <>\n      <Pressable {...pressableProps}>\n        <Box alignSelf={'flex-start'} ref={boxRef} onLayout={handleLayout}>\n          {children}\n        </Box>\n      </Pressable>\n      <Modal animationType=\"fade\" visible={visible} transparent onDismiss={onClose}>\n        <Pressable\n          style={{\n            backgroundColor: withOverlay ? overlayColor : 'transparent',\n            flex: 1,\n          }}\n          onPress={toggleTooltip}\n        >\n          {Content}\n        </Pressable>\n      </Modal>\n    </>\n  );\n};\n\nexport default Tooltip;\n\nconst Pointer = memo(\n  ({\n    withCaret,\n    pastCenterLine,\n    pastMiddleLine,\n    offsetY,\n    offsetX,\n    elementHeight,\n    elementWidth,\n    backgroundColor,\n  }: {\n    withCaret: boolean;\n    pastMiddleLine: boolean;\n    pastCenterLine: boolean;\n    offsetY: number;\n    offsetX: number;\n    elementHeight: number;\n    elementWidth: number;\n    backgroundColor: string;\n  }) => {\n    if (!withCaret) return null;\n\n    return (\n      <Box\n        style={{\n          position: 'absolute',\n          top: pastMiddleLine ? offsetY - 13 : offsetY + elementHeight,\n          left: pastCenterLine ? offsetX + elementWidth / 2 - 20 : offsetX + elementWidth / 2,\n        }}\n      >\n        <Triangle\n          style={{\n            borderBottomColor: backgroundColor,\n          }}\n          isDown={pastMiddleLine}\n        />\n      </Box>\n    );\n  }\n);\n"
  },
  {
    "path": "packages/react-native/src/tree/Checkbox.tsx",
    "content": "import React, { memo } from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport { Theme } from '../theme';\n\nconst Checkbox = memo(({ disabled, checked }: { disabled?: boolean; checked: 'all' | 'half' | 'none' }) => {\n  const theme = useTheme<Theme>();\n\n  if (checked === 'all') {\n    return (\n      <SvgXml\n        color={disabled ? theme.colors.disabled : theme.colors.primary200}\n        xml={`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm7.003 13l7.07-7.071l-1.413-1.414l-5.657 5.657l-2.829-2.829l-1.414 1.414L11.003 16Z\"/></svg>`}\n      />\n    );\n  } else if (checked === 'half') {\n    return (\n      <SvgXml\n        color={disabled ? theme.colors.disabled : theme.colors.primary200}\n        xml={`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm3 8v2h10v-2H7Z\"/></svg>`}\n      />\n    );\n  }\n  return (\n    <SvgXml\n      color={disabled ? theme.colors.disabled : theme.colors.gray500}\n      xml={`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm1 2v14h14V5H5Z\"/></svg>`}\n    />\n  );\n});\n\nexport default Checkbox;\n"
  },
  {
    "path": "packages/react-native/src/tree/Chevron.tsx",
    "content": "import React, { FC, memo } from 'react';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport SvgIcon from '../svg-icon';\nimport { Theme } from '../theme';\nimport { mix } from '../utils/redash';\n\nconst Chevron: FC<{ progress: Animated.SharedValue<number> }> = ({ progress }) => {\n  const theme = useTheme<Theme>();\n  const style = useAnimatedStyle(() => ({\n    transform: [{ rotateZ: `${mix(progress.value, 0, Math.PI / 2)}rad` }],\n  }));\n\n  return (\n    <Animated.View style={style}>\n      <SvgIcon name=\"right\" color={theme.colors.gray500} />\n    </Animated.View>\n  );\n};\n\nexport default memo(Chevron);\n"
  },
  {
    "path": "packages/react-native/src/tree/TreeGroup.tsx",
    "content": "import { memo, PropsWithChildren } from 'react';\nimport React from 'react';\nimport Animated from 'react-native-reanimated';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport Checkbox from './Checkbox';\nimport Chevron from './Chevron';\nimport { TreeItemProps, TreeProps } from './type';\nimport useGroup from './useGroup';\nimport { useTree } from './useTree';\n\nfunction TreeGroup({\n  id,\n  text,\n  disabled,\n  style,\n  textStyle,\n  onPress,\n  customCheckIcon,\n  customExpandIcon,\n  checkable,\n  level,\n  activeOpacity,\n  nodeStyle,\n  currentKeys,\n  openedKeys,\n  handleCheck,\n  handleExpand,\n  flatData,\n  children,\n}: PropsWithChildren<\n  Pick<TreeProps, 'customExpandIcon' | 'checkable' | 'activeOpacity' | 'nodeStyle'> &\n    Omit<TreeItemProps, 'items'> &\n    ReturnType<typeof useTree> & { level: number }\n>) {\n  const theme = useTheme<Theme>();\n  const { bodyStyle, progress, checkStatus, handleLayout, handlePress } = useGroup({\n    id,\n    openedKeys,\n    currentKeys,\n    flatData,\n    handleExpand,\n  });\n\n  return (\n    <Box style={[{ marginLeft: level * theme.spacing.x2 }]}>\n      <Flex alignItems={'center'} style={[nodeStyle, style]}>\n        <Pressable activeOpacity={activeOpacity} onPress={handlePress}>\n          <Box marginRight={'x1'} width={20} height={20} justifyContent={'center'} alignItems={'center'}>\n            {customExpandIcon ? customExpandIcon(progress) : <Chevron {...{ progress }} />}\n          </Box>\n        </Pressable>\n        {checkable && (\n          <Pressable\n            activeOpacity={activeOpacity}\n            onPress={() => handleCheck(id)}\n            disabled={disabled}\n            style={{ marginRight: theme.spacing.x1 }}\n          >\n            {customCheckIcon ? customCheckIcon(checkStatus) : <Checkbox disabled={disabled} checked={checkStatus} />}\n          </Pressable>\n        )}\n        <Pressable activeOpacity={activeOpacity} onPress={() => onPress?.(id)} disabled={disabled}>\n          <Text variant={'p0'} color={disabled ? 'disabled' : 'text'} style={textStyle}>\n            {text}\n          </Text>\n        </Pressable>\n      </Flex>\n      <Animated.View style={[{ position: 'relative', overflow: 'hidden' }, bodyStyle]}>\n        <Box position={'absolute'} width=\"100%\" collapsable={false} onLayout={handleLayout}>\n          {children}\n        </Box>\n      </Animated.View>\n    </Box>\n  );\n}\n\nexport default memo(TreeGroup);\n"
  },
  {
    "path": "packages/react-native/src/tree/TreeNode.tsx",
    "content": "import React, { memo } from 'react';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Flex from '../flex';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport Checkbox from './Checkbox';\nimport { TreeItemProps, TreeProps } from './type';\nimport { useTree } from './useTree';\n\nconst TreeNode = ({\n  id,\n  text,\n  disabled,\n  onPress,\n  style,\n  textStyle,\n  customCheckIcon,\n  level,\n  activeOpacity,\n  nodeStyle,\n  checkable,\n  handleCheck,\n  currentKeys,\n}: TreeItemProps &\n  Pick<TreeProps, 'checkable' | 'activeOpacity' | 'nodeStyle'> &\n  Pick<ReturnType<typeof useTree>, 'currentKeys' | 'handleCheck'> & { level: number }) => {\n  const theme = useTheme<Theme>();\n\n  const checked = currentKeys.includes(id);\n  const checkedStatus = checked ? 'all' : 'none';\n\n  return (\n    <Flex\n      style={[\n        {\n          marginLeft: level * theme.spacing.x2,\n        },\n        nodeStyle,\n        style,\n      ]}\n    >\n      {checkable && (\n        <Pressable\n          activeOpacity={activeOpacity}\n          disabled={disabled}\n          onPress={() => handleCheck(id)}\n          style={{ marginRight: theme.spacing.x1 }}\n        >\n          {customCheckIcon ? customCheckIcon(checkedStatus) : <Checkbox disabled={disabled} checked={checkedStatus} />}\n        </Pressable>\n      )}\n      <Pressable activeOpacity={activeOpacity} onPress={() => onPress?.(id)} disabled={disabled}>\n        <Text variant=\"p0\" color={disabled ? 'disabled' : checked ? 'primary200' : 'text'} style={textStyle}>\n          {text}\n        </Text>\n      </Pressable>\n    </Flex>\n  );\n};\nTreeNode.displayName = 'TreeNode';\n\nexport default memo(TreeNode);\n"
  },
  {
    "path": "packages/react-native/src/tree/index.md",
    "content": "---\ntitle: Tree - 树形展示\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 展示组件\n  path: /display\n---\n\n# Tree 树形展示\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117292364540973.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 默认展开全部\n\n```tsx | pure\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} expandAll />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117349496037901.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 不允许选择\n\n```tsx | pure\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} checkable={false} />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117352200938761.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 默认展开某些节点\n\n```tsx | pure\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} defaultExpandedKeys={['0-0-0']} />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117354815634217.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 默认勾选一些节点\n\n```tsx | pure\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} defaultCheckedKeys={['0-0-0-1']} />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117357704530374.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 禁用某些节点\n\n```tsx | pure\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n            disabled: true,\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        disabled: true,\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} expandAll />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117360435326271.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 7. 自定义展开图标\n\n```tsx | pure\nconst CustomExpandIcon: FC<{ progress: Animated.SharedValue<number> }> = ({ progress }) => {\n  const theme = useTheme<Theme>();\n  const style = useAnimatedStyle(() => ({\n    transform: [{ rotateZ: `${mix(progress.value, 0, Math.PI / 2)}rad` }],\n  }));\n\n  return (\n    <Animated.View style={style}>\n      <SvgIcon name=\"bells\" color={theme.colors.gray500} />\n    </Animated.View>\n  );\n};\n\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} customExpandIcon={progress => <CustomExpandIcon {...{ progress }} />} />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117363395426531.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 8. 自定义节点样式\n\n```tsx | pure\nconst treeData = [\n  {\n    text: 'parent 1',\n    id: '0-0',\n    items: [\n      {\n        text: 'parent 1-0',\n        id: '0-0-0',\n        items: [\n          {\n            text: 'leaf1',\n            id: '0-0-0-0',\n            style: { backgroundColor: 'red' },\n            textStyle: { color: 'white' },\n          },\n          {\n            text: 'leaf2',\n            id: '0-0-0-1',\n          },\n        ],\n      },\n      {\n        text: 'parent 1-1',\n        id: '0-0-1',\n        items: [{ text: 'sss', id: '0-0-1-0' }],\n      },\n    ],\n  },\n];\n\n<Tree treeData={treeData} nodeStyle={{ backgroundColor: 'blue' }} />;\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1691117366402405161.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### TreeProps\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| data | `true` | 树的节点数据 | `TreeItemProps[]` |  |\n| checkable | `false` | 是否可以选择的 | `boolean` | `true` |\n| checkedKeys | `false` | 选中的节点(受控的) | `string[]` |  |\n| defaultCheckedKeys | `false` | 默认选中的 key 第一次加载有效 | `string[]` |  |\n| expandAll | `false` | 全部展开 | `boolean` | `false` |\n| defaultExpandedKeys | `false` | 默认展开的节点 | `string[]` |  |\n| expandedKeys | `false` | 展开的节点 | `string[]` |  |\n| onCheck | `false` | 选中事件回调 | `(keys: string[]) => void` |  |\n| onExpand | `false` | 展开事件回调 | `(keys: string[]) => void` |  |\n| customExpandIcon | `false` | 自定义展开图标 | `(progress: Animated.SharedValue<number>) => ReactElement` |  |\n| activeOpacity | `false` | 树节点点击时的不透明度 | `number` | `0.6` |\n| style | `false` | 树样式 | `StyleProp<ViewStyle>` |  |\n| nodeStyle | `false` | 树节点样式 | `StyleProp<ViewStyle>` |  |\n\n### TreeItemProps\n\n| 属性            | 必填     | 说明             | 类型                                                   | 默认值  |\n| --------------- | -------- | ---------------- | ------------------------------------------------------ | ------- |\n| id              | `true`   | 节点唯一标识     | `number`                                               |         |\n| text            | `true`   | 节点文字         | `string`                                               |         |\n| items           | `false`  | 子节点           | `TreeItemProps[]`                                      |         |\n| disabled        | `false ` | 是否禁用         | `number`                                               | `false` |\n| onPress         | `false ` | 点击树节点的回调 | `(id: string) => void`                                 |         |\n| customCheckIcon | `false ` | 自定义选中图标   | `(checked: 'all' \\| 'half' \\| 'none') => ReactElement` |         |\n| style           | `false ` | 节点样式         | `StyleProp<ViewStyle>`                                 |         |\n| textStyle       | `false ` | 节点文字样式     | `StyleProp<TextStyle>`                                 |         |\n"
  },
  {
    "path": "packages/react-native/src/tree/index.tsx",
    "content": "import React, { FC } from 'react';\nimport { ScrollView } from 'react-native';\n\nimport TreeGroup from './TreeGroup';\nimport TreeNode from './TreeNode';\nimport { TreeItemProps, TreeProps } from './type';\nimport { useTree } from './useTree';\n\nconst Tree: FC<TreeProps> = ({\n  data,\n  style,\n  nodeStyle,\n  checkable = true,\n  activeOpacity = 0.6,\n  checkedKeys,\n  defaultCheckedKeys,\n  onCheck,\n  defaultExpandedKeys,\n  expandedKeys,\n  expandAll,\n  onExpand,\n  customExpandIcon,\n}) => {\n  const { currentKeys, openedKeys, flatData, handleCheck, handleExpand } = useTree({\n    data,\n    checkable,\n    checkedKeys,\n    defaultCheckedKeys,\n    onCheck,\n    defaultExpandedKeys,\n    expandedKeys,\n    expandAll,\n    onExpand,\n  });\n\n  const renderItem = (item: TreeItemProps, level: number) => {\n    if (item.items && Array.isArray(item.items) && item.items.length > 0) {\n      return (\n        <TreeGroup\n          key={item.id}\n          {...item}\n          {...{\n            level,\n            checkable,\n            currentKeys,\n            openedKeys,\n            handleCheck,\n            handleExpand,\n            customExpandIcon,\n            flatData,\n            activeOpacity,\n            nodeStyle,\n          }}\n        >\n          {item.items.map(item => renderItem(item, level + 1))}\n        </TreeGroup>\n      );\n    }\n    return (\n      <TreeNode\n        key={item.id}\n        {...item}\n        {...{\n          level,\n          checkable,\n          currentKeys,\n          handleCheck,\n          activeOpacity,\n          nodeStyle,\n        }}\n      />\n    );\n  };\n\n  return (\n    <ScrollView bounces={false} horizontal={false} showsVerticalScrollIndicator={false} style={style}>\n      {data.map(item => renderItem(item, 1))}\n    </ScrollView>\n  );\n};\nTree.displayName = 'Tree';\n\nexport default Tree;\n"
  },
  {
    "path": "packages/react-native/src/tree/type.ts",
    "content": "import { ReactElement } from 'react';\nimport { StyleProp, TextStyle, ViewStyle } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\nexport interface TreeItemProps {\n  /** 节点唯一标识 */\n  id: string;\n  /** 节点文字 */\n  text: string;\n  /** 子节点 */\n  items?: TreeItemProps[];\n  /** 是否禁用树节点 */\n  disabled?: boolean;\n  /** 点击树节点的回调 */\n  onPress?: (id: string) => void;\n  /** 自定义选中图标 */\n  customCheckIcon?: (checked: 'all' | 'half' | 'none') => ReactElement;\n  /** 节点样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 节点文字样式 */\n  textStyle?: StyleProp<TextStyle>;\n}\n\nexport type FlattenTreeItem = TreeItemProps & { parentId?: string };\n\nexport interface TreeProps {\n  /** 树的节点数据 */\n  data: TreeItemProps[];\n  /** 自定义展开图标 */\n  customExpandIcon?: (progress: Animated.SharedValue<number>) => ReactElement;\n  /** 是否可以选择的 */\n  checkable?: boolean;\n  /** 默认选中的节点 */\n  defaultCheckedKeys?: string[];\n  /** 选中的节点 */\n  checkedKeys?: string[];\n  /** 选中节点变化时的回调 */\n  onCheck?: (checkedKeys: string[]) => void;\n  /** 默认全部展开 */\n  expandAll?: boolean;\n  /** 默认展开的节点 */\n  defaultExpandedKeys?: string[];\n  /** 展开的节点 */\n  expandedKeys?: string[];\n  /** 展开节点变化时的回调 */\n  onExpand?: (expandedKeys: string[]) => void;\n  /** 树节点点击时的不透明度 */\n  activeOpacity?: number;\n  /** 树样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 树节点统一样式 */\n  nodeStyle?: StyleProp<ViewStyle>;\n}\n"
  },
  {
    "path": "packages/react-native/src/tree/useGroup.ts",
    "content": "import { useEffect, useMemo } from 'react';\nimport { LayoutChangeEvent } from 'react-native';\nimport { interpolate, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { TreeItemProps } from './type';\nimport { useTree } from './useTree';\nimport { findAllChildrenIds } from './util';\n\nexport default function useGroup({\n  id,\n  openedKeys,\n  currentKeys,\n  flatData,\n  handleExpand,\n}: Omit<ReturnType<typeof useTree>, 'handleCheck'> & Pick<TreeItemProps, 'id'>) {\n  const progress = useSharedValue(0);\n  const [bodySectionHeight, setBodySectionHeight] = useSafeState(0);\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    setBodySectionHeight(Math.floor(e.nativeEvent.layout.height));\n  };\n\n  const bodyStyle = useAnimatedStyle(() => {\n    return {\n      height: interpolate(progress.value, [0, 1], [0, bodySectionHeight]),\n    };\n  });\n\n  /** 默认展开菜单 */\n  useEffect(() => {\n    if (openedKeys.length === 0) return;\n\n    progress.value = withTiming(!openedKeys.includes(id) ? 0 : 1);\n  }, [openedKeys]);\n\n  const handlePress = () => {\n    handleExpand(id);\n    progress.value = withTiming(progress.value === 0 ? 1 : 0);\n  };\n\n  /**\n   * 根据id和currentKeys计算是否选中，有三种情况：\n   * 1. 自己的所有下级节点都已经选中，这时候自己的选中状态是 `all`;\n   * 2. 自己的所有下级节点有部分选中，这时候自己的选中状态是 `half`;\n   * 3. 自己的所有下级节点都没有选中，这时候自己的选中状态是 `none`;\n   */\n  const checkStatus = useMemo(() => {\n    console.log(currentKeys);\n    const item = flatData.find(item => item.id === id);\n    if (!item) return 'none';\n\n    if (currentKeys.includes(id)) return 'all';\n\n    if (item.disabled) return 'none';\n\n    // 遍历找到这个id所有的下级节点\n    const childrenIds = findAllChildrenIds(id, flatData);\n    if (childrenIds.length === 0) return 'none';\n\n    const isAllChecked = childrenIds.every(item => currentKeys.includes(item));\n    const isHalfChecked = childrenIds.some(item => currentKeys.includes(item));\n\n    if (isAllChecked) {\n      return 'all';\n    } else if (isHalfChecked) {\n      return 'half';\n    } else {\n      return 'none';\n    }\n  }, [currentKeys]) as 'all' | 'half' | 'none';\n\n  return {\n    bodyStyle,\n    progress,\n    checkStatus,\n\n    handleLayout,\n    handlePress: useMemoizedFn(handlePress),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/tree/useTree.ts",
    "content": "import { useEffect, useMemo } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { TreeProps } from './type';\nimport { findAllChildrenIds, findAllParentIds, flattenData, loopAllParents } from './util';\n\nexport function useTree({\n  data,\n  checkable,\n  checkedKeys,\n  defaultCheckedKeys,\n  onCheck,\n  defaultExpandedKeys,\n  expandedKeys,\n  expandAll,\n  onExpand,\n}: Omit<TreeProps, 'disabled' | 'showIcon' | 'style' | 'customExpandIcon'>) {\n  // 当前选中的节点\n  const [currentKeys, setCurrentKeys] = useSafeState<string[]>([]);\n  // 当前展开的节点\n  const [openedKeys, setOpenedKeys] = useSafeState<string[]>([]);\n\n  /** 将data打平 */\n  const flatData = useMemo(() => flattenData(data), [data]);\n\n  /** 根据checkable、checkedKeys、defaultCheckedKeys， 设置当前选中的节点 */\n  useEffect(() => {\n    if (checkable) {\n      if (checkedKeys && checkedKeys.length > 0) {\n        setCurrentKeys(checkedKeys);\n      } else if (defaultCheckedKeys && defaultCheckedKeys.length > 0) {\n        setCurrentKeys(defaultCheckedKeys);\n      }\n    }\n  }, [checkable, checkedKeys, defaultCheckedKeys]);\n\n  /** 根据expandAll、expandedKeys、defaultExpandedKeys， 设置当前展开的节点 */\n  useEffect(() => {\n    if (expandAll) {\n      setOpenedKeys(flatData.filter(item => Boolean(item.parentId)).map(item => item.parentId!));\n    } else if (expandedKeys && expandedKeys.length > 0) {\n      // 遍历expandedKeys，找到每个节点的所有上级节点\n      const expandedKeysWithParents = expandedKeys.reduce((arr, item) => {\n        arr = arr.concat(findAllParentIds(item, flatData));\n        return arr;\n      }, [] as string[]);\n\n      setOpenedKeys(expandedKeysWithParents);\n    } else if (defaultExpandedKeys && defaultExpandedKeys.length > 0) {\n      // 遍历defaultExpandedKeys， 找到每个节点的所有上级节点\n      const defaultExpandedKeysWithParents = defaultExpandedKeys.reduce((arr, item) => {\n        arr = arr.concat(findAllParentIds(item, flatData));\n        return arr;\n      }, [] as string[]);\n\n      setOpenedKeys(defaultExpandedKeysWithParents);\n    }\n  }, [flattenData, expandAll, expandedKeys, defaultExpandedKeys]);\n\n  /** 选中一个节点时的回调事件 */\n  const handleCheck = (key: string) => {\n    if (!checkable) return;\n\n    const index = currentKeys.indexOf(key); // 获取当前节点在已选中节点数组中的索引\n    let newKeys: string[] = [];\n    if (index > -1) {\n      newKeys = currentKeys.filter(item => item !== key);\n    } else {\n      newKeys = [...currentKeys, key];\n    }\n\n    // 找到这个节点的所有下级节点\n    const childrenIds = findAllChildrenIds(key, flatData);\n    if (childrenIds.length > 0) {\n      if (index > -1) {\n        // 如果当前节点已经选中，那么这个节点的所有下级节点都应该取消选中\n        newKeys = newKeys.filter(item => !childrenIds.includes(item));\n      } else {\n        // 如果当前节点没有选中，那么这个节点的所有下级节点都应该选中\n        newKeys = Array.from(new Set([...newKeys, ...childrenIds]));\n      }\n    }\n\n    // 遍历这个节点的所有上级节点，看是否要选中它们\n    loopAllParents(key, flatData, newKeys);\n\n    // 对newKeys去重\n    newKeys = Array.from(new Set(newKeys));\n\n    setCurrentKeys(newKeys);\n    onCheck?.(newKeys);\n  };\n\n  /** 展开一个节点时的回调事件 */\n  const handleExpand = (key: string) => {\n    const index = openedKeys.indexOf(key);\n    let newKeys: string[] = [];\n    if (index > -1) {\n      newKeys = openedKeys.filter(item => item !== key);\n    } else {\n      newKeys = [...openedKeys, key];\n    }\n    setOpenedKeys(newKeys);\n    onExpand?.(newKeys);\n  };\n\n  return {\n    currentKeys,\n    openedKeys,\n    flatData,\n\n    handleCheck: useMemoizedFn(handleCheck),\n    handleExpand: useMemoizedFn(handleExpand),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/tree/util.ts",
    "content": "import { FlattenTreeItem, TreeItemProps } from './type';\n\n/**\n * 遍历当前节点的所有下级节点\n * @param id 当前节点的id\n * @param data 打平后的数据\n * @returns 当前节点的所有下级节点的id数组\n */\nexport const findAllChildrenIds = (id: string, data: FlattenTreeItem[]) => {\n  const childrenIds: string[] = [];\n  const find = (id: string) => {\n    const item = data.find(item => item.id === id);\n    if (item) {\n      childrenIds.push(item.id);\n      if (item.items) {\n        item.items.forEach(item => {\n          find(item.id);\n        });\n      }\n    }\n  };\n  find(id);\n\n  // 从childrenIds删除被禁用的节点\n  const disabledIds = data.filter(item => item.disabled).map(item => item.id);\n  disabledIds.forEach(id => {\n    const index = childrenIds.indexOf(id);\n    if (index > -1) {\n      childrenIds.splice(index, 1);\n    }\n  });\n\n  return childrenIds;\n};\n\n/**\n * 遍历当前节点的所有上级节点\n * @param id 当前节点的id\n * @param data 打平后的数据\n * @returns 当前节点的所有上级节点的id数组\n */\nexport const findAllParentIds = (id: string, data: FlattenTreeItem[]) => {\n  const parentIds: string[] = [];\n  const find = (id: string) => {\n    const item = data.find(item => item.id === id);\n    if (item) {\n      parentIds.push(item.id);\n      if (item.parentId) {\n        find(item.parentId);\n      }\n    }\n  };\n  find(id);\n  return parentIds;\n};\n\n/**\n * 找到一个节点的所有兄弟节点(包含自己在内)\n * @param id 当前节点的id\n * @param data 打平后的数据\n * @returns 当前节点的所有兄弟节点的id数组\n */\nexport const findAllSiblingIds = (id: string, data: FlattenTreeItem[]) => {\n  const ele = data.find(item => item.id === id);\n  if (!ele) return [];\n\n  return data.filter(item => item.parentId === ele.parentId).map(item => item.id);\n};\n\n// 根据传入的id，找到这个节点的所有兄弟节点，判断这个兄弟节点是否都已经选中，如果已经选中，则选中这个节点的父节点，同时以这个父节点为参数递归\n// 如果这个节点的所有兄弟节点都没有选中，则取消选中这个节点的父节点，同时以这个父节点为参数，再次调用这个函数\n// 直到找到根节点，停止递归\nexport const loopAllParents = (id: string, data: FlattenTreeItem[], checkedKeys: string[]) => {\n  const ele = data.find(item => item.id === id);\n  if (!ele) return;\n\n  const siblingIds = findAllSiblingIds(id, data);\n  const isAllSiblingChecked = siblingIds.every(item => checkedKeys.includes(item));\n  if (isAllSiblingChecked) {\n    if (ele.parentId) {\n      const parent = data.find(item => item.id === ele.parentId);\n      if (parent && !parent.disabled) {\n        checkedKeys.push(ele.parentId);\n        loopAllParents(ele.parentId, data, checkedKeys);\n      }\n    }\n  } else {\n    const index = checkedKeys.indexOf(ele.parentId!);\n    if (index > -1) {\n      checkedKeys.splice(index, 1);\n    }\n    loopAllParents(ele.parentId!, data, checkedKeys);\n  }\n};\n\n/**\n * 将一个树形结构打平\n * @param data 树形结构数据\n * @returns 打平后的数组\n */\nexport const flattenData = (data: TreeItemProps[]) => {\n  const flatten = (data: TreeItemProps[], parentId?: string) => {\n    return data.reduce((arr, item) => {\n      arr.push({ ...item, parentId });\n      if (item.items) {\n        arr = arr.concat(flatten(item.items, item.id));\n      }\n      return arr;\n    }, [] as FlattenTreeItem[]);\n  };\n  return flatten(data);\n};\n"
  },
  {
    "path": "packages/react-native/src/utils/redash.ts",
    "content": "import { interpolateColor } from 'react-native-reanimated';\n\nexport const mix = (value: number, x: number, y: number) => {\n  'worklet';\n  return x * (1 - value) + y * value;\n};\n\ntype AnimatedColor = string | number;\n\nexport const mixColor = (\n  value: number,\n  color1: AnimatedColor,\n  color2: AnimatedColor,\n  colorSpace: 'RGB' | 'HSV' = 'RGB'\n) => {\n  'worklet';\n  return interpolateColor(value, [0, 1], [color1, color2], colorSpace);\n};\n\nexport const clamp = (value: number, lowerBound: number, upperBound: number) => {\n  'worklet';\n  return Math.min(Math.max(lowerBound, value), upperBound);\n};\n"
  },
  {
    "path": "packages/react-native/src/utils/ref-util.ts",
    "content": "export function addNewRef<T>(refs: any[], newRef: T) {\n  refs.push({\n    current: newRef,\n  });\n}\n\nexport function removeOldRef<T>(refs: any[], oldRef: T | null) {\n  refs = refs.filter(r => r.current !== oldRef);\n}\n\nexport function getRef(refs: any[]) {\n  const reversePriority = [...refs].reverse();\n  const activeRef = reversePriority.find(ref => ref?.current !== null);\n  if (!activeRef) {\n    return null;\n  }\n  return activeRef.current;\n}\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/VehicleKeyboardInput.tsx",
    "content": "import React, { forwardRef, useImperativeHandle } from 'react';\nimport { Keyboard } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Brief from '../brief';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Label from '../label';\nimport Modal from '../modal';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { VehicleKeyboardInputProps, VehicleKeyboardRef } from './type';\nimport useVehicleKeyboard from './useVehicleKeyboard';\nimport VehicleKeyboardModal from './VehicleKeyboardModal';\n\nconst { ONE_PIXEL } = helpers;\nconst VehicleKeyboardInput = forwardRef<VehicleKeyboardRef, VehicleKeyboardInputProps>(\n  (\n    {\n      label,\n      labelPosition = 'left',\n      colon = false,\n      required = false,\n      value,\n      onChange,\n      onCheck,\n      placeholder = '请输入',\n      disabled = false,\n      type,\n      extra,\n      style,\n      inputStyle,\n      allowClear = true,\n      brief,\n      itemHeight,\n      activeOpacity = 0.6,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { currentText, handleSubmit, handleInputClear } = useVehicleKeyboard({\n      value,\n      onCheck,\n      onChange,\n      placeholder,\n    });\n\n    const show = () => {\n      Keyboard.dismiss();\n      Modal.show(\n        <VehicleKeyboardModal\n          {...{\n            ...restProps,\n            type,\n            value: currentText === placeholder ? '' : currentText,\n            onSubmit: handleSubmit,\n            activeOpacity,\n          }}\n        />,\n        { position: 'bottom' }\n      );\n    };\n\n    useImperativeHandle(ref, () => {\n      return {\n        focus: show,\n      };\n    });\n\n    const InputContent = (\n      <Flex paddingHorizontal=\"x1\" borderWidth={ONE_PIXEL} borderColor=\"border\" borderRadius=\"x1\" flex={1}>\n        <Pressable\n          activeOpacity={activeOpacity}\n          onPress={show}\n          style={[\n            itemHeight ? { height: itemHeight, justifyContent: 'center' } : {},\n            {\n              flex: 1,\n              paddingVertical: theme.spacing.x2,\n            },\n            style,\n          ]}\n        >\n          <Text variant=\"p1\" color={currentText === placeholder ? 'gray300' : 'text'} style={inputStyle} selectable>\n            {currentText}\n          </Text>\n        </Pressable>\n        {allowClear && !disabled && !!currentText && currentText !== placeholder && (\n          <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10} style={{ alignItems: 'center' }}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n        <Brief brief={extra} />\n      </Flex>\n    );\n\n    if (labelPosition === 'top')\n      return (\n        <Box>\n          <Label {...{ label, colon, required }} />\n          {InputContent}\n          <Brief brief={brief} />\n        </Box>\n      );\n\n    return (\n      <Box>\n        <Flex alignItems=\"center\">\n          <Label {...{ colon, label, required }} />\n          {InputContent}\n        </Flex>\n        <Brief brief={brief} />\n      </Box>\n    );\n  }\n);\nVehicleKeyboardInput.displayName = 'VehicleKeyboardInput';\n\nexport default VehicleKeyboardInput;\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/VehicleKeyboardItem.tsx",
    "content": "import React, { forwardRef, useImperativeHandle } from 'react';\nimport { Keyboard } from 'react-native';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Brief from '../brief';\nimport Flex from '../flex';\nimport Modal from '../modal';\nimport Pressable from '../pressable';\nimport SvgIcon from '../svg-icon';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { VehicleKeyboardItemProps, VehicleKeyboardRef } from './type';\nimport useVehicleKeyboard from './useVehicleKeyboard';\nimport VehicleKeyboardModal from './VehicleKeyboardModal';\n\nconst VehicleKeyboardItem = forwardRef<VehicleKeyboardRef, VehicleKeyboardItemProps>(\n  (\n    {\n      value,\n      onChange,\n      onCheck,\n      placeholder = '请输入',\n      disabled = false,\n      style,\n      inputStyle,\n      extra,\n      allowClear = true,\n      activeOpacity = 0.6,\n      inForm,\n      ...restProps\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const { currentText, handleSubmit, handleInputClear } = useVehicleKeyboard({\n      value,\n      onChange,\n      onCheck,\n      placeholder,\n    });\n\n    const show = () => {\n      Keyboard.dismiss();\n      if (disabled) return;\n      Modal.show(\n        <VehicleKeyboardModal\n          {...{\n            ...restProps,\n            value: currentText === placeholder ? '' : currentText,\n            onSubmit: handleSubmit,\n            activeOpacity,\n          }}\n        />,\n        { position: 'bottom' }\n      );\n    };\n\n    useImperativeHandle(ref, () => {\n      return {\n        focus: show,\n      };\n    });\n\n    return (\n      <Box width=\"100%\" paddingHorizontal={inForm ? 'x0' : 'x1'} justifyContent={'center'} style={style}>\n        <Flex>\n          <Pressable\n            activeOpacity={activeOpacity}\n            onPress={show}\n            style={[\n              {\n                flexGrow: 1,\n                paddingVertical: theme.spacing.x2,\n                justifyContent: 'center',\n              },\n            ]}\n          >\n            <Text\n              variant=\"p1\"\n              color={currentText === placeholder ? 'gray300' : 'text'}\n              style={[{ textAlign: 'right' }, inputStyle]}\n              selectable\n            >\n              {currentText}\n            </Text>\n          </Pressable>\n          {allowClear && !disabled && !!currentText && currentText !== placeholder && (\n            <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10} style={{ alignItems: 'center' }}>\n              <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n            </Pressable>\n          )}\n          <Brief brief={extra} />\n        </Flex>\n      </Box>\n    );\n  }\n);\nVehicleKeyboardItem.displayName = 'VehicleKeyboardItem';\n\nexport default VehicleKeyboardItem;\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/VehicleKeyboardModal.tsx",
    "content": "import React, { FC } from 'react';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport { ImperativeModalChildrenProps } from '../modal/type';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { VehicleKeyboardModalProps } from './type';\nimport useVehicleKeyboardViewModal from './useVehicleKeyboardModal';\nimport VehicleKeyboardView from './VehicleKeyboardView';\n\nconst { ONE_PIXEL, deviceWidth } = helpers;\nconst VehicleKeyboardModal: FC<ImperativeModalChildrenProps<VehicleKeyboardModalProps>> = ({\n  value = '',\n  onPress,\n  onDelete,\n  onSubmit,\n  submitText = '完成',\n  activeOpacity,\n  closeModal,\n}) => {\n  const theme = useTheme<Theme>();\n  const { type, textArr, handleChange, handleSubmit, handleDelete } = useVehicleKeyboardViewModal({\n    value,\n    onPress,\n    onDelete,\n    onSubmit,\n    closeModal,\n  });\n\n  const itemWidth = (deviceWidth - theme.spacing.x2 * 2 - theme.spacing.x1 * 7) / 9;\n\n  const InputText = (value: string | undefined, index: number) => {\n    if (index === 7 && !value) {\n      return (\n        <Text variant=\"p3\" color=\"text\">\n          新能源\n        </Text>\n      );\n    }\n    return (\n      <Text variant=\"p1\" color=\"text\">\n        {value}\n      </Text>\n    );\n  };\n\n  return (\n    <Box>\n      <Flex\n        justifyContent=\"center\"\n        alignItems=\"center\"\n        paddingVertical={'x2'}\n        marginBottom={'x1'}\n        borderBottomWidth={ONE_PIXEL}\n        borderBottomColor={'border'}\n      >\n        <Flex justifyContent=\"center\" width={itemWidth * 8} borderWidth={ONE_PIXEL} borderColor={'border'}>\n          {[0, 1, 2, 3, 4, 5, 6, 7].map((item, index) => {\n            return (\n              <Box\n                key={item}\n                alignItems=\"center\"\n                justifyContent=\"center\"\n                borderRightWidth={index === 7 ? 0 : ONE_PIXEL}\n                borderColor=\"border\"\n                width={itemWidth}\n                height={itemWidth}\n              >\n                {InputText(textArr[item], item)}\n              </Box>\n            );\n          })}\n        </Flex>\n        <Pressable onPress={handleSubmit} activeOpacity={activeOpacity} style={{ paddingLeft: theme.spacing.x6 }}>\n          <Text variant=\"p0\" color=\"primary200\">\n            {submitText}\n          </Text>\n        </Pressable>\n      </Flex>\n      <VehicleKeyboardView type={type} onPress={handleChange} onDelete={handleDelete} activeOpacity={activeOpacity} />\n    </Box>\n  );\n};\nVehicleKeyboardModal.displayName = 'VehicleKeyboardModal';\n\nexport default VehicleKeyboardModal;\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/VehicleKeyboardView.tsx",
    "content": "import React, { FC } from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport Flex from '../flex';\nimport helpers from '../helpers';\nimport Pressable from '../pressable';\nimport Text from '../text';\nimport { Theme } from '../theme';\nimport { VehicleKeyboardViewProps } from './type';\n\nconst { px, ONE_PIXEL, deviceWidth } = helpers;\n\nconst provinces = [\n  '京',\n  '津',\n  '冀',\n  '鲁',\n  '晋',\n  '蒙',\n  '辽',\n  '吉',\n  '黑',\n  '沪',\n  '苏',\n  '浙',\n  '皖',\n  '闽',\n  '赣',\n  '豫',\n  '鄂',\n  '湘',\n  '粤',\n  '桂',\n  '渝',\n  '川',\n  '贵',\n  '云',\n  '藏',\n  '陕',\n  '甘',\n  '琼',\n  '新',\n  '宁',\n  '青',\n  '使',\n  '领',\n  'del',\n];\nconst vehicleNum = [\n  '1',\n  '2',\n  '3',\n  '4',\n  '5',\n  '6',\n  '7',\n  '8',\n  '9',\n  '0',\n  'Q',\n  'W',\n  'E',\n  'R',\n  'T',\n  'Y',\n  'U',\n  'P',\n  'A',\n  'S',\n  'D',\n  'F',\n  'G',\n  'H',\n  'J',\n  'K',\n  'L',\n  'Z',\n  'X',\n  'C',\n  'V',\n  'B',\n  'N',\n  'M',\n  '挂',\n  '学',\n  '警',\n  '港',\n  '澳',\n  'del',\n];\n\nconst keys = {\n  provinces,\n  vehicleNum,\n};\n\nconst VehicleKeyboardView: FC<VehicleKeyboardViewProps> = ({\n  type = 'provinces',\n  onPress,\n  onDelete,\n  activeOpacity = 0.6,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const itemWidth = (deviceWidth - theme.spacing.x2 * 2 - theme.spacing.x1 * 7) / 9;\n\n  return (\n    <Box>\n      <Flex justifyContent={'space-evenly'} flexWrap=\"wrap\">\n        {keys[type].map(item => {\n          return item != 'del' ? (\n            <Pressable\n              key={item}\n              activeOpacity={activeOpacity}\n              onPress={() => {\n                onPress?.(item);\n              }}\n              style={{\n                width: itemWidth,\n                height: itemWidth,\n                margin: theme.spacing.x1,\n                borderWidth: ONE_PIXEL,\n                borderColor: theme.colors.border,\n                borderRadius: theme.borderRadii.x1,\n                justifyContent: 'center',\n                alignItems: 'center',\n              }}\n            >\n              <Text variant=\"p0\" color=\"text\">\n                {item}\n              </Text>\n            </Pressable>\n          ) : (\n            <Pressable\n              key=\"del\"\n              activeOpacity={activeOpacity}\n              style={{\n                justifyContent: 'center',\n                alignItems: 'center',\n                alignSelf: 'flex-end',\n                width: itemWidth,\n                height: itemWidth,\n                margin: theme.spacing.x1,\n                borderWidth: ONE_PIXEL,\n                borderColor: theme.colors.border,\n                borderRadius: theme.borderRadii.x1,\n                marginLeft: 'auto',\n              }}\n              onPress={onDelete}\n            >\n              <SvgXml\n                xml={`\n                  <svg\n                    t=\"1607517664521\"\n                    class=\"icon\"\n                    viewBox=\"0 0 1579 1024\"\n                    version=\"1.1\"\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    p-id=\"7769\"\n                    width=\"200\"\n                    height=\"200\"\n                  >\n                    <path\n                      d=\"M1473.619354 0H499.942734a122.427628 122.427628 0 0 0-94.06463 44.818325L13.044586 478.700403A58.162099 58.162099 0 0 0 15.557763 554.99328l397.261497 437.292818a101.065623 101.065623 0 0 0 72.941974 31.654064h987.85812a109.323205 109.323205 0 0 0 106.331327-111.477356V111.297844A109.263367 109.263367 0 0 0 1473.619354 0z m4.787004 823.544206a87.602174 87.602174 0 0 1-88.021037 86.584936H529.981184a86.345585 86.345585 0 0 1-60.256413-24.533396L141.276456 545.419272a43.083036 43.083036 0 0 1-2.154151-59.239175l324.738386-337.364109a103.638637 103.638637 0 0 1 77.788815-34.825454h849.09484a87.602174 87.602174 0 0 1 88.021037 86.584935v622.968737z\"\n                      fill=\"${theme.colors.gray500}\"\n                      p-id=\"7770\"\n                    ></path>\n                    <path\n                      d=\"M1192.562379 665.453398a56.965348 56.965348 0 1 1-80.541342 80.541343l-151.508678-151.508678-147.080699 147.260212a56.965348 56.965348 0 0 1-80.541343-80.541343l147.260212-147.260212-151.748028-151.508677a56.90551 56.90551 0 0 1 80.36183-80.541343l151.508678 151.508678 155.577631-155.577631a56.90551 56.90551 0 0 1 80.541343 80.36183l-155.577631 155.577631z\"\n                      fill=\"${theme.colors.gray500}\"\n                      p-id=\"7771\"\n                    ></path>\n                  </svg>`}\n                width={px(22)}\n                height={px(14)}\n              />\n            </Pressable>\n          );\n        })}\n      </Flex>\n    </Box>\n  );\n};\n\nVehicleKeyboardView.displayName = 'VehicleKeyboardView';\n\nexport default VehicleKeyboardView;\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/index.md",
    "content": "---\ntitle: VehicleKeyboard - 车牌键盘组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 表单组件\n  path: /form\n---\n\n# VehicleKeyboard 车牌键盘组件\n\n## 效果演示\n\n### 1. 默认的车牌键盘\n\n```tsx | pure\n<VehicleKeyboardInput\n  onPress={e => {\n    Alert.alert(e);\n  }}\n  onDelete={() => {\n    Alert.alert('delete');\n  }}\n  onSubmit={() => {\n    Alert.alert('submit');\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"数字键盘 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609320228495622158.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### VehicleKeyboardView 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| onPress       | `false` | 按键的回调事件                  | `(key: string) => void`           |          |\n| onDelete      | `false` | 删除按键的回调事件              | `() => void`                      |          |\n| onSubmit      | `false` | 提交按键的回调事件              | `() => void`                      |          |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n\n### VehicleKeyboardModal 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| onPress       | `false` | 按键的回调事件                  | `(key: string) => void`           |          |\n| onDelete      | `false` | 删除按键的回调事件              | `() => void`                      |          |\n| onSubmit      | `false` | 提交按键的回调事件              | `(value: string) => void`         |          |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n| submitText    | `false` | 提交按键的文本                  | `string`                          | `确定`   |\n| value         | `false` | 输入值                          | `string`                          |          |\n\n### VehicleKeyboardItem 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n| value         | `false` | 输入值                          | `string`                          |          |\n| onChange      | `false` | 值修改后的回调                  | `(value: string) => void`         |          |\n| onCheck       | `false` | 对值进行校验的回调              | `(value: string) => Promise<any>` |          |\n| placeholder   | `false` | 提示语                          | `string`                          | `请输入` |\n| style         | `false` | 自定义样式                      | `ViewStyle`                       |          |\n| inputStyle    | `false` | 输入框文字样式                  | `TextStyle`                       |          |\n| extra         | `false` | 右侧内容                        | `ReactNode`                       |          |\n| arrowClear    | `false` | 是否允许清空                    | `boolean`                         | `true`   |\n| disabled      | `false` | 是否禁用                        | `boolean`                         | `false`  |\n\n### VehicleKeyboardInput 组件\n\n| 属性          | 必填    | 说明                            | 类型                              | 默认值   |\n| ------------- | ------- | ------------------------------- | --------------------------------- | -------- |\n| type          | `false` | 键盘类型 （数字、身份证、整数） | `number` \\| `IdCard` \\| `integer` | `number` |\n| activeOpacity | `false` | 按下时的不透明度                | `number`                          | `0.6`    |\n| value         | `false` | 输入值                          | `string`                          |          |\n| onChange      | `false` | 值修改后的回调                  | `(value: string) => void`         |          |\n| onCheck       | `false` | 对值进行校验的回调              | `(value: string) => Promise<any>` |          |\n| placeholder   | `false` | 提示语                          | `string`                          | `请输入` |\n| style         | `false` | 自定义样式                      | `ViewStyle`                       |          |\n| inputStyle    | `false` | 输入框文字样式                  | `TextStyle`                       |          |\n| extra         | `false` | 右侧内容                        | `ReactNode`                       |          |\n| arrowClear    | `false` | 是否允许清空                    | `boolean`                         | `true`   |\n| disabled      | `false` | 是否禁用                        | `boolean`                         | `false`  |\n| minHeight     | `false` | 输入框最小高度                  | `number`                          | `32`     |\n| label         | `true`  | 标签文本                        | `string`                          |          |\n| labelPosition | `false` | 标签位置。输入框左侧或者顶部    | `left` \\| `top`                   | `left`   |\n| colon         | `false` | 是否在标签后显示冒号            | `boolean`                         | `false`  |\n| required      | `false` | 是否在标签前显示必填标识        | `boolean`                         | `false`  |\n| brief         | `false` | 底部内容                        | `ReactNode`                       |          |\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/index.tsx",
    "content": "export { default as VehicleKeyboardView } from './VehicleKeyboardView';\nexport { default as VehicleKeyboardItem } from './VehicleKeyboardItem';\nexport { default as VehicleKeyboardInput } from './VehicleKeyboardInput';\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/type.ts",
    "content": "import { ReactNode } from 'react';\nimport { StyleProp, TextStyle, ViewStyle } from 'react-native';\n\nexport type VehicleKeyboardType = 'provinces' | 'vehicleNum';\n\nexport type VehicleKeyboardViewProps = {\n  /** 键盘类型 省份和数字字母 */\n  type?: VehicleKeyboardType;\n  /** 按键事件 */\n  onPress?: (key: string) => void;\n  /** 删除事件 */\n  onDelete?: () => void;\n  /** 提交事件 */\n  onSubmit?: () => void;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n};\n\nexport interface VehicleKeyboardModalProps extends Omit<VehicleKeyboardViewProps, 'onSubmit'> {\n  value?: string;\n  onSubmit: (value: string) => void;\n  submitText?: string;\n}\n\nexport interface VehicleKeyboardRef {\n  focus: () => void;\n}\n\nexport interface VehicleKeyboardItemProps extends Pick<VehicleKeyboardViewProps, 'type' | 'activeOpacity'> {\n  value?: string;\n  onChange?: (value?: string) => void;\n  onCheck?: (value: string) => Promise<any>;\n  placeholder?: string;\n  style?: StyleProp<ViewStyle>;\n  inputStyle?: StyleProp<TextStyle>;\n  /** 右侧内容 */\n  extra?: ReactNode;\n  allowClear?: boolean;\n  disabled?: boolean;\n  inForm?: boolean;\n}\n\nexport interface VehicleKeyboardInputProps extends VehicleKeyboardItemProps {\n  label: string;\n  /** 标签位置。可选值：左侧/上方 */\n  labelPosition?: 'left' | 'top';\n  /** 是否显示冒号 */\n  colon?: boolean;\n  /** 是否必填项 */\n  required?: boolean;\n  brief?: ReactNode;\n  itemHeight?: number;\n}\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/useVehicleKeyboard.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport Toast from '../toast';\nimport type { VehicleKeyboardInputProps } from './type';\n\nconst VehicleReg =\n  /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/;\n\nexport default function useVehicleKeyboard({\n  value,\n  onChange,\n  onCheck,\n  placeholder = '请输入',\n}: Pick<VehicleKeyboardInputProps, 'value' | 'onChange' | 'onCheck' | 'placeholder'>) {\n  const [currentText, setCurrentText] = useSafeState<string>();\n\n  useEffect(() => {\n    setCurrentText(value ?? placeholder ?? '');\n  }, [value, placeholder]);\n\n  /**\n   * 根据type对value进行合法性校验\n   */\n  const handleSubmit = async (value: string) => {\n    if (!VehicleReg.test(value)) {\n      Toast.middle({ content: '请输入正确的车牌号' });\n      return;\n    }\n    await onCheck?.(value);\n    if (onChange) {\n      onChange(`${value}`);\n    } else {\n      setCurrentText(value || placeholder);\n    }\n  };\n\n  const handleInputClear = () => {\n    if (onChange) {\n      onChange();\n    } else {\n      setCurrentText(placeholder);\n    }\n  };\n\n  return {\n    currentText,\n    handleSubmit: useMemoizedFn(handleSubmit),\n    handleInputClear: useMemoizedFn(handleInputClear),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/vehicle-keyboard/useVehicleKeyboardModal.ts",
    "content": "import { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { ImperativeModalChildrenProps } from '../modal/type';\nimport { VehicleKeyboardModalProps, VehicleKeyboardType } from './type';\n\nexport default function useVehicleKeyboardModal({\n  value = '',\n  onPress,\n  onDelete,\n  onSubmit,\n  closeModal,\n}: Pick<\n  ImperativeModalChildrenProps<VehicleKeyboardModalProps>,\n  'value' | 'onPress' | 'onDelete' | 'onSubmit' | 'closeModal'\n>) {\n  const [text, setText] = useSafeState(value);\n\n  const type = text.length === 0 ? 'provinces' : ('vehicleNum' as VehicleKeyboardType);\n  const textArr = text.split('');\n\n  const handleChange = (key: string) => {\n    if (text.length > 8) {\n      return;\n    }\n    setText(text => text + key);\n    onPress?.(key);\n  };\n\n  const handleDelete = () => {\n    setText(text => (text.length > 0 ? text.slice(0, text.length - 1) : ''));\n    onDelete?.();\n  };\n\n  const handleSubmit = () => {\n    onSubmit?.(text);\n    closeModal?.();\n  };\n\n  return {\n    text,\n    type,\n    textArr,\n    handleChange: useMemoizedFn(handleChange),\n    handleSubmit: useMemoizedFn(handleSubmit),\n    handleDelete: useMemoizedFn(handleDelete),\n  };\n}\n"
  },
  {
    "path": "packages/react-native/src/white-space/index.md",
    "content": "---\ntitle: WhiteSpace - 水平留白组件\nnav:\n  title: RN 组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n---\n\n# WhiteSpace 水平留白组件\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<View style={{ height: 50, backgroundColor: 'red' }} />\n<WhiteSpace />\n<View style={{ height: 50, backgroundColor: 'gold' }} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"whiteSpace-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607483947000193494.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 指定 backgroundColor 和 size\n\n```tsx | pure\n<View style={{ height: 50, backgroundColor: 'red' }} />\n<WhiteSpace size=\"x6\" backgroundColor=\"green\" />\n<View style={{ height: 50, backgroundColor: 'gold' }} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"whiteSpace-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607484882581015487.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性            | 必填    | 说明             | 类型                                                | 默认值        |\n| --------------- | ------- | ---------------- | --------------------------------------------------- | ------------- |\n| size            | `false` | 水平留白的大小   | `xxs` \\| `xs` \\| `s` \\| `m` \\| `l` \\| `xl` \\| `xxl` | `m`           |\n| backgroundColor | `false` | 水平留白的背景色 | `string`                                            | `transparent` |\n\n_`size`的值对应的具体大小定义在`theme`文件的`spacing`。_\n"
  },
  {
    "path": "packages/react-native/src/white-space/index.tsx",
    "content": "import React, { FC, memo } from 'react';\n\nimport { useTheme } from '@shopify/restyle';\n\nimport Box from '../box';\nimport { Spacing, Theme } from '../theme';\n\nexport interface WhiteSpaceProps {\n  size?: Spacing;\n  backgroundColor?: string;\n}\n\nconst WhiteSpace: FC<WhiteSpaceProps> = ({ size = 'x2', backgroundColor = 'transparent' }) => {\n  const theme = useTheme<Theme>();\n  return <Box height={theme.spacing[size]} style={{ backgroundColor }} />;\n};\nWhiteSpace.displayName = 'WhiteSpace';\n\nexport default memo(WhiteSpace);\n"
  },
  {
    "path": "packages/react-native/src/wing-blank/index.md",
    "content": "---\ntitle: WingBlank - 两翼留白组件\nnav:\n  title: RN 组件\n  path: /react-native\ngroup:\n  title: 基础组件\n  path: /basic\n---\n\n# WingBlank 两翼留白组件\n\n**Tips: 当`WingBlank`组件和`ScrollView`组件配合使用时，请务必让`WingBlank`组件作为`ScrollView`组件的子组件使用。**\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<WingBlank>\n  <View style={{ height: 150, backgroundColor: 'red' }} />\n</WingBlank>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"wingBlank-ios1.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607485239616233263.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 修改 size\n\n```tsx | pure\n<WingBlank size=\"x6\">\n  <View style={{ height: 150, backgroundColor: 'red' }} />\n</WingBlank>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"wingBlank-ios2.png\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607485584301348092.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性     | 必填    | 说明           | 类型                                                | 默认值 |\n| -------- | ------- | -------------- | --------------------------------------------------- | ------ |\n| size     | `false` | 两翼留白的大小 | `xxs` \\| `xs` \\| `s` \\| `m` \\| `l` \\| `xl` \\| `xxl` | `m`    |\n| children | `true`  | 包裹的子组件   | `ReactNode`                                         |        |\n\n_`size`的值对应的具体大小定义在`theme`文件的`spacing`。_\n"
  },
  {
    "path": "packages/react-native/src/wing-blank/index.tsx",
    "content": "import React, { FC, memo, PropsWithChildren } from 'react';\n\nimport { BoxProps } from '@shopify/restyle';\n\nimport Box from '../box';\nimport { Spacing, Theme } from '../theme';\n\nexport interface WingBlankProps extends BoxProps<Theme> {\n  size?: Spacing;\n}\n\nconst WingBlank: FC<PropsWithChildren<WingBlankProps>> = ({ children, size = 'x2', ...restProps }) => {\n  return (\n    <Box marginHorizontal={size} backgroundColor={'transparent'} {...restProps}>\n      {children}\n    </Box>\n  );\n};\nWingBlank.displayName = 'WingBlank';\n\nexport default memo(WingBlank);\n"
  },
  {
    "path": "packages/react-native/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false,\n    \"baseUrl\": \".\"\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"**/*.js\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native/typings.d.ts",
    "content": "import 'react';\n\ntype ChildrenType = JSX.Element | number | boolean | Element | ReactFragment | null;\n\ndeclare module 'react' {\n  interface RefAttributes {\n    children?: ChildrenType;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-alipay/.gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# BUCK\nbuck-out/\n\\.buckd/\n*.keystore\n"
  },
  {
    "path": "packages/react-native-alipay/README.md",
    "content": "# react-native-alipay\n\n## Getting started\n\n`$ npm install @td-design/react-native-alipay --save`\n\n# android\n\n```\n\n1 申请安卓权限\n\n支付宝需要申请以下权限\n\n```\n\n<uses-permission android:name=\"android.permission.INTERNET\" />\n<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n```\n"
  },
  {
    "path": "packages/react-native-alipay/android/README.md",
    "content": "# README\n\nIf you want to publish the lib as a maven dependency, follow these steps before publishing a new version to npm:\n\n1. Be sure to have the Android [SDK](https://developer.android.com/studio/index.html) and [NDK](https://developer.android.com/ndk/guides/index.html) installed\n2. Be sure to have a `local.properties` file in this folder that points to the Android SDK and NDK\n\n```\nndk.dir=/Users/{username}/Library/Android/sdk/ndk-bundle\nsdk.dir=/Users/{username}/Library/Android/sdk\n```\n\n3. Delete the `maven` folder\n4. Run `./gradlew installArchives`\n5. Verify that latest set of generated files is in the maven folder with the correct version number\n"
  },
  {
    "path": "packages/react-native-alipay/android/build.gradle",
    "content": "// android/build.gradle\n\n// based on:\n//\n// * https://github.com/facebook/react-native/blob/0.60-stable/template/android/build.gradle\n//   previous location:\n//   - https://github.com/facebook/react-native/blob/0.58-stable/local-cli/templates/HelloWorld/android/build.gradle\n//\n// * https://github.com/facebook/react-native/blob/0.60-stable/template/android/app/build.gradle\n//   previous location:\n//   - https://github.com/facebook/react-native/blob/0.58-stable/local-cli/templates/HelloWorld/android/app/build.gradle\n\n// These defaults should reflect the SDK versions used by\n// the minimum React Native version supported.\ndef DEFAULT_COMPILE_SDK_VERSION = 28\ndef DEFAULT_BUILD_TOOLS_VERSION = '28.0.3'\ndef DEFAULT_MIN_SDK_VERSION = 16\ndef DEFAULT_TARGET_SDK_VERSION = 28\n\ndef safeExtGet(prop, fallback) {\n    rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback\n}\n\napply plugin: 'com.android.library'\napply plugin: 'maven'\n\nbuildscript {\n    // The Android Gradle plugin is only required when opening the android folder stand-alone.\n    // This avoids unnecessary downloads and potential conflicts when the library is included as a\n    // module dependency in an application project.\n    // ref: https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:build_script_external_dependencies\n    if (project == rootProject) {\n        repositories {\n            google()\n        }\n        dependencies {\n            // This should reflect the Gradle plugin version used by\n            // the minimum React Native version supported.\n            classpath 'com.android.tools.build:gradle:3.4.1'\n        }\n    }\n}\n\nandroid {\n    compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION)\n    buildToolsVersion safeExtGet('buildToolsVersion', DEFAULT_BUILD_TOOLS_VERSION)\n    defaultConfig {\n        minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION)\n        targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)\n        versionCode 1\n        versionName \"1.0\"\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\nrepositories {\n    // ref: https://www.baeldung.com/maven-local-repository\n    mavenLocal()\n    maven {\n        // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n        url \"$rootDir/../node_modules/react-native/android\"\n    }\n    maven {\n        // Android JSC is installed from npm\n        url \"$rootDir/../node_modules/jsc-android/dist\"\n    }\n    google()\n}\n\ndependencies {\n    //noinspection GradleDynamicVersion\n    implementation 'com.facebook.react:react-native:+'  // From node_modules\n    implementation (files('./libs/alipaysdk-15.8.06.211122170115.aar'))\n}\n\n\n\n"
  },
  {
    "path": "packages/react-native-alipay/android/src/main/AndroidManifest.xml",
    "content": "<!-- AndroidManifest.xml -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.thundersdata.alipay\">\n\n</manifest>\n"
  },
  {
    "path": "packages/react-native-alipay/android/src/main/java/com/thundersdata/alipay/ReactNativeAlipayModule.java",
    "content": "// ReactNativeAlipayModule.java\n\npackage com.thundersdata.alipay;\n\nimport com.alipay.sdk.app.EnvUtils;\nimport com.alipay.sdk.app.PayTask;\nimport com.facebook.react.bridge.Arguments;\nimport com.facebook.react.bridge.Callback;\nimport com.facebook.react.bridge.Promise;\nimport com.facebook.react.bridge.ReactApplicationContext;\nimport com.facebook.react.bridge.ReactContextBaseJavaModule;\nimport com.facebook.react.bridge.ReactMethod;\nimport com.facebook.react.bridge.WritableMap;\nimport java.util.Map;\n\npublic class ReactNativeAlipayModule extends ReactContextBaseJavaModule {\n\n    private final ReactApplicationContext reactContext;\n\n    public ReactNativeAlipayModule(ReactApplicationContext reactContext) {\n        super(reactContext);\n        this.reactContext = reactContext;\n    }\n\n    @Override\n    public String getName() {\n        return \"ReactNativeAlipay\";\n    }\n\n    @ReactMethod\n    public void openSandBox(){\n      EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);\n    }\n\n    @ReactMethod\n    public void sampleMethod(String stringArgument, int numberArgument, Callback callback) {\n        // TODO: Implement some actually useful functionality\n        callback.invoke(\"Received numberArgument: \" + numberArgument + \" stringArgument: \" + stringArgument);\n    }\n\n    @ReactMethod\n    public void pay(final String orderInfo, final Promise promise) {\n        Runnable payRunnable = new Runnable() {\n            @Override\n            public void run() {\n                WritableMap map = Arguments.createMap();\n                PayTask alipay = new PayTask(getCurrentActivity());\n                Map<String, String> result = alipay.payV2(orderInfo,true);\n                for (Map.Entry<String, String> entry: result.entrySet())\n                    map.putString(entry.getKey(), entry.getValue());\n                promise.resolve(map);\n            }\n        };\n        // 必须异步调用\n        Thread payThread = new Thread(payRunnable);\n        payThread.start();\n    }\n\n}\n"
  },
  {
    "path": "packages/react-native-alipay/android/src/main/java/com/thundersdata/alipay/ReactNativeAlipayPackage.java",
    "content": "// ReactNativeAlipayPackage.java\n\npackage com.thundersdata.alipay;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.bridge.NativeModule;\nimport com.facebook.react.bridge.ReactApplicationContext;\nimport com.facebook.react.uimanager.ViewManager;\n\npublic class ReactNativeAlipayPackage implements ReactPackage {\n    @Override\n    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {\n        return Arrays.<NativeModule>asList(new ReactNativeAlipayModule(reactContext));\n    }\n\n    @Override\n    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {\n        return Collections.emptyList();\n    }\n}\n"
  },
  {
    "path": "packages/react-native-alipay/index.js",
    "content": "// main index.js\nimport { NativeModules } from 'react-native';\n\nconst { ReactNativeAlipay } = NativeModules;\n\nexport default ReactNativeAlipay;\n"
  },
  {
    "path": "packages/react-native-alipay/ios/ReactNativeAlipay.h",
    "content": "// ReactNativeAlipay.h\n#import <Foundation/Foundation.h>\n#import <React/RCTBridgeModule.h>\n\n@interface RCTAlipay : NSObject<RCTBridgeModule>\n\n+(void) handleCallback:(NSURL *)url;\n\n@end\n"
  },
  {
    "path": "packages/react-native-alipay/ios/ReactNativeAlipay.m",
    "content": "#import \"ReactNativeAlipay.h\"\n#import <AlipaySDK/AlipaySDK.h>\n\nstatic RCTPromiseResolveBlock _resolve;\nstatic RCTPromiseRejectBlock _reject;\n\n@implementation RCTAlipay\n\nRCT_EXPORT_MODULE(ReactNativeAlipay);\n\nRCT_REMAP_METHOD(pay, payInfo:(NSString *)payInfo resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)\n{\n \n    NSArray *urls = [[NSBundle mainBundle] infoDictionary][@\"CFBundleURLTypes\"];\n    NSMutableString *appScheme = [NSMutableString string];\n    \n    BOOL multiUrls = [urls count] > 1;\n    for (NSDictionary *url in urls) {\n        NSArray *schemes = url[@\"CFBundleURLSchemes\"];\n        if (!multiUrls ||\n            (multiUrls && [@\"alipay\" isEqualToString:url[@\"CFBundleURLName\"]])) {\n            [appScheme appendString:schemes[0]];\n            break;\n        }\n    }\n\n    if ([appScheme isEqualToString:@\"\"]) {\n        NSString *error = @\"scheme cannot be empty\";\n        reject(@\"10000\", error, [NSError errorWithDomain:error code:10000 userInfo:NULL]);\n        return;\n    }\n    \n    _resolve = resolve;\n    _reject = reject;\n    \n    [[AlipaySDK defaultService] payOrder:payInfo fromScheme:appScheme callback:^(NSDictionary *resultDic) {\n        [RCTAlipay handleResult:resultDic];\n    }];\n}\n\n+(void) handleCallback:(NSURL *)url\n{\n    NSLog(@\"url = %@\",url);\n    //如果极简开发包不可用，会跳转支付宝钱包进行支付，需要将支付宝钱包的支付结果回传给开发包\n    if ([url.host isEqualToString:@\"safepay\"]) {\n        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {\n          NSLog(@\"result = %@\",resultDic);\n          //【由于在跳转支付宝客户端支付的过程中，商户app在后台很可能被系统kill了，所以pay接口的callback就会失效，请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】\n            [self handleResult:resultDic];\n        }];\n    }\n    if ([url.host isEqualToString:@\"platformapi\"]){//支付宝钱包快登授权返回authCode\n        \n        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {\n          NSLog(@\"result = %@\",resultDic);\n            //【由于在跳转支付宝客户端支付的过程中，商户app在后台很可能被系统kill了，所以pay接口的callback就会失效，请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】\n            [self handleResult:resultDic];\n        }];\n    }\n}\n\n+(void) handleResult:(NSDictionary *)resultDic\n{\n    NSString *status = resultDic[@\"resultStatus\"];\n    if ([status integerValue] >= 8000) {\n        _resolve(resultDic);\n    } else {\n        _reject(status, resultDic[@\"memo\"], [NSError errorWithDomain:resultDic[@\"memo\"] code:[status integerValue] userInfo:NULL]);\n    }\n}\n\n+ (BOOL)requiresMainQueueSetup{\n  return NO;\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-alipay/ios/ReactNativeAlipay.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t58B511D91A9E6C8500147676 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"include/$(PRODUCT_NAME)\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t134814201AA4EA6300B7C361 /* libReactNativeAlipay.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReactNativeAlipay.a; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t58B511D81A9E6C8500147676 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t134814211AA4EA7D00B7C361 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t134814201AA4EA6300B7C361 /* libReactNativeAlipay.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t58B511D21A9E6C8500147676 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t134814211AA4EA7D00B7C361 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t58B511DA1A9E6C8500147676 /* ReactNativeAlipay */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget \"ReactNativeAlipay\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t58B511D71A9E6C8500147676 /* Sources */,\n\t\t\t\t58B511D81A9E6C8500147676 /* Frameworks */,\n\t\t\t\t58B511D91A9E6C8500147676 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = ReactNativeAlipay;\n\t\t\tproductName = RCTDataManager;\n\t\t\tproductReference = 134814201AA4EA6300B7C361 /* libReactNativeAlipay.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t58B511D31A9E6C8500147676 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0920;\n\t\t\t\tORGANIZATIONNAME = Facebook;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t58B511DA1A9E6C8500147676 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject \"ReactNativeAlipay\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 58B511D21A9E6C8500147676;\n\t\t\tproductRefGroup = 58B511D21A9E6C8500147676;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t58B511DA1A9E6C8500147676 /* ReactNativeAlipay */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t58B511D71A9E6C8500147676 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t58B511ED1A9E6C8500147676 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"/usr/lib/swift $(inherited)\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(inherited)\\\"\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t58B511EE1A9E6C8500147676 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"/usr/lib/swift $(inherited)\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(inherited)\\\"\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t58B511F01A9E6C8500147676 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,\n\t\t\t\t\t\"$(SRCROOT)/../../../React/**\",\n\t\t\t\t\t\"$(SRCROOT)/../../react-native/React/**\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = ReactNativeAlipay;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t58B511F11A9E6C8500147676 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,\n\t\t\t\t\t\"$(SRCROOT)/../../../React/**\",\n\t\t\t\t\t\"$(SRCROOT)/../../react-native/React/**\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = ReactNativeAlipay;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t58B511D61A9E6C8500147676 /* Build configuration list for PBXProject \"ReactNativeAlipay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t58B511ED1A9E6C8500147676 /* Debug */,\n\t\t\t\t58B511EE1A9E6C8500147676 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget \"ReactNativeAlipay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t58B511F01A9E6C8500147676 /* Debug */,\n\t\t\t\t58B511F11A9E6C8500147676 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 58B511D31A9E6C8500147676 /* Project object */;\n}\n"
  },
  {
    "path": "packages/react-native-alipay/ios/ReactNativeAlipay.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:ReactNativeAlipay.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "packages/react-native-alipay/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-alipay\",\n  \"title\": \"React Native Alipay\",\n  \"version\": \"1.0.0\",\n  \"description\": \"集成支付宝支付功能\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"README.md\",\n    \"android\",\n    \"index.js\",\n    \"ios\",\n    \"react-native-alipay.podspec\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"keywords\": [\n    \"react-native\",\n    \"alipay\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\"\n  }\n}"
  },
  {
    "path": "packages/react-native-alipay/react-native-alipay.podspec",
    "content": "# react-native-alipay.podspec\n\nrequire \"json\"\n\npackage = JSON.parse(File.read(File.join(__dir__, \"package.json\")))\n\nPod::Spec.new do |s|\n  s.name         = \"react-native-alipay\"\n  s.version      = package[\"version\"]\n  s.summary      = package[\"description\"]\n  s.description  = <<-DESC\n                  react-native-alipay\n                   DESC\n  s.homepage     = \"https://github.com/thundersdata-frontend/td-design\"\n  # brief license entry:\n  s.license      = \"MIT\"\n  # optional - use expanded license entry instead:\n  # s.license    = { :type => \"MIT\", :file => \"LICENSE\" }\n  s.authors      = { \"Your Name\" => \"yourname@email.com\" }\n  s.platforms    = { :ios => \"9.0\" }\n  s.source       = { :git => \"https://github.com/thundersdata-frontend/td-design/.git\", :tag => \"#{s.version}\" }\n\n  s.source_files = \"ios/**/*.{h,c,cc,cpp,m,mm,swift}\"\n  s.requires_arc = true\n\n\n\n\n  s.dependency \"React\"\n  s.dependency \"AlipaySDK-iOS\"\n  # ...\n  # s.dependency \"...\"\nend\n\n"
  },
  {
    "path": "packages/react-native-amap-search/.gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# BUCK\nbuck-out/\n\\.buckd/\n*.keystore\n"
  },
  {
    "path": "packages/react-native-amap-search/CHANGELOG.md",
    "content": "# @td-design/react-native-amap-search\n\n## 2.0.1\n\n### Patch Changes\n\n- [#633](https://github.com/thundersdata-frontend/td-design/pull/633) [`76eb30946`](https://github.com/thundersdata-frontend/td-design/commit/76eb309464969557a4da35335a052d66e2fbd80b) Thanks [@chen929104](https://github.com/chen929104)! - 搜索的时候增加城市设置\n\n## 2.0.0\n\n### Major Changes\n\n- [#514](https://github.com/thundersdata-frontend/td-design/pull/514) [`ec67fd8d4`](https://github.com/thundersdata-frontend/td-design/commit/ec67fd8d4dcddf3cd77401f24fb8413dbc8904ed) Thanks [@chen929104](https://github.com/chen929104)! - refactor: 1 修改 react-native-amap 原生 init 方法名名称（不影响组件的调用）\n"
  },
  {
    "path": "packages/react-native-amap-search/README.md",
    "content": "# react-native-amap-search\n\nsearch\n\n## 安装\n\nnpm or yarn\n\n```sh\nnpm install @td-design/react-native-amap-search\n\nyarn add @td-design/react-native-amap-search\n\n# ios 项目需要更新 pods\ncd ios\npod install\n```\n\n## 使用\n\n### 添加高德 Key\n\n- ios\n\n1 [获取高德 key](https://lbs.amap.com/api/android-sdk/guide/create-project/get-key)\n\n2 在 AppDelegate.m 里引入 SDK 头文件 #import <AMapFoundationKit/AMapFoundationKit.h>， 并设置高德 Key [AMapServices sharedServices].apiKey = @\"你的高德 Key\";。\n\n- android\n\n1 [获取高德 key](https://lbs.amap.com/api/android-sdk/guide/create-project/get-key)\n\n2 编辑 Android 项目的 AndroidManifest.xml（一般在 android\\app\\src\\main\\AndroidManifest.xml），添加如下代码：\n\n```\n<application>\n  <meta-data android:name=\"com.amap.api.v2.apikey\" android:value=\"你的高德 Key\" />\n</application>\n```\n\n## 用法\n\n1 初始化\n\n```js\nimport { init } from '@td-design/react-native-amap-search';\n\ninit();\n```\n\n2 调用\n\n```js\nimport { useAMapSearch } from '@td-design/react-native-amap-search';\n\nconst { aMapPOIKeywordsSearch, data } = useAMapSearch();\n```\n\n## API\n\n1 aMapPOIKeywordsSearch(关键字搜索)\n\n```js\nexport interface KeyWordsSearchPOIParams {\n  /**关键字 */\n  keywords?: string;\n  /**范围 */\n  cityLimit?: boolean;\n  /**是否指定城市 */\n  city?: string;\n  /**是否人工干预 */\n  special?: boolean;\n  /**页数 */\n  page?: number;\n  /**一页的数量 */\n  pageSize?: number;\n  /**文本分类、分类代码 */\n  types?: string;\n}\n```\n\n2 aMapPOIAroundSearch(周边 poi 搜索)\n\n```js\nexport interface SearchPOIParams {\n  /**纬度 */\n  latitude: number;\n  /**经度 */\n  longitude: number; // 经度\n  /** 关键字*/\n  keywords?: string;\n  /**范围 */\n  radius?: number;\n  /** 是否指定城市*/\n  city?: string;\n  /** 是否人工干预*/\n  special?: boolean;\n  /**页数 */\n  page?: number;\n  /**一页的数量 */\n  pageSize?: number;\n  /**文本分类、分类代码 */\n  types?: string;\n}\n```\n\n3 aMapPOIPolygonSearch(区域 poi 搜索)\n\n```js\nexport interface PolygonSearchParams {\n  /** 多边形的点*/\n  points: AMapGeoPoint[];\n  /**关键字 */\n  keywords: string;\n  /**页数 */\n  page?: number;\n  /**一页的数量 */\n  pageSize?: number;\n  /**文本分类、分类代码 */\n  types?: string;\n}\n```\n\n4 RouteSearchParams(道路规划沿途的 poi)\n\n```js\nexport interface RouteSearchParams {\n  /**开始位置 */\n  origin: AMapGeoPoint;\n  /** 结束位置*/\n  destination: AMapGeoPoint;\n  /** 驾车导航策略*/\n  strategy?: number;\n  /**搜索类型 */\n  searchType?: number;\n  /**道路周围搜索范围,单位米,[0-500]，默认250。 */\n  range?: number;\n}\n```\n\n# 返回\n\n```js\nexport interface ResultPOI {\n  /**POI全局唯一ID */\n  uid: string;\n  /**名称 */\n  name: string;\n  /**兴趣点类型 */\n  type: string;\n  /**类型编码 */\n  typecode: string;\n  /** 纬度*/\n  latitude: number;\n  /**经度 */\n  longitude: number;\n  /**地址 */\n  address: string;\n  /**电话 */\n  tel: string;\n  /**距中心点的距离，单位米 */\n  distance: number;\n  /**停车场类型，地上、地下 */\n  parkingType: string;\n  /**商铺id */\n  shopID: string;\n  /**邮编 */\n  postcode: string;\n  /**网址 */\n  website: string;\n  /** 电子邮件*/\n  email: string;\n  /**省 */\n  province: string;\n  /**省编码 */\n  pcode: string;\n  /** 市*/\n  city: string;\n  /**城市编码 */\n  citycode: string;\n  /** 区域名称*/\n  district: string;\n  /**区域编码 */\n  adcode: string;\n}\n```\n"
  },
  {
    "path": "packages/react-native-amap-search/android/build.gradle",
    "content": "buildscript {\n    if (project == rootProject) {\n        repositories {\n            google()\n            jcenter()\n        }\n\n        dependencies {\n            classpath 'com.android.tools.build:gradle:3.5.3'\n        }\n    }\n}\n\napply plugin: 'com.android.library'\n\ndef safeExtGet(prop, fallback) {\n    rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback\n}\n\nandroid {\n    compileSdkVersion safeExtGet('AmapSearch_compileSdkVersion', 29)\n    buildToolsVersion safeExtGet('AmapSearch_buildToolsVersion', '29.0.2')\n    defaultConfig {\n        minSdkVersion safeExtGet('AmapSearch_minSdkVersion', 16)\n        targetSdkVersion safeExtGet('AmapSearch_targetSdkVersion', 29)\n        versionCode 1\n        versionName \"1.0\"\n\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n        }\n    }\n    lintOptions {\n        disable 'GradleCompatible'\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\n\nrepositories {\n    mavenLocal()\n    maven {\n        // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n        url(\"$rootDir/../node_modules/react-native/android\")\n    }\n    google()\n    jcenter()\n}\n\ndependencies {\n    //noinspection GradleDynamicVersion\n    implementation \"com.facebook.react:react-native:+\"  // From node_modules\n    implementation 'com.amap.api:search:9.4.5' //高德地图搜索功能\n}\n"
  },
  {
    "path": "packages/react-native-amap-search/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.8-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "packages/react-native-amap-search/android/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "packages/react-native-amap-search/android/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "packages/react-native-amap-search/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.reactnativeamapsearch\">\n\n</manifest>\n"
  },
  {
    "path": "packages/react-native-amap-search/android/src/main/java/com/reactnativeamapsearch/AmapSearchModule.java",
    "content": "package com.reactnativeamapsearch;\n\nimport androidx.annotation.NonNull;\n\nimport com.amap.api.services.core.AMapException;\nimport com.amap.api.services.core.LatLonPoint;\nimport com.amap.api.services.core.PoiItem;\nimport com.amap.api.services.poisearch.PoiResult;\nimport com.amap.api.services.poisearch.PoiSearch;\nimport com.amap.api.services.routepoisearch.RoutePOIItem;\nimport com.amap.api.services.routepoisearch.RoutePOISearch;\nimport com.amap.api.services.routepoisearch.RoutePOISearchQuery;\nimport com.amap.api.services.routepoisearch.RoutePOISearchResult;\nimport com.facebook.react.bridge.Arguments;\nimport com.facebook.react.bridge.Callback;\nimport com.facebook.react.bridge.ReactApplicationContext;\n\nimport com.facebook.react.bridge.ReactContextBaseJavaModule;\nimport com.facebook.react.bridge.ReactMethod;\nimport com.facebook.react.bridge.ReadableArray;\nimport com.facebook.react.bridge.ReadableMap;\nimport com.facebook.react.bridge.WritableArray;\nimport com.facebook.react.bridge.WritableMap;\nimport com.facebook.react.module.annotations.ReactModule;\nimport com.amap.api.services.core.ServiceSettings;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n@ReactModule(name = AmapSearchModule.NAME)\npublic class AmapSearchModule extends ReactContextBaseJavaModule implements PoiSearch.OnPoiSearchListener, RoutePOISearch.OnRoutePOISearchListener {\n    public static final String NAME = \"AMapSearchManager\";\n\n    private int currentPage = 0;// 当前页面，从0开始计数\n    private PoiSearch.Query query;// Poi查询条件类\n    private PoiSearch poiSearch;\n    private RoutePOISearch routePOISearch;\n    private List<PoiItem> poiItems;// poi数据\n    private String keyWord = \"\";\n    private String city = \"\";\n    private Callback jsCallBack;\n\n    private static ReactApplicationContext reactContext;\n\n    public AmapSearchModule(ReactApplicationContext context) {\n        super(context);\n        reactContext=context;\n    }\n\n    @Override\n    @NonNull\n    public String getName() {\n        return NAME;\n    }\n\n\n\n  public  WritableArray formatData(ArrayList<PoiItem> poiItems){\n\n    WritableArray array = Arguments.createArray();\n\n    for(int i = 0 ; i< poiItems.size();i++){\n      WritableMap item = Arguments.createMap();\n      PoiItem poiItem = poiItems.get(i);\n\n      item.putString(\"uid\",poiItem.getPoiId()); //id\n      item.putString(\"name\",poiItem.getTitle()); //名称\n      item.putString(\"type\",poiItem.getTypeDes()); //兴趣点类型\n      item.putString(\"typecode\",poiItem.getTypeCode()); //类型编码\n      item.putDouble(\"latitude\",poiItem.getLatLonPoint().getLatitude()); //纬度\n      item.putDouble(\"longitude\",poiItem.getLatLonPoint().getLongitude()); //经度\n      item.putString(\"address\",poiItem.getSnippet()); // 地址\n      item.putString(\"tel\",poiItem.getTel()); // 电话\n      item.putInt(\"distance\",poiItem.getDistance());  //距中心点的距离，单位米\n      item.putString(\"parkingType\",poiItem.getParkingType()); //停车场类型，地上、地下\n      item.putString(\"shopID\",poiItem.getShopID());\n      item.putString(\"postcode\",poiItem.getPostcode()); //邮编\n      item.putString(\"website\",poiItem.getWebsite());  //网址\n      item.putString(\"email\",poiItem.getEmail()); //电子邮件\n      item.putString(\"province\",poiItem.getProvinceName()); //省\n      item.putString(\"pcode\",poiItem.getProvinceCode()); //省编码\n      item.putString(\"city\",poiItem.getCityName()); //市\n      item.putString(\"citycode\",poiItem.getCityCode()); //城市编码\n      item.putString(\"district\",poiItem.getAdName()); //区域名称\n      item.putString(\"adcode\",poiItem.getAdCode()); //区域编码\n\n      array.pushMap(item);\n    }\n\n    return array;\n  }\n\n  @Override\n  public void onPoiSearched(PoiResult poiResult, int i) {\n    System.out.println(\"===>onPoiSearched\");\n\n    WritableArray array  = formatData(poiResult.getPois());\n\n    if(this.jsCallBack==null){\n      return;\n    }\n    this.jsCallBack.invoke(null,array);\n    this.jsCallBack = null;\n  }\n\n  @Override\n  public void onRoutePoiSearched(RoutePOISearchResult result, int errorCode){\n    WritableArray array = Arguments.createArray();\n    List<RoutePOIItem> poiItems = result.getRoutePois();\n    for(int i = 0 ; i< poiItems.size();i++){\n      WritableMap item = Arguments.createMap();\n      RoutePOIItem poiItem = poiItems.get(i);\n      item.putString(\"uid\",poiItem.getID());\n      item.putString(\"name\",poiItem.getTitle()); //名称\n      item.putDouble(\"latitude\",poiItem.getPoint().getLatitude()); //纬度\n      item.putDouble(\"longitude\",poiItem.getPoint().getLongitude()); //经度\n      item.putDouble(\"distance\", poiItem.getDistance());  //距中心点的距离，单位米\n      array.pushMap(item);\n    }\n    this.jsCallBack.invoke(null,array);\n    this.jsCallBack = null;\n  }\n\n  @Override\n  public void onPoiItemSearched(PoiItem poiItem, int i) {\n\n    System.out.println(\"===>onPoiItemSearched\");\n  }\n\n\n\n  @ReactMethod\n  public void initSDK(){\n    ServiceSettings.updatePrivacyShow(this.reactContext, true, true);\n    ServiceSettings.updatePrivacyAgree(this.reactContext,true);\n    System.out.println(\"===>start!\");\n  }\n\n\n  @ReactMethod\n  public void  aMapPOIAroundSearch(double latitude , double longitude , String keywords,Integer radius ,String city ,Boolean special, Integer page, Integer pageSize ,String types, Callback callback){\n      this.jsCallBack = callback;\n      this.doAMapPOIAroundSearch(latitude,longitude,keywords,radius,city,special,page,pageSize,types);\n  }\n\n  @ReactMethod\n  public void  aMapPOIKeywordsSearch( String keywords ,String city,String types ,Boolean cityLimit , Integer page, Integer pageSize, Callback callback){\n    this.jsCallBack = callback;\n    this.doAMapPOIAroundSearch(keywords,city,types,cityLimit,page,pageSize);\n  }\n\n\n\n  @ReactMethod\n  public void  aMapPOIPolygonSearch(ReadableArray points, String keywords , Integer page, Integer pageSize,String types, Callback callback){\n    this.jsCallBack = callback;\n    this.doAMapPOIAroundSearch(points,keywords,page,pageSize,types);\n  }\n  @ReactMethod\n  public void  aMapRoutePOISearch(ReadableMap origin, ReadableMap destination, Integer strategy, Integer searchType,Integer range,Callback callback){\n    this.jsCallBack = callback;\n    this.doRoutePOISearch(origin,destination,strategy,searchType,range);\n  }\n\n  /**\n   * 开始进行poi搜索\n   */\n  protected void doAMapPOIAroundSearch(double latitude , double longitude , String keywords,Integer radius,String city,Boolean special,Integer page, Integer pageSize ,String types  ) {\n    System.out.println(\"===>doSearchQuery\");\n\n    query = new PoiSearch.Query(keywords, \"\", city);// 第一个参数表示搜索字符串，第二个参数表示poi搜索类型，第三个参数表示poi搜索区域（空字符串代表全国）\n    query.setPageSize(pageSize);// 设置每页最多返回多少条poiitem\n    query.setPageNum(page);// 设置查第一页\n//    query.setSpecial(special);\n\n\n    try {\n      poiSearch = new PoiSearch(this.reactContext, query);\n    } catch (AMapException e) {\n      e.printStackTrace();\n    }\n\n    poiSearch.setOnPoiSearchListener(this);\n    poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(latitude,longitude), radius, true));\n    poiSearch.searchPOIAsyn();// 异步搜索\n  }\n\n  /**\n   * 开始进行poi搜索\n   */\n  protected void doAMapPOIAroundSearch(String keywords ,String city,String types ,Boolean cityLimit , Integer page, Integer pageSize) {\n    System.out.println(\"===>doSearchQuery\");\n\n    query = new PoiSearch.Query(keywords, \"\", city);// 第一个参数表示搜索字符串，第二个参数表示poi搜索类型，第三个参数表示poi搜索区域（空字符串代表全国）\n    query.setCityLimit(cityLimit);\n    query.setPageSize(pageSize);// 设置每页最多返回多少条poiitem\n    query.setPageNum(page);// 设置查第一页\n\n    try {\n      poiSearch = new PoiSearch(this.reactContext, query);\n    } catch (AMapException e) {\n      e.printStackTrace();\n    }\n    poiSearch.setOnPoiSearchListener(this);\n    poiSearch.searchPOIAsyn();// 异步搜索\n  }\n\n  /**\n   * 开始进行poi搜索\n   * 周边搜索\n   */\n  protected void doAMapPOIAroundSearch(ReadableArray points, String keywords , Integer page, Integer pageSize,String types) {\n    System.out.println(\"===>doSearchQuery\");\n\n    query = new PoiSearch.Query(keywords, \"\", \"\");// 第一个参数表示搜索字符串，第二个参数表示poi搜索类型，第三个参数表示poi搜索区域（空字符串代表全国）\n    query.setPageSize(pageSize);// 设置每页最多返回多少条poiitem\n    query.setPageNum(page);// 设置查第一页\n\n    List<LatLonPoint> polygonPoints = new ArrayList<LatLonPoint>();\n\n    for(Integer i=0;i<points.size();i++ ){\n      ReadableMap map = points.getMap(i);\n      polygonPoints.add(new LatLonPoint(map.getDouble(\"latitude\"),map.getDouble(\"longitude\")));\n    }\n\n    try {\n      poiSearch = new PoiSearch(this.reactContext, query);\n    } catch (AMapException e) {\n      e.printStackTrace();\n    }\n    poiSearch.setOnPoiSearchListener(this);\n    poiSearch.setBound(new PoiSearch.SearchBound(polygonPoints));//设置多边形区域\n    poiSearch.searchPOIAsyn();// 异步搜索\n  }\n\n\n  /**\n   * 开始进行poi搜索\n   * 道路沿途检索POI\n   */\n  protected void doRoutePOISearch(ReadableMap origin, ReadableMap destination, Integer strategy, Integer searchType,Integer range) {\n\n    RoutePOISearch.RoutePOISearchType mode ;\n\n    switch (searchType){\n      case 0:\n        mode = RoutePOISearch.RoutePOISearchType.TypeGasStation;\n        break;\n      case  1:\n        mode = RoutePOISearch.RoutePOISearchType.TypeMaintenanceStation;\n        break;\n      case 2:\n        mode = RoutePOISearch.RoutePOISearchType.TypeATM;\n        break;\n      case 3:\n        mode = RoutePOISearch.RoutePOISearchType.TypeToilet;\n        break;\n      case 4:\n        mode = RoutePOISearch.RoutePOISearchType.TypeFillingStation;\n        break;\n      case 5:\n        mode = RoutePOISearch.RoutePOISearchType.TypeServiceArea;\n        break;\n      default:\n        mode = RoutePOISearch.RoutePOISearchType.TypeGasStation;\n        break;\n    }\n\n    System.out.println(\"===>doSearchQuery\");\n    LatLonPoint mStartPoint = new LatLonPoint(origin.getDouble(\"latitude\"),origin.getDouble(\"longitude\"));\n    LatLonPoint mEndPoint = new LatLonPoint(destination.getDouble(\"latitude\"),origin.getDouble(\"longitude\"));\n    RoutePOISearchQuery query = new RoutePOISearchQuery(mStartPoint ,mEndPoint, strategy, mode, range);\n    try {\n      routePOISearch = new RoutePOISearch(this.reactContext, query);\n    } catch (AMapException e) {\n      e.printStackTrace();\n    }\n    routePOISearch.setPoiSearchListener(this);\n    routePOISearch.searchRoutePOIAsyn();\n  }\n\n}\n"
  },
  {
    "path": "packages/react-native-amap-search/android/src/main/java/com/reactnativeamapsearch/AmapSearchPackage.java",
    "content": "package com.reactnativeamapsearch;\n\nimport androidx.annotation.NonNull;\n\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.bridge.NativeModule;\nimport com.facebook.react.bridge.ReactApplicationContext;\nimport com.facebook.react.uimanager.ViewManager;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\npublic class AmapSearchPackage implements ReactPackage {\n    @NonNull\n    @Override\n    public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {\n        List<NativeModule> modules = new ArrayList<>();\n        modules.add(new AmapSearchModule(reactContext));\n        return modules;\n    }\n\n    @NonNull\n    @Override\n    public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {\n        return Collections.emptyList();\n    }\n}\n"
  },
  {
    "path": "packages/react-native-amap-search/ios/AMapSearchManager.h",
    "content": "//\n//  AMapSearchManager.h\n//  freightDriver\n//\n//  Created by 陈英杰 on 2021/7/13.\n//\n\n#import <React/RCTBridgeModule.h>\n#import <AMapFoundationKit/AMapFoundationKit.h>\n#import <AMapSearchKit/AMapSearchKit.h>\n\n@interface AMapSearchManager:NSObject <RCTBridgeModule>\n@end\n"
  },
  {
    "path": "packages/react-native-amap-search/ios/AMapSearchManager.m",
    "content": "//\n//  AMapSearchManager.m\n//  freightDriver\n//\n//  Created by 陈英杰 on 2021/7/13.\n//\n#import <AMapFoundationKit/AMapFoundationKit.h>\n#import \"AMapSearchAPI.h\"\n#import \"AMapSearchManager.h\"\n\n\n\n@implementation AMapSearchManager{\n  AMapSearchAPI *_search;\n  RCTResponseSenderBlock jsCallBack;\n}\n\nRCT_EXPORT_MODULE();\n\nRCT_EXPORT_METHOD(initSDK)\n{\n  [AMapSearchAPI updatePrivacyShow:AMapPrivacyShowStatusDidShow privacyInfo:AMapPrivacyInfoStatusDidContain];\n  [AMapSearchAPI updatePrivacyAgree:AMapPrivacyAgreeStatusDidAgree];\n  self->_search = [[AMapSearchAPI alloc] init];\n  self->_search.delegate = self;\n};\n\n// 获取道路沿途的POI\nRCT_EXPORT_METHOD(aMapRoutePOISearch:(NSDictionary *)origin destination:(NSDictionary *)destination  strategy:(NSInteger)strategy  searchType:(NSInteger)searchType range:(NSInteger )range callback:(RCTResponseSenderBlock)callback )\n{\n    AMapRoutePOISearchRequest *request = [[AMapRoutePOISearchRequest alloc] init];\n    CGFloat originLatitude =[[origin objectForKey:@\"latitude\"] floatValue];\n    CGFloat originLongitude=[[origin objectForKey:@\"longitude\"] floatValue];\n    request.origin=[AMapGeoPoint locationWithLatitude:originLatitude longitude: originLongitude];\n    CGFloat destinationLatitude =[[origin objectForKey:@\"latitude\"] floatValue];\n    CGFloat destinationLongitude=[[origin objectForKey:@\"longitude\"] floatValue];\n    request.destination=[AMapGeoPoint locationWithLatitude:destinationLatitude longitude: destinationLongitude];\n\n    // 驾车导航策略，同驾车路径规划请求的策略（5 多策略除外）\n    request.strategy = strategy;\n    // 搜索类型\n    request.searchType = searchType;\n    \n//     道路周围搜索范围,单位米,[0-500]，默认250。\n    request.range= range;\n    \n    \n    self->jsCallBack =callback;\n    [self->_search AMapRoutePOISearch:request];\n    \n}\n\n\n\nRCT_EXPORT_METHOD(aMapPOIPolygonSearch:(NSArray *)points keywords:(NSString *)keywords page:(nonnull NSInteger *)page pageSize:(nonnull NSInteger *)pageSize types:(NSString *)types callback:(RCTResponseSenderBlock)callback){\n    \n    NSMutableArray<AMapGeoPoint *> *polygonPoints= [[NSMutableArray alloc] init];\n    if(points != nil && [points count] >= 2) {\n        for (NSInteger i = 0; i < [points count]; i++) {\n            NSDictionary* dict = [points objectAtIndex:i];\n            CGFloat latitude = [[dict objectForKey:@\"latitude\"] floatValue];\n            CGFloat longitude = [[dict objectForKey:@\"longitude\"] floatValue];\n            ;[polygonPoints addObject:[AMapGeoPoint locationWithLatitude:latitude longitude:longitude]];\n        }\n    }\n    \n    \n    \n    self->jsCallBack =callback;\n    \n    AMapGeoPolygon *polygon = [AMapGeoPolygon polygonWithPoints:polygonPoints];\n\n    AMapPOIPolygonSearchRequest *request = [[AMapPOIPolygonSearchRequest alloc] init];\n\n    request.polygon = polygon;\n    request.keywords = keywords;\n    request.page = page;\n    request.offset = pageSize;\n    request.types = types;\n \n    \n    [self->_search AMapPOIPolygonSearch:request];\n\n}\n\nRCT_EXPORT_METHOD(aMapPOIKeywordsSearch:(NSString *)keywords city:(NSString *)city types:(NSString *)types cityLimit:(BOOL)cityLimit page:(nonnull NSInteger *)page pageSize:(nonnull NSInteger *)pageSize callback:(RCTResponseSenderBlock)callback)\n{\n    AMapPOIKeywordsSearchRequest *request = [[AMapPOIKeywordsSearchRequest alloc] init];\n    self->jsCallBack =callback;\n    request.keywords = keywords;\n    request.city = city;\n    if(![types  isEqual: @\"\"]){\n    request.types = types;\n    }\n    request.cityLimit=cityLimit;\n    /* 设置分页页数 */\n      request.page = page;\n    /* 设置分页 */\n      request.offset = pageSize;\n    \n\n    \n    [self->_search AMapPOIKeywordsSearch:request];\n}\n\n\nRCT_EXPORT_METHOD(aMapPOIAroundSearch:(nonnull NSNumber *)latitude longitude:(nonnull NSNumber *)longitude keywords:(NSString *)keywords radius:(nonnull NSInteger *)radius city:(NSString *)city special:(BOOL)special page:(nonnull NSInteger *)page pageSize:(nonnull NSInteger *)pageSize types:(NSString*)types callback:(RCTResponseSenderBlock)callback ){\n\n  AMapPOIAroundSearchRequest *request = [[AMapPOIAroundSearchRequest alloc] init];\n\n  self->jsCallBack =callback;\n    \n  request.location = [AMapGeoPoint locationWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];\n  request.keywords = keywords;\n  /* 搜索城市 */\n  request.city=city;\n  /* 搜索半径 */\n    request.radius = radius;\n  /* 是否对结果进行人工干预 */\n//  request.special=special;\n  /* 设置分页页数 */\n    request.page = page;\n  /* 设置分页 */\n    request.offset = pageSize;\n  /*设置类型 */\n  request.types = types;\n  /* 按照距离排序. */\n  request.sortrule = 0;\n\n  [self->_search AMapPOIAroundSearch:request];\n}\n\n- (NSMutableArray *)formatData:(AMapPOISearchResponse *)response\n{\n    NSMutableArray *resultList;\n    if (response.pois.count == 0)\n    {\n    resultList = [NSMutableArray arrayWithCapacity:0];\n        return resultList;\n    }\n \n  resultList = [NSMutableArray arrayWithCapacity:response.pois.count];\n   if (response.pois.count > 0)\n   {\n       [response.pois enumerateObjectsUsingBlock:^(AMapPOI *obj, NSUInteger idx, BOOL *stop) {\n           \n           [resultList addObject:@{\n                                   @\"uid\": obj.uid, // uid\n                                   @\"name\": obj.name, // 名称\n                                   @\"type\": obj.type, //兴趣点类型\n                                   @\"typecode\": obj.typecode, // 类型编码\n                                   @\"latitude\": @(obj.location.latitude), //纬度\n                                   @\"longitude\": @(obj.location.longitude), //经度\n                                   @\"address\": obj.address, // 地址\n                                   @\"tel\": obj.tel, // 电话\n                                   @\"distance\": @(obj.distance), //距中心点的距离，单位米\n                                   @\"parkingType\":obj.parkingType, //停车场类型，地上、地下\n                                   @\"shopID\":obj.shopID, // 商铺id\n                                   @\"postcode\":obj.postcode, //邮编\n                                   @\"website\":obj.website, // 网址\n                                   @\"email\":obj.email, //电子邮件\n                                   @\"province\":obj.province, //省\n                                   @\"pcode\" : obj.pcode, //省编码\n                                   @\"city\": obj.city, //市\n                                   @\"citycode\":obj.citycode, //城市编码\n                                   @\"district\":obj.district, //区域名称\n                                   @\"adcode\":obj.adcode, // 区域编码\n                                   }];\n           \n       }];\n   }\n    return  resultList;\n}\n\n- (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response\n{\n  NSMutableArray *resultList = [self formatData:response];\n    if(!self->jsCallBack){\n        return;\n    }\n    self->jsCallBack(@[[NSNull null],resultList]);\n    self->jsCallBack= nil;\n\n}\n\n/* 沿途搜索回调. */\n- (void)onRoutePOISearchDone:(AMapRoutePOISearchRequest *)request response:(AMapRoutePOISearchResponse *)response\n{\n    NSMutableArray *resultList = [self formatData:response];\n      if(!self->jsCallBack){\n          return;\n      }\n      self->jsCallBack(@[[NSNull null],resultList]);\n      self->jsCallBack= nil;\n}\n\n- (void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error\n{\n   \n    if(!self->jsCallBack){\n        return;\n    }\n    self->jsCallBack(@[error,[NSNull null]]);\n    self->jsCallBack= nil;\n}\n\n\n@end\n"
  },
  {
    "path": "packages/react-native-amap-search/ios/AmapSearch.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\n\t\t5E555C0D2413F4C50049A1A2 /* AmapSearch.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E7B5891CC2AC0600A0062D /* AmapSearch.m */; };\n\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t58B511D91A9E6C8500147676 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"include/$(PRODUCT_NAME)\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t134814201AA4EA6300B7C361 /* libAmapSearch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAmapSearch.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\n\t\tB3E7B5881CC2AC0600A0062D /* AmapSearch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AmapSearch.h; sourceTree = \"<group>\"; };\n\t\tB3E7B5891CC2AC0600A0062D /* AmapSearch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AmapSearch.m; sourceTree = \"<group>\"; };\n\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t58B511D81A9E6C8500147676 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t134814211AA4EA7D00B7C361 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t134814201AA4EA6300B7C361 /* libAmapSearch.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t58B511D21A9E6C8500147676 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\n\t\t\t\tB3E7B5881CC2AC0600A0062D /* AmapSearch.h */,\n\t\t\t\tB3E7B5891CC2AC0600A0062D /* AmapSearch.m */,\n\n\t\t\t\t134814211AA4EA7D00B7C361 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t58B511DA1A9E6C8500147676 /* AmapSearch */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget \"AmapSearch\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t58B511D71A9E6C8500147676 /* Sources */,\n\t\t\t\t58B511D81A9E6C8500147676 /* Frameworks */,\n\t\t\t\t58B511D91A9E6C8500147676 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = AmapSearch;\n\t\t\tproductName = RCTDataManager;\n\t\t\tproductReference = 134814201AA4EA6300B7C361 /* libAmapSearch.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t58B511D31A9E6C8500147676 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0920;\n\t\t\t\tORGANIZATIONNAME = Facebook;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t58B511DA1A9E6C8500147676 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject \"AmapSearch\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 58B511D21A9E6C8500147676;\n\t\t\tproductRefGroup = 58B511D21A9E6C8500147676;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t58B511DA1A9E6C8500147676 /* AmapSearch */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t58B511D71A9E6C8500147676 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\n\t\t\t\tB3E7B58A1CC2AC0600A0062D /* AmapSearch.m in Sources */,\n\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t58B511ED1A9E6C8500147676 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t58B511EE1A9E6C8500147676 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t58B511F01A9E6C8500147676 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,\n\t\t\t\t\t\"$(SRCROOT)/../../../React/**\",\n\t\t\t\t\t\"$(SRCROOT)/../../react-native/React/**\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = AmapSearch;\n\t\t\t\tSKIP_INSTALL = YES;\n\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t58B511F11A9E6C8500147676 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,\n\t\t\t\t\t\"$(SRCROOT)/../../../React/**\",\n\t\t\t\t\t\"$(SRCROOT)/../../react-native/React/**\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = AmapSearch;\n\t\t\t\tSKIP_INSTALL = YES;\n\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t58B511D61A9E6C8500147676 /* Build configuration list for PBXProject \"AmapSearch\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t58B511ED1A9E6C8500147676 /* Debug */,\n\t\t\t\t58B511EE1A9E6C8500147676 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget \"AmapSearch\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t58B511F01A9E6C8500147676 /* Debug */,\n\t\t\t\t58B511F11A9E6C8500147676 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 58B511D31A9E6C8500147676 /* Project object */;\n}\n"
  },
  {
    "path": "packages/react-native-amap-search/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-amap-search\",\n  \"version\": \"2.0.1\",\n  \"description\": \"search\",\n  \"main\": \"lib/commonjs/index\",\n  \"module\": \"lib/module/index\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\",\n    \"react-native-amap-search.podspec\"\n  ],\n  \"scripts\": {\n    \"build\": \"bob build\"\n  },\n  \"keywords\": [\n    \"react-native\",\n    \"ios\",\n    \"android\"\n  ],\n  \"repository\": \"https://github.com/thundersdata-frontend/td-design/\",\n  \"author\": \"chenyingjie <929104662@qq.com> (https://github.com/thundersdata-frontend/td-design#readme)\",\n  \"license\": \"Apache-2.0\",\n  \"bugs\": {\n    \"url\": \"https://github.com/thundersdata-frontend/td-design/issues\"\n  },\n  \"homepage\": \"https://github.com/thundersdata-frontend/td-design/#readme\",\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"pod-install\": \"^0.1.38\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"commonjs\",\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  }\n}"
  },
  {
    "path": "packages/react-native-amap-search/react-native-amap-search.podspec",
    "content": "require \"json\"\n\npackage = JSON.parse(File.read(File.join(__dir__, \"package.json\")))\n\nPod::Spec.new do |s|\n  s.name         = \"react-native-amap-search\"\n  s.version      = package[\"version\"]\n  s.summary      = package[\"description\"]\n  s.homepage     = package[\"homepage\"]\n  s.license      = package[\"license\"]\n  s.authors      = package[\"author\"]\n\n  s.platforms    = { :ios => \"10.0\" }\n  s.source       = { :git => \"https://github.com/thundersdata-frontend/td-design/.git\", :tag => \"#{s.version}\" }\n\n  s.source_files = \"ios/**/*.{h,m,mm}\"\n\n  s.dependency \"React-Core\"\n  s.dependency 'AMapSearch', \"~>9.4.5 \"\nend\n"
  },
  {
    "path": "packages/react-native-amap-search/scripts/bootstrap.js",
    "content": "const path = require('path');\nconst child_process = require('child_process');\n\nconst root = path.resolve(__dirname, '..');\nconst args = process.argv.slice(2);\nconst options = {\n  cwd: process.cwd(),\n  env: process.env,\n  stdio: 'inherit',\n  encoding: 'utf-8',\n};\n\nlet result;\n\nif (process.cwd() !== root || args.length) {\n  // We're not in the root of the project, or additional arguments were passed\n  // In this case, forward the command to `yarn`\n  result = child_process.spawnSync('yarn', args, options);\n} else {\n  // If `yarn` is run without arguments, perform bootstrap\n  result = child_process.spawnSync('yarn', ['bootstrap'], options);\n}\n\nprocess.exitCode = result.status;\n"
  },
  {
    "path": "packages/react-native-amap-search/src/constant.ts",
    "content": "export const RADIUS = 1500;\nexport const SPECIAL = true;\nexport const PAGE = 1;\nexport const PAGESIZE = 20;\n"
  },
  {
    "path": "packages/react-native-amap-search/src/index.tsx",
    "content": "import { NativeModules } from 'react-native';\n\nimport useAMapSearch from './useSearch';\n\nconst AMapSearchManager = NativeModules.AMapSearchManager;\n\nconst init = AMapSearchManager.initSDK;\n\nexport { useAMapSearch, init };\n"
  },
  {
    "path": "packages/react-native-amap-search/src/typing.d.ts",
    "content": "interface AMapGeoPoint {\n  /** 纬度*/\n  latitude: number;\n  /** 经度*/\n  longitude: number;\n}\ninterface SearchPOIParams {\n  /**纬度 */\n  latitude: number;\n  /**经度 */\n  longitude: number; // 经度\n  /** 关键字*/\n  keywords?: string;\n  /**范围 */\n  radius?: number;\n  /** 是否指定城市*/\n  city?: string;\n  /** 是否人工干预*/\n  special?: boolean;\n  /**页数 */\n  page?: number;\n  /**一页的数量 */\n  pageSize?: number;\n  /**文本分类、分类代码 */\n  types?: string;\n}\n\ninterface KeyWordsSearchPOIParams {\n  /**关键字 */\n  keywords?: string;\n  /**范围 */\n  cityLimit?: boolean;\n  /**是否指定城市 */\n  city?: string;\n  /**是否人工干预 */\n  special?: boolean;\n  /**页数 */\n  page?: number;\n  /**一页的数量 */\n  pageSize?: number;\n  /**文本分类、分类代码 */\n  types?: string;\n}\n\ninterface PolygonSearchParams {\n  /** 多边形的点*/\n  points: AMapGeoPoint[];\n  /**关键字 */\n  keywords: string;\n  /**页数 */\n  page?: number;\n  /**一页的数量 */\n  pageSize?: number;\n  /**文本分类、分类代码 */\n  types?: string;\n}\n\ninterface RouteSearchParams {\n  /**开始位置 */\n  origin: AMapGeoPoint;\n  /** 结束位置*/\n  destination: AMapGeoPoint;\n  /** 驾车导航策略*/\n  strategy?: number;\n  /**搜索类型 */\n  searchType?: number;\n  /**道路周围搜索范围,单位米,[0-500]，默认250。 */\n  range?: number;\n}\n\ninterface ResultPOI {\n  /**POI全局唯一ID */\n  uid: string;\n  /**名称 */\n  name: string;\n  /**兴趣点类型 */\n  type: string;\n  /**类型编码 */\n  typecode: string;\n  /** 纬度*/\n  latitude: number;\n  /**经度 */\n  longitude: number;\n  /**地址 */\n  address: string;\n  /**电话 */\n  tel: string;\n  /**距中心点的距离，单位米 */\n  distance: number;\n  /**停车场类型，地上、地下 */\n  parkingType: string;\n  /**商铺id */\n  shopID: string;\n  /**邮编 */\n  postcode: string;\n  /**网址 */\n  website: string;\n  /** 电子邮件*/\n  email: string;\n  /**省 */\n  province: string;\n  /**省编码 */\n  pcode: string;\n  /** 市*/\n  city: string;\n  /**城市编码 */\n  citycode: string;\n  /** 区域名称*/\n  district: string;\n  /**区域编码 */\n  adcode: string;\n}\n"
  },
  {
    "path": "packages/react-native-amap-search/src/useSearch.tsx",
    "content": "import { useCallback, useState } from 'react';\nimport { NativeModules } from 'react-native';\n\nimport { PAGE, PAGESIZE, RADIUS, SPECIAL } from './constant';\n\nconst AMapSearchManager = NativeModules.AMapSearchManager;\nfunction useAMapSearch() {\n  const [data, setData] = useState<ResultPOI[]>();\n\n  const onPOISearchDone = useCallback((err: any, result: ResultPOI[]) => {\n    if (err) {\n      Error('err');\n    } else {\n      setData(result);\n    }\n  }, []);\n\n  const aMapPOIAroundSearch = useCallback(\n    (params: SearchPOIParams) => {\n      const {\n        latitude,\n        longitude,\n        keywords = '',\n        radius = RADIUS,\n        city = '',\n        special = SPECIAL,\n        page = PAGE,\n        pageSize = PAGESIZE,\n        types = '',\n      } = params;\n\n      AMapSearchManager.aMapPOIAroundSearch(\n        latitude,\n        longitude,\n        keywords,\n        radius,\n        city,\n        special,\n        page,\n        pageSize,\n        types,\n        onPOISearchDone\n      );\n    },\n    [onPOISearchDone]\n  );\n\n  const aMapPOIKeywordsSearch = useCallback(\n    (params: KeyWordsSearchPOIParams) => {\n      const { keywords = '', city = '', page = PAGE, pageSize = PAGESIZE, types = '', cityLimit = false } = params;\n\n      AMapSearchManager.aMapPOIKeywordsSearch(keywords, city, types, cityLimit, page, pageSize, onPOISearchDone);\n    },\n    [onPOISearchDone]\n  );\n\n  const aMapPOIPolygonSearch = useCallback(\n    (params: PolygonSearchParams) => {\n      const { points = [], keywords = '', page = PAGE, pageSize = PAGESIZE, types = '' } = params;\n\n      AMapSearchManager.aMapPOIPolygonSearch(points, keywords, page, pageSize, types, onPOISearchDone);\n    },\n    [onPOISearchDone]\n  );\n\n  const aMapRoutePOISearch = useCallback(\n    (params: RouteSearchParams) => {\n      const { origin, destination, strategy = 0, searchType = 0, range = 250 } = params;\n\n      AMapSearchManager.aMapRoutePOISearch(origin, destination, strategy, searchType, range, onPOISearchDone);\n    },\n    [onPOISearchDone]\n  );\n\n  return {\n    aMapPOIKeywordsSearch: aMapPOIKeywordsSearch,\n    aMapPOIAroundSearch: aMapPOIAroundSearch,\n    aMapPOIPolygonSearch: aMapPOIPolygonSearch,\n    aMapRoutePOISearch: aMapRoutePOISearch,\n    data: data,\n  };\n}\n\nexport default useAMapSearch;\n"
  },
  {
    "path": "packages/react-native-amap-search/tsconfig.build.json",
    "content": "{\n  \"extends\": \"./tsconfig\",\n  \"exclude\": [\"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-amap-search/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"baseUrl\": \"./\",\n    \"paths\": {\n      \"react-native-amap-search\": [\"./src/index\"]\n    },\n    \"allowUnreachableCode\": false,\n    \"allowUnusedLabels\": false,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"jsx\": \"react\",\n    \"lib\": [\"esnext\"],\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"noFallthroughCasesInSwitch\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitUseStrict\": false,\n    \"noStrictGenericChecks\": false,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"target\": \"esnext\"\n  }\n}\n"
  },
  {
    "path": "packages/react-native-calendar/CHANGELOG.md",
    "content": "# @td-design/react-native-calendar\n\n## 2.5.3\n\n### Patch Changes\n\n- [#936](https://github.com/thundersdata-frontend/td-design/pull/936) [`dbe3d588d`](https://github.com/thundersdata-frontend/td-design/commit/dbe3d588da78ae38e6f08603013ea1cb15bacaff) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复picker组件修改后引起的bug\n\n## 2.5.2\n\n### Patch Changes\n\n- [#890](https://github.com/thundersdata-frontend/td-design/pull/890) [`fe9a1ab9d`](https://github.com/thundersdata-frontend/td-design/commit/fe9a1ab9d4cb8133257138c2f6430194faf59af3) Thanks [@chj-damon](https://github.com/chj-damon)! - 删除 `react-native-redash`依赖优化`react-native-picker` 的`onChange`事件的参数类型问题\n\n## 2.5.1\n\n### Patch Changes\n\n- [#714](https://github.com/thundersdata-frontend/td-design/pull/714) [`ef6d88136`](https://github.com/thundersdata-frontend/td-design/commit/ef6d88136421ea13b19b11730f94b589047c5a8b) Thanks [@chj-damon](https://github.com/chj-damon)! - 继续优化组件样式\n\n## 2.5.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 样式优化\n\n## 2.4.1\n\n### Patch Changes\n\n- [#677](https://github.com/thundersdata-frontend/td-design/pull/677) [`469b748a3`](https://github.com/thundersdata-frontend/td-design/commit/469b748a33b288afc288be969a193eae0e2f6d13) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化组件同时为一些组件补充 activeOpacity 属性\n\n## 2.4.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n## 2.3.10\n\n### Patch Changes\n\n- [#625](https://github.com/thundersdata-frontend/td-design/pull/625) [`5efa85848`](https://github.com/thundersdata-frontend/td-design/commit/5efa858485f78542b293404baa504e11182830bb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 useTheme 引入路径不正确导致报错的问题\n"
  },
  {
    "path": "packages/react-native-calendar/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-calendar\",\n  \"version\": \"2.5.3\",\n  \"description\": \"基于 @td-design/react-native 的日历组件\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"dependencies\": {\n    \"dayjs\": \"^1.11.9\"\n  },\n  \"devDependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@td-design/rn-hooks\": \"workspace:^2.8.1\",\n    \"@td-design/react-native-picker\": \"workspace:^5.0.0\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-gesture-handler\": \"^2.12.0\",\n    \"react-native-reanimated\": \"^3.3.0\",\n    \"react-native-svg\": \"^13.10.0\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Agenda/index.tsx",
    "content": "import React from 'react';\nimport { FlatList, ListRenderItemInfo, StyleSheet } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport Svg, { Circle } from 'react-native-svg';\n\nimport { Box, Flex, helpers, Pressable, SvgIcon, Text, Theme, useTheme, WhiteSpace } from '@td-design/react-native';\n\nimport { AgendaProps, Item } from '../../type';\nimport Calendar from '../Calendar';\nimport useAgenda from './useAgenda';\n\nconst { px, ONE_PIXEL } = helpers;\n\nfunction Agenda<ItemT extends Item>({\n  data = [],\n  renderItem,\n  keyExtractor,\n  firstDay,\n  activeOpacity = 0.6,\n  ...restProps\n}: AgendaProps<ItemT>) {\n  const theme = useTheme<Theme>();\n\n  const { contentStyle, iconWrapStyle, expanded, handleMonthChange } = useAgenda({ firstDay });\n\n  const styles = StyleSheet.create({\n    iconBtn: {\n      justifyContent: 'center',\n      alignItems: 'center',\n      height: px(30),\n    },\n    list: { backgroundColor: theme.colors.white, flex: 1 },\n  });\n\n  const handleRenderItem = (itemInfo: ListRenderItemInfo<ItemT>) => {\n    if (renderItem) {\n      return renderItem(itemInfo);\n    } else {\n      const { item } = itemInfo;\n      return (\n        <Pressable onPress={item.onPress} activeOpacity={activeOpacity}>\n          <Flex borderStyle=\"solid\" borderBottomColor=\"border\" borderBottomWidth={ONE_PIXEL} paddingHorizontal=\"x2\">\n            <Svg height={theme.borderRadii.x2} width={theme.borderRadii.x2}>\n              <Circle\n                cx={theme.borderRadii.x1}\n                cy={theme.borderRadii.x1}\n                r={theme.borderRadii.x1}\n                fill={theme.colors.func300}\n              />\n            </Svg>\n            <Box paddingVertical={'x2'} marginLeft={'x2'}>\n              <Text variant=\"p0\" color=\"text\" marginBottom={'x1'}>\n                {item.title}\n              </Text>\n              <Text variant=\"p1\" color=\"text\">\n                {item.time}\n              </Text>\n            </Box>\n          </Flex>\n        </Pressable>\n      );\n    }\n  };\n\n  return (\n    <Box flex={1}>\n      <Calendar\n        onMonthChange={handleMonthChange}\n        contentStyle={[{ overflow: 'hidden' }, contentStyle] as any}\n        activeOpacity={activeOpacity}\n        {...restProps}\n      />\n      <Pressable\n        activeOpacity={1}\n        onPress={() => {\n          expanded.value = !expanded.value;\n        }}\n        style={styles.iconBtn}\n      >\n        <Animated.View style={iconWrapStyle}>\n          <SvgIcon name=\"up\" size={px(24)} color={theme.colors.gray500} />\n        </Animated.View>\n      </Pressable>\n      <WhiteSpace backgroundColor={theme.colors.gray50} />\n      <FlatList\n        data={data}\n        renderItem={handleRenderItem}\n        keyExtractor={keyExtractor}\n        contentContainerStyle={styles.list}\n      />\n    </Box>\n  );\n}\n\nexport default Agenda;\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Agenda/useAgenda.ts",
    "content": "import { useMemo } from 'react';\nimport { useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { helpers } from '@td-design/react-native';\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport dayjs from 'dayjs';\n\nimport { DAY_WIDTH } from '../../constant';\nimport { getRows } from '../../dateUtils';\nimport { AgendaProps, Item } from '../../type';\n\nconst { px } = helpers;\nconst dayItemHeight = DAY_WIDTH + px(16);\nexport default function useAgenda<ItemT extends Item>({ firstDay }: Pick<AgendaProps<ItemT>, 'firstDay'>) {\n  const [currentMonth, setCurrentMonth] = useSafeState(dayjs());\n\n  const expanded = useSharedValue(false);\n  const animation = useDerivedValue(() => (expanded.value ? withTiming(1) : withTiming(0)));\n\n  const handleMonthChange = (month: string) => {\n    setCurrentMonth(dayjs(month + '-01'));\n  };\n\n  const y = useMemo(() => {\n    const rows = getRows(currentMonth, firstDay);\n    return rows * dayItemHeight;\n  }, [currentMonth, firstDay]);\n\n  const contentStyle = useAnimatedStyle(() => ({\n    height: mix(animation.value, y, 0),\n  }));\n\n  const iconWrapStyle = useAnimatedStyle(() => ({\n    transform: [{ rotateZ: `${mix(animation.value, 0, Math.PI)}rad` }],\n  }));\n\n  return { contentStyle, iconWrapStyle, expanded, handleMonthChange: useMemoizedFn(handleMonthChange) };\n}\n\nconst mix = (value: number, x: number, y: number) => {\n  'worklet';\n  return x * (1 - value) + y * value;\n};\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Calendar/index.tsx",
    "content": "import React from 'react';\nimport { Directions, FlingGestureHandler } from 'react-native-gesture-handler';\n\nimport dayjs from 'dayjs';\n\nimport { CalendarProps } from '../../type';\nimport useCalendar from './useCalendar';\n\nconst Calendar: React.FC<CalendarProps> = ({ enableSwipeMonths = true, ...restProps }) => {\n  const { isFold, renderCalendar, handlerStateChange } = useCalendar(restProps);\n\n  if (!enableSwipeMonths || !isFold) return <>{renderCalendar()}</>;\n  return (\n    <FlingGestureHandler direction={Directions.LEFT} onHandlerStateChange={event => handlerStateChange(event, 'left')}>\n      <FlingGestureHandler\n        direction={Directions.RIGHT}\n        onHandlerStateChange={event => handlerStateChange(event, 'right')}\n      >\n        {renderCalendar()}\n      </FlingGestureHandler>\n    </FlingGestureHandler>\n  );\n};\n\nexport default React.memo(Calendar, (prevProps, nextProps) => {\n  // 返回false才会触发渲染\n  let shouldUpdate = true;\n\n  if (prevProps.current?.format('YYYY-MM') !== nextProps.current?.format('YYYY-MM')) {\n    shouldUpdate = false;\n  }\n\n  if (JSON.stringify(prevProps?.markedDates) !== JSON.stringify(nextProps?.markedDates)) {\n    shouldUpdate = false;\n  }\n\n  shouldUpdate = [\n    'hideExtraDays',\n    'showSixWeeks',\n    'showArrowLeft',\n    'showArrowRight',\n    'firstDay',\n    'enableSwipeMonths',\n    'contentStyle',\n    'monthWrapperStyle',\n  ].reduce((prev, next) => {\n    if (!prev || nextProps[next as keyof CalendarProps] !== prevProps[next as keyof CalendarProps]) {\n      return false;\n    }\n    return true;\n  }, shouldUpdate);\n\n  shouldUpdate = ['minDate', 'maxDate'].reduce((prev, next) => {\n    const prevDate = prevProps[next as keyof CalendarProps] as CalendarProps['minDate'] | CalendarProps['maxDate'];\n    const nextDate = nextProps[next as keyof CalendarProps] as CalendarProps['minDate'] | CalendarProps['maxDate'];\n    if (!prev) {\n      return false;\n    } else if (prevDate !== nextDate) {\n      if (prevDate && nextDate && dayjs(prevDate).format('YYYY-MM') === dayjs(nextDate).format('YYYY-MM')) {\n        return true;\n      } else {\n        return false;\n      }\n    }\n    return prev;\n  }, shouldUpdate);\n\n  return shouldUpdate;\n});\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Calendar/useCalendar.tsx",
    "content": "import React, { ReactNode, useEffect } from 'react';\nimport { FlingGestureHandlerStateChangeEvent, State } from 'react-native-gesture-handler';\nimport Animated from 'react-native-reanimated';\n\nimport { Box, Flex, Theme, useTheme } from '@td-design/react-native';\nimport { DatePicker } from '@td-design/react-native-picker';\nimport { useBoolean, useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport dayjs, { Dayjs } from 'dayjs';\n\nimport { dateFormat, dayjsToData, fromTo, isGTE, isLTE, page, sameDate, sameMonth } from '../../dateUtils';\nimport { CalendarProps, CurDateType, DateObject, MarkedDates, PeriodMarking, StateType } from '../../type';\nimport Day from '../Day/';\nimport CalendarHeader from '../Header';\nimport Period from '../Period';\n\nexport default function useCalendar({\n  current,\n  minDate,\n  maxDate,\n  markedDates = {},\n  markingType = 'dot',\n  showSixWeeks = false,\n  hideExtraDays = false,\n  firstDay = 0,\n  style,\n  contentStyle,\n  monthWrapperStyle,\n  onDayPress,\n  onMonthChange,\n  activeOpacity = 0.6,\n  ...restProps\n}: CalendarProps) {\n  const theme = useTheme<Theme>();\n  const [currentMonth, setCurrentMonth] = useSafeState<Dayjs>(current || dayjs());\n  const [curMarkedDates, setCurMarkedDates] = useSafeState<MarkedDates>({});\n  const [isFold, { setTrue, setFalse }] = useBoolean(true);\n\n  const markedDatesJsonString = JSON.stringify(markedDates);\n\n  useEffect(() => {\n    const markedDatesObj = JSON.parse(markedDatesJsonString);\n    if (markingType === 'dot') {\n      // 设置current为默认选中\n      setCurMarkedDates({ [dateFormat(currentMonth)]: { selected: true } });\n    } else {\n      setCurMarkedDates(markedDatesObj);\n    }\n  }, [currentMonth, markingType, markedDatesJsonString, setCurMarkedDates]);\n\n  const updateMonth = (day: Dayjs) => {\n    if (dateFormat(day, 'YYYY-MM') === dateFormat(currentMonth, 'YYYY-MM')) {\n      return;\n    }\n    setCurrentMonth(day);\n  };\n\n  /** 判断日期是否在区间 */\n  const isDateNotInTheRange = (date: Dayjs, minDate?: CurDateType, maxDate?: CurDateType) => {\n    // 当前日期比最小日期小 || 当前日期比最大日期大\n    return (minDate && !isGTE(date, minDate)) || (maxDate && !isLTE(date, maxDate));\n  };\n\n  const pressDay = (date: DateObject) => {\n    const _date = dayjs(date.dateString);\n    let state = {};\n    // 当前日期比最小日期大 && 当前日期比最大日期小\n    if (!(minDate && !isGTE(_date, minDate)) && !(maxDate && !isLTE(_date, maxDate))) {\n      updateMonth(_date);\n      if (markingType === 'dot') {\n        state = {\n          [dateFormat(_date)]: { selected: true },\n        };\n      } else {\n        const markedDatesArr = Object.entries(curMarkedDates);\n        // 此时curMarkedDates为{}\n        if (markedDatesArr.length === 0) {\n          state = { [dateFormat(_date)]: { selected: true, startingDay: true } };\n        } else {\n          // 计算中此时curMarkedDates中的开始日期和结束日期\n          const startDate = markedDatesArr.find(item => (item[1] as PeriodMarking).startingDay)?.[0];\n          const endDate = markedDatesArr.find(item => (item[1] as PeriodMarking).endingDay)?.[0];\n          // 此时curMarkedDates中已经有选中的时间段，则进行清空并赋值开始日期\n          if (startDate && endDate) {\n            state = { [dateFormat(_date)]: { selected: true, startingDay: true } };\n          } else {\n            // 此时curMarkedDates中有开始时间或者是结束时间\n            const _markedDates: Record<string, any> = {};\n            // 计算出开始日期和当前选中日期之间的date\n            let from = dayjs(startDate || endDate);\n            let to = _date;\n            if (isGTE(from, to)) {\n              [to, from] = [from, to];\n            }\n            const dates = fromTo(from, to);\n            dates.map(item => (_markedDates[dateFormat(item)] = { selected: true }));\n            state = {\n              ..._markedDates,\n              [dateFormat(from)]: { selected: true, startingDay: true },\n              [dateFormat(to)]: { selected: true, endingDay: true },\n            };\n          }\n        }\n      }\n      setCurMarkedDates(state);\n      onDayPress?.(date, state);\n    }\n  };\n\n  const renderDayComponent = () => {\n    switch (markingType) {\n      case 'period':\n        return Period;\n      default:\n        return Day;\n    }\n  };\n\n  /** 天 */\n  const renderDay = (day: Dayjs, id: number) => {\n    let state = '';\n\n    if (isDateNotInTheRange(day, minDate, maxDate)) {\n      state = 'disabled';\n    } else if (!sameMonth(day, currentMonth)) {\n      state = 'otherMonth';\n    } else if (sameDate(day, dayjs())) {\n      state = 'today';\n    }\n\n    if (!sameMonth(day, currentMonth) && hideExtraDays) {\n      return <Box flex={1} key={id} />;\n    }\n\n    const DayComp = renderDayComponent();\n    const dateAsObject = dayjsToData(day);\n\n    const propsMarking = markedDates[dateFormat(day)] ?? {};\n    const stateMarking = curMarkedDates[dateFormat(day)] ?? {};\n\n    const dayProps = {\n      state: state as StateType,\n      onPress: pressDay,\n      date: dateAsObject,\n      activeOpacity,\n      marking: { ...propsMarking, ...stateMarking },\n    };\n\n    return (\n      <Flex justifyContent=\"center\" style={{ flex: 1 }} key={id}>\n        <DayComp {...dayProps}>{day.date()}</DayComp>\n      </Flex>\n    );\n  };\n\n  /** 周 */\n  const renderWeek = (days: Dayjs[], id: number) => {\n    const week: ReactNode[] = [];\n\n    days.forEach((day, id2) => {\n      week.push(renderDay(day, id2));\n    });\n\n    return <Flex key={id}>{week}</Flex>;\n  };\n\n  /** 月 */\n  const renderMonth = () => {\n    const shouldShowSixWeeks = showSixWeeks && !hideExtraDays;\n    const days = page(currentMonth, firstDay, shouldShowSixWeeks);\n    const weeks = [];\n\n    while (days.length) {\n      weeks.push(renderWeek(days.splice(0, 7), weeks.length));\n    }\n\n    return <Animated.View style={monthWrapperStyle}>{weeks}</Animated.View>;\n  };\n\n  const addMonth = (count: number) => {\n    updateMonth(currentMonth.add(count, 'month'));\n  };\n\n  const handlerStateChange = ({ nativeEvent }: FlingGestureHandlerStateChangeEvent, direction: 'left' | 'right') => {\n    if (nativeEvent.oldState === State.ACTIVE) {\n      addMonth(direction === 'left' ? 1 : -1);\n    }\n  };\n\n  const handleChange = (date?: Date) => {\n    setCurrentMonth(dayjs(date));\n    onMonthChange?.(dateFormat(dayjs(date), 'YYYY-MM'));\n  };\n\n  const renderDatePicker = () => {\n    return <DatePicker value={currentMonth.toDate()} onChange={handleChange} />;\n  };\n\n  const renderCalendar = () => (\n    <Animated.View\n      style={[\n        {\n          paddingHorizontal: theme.spacing.x2,\n          backgroundColor: theme.colors.white,\n        },\n        style,\n      ]}\n    >\n      <CalendarHeader\n        month={currentMonth}\n        firstDay={firstDay}\n        onPressArrowDown={setFalse}\n        onPressArrowUp={setTrue}\n        onPressArrowLeft={addMonth}\n        onPressArrowRight={addMonth}\n        showDown={isFold}\n        activeOpacity={activeOpacity}\n        dayNamesStyle={markingType === 'period' ? { marginBottom: theme.spacing.x1 } : {}}\n        {...restProps}\n      />\n      <Animated.View style={contentStyle}>{isFold ? renderMonth() : renderDatePicker()}</Animated.View>\n    </Animated.View>\n  );\n\n  return {\n    isFold,\n    renderCalendar,\n    handlerStateChange: useMemoizedFn(handlerStateChange),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/CalendarList/index.tsx",
    "content": "import React from 'react';\nimport { FlatList, ListRenderItemInfo } from 'react-native';\n\nimport { Box, helpers, Text } from '@td-design/react-native';\n\nimport { CALENDAR_HEIGHT } from '../../constant';\nimport { CalendarListProps, RowItem } from '../../type';\nimport Calendar from '../Calendar';\nimport useCalendarList from './useCalendarList';\n\nconst { deviceWidth } = helpers;\n\nconst CalendarList: React.FC<CalendarListProps> = props => {\n  const { rows, getItemLayout, handleViewableItemsChanged } = useCalendarList(props);\n\n  const {\n    pastScrollRange = 12,\n    horizontal = false,\n    calendarWidth = deviceWidth,\n    calendarHeight = CALENDAR_HEIGHT,\n    activeOpacity = 0.6,\n    ...restProps\n  } = props;\n  const renderItem = ({ item }: ListRenderItemInfo<RowItem>) => {\n    if (!item.isShowDate) {\n      return (\n        <Box\n          height={calendarHeight}\n          width={calendarWidth}\n          justifyContent=\"center\"\n          alignItems=\"center\"\n          backgroundColor=\"background\"\n        >\n          <Text variant=\"h0\" color=\"text\">\n            {item.date.format('YYYY-MM-DD')}\n          </Text>\n        </Box>\n      );\n    }\n    return (\n      <Calendar\n        current={item.date}\n        style={{ height: calendarHeight, width: calendarWidth }}\n        showArrowLeft={false}\n        showArrowRight={false}\n        hideExtraDays={true}\n        activeOpacity={activeOpacity}\n        {...restProps}\n      />\n    );\n  };\n\n  return (\n    <FlatList\n      data={rows}\n      keyExtractor={(_, index) => `${index}`}\n      renderItem={renderItem}\n      getItemLayout={getItemLayout}\n      viewabilityConfig={{\n        itemVisiblePercentThreshold: 20,\n      }}\n      onViewableItemsChanged={handleViewableItemsChanged}\n      initialScrollIndex={pastScrollRange}\n      scrollEnabled={true}\n      horizontal={horizontal}\n      pagingEnabled={horizontal}\n    />\n  );\n};\n\nexport default CalendarList;\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/CalendarList/useCalendarList.ts",
    "content": "import { useEffect } from 'react';\nimport { ViewToken } from 'react-native';\n\nimport { helpers } from '@td-design/react-native';\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport dayjs, { Dayjs } from 'dayjs';\n\nimport { CALENDAR_HEIGHT } from '../../constant';\nimport { CalendarListProps, RowItem } from '../../type';\n\nconst { deviceWidth } = helpers;\nexport default function useCalendarList({\n  current = dayjs(),\n  pastScrollRange = 12,\n  futureScrollRange = 12,\n  horizontal = false,\n  calendarWidth = deviceWidth,\n  calendarHeight = CALENDAR_HEIGHT,\n}: CalendarListProps) {\n  const [rows, setRows] = useSafeState<RowItem[]>([]);\n  const [currentDate] = useSafeState<Dayjs>(current);\n\n  useEffect(() => {\n    const _rows: RowItem[] = [];\n\n    new Array(pastScrollRange + futureScrollRange).fill('').map((_, i) => {\n      const rangeDate = currentDate.add(i - pastScrollRange, 'month');\n\n      if ((pastScrollRange - 1 <= i && i <= pastScrollRange + 1) || (!pastScrollRange && i <= pastScrollRange + 2)) {\n        _rows.push({ date: rangeDate, isShowDate: true });\n      } else {\n        _rows.push({ date: rangeDate, isShowDate: false });\n      }\n    });\n\n    setRows(_rows);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [currentDate, pastScrollRange, futureScrollRange]);\n\n  const getItemLayout = (_: ArrayLike<any> | null | undefined, index: number) => {\n    return {\n      length: horizontal ? calendarWidth : calendarHeight,\n      offset: (horizontal ? calendarWidth : calendarHeight) * index,\n      index,\n    };\n  };\n\n  const rowIsCloseToViewable = (index: number, distance: number, viewableItems: Array<ViewToken>) => {\n    for (let i = 0; i < viewableItems.length; i++) {\n      if (Math.abs(index - viewableItems[i].index!) <= distance) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  const handleViewableItemsChanged = ({ viewableItems }: { viewableItems: Array<ViewToken> }) => {\n    setRows(rows => {\n      const newRows: RowItem[] = [];\n\n      rows.map((item, index) => {\n        let val = item.date;\n        const rowShouldBeRendered = rowIsCloseToViewable(index, 1, viewableItems);\n\n        if (rowShouldBeRendered && !item.isShowDate) {\n          val = current.add(index - pastScrollRange, 'month');\n          newRows.push({ date: val, isShowDate: true });\n        } else if (!rowShouldBeRendered) {\n          newRows.push({ date: val, isShowDate: false });\n        } else {\n          newRows.push({ date: val, isShowDate: true });\n        }\n      });\n\n      return newRows;\n    });\n  };\n\n  return {\n    rows,\n    getItemLayout: useMemoizedFn(getItemLayout),\n    handleViewableItemsChanged: useMemoizedFn(handleViewableItemsChanged),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Day/index.tsx",
    "content": "import React from 'react';\nimport { StyleSheet } from 'react-native';\nimport Svg, { Circle } from 'react-native-svg';\n\nimport { Pressable, Text, Theme, useTheme } from '@td-design/react-native';\n\nimport { DAY_WIDTH } from '../../constant';\nimport { DayProps } from '../../type';\n\nconst Day: React.FC<DayProps> = ({ state, date, onPress, marking = {}, activeOpacity, children }) => {\n  const theme = useTheme<Theme>();\n\n  const { dotColor, selected, disabled, selectedColor } = marking;\n\n  const isDisabled = state === 'disabled' || disabled;\n  const isToday = state === 'today';\n  const isOtherMonth = state === 'otherMonth';\n\n  const handlePress = () => {\n    if (!isDisabled) {\n      onPress(date);\n    }\n  };\n\n  const styles = StyleSheet.create({\n    container: {\n      width: DAY_WIDTH,\n      height: DAY_WIDTH,\n      alignItems: 'center',\n      justifyContent: 'center',\n      marginVertical: theme.spacing.x2,\n    },\n    selected: {\n      backgroundColor: selectedColor || theme.colors.primary200,\n      borderRadius: theme.borderRadii.x1,\n    },\n    dot: {\n      backgroundColor: dotColor,\n      width: theme.borderRadii.x1,\n      height: theme.borderRadii.x1,\n      borderRadius: theme.borderRadii.x1,\n    },\n  });\n\n  let color: any = 'text';\n  if (selected) {\n    color = 'white';\n  } else if (!selected && isToday) {\n    color = 'primary200';\n  } else if (isDisabled || isOtherMonth) {\n    color = 'disabled';\n  }\n\n  return (\n    <Pressable\n      activeOpacity={activeOpacity}\n      style={StyleSheet.flatten([styles.container, selected && styles.selected])}\n      onPress={handlePress}\n    >\n      <Text variant=\"p1\" color={color}>\n        {String(children)}\n      </Text>\n      <Svg height={theme.borderRadii.x2} width={theme.borderRadii.x2}>\n        <Circle\n          cx={theme.borderRadii.x1}\n          cy={theme.borderRadii.x1}\n          r={theme.borderRadii.x1}\n          fill={dotColor ?? 'transparent'}\n        />\n      </Svg>\n    </Pressable>\n  );\n};\n\nexport default React.memo(Day);\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Header/index.tsx",
    "content": "import React from 'react';\nimport { View, ViewStyle } from 'react-native';\n\nimport { Flex, helpers, Pressable, SvgIcon, Text, Theme, useTheme } from '@td-design/react-native';\nimport dayjs from 'dayjs';\n\nimport { WEEK_DAY_NAMES } from '../../constant';\nimport { dateFormat } from '../../dateUtils';\nimport { ArrowDirection, CalendarHeaderControlProps, CalendarHeaderProps } from '../../type';\n\nconst { ONE_PIXEL } = helpers;\n\nconst CalendarHeader: React.FC<CalendarHeaderProps & CalendarHeaderControlProps> = ({\n  month = dayjs(),\n  monthFormat = 'YYYY年MM月',\n  firstDay,\n  showDown = true,\n  headerStyle,\n  dayNamesStyle,\n  showArrowLeft = true,\n  showArrowRight = true,\n  activeOpacity,\n  onPressArrowLeft,\n  onPressArrowRight,\n  onPressArrowDown,\n  onPressArrowUp,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const handlePress = (direction: ArrowDirection) => {\n    switch (direction) {\n      case 'left':\n        onPressArrowLeft?.(-1);\n        break;\n      case 'right':\n        onPressArrowRight?.(1);\n        break;\n      case 'down':\n        onPressArrowDown?.();\n        break;\n      case 'up':\n        onPressArrowUp?.();\n        break;\n    }\n  };\n\n  const renderArrow = (direction: ArrowDirection, style?: ViewStyle) => {\n    return (\n      <Pressable\n        activeOpacity={activeOpacity}\n        onPress={() => handlePress(direction)}\n        style={[{ padding: theme.spacing.x2 }, style]}\n        hitOffset={10}\n      >\n        <SvgIcon name={direction} color={theme.colors.gray500} />\n      </Pressable>\n    );\n  };\n\n  const renderDayNames = () => {\n    let _dayNames = WEEK_DAY_NAMES;\n    if (firstDay) {\n      _dayNames = WEEK_DAY_NAMES.slice(firstDay).concat(_dayNames.slice(0, firstDay));\n    }\n\n    return (\n      <Flex style={dayNamesStyle} marginVertical=\"x2\" justifyContent=\"space-around\">\n        {_dayNames.map((day, idx) => (\n          <Text key={idx} variant=\"p1\" color=\"text\" numberOfLines={1}>\n            {day}\n          </Text>\n        ))}\n      </Flex>\n    );\n  };\n\n  return (\n    <View>\n      <Flex\n        justifyContent=\"space-between\"\n        paddingVertical=\"x2\"\n        borderBottomColor=\"border\"\n        borderBottomWidth={ONE_PIXEL}\n        style={headerStyle}\n      >\n        <Pressable\n          activeOpacity={activeOpacity}\n          style={{ flexDirection: 'row', alignItems: 'center' }}\n          onPress={() => handlePress(showDown ? 'down' : 'up')}\n        >\n          <Text variant=\"p1\" color=\"text\">\n            {month.format(monthFormat)}\n          </Text>\n          <SvgIcon name={showDown ? 'down' : 'up'} color={theme.colors.gray500} />\n        </Pressable>\n        <Flex>\n          {showArrowLeft && renderArrow('left')}\n          {showArrowRight && renderArrow('right')}\n        </Flex>\n      </Flex>\n      {showDown && renderDayNames()}\n    </View>\n  );\n};\n\nexport default React.memo(CalendarHeader, (prevProps, nextProps) => {\n  // 返回false才会触发渲染\n  let shouldUpdate = true;\n\n  if (dateFormat(prevProps.month) !== dateFormat(nextProps.month)) {\n    shouldUpdate = false;\n  }\n\n  shouldUpdate = ['monthFormat', 'showArrowLeft', 'showArrowRight', 'showDown', 'firstDay', 'headerStyle'].reduce(\n    (prev, next) => {\n      if (!prev || nextProps[next as keyof CalendarHeaderProps] !== prevProps[next as keyof CalendarHeaderProps]) {\n        return false;\n      }\n      return true;\n    },\n    shouldUpdate\n  );\n\n  return shouldUpdate;\n});\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Period/index.tsx",
    "content": "import React from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { Flex, helpers, Pressable, Text } from '@td-design/react-native';\n\nimport { DAY_WIDTH } from '../../constant';\nimport { PeriodProps } from '../../type';\nimport usePeriod from './usePeriod';\n\nconst { px } = helpers;\n\nconst HEIGHT = DAY_WIDTH + px(20);\n\nconst Period: React.FC<PeriodProps> = ({ state, date, marking, onPress, children, activeOpacity }) => {\n  const { theme, onDayPress, filters, selected, startingDay, endingDay, isDisabled, isToday, extra } = usePeriod({\n    state,\n    date,\n    marking,\n    onPress,\n  });\n\n  const styles = StyleSheet.create({\n    container: { flex: 1, height: HEIGHT },\n    wrapper: { width: DAY_WIDTH, height: DAY_WIDTH },\n    selected: { borderRadius: theme.borderRadii.x1 },\n    bg: {\n      backgroundColor: theme.colors.primary200,\n    },\n    extra: {\n      position: 'absolute',\n      top: DAY_WIDTH + px(2),\n      left: 0,\n      right: 0,\n    },\n  });\n\n  let color: any = 'text';\n  if (selected && (startingDay || endingDay)) {\n    color = 'white';\n  } else if (isToday) {\n    color = 'primary200';\n  } else if (isDisabled) {\n    color = 'disabled';\n  }\n\n  return (\n    <Pressable activeOpacity={activeOpacity} onPress={onDayPress} style={styles.container}>\n      <Flex justifyContent=\"center\" style={{ width: '100%', height: DAY_WIDTH }}>\n        {filters}\n        <Flex\n          justifyContent=\"center\"\n          style={StyleSheet.flatten([\n            styles.wrapper,\n            selected && styles.selected,\n            selected && (startingDay || endingDay) && styles.bg,\n          ])}\n        >\n          <Text variant=\"p1\" color={color}>\n            {String(children)}\n          </Text>\n        </Flex>\n      </Flex>\n      <Flex style={styles.extra} justifyContent=\"center\">\n        {typeof extra === 'string' ? (\n          <Text variant=\"p3\" color=\"primary200\">\n            {extra}\n          </Text>\n        ) : (\n          extra\n        )}\n      </Flex>\n    </Pressable>\n  );\n};\n\nexport default React.memo(Period);\n"
  },
  {
    "path": "packages/react-native-calendar/src/components/Period/usePeriod.tsx",
    "content": "import React, { useMemo } from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { Flex, Theme, useTheme } from '@td-design/react-native';\nimport { useMemoizedFn } from '@td-design/rn-hooks';\n\nimport { DAY_WIDTH } from '../../constant';\nimport { PeriodProps } from '../../type';\n\nexport default function usePeriod({ state, date, marking, onPress }: Omit<PeriodProps, 'activeOpacity'>) {\n  const theme = useTheme<Theme>();\n  const { selected, disabled, startingDay, endingDay, extra } = marking;\n\n  const isDisabled = state === 'disabled' || disabled;\n  const isToday = state === 'today';\n\n  const onDayPress = () => {\n    if (!isDisabled) {\n      onPress?.(date);\n    }\n  };\n\n  const styles = StyleSheet.create({\n    fillBlock: {\n      position: 'absolute',\n      height: DAY_WIDTH,\n      left: 0,\n      right: 0,\n    },\n    fillItem: {\n      height: DAY_WIDTH,\n      flex: 1,\n    },\n  });\n\n  const filters = useMemo(() => {\n    const isStart = startingDay && !endingDay;\n    const isEnd = !startingDay && endingDay;\n\n    const startStyle = {\n      borderTopLeftRadius: theme.borderRadii.x1,\n      borderBottomLeftRadius: theme.borderRadii.x1,\n    };\n    const endStyle = {\n      borderTopRightRadius: theme.borderRadii.x1,\n      borderBottomRightRadius: theme.borderRadii.x1,\n    };\n    const filledStyle = {\n      backgroundColor: theme.colors.white,\n    };\n    const notFilledStyle = {\n      backgroundColor: theme.colors.primary50,\n    };\n\n    if (!selected) return null;\n    return (\n      <Flex style={[styles.fillBlock, !startingDay && !endingDay && notFilledStyle]}>\n        <View style={[styles.fillItem, isStart ? filledStyle : notFilledStyle, isStart && startStyle]} />\n        <View style={[styles.fillItem, isEnd ? filledStyle : notFilledStyle, isEnd && endStyle]} />\n      </Flex>\n    );\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [startingDay, endingDay, selected]);\n\n  return {\n    theme,\n    onDayPress: useMemoizedFn(onDayPress),\n    filters,\n    selected,\n    startingDay,\n    endingDay,\n    isDisabled,\n    isToday,\n    extra,\n  };\n}\n"
  },
  {
    "path": "packages/react-native-calendar/src/constant.ts",
    "content": "import { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\n\nexport const WEEK_DAY_NAMES = ['日', '一', '二', '三', '四', '五', '六'];\n\nexport const CALENDAR_HEIGHT = px(400);\n\nexport const DAY_WIDTH = px(34);\n"
  },
  {
    "path": "packages/react-native-calendar/src/dateUtils.ts",
    "content": "import dayjs, { Dayjs } from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\n\nimport { CurDateType } from './type';\n\nconst localeData = require('dayjs/plugin/localeData');\n\ndayjs.extend(localeData);\ndayjs.extend(utc);\n\n/** 是否是同一个月 */\nexport function sameMonth(a: Dayjs, b: Dayjs) {\n  return a instanceof dayjs && b instanceof dayjs && a.year() === b.year() && a.month() === b.month();\n}\n\n/** 是否是同一天 */\nexport function sameDate(a: Dayjs, b: Dayjs) {\n  return (\n    a instanceof dayjs &&\n    b instanceof dayjs &&\n    a.year() === b.year() &&\n    a.month() === b.month() &&\n    a.date() === b.date()\n  );\n}\n\n/** 晚于 */\nexport function isGTE(a: CurDateType, b: CurDateType) {\n  return dayjs(a).diff(b, 'day') > -1;\n}\n\n/** 早于 */\nexport function isLTE(a: CurDateType, b: CurDateType) {\n  return dayjs(b).diff(a, 'day') > -1;\n}\n\n/** 从a日期到b日期之间的天数 */\nexport function fromTo(a: Dayjs, b: Dayjs) {\n  const days = [];\n  let from = a;\n\n  while (b.diff(from, 'day') > -1) {\n    days.push(from);\n    from = from.add(1, 'day');\n  }\n  return days;\n}\n\n/** 计算该月份的天数 */\nexport function month(date: Dayjs) {\n  const year = date.year(),\n    month = date.month();\n  const days = new Date(year, month + 1, 0).getDate(); // 这个月一共几天\n\n  const firstDay = dayjs(new Date(year, month, 1, 0, 0, 0));\n  const lastDay = dayjs(new Date(year, month, days, 0, 0, 0));\n\n  return fromTo(firstDay, lastDay);\n}\n\nexport function page(date: Dayjs, firstDayOfWeek = 0, showSixWeeks = false) {\n  const days = month(date);\n  let before: Dayjs[] = [],\n    after: Dayjs[] = [];\n\n  const fdow = (7 + firstDayOfWeek) % 7 || 7; // 一周以周日开头：7\n  const ldow = (fdow + 6) % 7; // 一周以周六结尾：6\n\n  let from = days[0];\n  const daysBefore = from.day(); // 这个月的第一天应该是周几\n  if (daysBefore !== fdow) {\n    from = from.add(-(daysBefore + 7 - fdow) % 7, 'day'); // 那这个月的周日开始应该是几号\n  }\n\n  let to = days[days.length - 1];\n  const day = to.day(); // 最后一天是周几\n  if (day !== ldow) {\n    to = to.add((ldow + 7 - day) % 7, 'day'); // 这个月的周六结束应该是几号\n  }\n\n  const daysForSixWeeks = (daysBefore + days.length) / 6 >= 6;\n  if (showSixWeeks && !daysForSixWeeks) {\n    to = to.add(7, 'day');\n  }\n\n  if (isLTE(from, days[0])) {\n    before = fromTo(from, days[0]);\n  }\n\n  if (isGTE(to, days[days.length - 1])) {\n    after = fromTo(days[days.length - 1], to);\n  }\n\n  return before.concat(days.slice(1, days.length - 1), after);\n}\n\nexport function getRows(date: Dayjs, firstDayOfWeek = 0) {\n  const days = month(date); // 该月一共有几天\n\n  const _firstDayOfWeek = (7 + firstDayOfWeek) % 7 || 7; // 一周以周日开头：7\n  const _lastDayOfWeek = (_firstDayOfWeek + 6) % 7 || 7; // 一周以周六结尾：6\n\n  const from = days[0];\n  const daysBefore = from.day(); // 这个月的第一天应该是周几\n  // 如果结尾日小于该月的第一天则需要加7\n  const daysOfFirstRow =\n    _lastDayOfWeek < daysBefore ? _lastDayOfWeek + 7 - daysBefore + 1 : _lastDayOfWeek - daysBefore + 1;\n\n  const to = days[days.length - 1];\n  const day = to.day(); // 最后一天是周几\n  const daysOfLastRow = 7 - Math.abs(_lastDayOfWeek - day);\n\n  return (days.length - daysOfFirstRow - daysOfLastRow) / 7 + 2;\n}\n\nexport function dateFormat(date?: Dayjs, format = 'YYYY-MM-DD') {\n  if (!date) return '';\n  return date.format(format);\n}\n\nexport function dayjsToData(date: Dayjs) {\n  const dateString = dateFormat(date);\n  return {\n    year: date.year(),\n    month: date.month() + 1,\n    day: date.date(),\n    timestamp: date.valueOf(),\n    dateString: dateString,\n  };\n}\n"
  },
  {
    "path": "packages/react-native-calendar/src/index.md",
    "content": "---\ntitle: Calendar - 日历组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 日历组件\n  path: /calendar\n---\n\n# Calendar 日历组件\n\n使用本组件需要单独安装：**yarn add @td-design/react-native-calendar**\n\n## 效果演示\n\n### 1. 基础 Calendar\n\n```tsx | pure\n<Calendar />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609137338819827656.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 配置 markedDates\n\n```tsx | pure\n<Calendar\n  markedDates={{\n    '2020-12-03': { disabled: true },\n    '2020-12-04': { disabled: true, dotColor: '#7DC455' },\n    '2020-12-11': { dotColor: theme.colors.primaryColor, selected: true },\n    '2020-12-13': { dotColor: theme.colors.primaryColor, selected: true, selectedColor: '#7DC455' },\n    '2020-12-17': { dotColor: '#7DC455', textColor: 'red' },\n    '2020-12-25': { dotColor: '#7DC455' },\n  }}\n  onDayPress={date => console.log(date, 'onDayPress')}\n  onMonthChange={date => console.log(date, 'onMonthChange')}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609213294210202748.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 配置 firstDay\n\n```tsx | pure\n<Calendar firstDay={1} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609125525450993973.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 配置 hideExtraDays\n\n```tsx | pure\n<Calendar hideExtraDays />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609125532566559388.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 5. 配置 showSixWeeks\n\n```tsx | pure\n<Calendar showSixWeeks />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609125535449832660.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 6. 配置 minDate 和 maxDate\n\n```tsx | pure\n<Calendar minDate=\"2020-12-05\" maxDate=\"2020-12-29\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609125540158660005.png\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 7. CalendarList\n\n```tsx | pure\nexport default () => {\n  const [curMarkedDates, setCurMarkedDates] = useState<MarkedDates>({});\n  const dates = useMemo(() => {\n    let _dates = curMarkedDates;\n    for (let [key, value] of Object.entries(curMarkedDates)) {\n      if ((value as PeriodMarking).startingDay) {\n        _dates = {\n          ...curMarkedDates,\n          [key]: { selected: true, startingDay: true, extra: '起' },\n        };\n      }\n      if ((value as PeriodMarking).endingDay) {\n        _dates = {\n          ..._dates,\n          [key]: { selected: true, endingDay: true, extra: '止' },\n        };\n      }\n    }\n    return _dates;\n  }, [curMarkedDates]);\n\n  return (\n    <CalendarList\n      markingType=\"period\"\n      onDayPress={(_, markedDates) => {\n        setCurMarkedDates(markedDates);\n      }}\n      markedDates={dates}\n    />\n  );\n};\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609137415401507983.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 8. Agenda\n\n```tsx | pure\n<Agenda\n  data={[\n    { time: '09:00', title: '上班打卡' },\n    { time: '12:00', title: '吃午饭啦' },\n  ]}\n  keyExtractor={(_, index) => `${index}`}\n  markedDates={{ '2020-12-03': { dotColor: theme.colors.success }, '2020-12-13': { dotColor: 'red' } }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1609137440241431421.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### CalendarHeader\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| firstDay | `false` | 一周以哪天开头，周一为 1， 周二为 2 以此类推，默认周日开头 | `number` | `0` |\n| month | `false` | 展示月份 | `Dayjs` |  |\n| monthFormat | `false` | 月份格式化 | `string` | `YYYY年MM月` |\n| showArrowLeft | `false` | 是否展示左边箭头 | `boolean` | `true` |\n| showArrowRight | `false` | 是否展示右边箭头 | `boolean` | `true` |\n| showDown | `false` | 展示向上还是向下按钮 | `boolean` | `true` |\n| headerStyle | `false` | header 的样式 | `ViewStyle` |  |\n| dayNamesStyle | `false` | 星期几的头部样式 | `ViewStyle` |  |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n| onPressArrowLeft | `false` | 按下左边按钮回调 | `(month: Dayjs) => void` |  |\n| onPressArrowRight | `false` | 按下右边按钮回调 | `(month: Dayjs) => void` |  |\n| onPressArrowDown | `false` | 按下向下按钮回调 | `(month: Dayjs) => void` |  |\n| onPressArrowUp | `false` | 按下向上按钮回调 | `(month: Dayjs) => void` |  |\n\n### Calendar\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| firstDay | `false` | 一周以哪天开头，周一为 1， 周二为 2 以此类推，默认周日开头 | `number` | `0` |\n| month | `false` | 展示月份 | `Dayjs` |  |\n| monthFormat | `false` | 月份格式化 | `string` | `YYYY年MM月` |\n| showArrowLeft | `false` | 是否展示左边箭头 | `boolean` | `true` |\n| showArrowRight | `false` | 是否展示右边箭头 | `boolean` | `true` |\n| headerStyle | `false` | header 的样式 | `ViewStyle` |  |\n| current | `false` | 需要展示的当前月份 | `Dayjs` | `dayjs()` |\n| minDate | `false` | 可选择的最小的日期 | `CurDateType` |  |\n| maxDate | `false` | 可选择的最大的日期 | `CurDateType` |  |\n| markedDates | `false` | 被标记的日期 | `{ [date: string]: PeriodMarking \\| DotMarking }` | `{}` |\n| markingType | `false` | 标记类型 | `dot` \\| `period` | `dot` |\n| enableSwipeMonths | `false` | 是否可以滑动切换月份 | `boolean` | `true` |\n| hideExtraDays | `false` | 是否展示当前月份之外的天数 | `boolean` | `false` |\n| showSixWeeks | `false` | 是否每个月都展示 6 个星期（只有当`hideExtraDays` = `false`时生效） | `boolean` | `false` |\n| style | `false` | calendar 整体的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| monthWrapperStyle | `false` | month 外层的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| contentStyle | `false` | content 的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| onDayPress | `false` | 点击日期的回调 | `(date: DateObject, markedDates: MarkedDates) => void` |  |\n| onMonthChange | `false` | 月份变化回调 | `(month: string) => void` |  |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n\n### CalendarList\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| firstDay | `false` | 一周以哪天开头，周一为 1， 周二为 2 以此类推，默认周日开头 | `number` | `0` |\n| month | `false` | 展示月份 | `Dayjs` |  |\n| monthFormat | `false` | 月份格式化 | `string` | `YYYY年MM月` |\n| showArrowLeft | `false` | 是否展示左边箭头 | `boolean` | `true` |\n| showArrowRight | `false` | 是否展示右边箭头 | `boolean` | `true` |\n| headerStyle | `false` | header 的样式 | `ViewStyle` |  |\n| current | `false` | 需要展示的当前月份 | `Dayjs` | `dayjs()` |\n| minDate | `false` | 可选择的最小的日期 | `CurDateType` |  |\n| maxDate | `false` | 可选择的最大的日期 | `CurDateType` |  |\n| markedDates | `false` | 被标记的日期 | `{ [date: string]: PeriodMarking \\| DotMarking }` | `{}` |\n| markingType | `false` | 标记类型 | `dot` \\| `period` | `dot` |\n| enableSwipeMonths | `false` | 是否可以滑动切换月份 | `boolean` | `true` |\n| hideExtraDays | `false` | 是否展示当前月份之外的天数 | `boolean` | `false` |\n| showSixWeeks | `false` | 是否每个月都展示 6 个星期（只有当`hideExtraDays` = `false`时生效） | `boolean` | `false` |\n| style | `false` | calendar 整体的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| monthWrapperStyle | `false` | month 外层的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| contentStyle | `false` | content 的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| onDayPress | `false` | 点击日期的回调 | `(date: DateObject, markedDates: MarkedDates) => void` |  |\n| onMonthChange | `false` | 月份变化回调 | `(month: string) => void` |  |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n| pastScrollRange | `false` | 最多往前推算几个月 | `number` | `12` |\n| futureScrollRange | `false` | 最多往后推算几个月 | `number` | `12` |\n| horizontal | `false` | 是否水平 | `boolean` | `false` |\n| calendarWidth | `false` | 日历宽度 | `number` | `deviceWidth` |\n| calendarHeight | `false` | 日历高度 | `number` | `420` |\n\n### Agenda\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| firstDay | `false` | 一周以哪天开头，周一为 1， 周二为 2 以此类推，默认周日开头 | `number` | `0` |\n| month | `false` | 展示月份 | `Dayjs` |  |\n| monthFormat | `false` | 月份格式化 | `string` | `YYYY年MM月` |\n| showArrowLeft | `false` | 是否展示左边箭头 | `boolean` | `true` |\n| showArrowRight | `false` | 是否展示右边箭头 | `boolean` | `true` |\n| headerStyle | `false` | header 的样式 | `ViewStyle` |  |\n| current | `false` | 需要展示的当前月份 | `Dayjs` | `dayjs()` |\n| minDate | `false` | 可选择的最小的日期 | `CurDateType` |  |\n| maxDate | `false` | 可选择的最大的日期 | `CurDateType` |  |\n| markedDates | `false` | 被标记的日期 | `{ [date: string]: PeriodMarking \\| DotMarking }` | `{}` |\n| markingType | `false` | 标记类型 | `dot` \\| `period` | `dot` |\n| enableSwipeMonths | `false` | 是否可以滑动切换月份 | `boolean` | `true` |\n| hideExtraDays | `false` | 是否展示当前月份之外的天数 | `boolean` | `false` |\n| style | `false` | calendar 整体的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| monthWrapperStyle | `false` | month 外层的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| contentStyle | `false` | content 的补充样式 | `Animated.AnimateStyle<ViewStyle>` |  |\n| onDayPress | `false` | 点击日期的回调 | `(date: DateObject, markedDates: MarkedDates) => void` |  |\n| onMonthChange | `false` | 月份变化回调 | `(month: string) => void` |  |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n| data | `false` | 日程数据 | `ItemT[]` | `[]` |\n| renderItem | `false` | 每个日程的渲染 | `ListRenderItem<ItemT>` |  |\n| keyExtractor | `true` | 标记每条数据的唯一性的 key | `(item: ItemT, index: number) => string` |  |\n\n### PeriodMarking\n\n| 属性        | 必填    | 说明           | 类型        | 默认值 |\n| ----------- | ------- | -------------- | ----------- | ------ |\n| disabled    | `false` | 是否禁用       | `boolean`   |        |\n| selected    | `false` | 是否选中       | `boolean`   |        |\n| startingDay | `false` | 是否是开始日期 | `boolean`   |        |\n| endingDay   | `false` | 是否是结束日期 | `boolean`   |        |\n| extra       | `false` | 额外参数       | `ReactNode` |        |\n\n### DotMarking\n\n| 属性          | 必填    | 说明           | 类型      | 默认值 |\n| ------------- | ------- | -------------- | --------- | ------ |\n| disabled      | `false` | 是否禁用       | `boolean` |        |\n| selected      | `false` | 是否选中       | `boolean` |        |\n| textColor     | `false` | 日期的颜色     | `string`  |        |\n| selectedColor | `false` | 选中的背景颜色 | `string`  |        |\n| dotColor      | `false` | 点的颜色       | `string`  |        |\n\n## 补充说明\n\n### 1. CurDateType 枚举值如下\n\n```tsx | pure\ntype CurDateType = 'string' | 'Date' | 'Dayjs';\n```\n\n### 2. DateObject 对象如下\n\n```tsx | pure\n{\n  day: number;\n  dateString: string;\n  month: number;\n  timestamp: number;\n  year: number;\n}\n```\n\n### 3. Item 对象如下\n\n```tsx | pure\n{\n  time: string;\n  title: string;\n  onPress?: () => void;\n}\n```\n"
  },
  {
    "path": "packages/react-native-calendar/src/index.tsx",
    "content": "import Agenda from './components/Agenda';\nimport Calendar from './components/Calendar';\nimport CalendarList from './components/CalendarList';\n\nexport default Calendar;\nexport { CalendarList, Agenda };\n"
  },
  {
    "path": "packages/react-native-calendar/src/type.ts",
    "content": "import { ReactNode } from 'react';\nimport { ListRenderItem, ViewStyle } from 'react-native';\nimport { AnimatedStyleProp } from 'react-native-reanimated';\n\nimport { Dayjs } from 'dayjs';\n\nexport type StateType = 'disabled' | 'today' | 'otherMonth';\n\nexport type ArrowDirection = 'left' | 'right' | 'down' | 'up';\n\nexport type CurDateType = string | Date | Dayjs;\n\nexport type MarkedDates = { [date: string]: PeriodMarking | DotMarking };\n\nexport interface DateObject {\n  day: number;\n  dateString: string;\n  month: number;\n  timestamp: number;\n  year: number;\n}\n\nexport interface PeriodMarking {\n  disabled?: boolean;\n  selected?: boolean;\n  startingDay?: boolean;\n  endingDay?: boolean;\n  extra?: ReactNode;\n}\n\nexport interface DotMarking {\n  textColor?: string;\n  disabled?: boolean;\n  selected?: boolean;\n  selectedColor?: string;\n  dotColor?: string;\n}\n\nexport interface RowItem {\n  date: Dayjs;\n  isShowDate: boolean;\n}\n\nexport interface DayProps {\n  /** 某天的状态 */\n  state?: StateType;\n  /** 日期 */\n  date: DateObject;\n  /** 日期点击回调 */\n  onPress: (date: DateObject) => void;\n  /** 标记 */\n  marking?: DotMarking;\n  children: ReactNode;\n  activeOpacity: number;\n}\n\nexport interface PeriodProps {\n  /** 某天的状态 */\n  state?: StateType;\n  /** 标记 */\n  marking: PeriodMarking;\n  /** 日期点击回调 */\n  onPress: (date: DateObject) => void;\n  /** 日期 */\n  date: DateObject;\n  children?: ReactNode;\n  activeOpacity: number;\n}\n\nexport interface CalendarHeaderProps {\n  /** 一周以哪天开头，周一为1， 周二为2以此类推，默认周日开头，为0 */\n  firstDay?: number;\n  /** 展示月份 */\n  month?: Dayjs;\n  /** 月份格式化，默认为 YYYY年MM月 */\n  monthFormat?: string;\n  /** 是否展示左边箭头 */\n  showArrowLeft?: boolean;\n  /** 是否展示右边箭头 */\n  showArrowRight?: boolean;\n  /** 展示向上还是向下按钮 */\n  showDown?: boolean;\n  /** header的样式 */\n  headerStyle?: ViewStyle;\n  /** 星期几的头部样式 */\n  dayNamesStyle?: ViewStyle;\n  activeOpacity?: number;\n}\n\nexport interface CalendarHeaderControlProps {\n  /** 按下左边按钮回调 */\n  onPressArrowLeft?: (count: number) => void;\n  /** 按下右边按钮回调 */\n  onPressArrowRight?: (count: number) => void;\n  /** 按下向下按钮回调 */\n  onPressArrowDown?: () => void;\n  /** 按下向上按钮回调 */\n  onPressArrowUp?: () => void;\n}\n\nexport interface CalendarProps extends Omit<CalendarHeaderProps, 'showDown' | 'dayNamesStyle'> {\n  /** 需要展示的当前月份，默认为Date() */\n  current?: Dayjs;\n  /** 可选择的最小的日期 */\n  minDate?: CurDateType;\n  /** 可选择的最大的日期 */\n  maxDate?: CurDateType;\n  /** 被标记的日期 */\n  markedDates?: MarkedDates;\n  /** 标记类型，默认值为dot */\n  markingType?: 'dot' | 'period';\n  /** 是否可以滑动切换月份，默认值为false */\n  enableSwipeMonths?: boolean;\n  /** 是否展示当前月份之外的天数，默认值为false */\n  hideExtraDays?: boolean;\n  /** 是否每个月都展示6个星期（只有当hideExtraDays = false时生效），默认值为false */\n  showSixWeeks?: boolean;\n  /** calendar整体的补充样式 */\n  style?: AnimatedStyleProp<ViewStyle>;\n  /** month外层的补充样式 */\n  monthWrapperStyle?: AnimatedStyleProp<ViewStyle>;\n  /** content的补充样式 */\n  contentStyle?: AnimatedStyleProp<ViewStyle>;\n  /** 点击日期的回调 */\n  onDayPress?: (date: DateObject, markedDates: MarkedDates) => void;\n  /** 月份变化回调 */\n  onMonthChange?: (month: string) => void;\n}\n\nexport interface CalendarListProps extends CalendarProps {\n  /** 最多往前推算几个月，默认为12个月 */\n  pastScrollRange?: number;\n  /** 最多往后推算几个月，默认为12个月 */\n  futureScrollRange?: number;\n  /** 是否水平 */\n  horizontal?: boolean;\n  /** 日历宽度 */\n  calendarWidth?: number;\n  /** 日历高度 */\n  calendarHeight?: number;\n}\n\nexport interface Item {\n  time: string;\n  title: string;\n  onPress?: () => void;\n}\n\nexport interface AgendaProps<ItemT> extends Omit<CalendarProps, 'showSixWeeks'> {\n  data?: ItemT[];\n  renderItem?: ListRenderItem<ItemT>;\n  keyExtractor: (item: ItemT, index: number) => string;\n}\n"
  },
  {
    "path": "packages/react-native-calendar/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-calendar/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-echarts/CHANGELOG.md",
    "content": "# @td-design/react-native-echarts\n\n## 5.4.0\n\n### Minor Changes\n\n- [`f94e4491e`](https://github.com/thundersdata-frontend/td-design/commit/f94e4491e2f00791a3ea8cac41bf1778e1f0a50f) - 修改 echarts 版本为 5.4.0\n"
  },
  {
    "path": "packages/react-native-echarts/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-echarts\",\n  \"version\": \"5.4.0\",\n  \"description\": \"封装echarts在react native项目中使用\",\n  \"main\": \"lib/commonjs/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"react-native\",\n    \"echarts\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-webview\": \"^13.2.3\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"commonjs\",\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  }\n}"
  },
  {
    "path": "packages/react-native-echarts/readMe.md",
    "content": "# react-native-echarts\n\n在 react-native 项目中使用 echarts 展示图表\n\n- IOS 效果图\n\n![ios](./assets/ios.png)\n\n- Android 效果图\n\n![android](./assets/android.png)\n\n## 特点\n\n**基于最新的 echarts 版本**\n\n**支持开启 hermes**\n\n## 使用\n\n```code\nyarn add react-native-webview @td-design/react-native-echarts\n```\n\n## 示例\n\n### 1. 获取数据后显示图表\n\n```jsx\nimport React, { FC, useEffect, useRef } from 'react';\nimport { View } from 'react-native';\nimport Echarts, { EchartsHandler } from '@td-design/react-native-echarts';\n\nexport default () => {\n  const chart = useRef<EchartsHandler>(null);\n\n  // setOption after data fetch\n  useEffect(() => {\n    fetch(xxx).then(data => {\n      chart.current?.setOption({\n        tooltip: {\n          trigger: 'axis',\n          formatter: `function (params) {\n            if (Array.isArray(params)) {\n              return params[0].name;\n            }\n            return params.name;\n          }`,\n        },\n        xAxis: {\n          type: 'category',\n          // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n          data: data.xAxis,\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [\n          {\n            // data: [150, 230, 224, 218, 135, 147, 260],\n            data: data.seriesData,\n            type: 'line',\n          },\n        ],\n      });\n    })\n  }, []);\n\n  return (\n    <View style={{ flex: 1 }}>\n      <Echarts ref={chart}>\n    </View>\n  );\n}\n```\n\n### 2. 修改图表\n\n```jsx\nimport React, { FC, useEffect, useRef } from 'react';\nimport { View, Button } from 'react-native';\nimport Echarts, { EchartsHandler } from '@td-design/react-native-echarts';\n\nexport default () => {\n  const chart = useRef<EchartsHandler>(null);\n\n  // setOption after data fetch\n  useEffect(() => {\n    fetch(xxx).then(data => {\n      chart.current?.setOption({\n        tooltip: {\n          trigger: 'axis',\n          formatter: `function (params) {\n            if (Array.isArray(params)) {\n              return params[0].name;\n            }\n            return params.name;\n          }`,\n        },\n        xAxis: {\n          type: 'category',\n          // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n          data: data.xAxis,\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [\n          {\n            // data: [150, 230, 224, 218, 135, 147, 260],\n            data: data.seriesData,\n            type: 'line',\n          },\n        ],\n      });\n    })\n  }, []);\n\n  // modify chart option\n  const modifyOptions = () => {\n    chart.current?.setOption({\n      tooltip: {\n        trigger: 'axis',\n        formatter: `function (params) {\n          if (Array.isArray(params)) {\n            return params[0].name + \": \" + params[0].data;\n          }\n          return params.name + \": \" + params.data;\n        }`,\n      },\n      xAxis: {\n        type: 'category',\n        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n      },\n      yAxis: {\n        type: 'value',\n      },\n      series: [\n        {\n          data: [82, 93, 90, 93, 129, 46, 66],\n          type: 'line',\n        },\n      ],\n    });\n  };\n\n  return (\n    <View style={{ flex: 1 }}>\n      <Echarts ref={chart}>\n      <Button title=\"modify chart\" onPress={modifyOptions} />\n    </View>\n  );\n}\n```\n\n### 3. 清除图表\n\n```jsx\nimport React, { FC, useEffect, useRef } from 'react';\nimport { View, Button } from 'react-native';\nimport Echarts, { EchartsHandler } from '@td-design/react-native-echarts';\n\nexport default () => {\n  const chart = useRef<EchartsHandler>(null);\n\n  // setOption after data fetch\n  useEffect(() => {\n    fetch(xxx).then(data => {\n      chart.current?.setOption({\n        tooltip: {\n          trigger: 'axis',\n          formatter: `function (params) {\n            if (Array.isArray(params)) {\n              return params[0].name;\n            }\n            return params.name;\n          }`,\n        },\n        xAxis: {\n          type: 'category',\n          // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n          data: data.xAxis,\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [\n          {\n            // data: [150, 230, 224, 218, 135, 147, 260],\n            data: data.seriesData,\n            type: 'line',\n          },\n        ],\n      });\n    })\n  }, []);\n\n  // clear chart\n  const clearChart = () => {\n    chart.current?.clear();\n  };\n\n  return (\n    <View style={{ flex: 1 }}>\n      <Echarts ref={chart}>\n      <Button title=\"clear chart\" onPress={clearChart} />\n    </View>\n  );\n}\n```\n\n## 属性\n\n| 属性            | 必填    | 说明           | 类型     | 默认值   |\n| --------------- | ------- | -------------- | -------- | -------- |\n| width           | `false` | 图表宽度       | `number` | 屏幕宽度 |\n| height          | `false` | 图表高度       | `number` | `300`    |\n| backgroundColor | `false` | 图表背景色     | `string` | `#fff`   |\n| extraCode       | `false` | 额外注入的代码 | `string` | ``       |\n\n## 方法\n\n| 方法                 | 说明           |\n| -------------------- | -------------- |\n| `setBackgroundColor` | 修改背景色     |\n| `getOption`          | 获取图表配置项 |\n| `setOption`          | 修改图表配置项 |\n| `clear`              | 清除图表       |\n\n## Q&A\n\n- Q: 安卓上无法显示图表\n- A: 安卓上需要把`node_modules/@td-design/react-native-echarts/lib/commonjs/tmp/tpl.html` 文件复制到`android/app/src/main/assets/`目录下。\n"
  },
  {
    "path": "packages/react-native-echarts/src/index.md",
    "content": "---\ntitle: ECharts - 图表组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 图表组件\n  path: /charts\n---\n\n# ECharts 图表组件\n\n使用本组件需要单独安装：**yarn add @td-design/react-native-echarts**\n\n**!!! 强烈建议使用(wrn-echarts)[https://github.com/wuba/wrn-echarts]**\n\n## 效果演示\n\n### 1. 渲染图表\n\n```tsx | pure\nconst chart = useRef<EchartsHandler>(null);\n\nuseEffect(() => {\n  chart.current?.setOption({\n    tooltip: {\n      trigger: 'axis',\n      formatter: `function (params) {\n          if (Array.isArray(params)) {\n            return params[0].name;\n          }\n          return params.name;\n        }`,\n    },\n    xAxis: {\n      type: 'category',\n      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n    },\n    yAxis: {\n      type: 'value',\n    },\n    series: [\n      {\n        data: [150, 230, 224, 218, 135, 147, 260],\n        type: 'line',\n      },\n    ],\n  });\n\n  return () => clearTimeout(timer);\n}, []);\n\nreturn <Echarts ref={chart} />;\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644832185331956336.png\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 2. 修改图表数据\n\n```tsx | pure\nconst modifyOptions = () => {\n  chart.current?.setOption({\n    tooltip: {\n      trigger: 'axis',\n      formatter: `function (params) {\n        if (Array.isArray(params)) {\n          return params[0].name + \": \" + params[0].data;\n        }\n        return params.name + \": \" + params.data;\n      }`,\n    },\n    xAxis: {\n      type: 'category',\n      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n    },\n    yAxis: {\n      type: 'value',\n    },\n    series: [\n      {\n        data: [82, 93, 90, 93, 129, 46, 66],\n        type: 'line',\n      },\n    ],\n  });\n};\n\nreturn (\n  <Container>\n    <Echarts ref={chart} />\n    <Button title=\"修改图表数据\" onPress={modifyOptions} />\n  </Container>\n);\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644832405780437433.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 3. 渲染地图\n\n```tsx | pure\nexport function MapChart() {\n  const chart = useRef<EchartsHandler>(null);\n\n  useEffect(() => {\n    const timer = setTimeout(() => {\n      chart.current?.setOption({\n        backgroundColor: '#000',\n        geo: {\n          map: 'shandong',\n          roam: false,\n          silent: true,\n          itemStyle: {\n            areaColor: '#013C62',\n            shadowColor: '#6aa1fb',\n            shadowOffsetX: 2,\n            shadowOffsetY: 5,\n            shadowBlur: 8,\n          },\n        },\n        series: [\n          {\n            name: 'shandong',\n            type: 'map',\n            roam: false,\n            map: 'shandong',\n            data: [],\n            label: {\n              show: false,\n            },\n            itemStyle: {\n              areaColor: '#1B4EB8',\n              borderWidth: 1,\n              borderColor: '#CDC4CB',\n              shadowColor: '#1B4EB8',\n              shadowOffsetX: -2,\n              shadowBlur: 8,\n            },\n            select: {\n              label: { show: false },\n              itemStyle: {\n                areaColor: '#49e7db',\n                opacity: 0.6,\n                borderWidth: 2,\n                borderColor: '#16fff1',\n              },\n            },\n            emphasis: {\n              label: { show: false },\n              itemStyle: {\n                areaColor: '#49e7db',\n                // opacity: 0.6,\n                borderWidth: 2,\n                borderColor: '#16fff1',\n              },\n            },\n          },\n        ],\n      });\n    }, 2000);\n\n    return () => clearTimeout(timer);\n  }, []);\n\n  const extraCode = `\n    var shandongMapData = ${JSON.stringify(shandongMap)};\n    echarts.registerMap('shandong', shandongMapData);\n  `;\n\n  return (\n    <Container>\n      <Echarts ref={chart} extraCode={extraCode} />\n    </Container>\n  );\n}\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644832499897809477.png\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n## API\n\n| 属性               | 必填    | 说明                         | 类型                 | 默认值 |\n| ------------------ | ------- | ---------------------------- | -------------------- | ------ |\n| width              | `false` | 图表的宽度                   | `number`             |        |\n| height             | `false` | 图表的高度                   | `number`             |        |\n| backgroundColor    | `false` | 图表的背景色                 | `string`             |        |\n| extraCode          | `false` | 额外注入的代码，比如注册地图 | `string`             |        |\n| echartsInitOptions | `false` | echarts 初始化配置           | `EchartsInitOptions` |        |\n\n```ts\ntype EchartsInitOptions = {\n  /** 设备像素比 */\n  devicePixelRatio?: number;\n  /** 渲染模式 */\n  renderer?: 'canvas' | 'svg';\n  /** 使用的语言，内置 'ZH' 和 'EN' 两个语言 */\n  locale?: 'ZH' | 'EN';\n  /** 是否开启脏矩形渲染，只有在 Canvas 渲染模式有效， 默认为false。 */\n  useDirtyRect?: boolean;\n};\n```\n"
  },
  {
    "path": "packages/react-native-echarts/src/index.tsx",
    "content": "import React, { forwardRef, useImperativeHandle, useRef } from 'react';\nimport { Dimensions, Platform, View } from 'react-native';\nimport { WebView, WebViewMessageEvent } from 'react-native-webview';\n\nimport { buildEcharts, EchartsInitOptions, formatString } from './utils/builder';\n\nconst { width: deviceWidth } = Dimensions.get('window');\n\ninterface EchartsProps {\n  /** 图表的宽度 */\n  width?: number;\n  /** 图表的高度 */\n  height?: number;\n  /** 图表的背景色 */\n  backgroundColor?: string;\n  /** 额外注入的代码，比如注册地图 */\n  extraCode?: string;\n  /** echarts初始化配置 */\n  echartsInitOptions?: EchartsInitOptions;\n}\n\nexport interface EchartsHandler {\n  setBackgroundColor: (color: string) => void;\n  getOption: (callback: (data: any) => void, properties?: string[]) => void;\n  setOption: (options: any) => void;\n  clear: () => void;\n}\n\nconst Echarts = forwardRef<EchartsHandler, EchartsProps>(\n  (\n    {\n      width = deviceWidth,\n      height = 300,\n      backgroundColor = '#fff',\n      extraCode,\n      echartsInitOptions = { renderer: 'svg', locale: 'ZH', useDirtyRect: true },\n    },\n    forwardedRef\n  ) => {\n    const webviewRef = useRef<WebView>(null);\n    const callbacks = useRef<Record<string, any>>({});\n\n    const postMessage = (data: Record<string, any>) => {\n      webviewRef.current?.postMessage(formatString(JSON.stringify(data)));\n    };\n\n    const getID = () => `_${Math.random().toString(36).substr(2, 9)}`;\n\n    const setBackgroundColor = (color: string) => {\n      const data = {\n        types: 'SET_BACKGROUND_COLOR',\n        color,\n      };\n      postMessage(data);\n    };\n\n    const getOption = (callback: (data: any) => void, properties?: string[]) => {\n      const uuid = getID();\n      callbacks.current[uuid] = callback;\n      const data = {\n        types: 'GET_OPTION',\n        uuid,\n        properties,\n      };\n      postMessage(data);\n    };\n\n    const setOption = (option: any, notMerge = false, lazyUpdate = false) => {\n      const data = {\n        types: 'SET_OPTION',\n        payload: {\n          option,\n          notMerge,\n          lazyUpdate,\n        },\n      };\n      postMessage(data);\n    };\n\n    const clear = () => {\n      const data = {\n        types: 'CLEAR',\n      };\n      postMessage(data);\n    };\n\n    useImperativeHandle(forwardedRef, () => ({\n      setBackgroundColor,\n      getOption,\n      setOption,\n      clear,\n    }));\n\n    const handleMessage = (e: WebViewMessageEvent) => {\n      try {\n        const data = JSON.parse(unescape(unescape(e.nativeEvent.data)));\n        if (data.type === 'CALLBACK') {\n          const { uuid } = data;\n          callbacks.current[uuid](data.payload);\n        }\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    const handleLoadEnd = () => {\n      if (extraCode) {\n        webviewRef.current?.injectJavaScript(`\n          ${extraCode};\n          true;\n        `);\n      }\n      webviewRef.current?.injectJavaScript(buildEcharts(backgroundColor, echartsInitOptions));\n    };\n\n    return (\n      <View style={{ width, height, overflow: 'hidden' }}>\n        <WebView\n          ref={webviewRef}\n          source={Platform.OS === 'ios' ? require('./tmp/tpl.html') : { uri: 'file:///android_asset/tpl.html' }}\n          // https://github.com/react-native-webview/react-native-webview/issues/430\n          style={{ flex: 1, opacity: 0.99, backgroundColor: '#fff' }}\n          scrollEnabled={false}\n          javaScriptEnabled\n          mixedContentMode=\"always\"\n          originWhitelist={['*']}\n          androidLayerType=\"hardware\"\n          onLoadEnd={handleLoadEnd}\n          onMessage={handleMessage}\n        />\n      </View>\n    );\n  }\n);\n\nexport default Echarts;\n"
  },
  {
    "path": "packages/react-native-echarts/src/tmp/tpl.html",
    "content": "<!DOCTYPE html>\n<html lang=\"de\">\n\n<head>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n  <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no\">\n  <style type=\"text/css\">\n    html,\n    body {\n      height: 100%;\n      width: 100%;\n      margin: 0;\n      padding: 0;\n      background-color: #fff;\n    }\n\n    #main {\n      height: 100%;\n      width: 100%;\n      background-color: #fff;\n    }\n  </style>\n  <script>\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],e):e((t=\"undefined\"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){\"use strict\";\n/*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */var e = function (t, n) { return e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]) }, e(t, n) }; function n(t, n) { if (\"function\" != typeof n && null !== n) throw new TypeError(\"Class extends value \" + String(n) + \" is not a constructor or null\"); function i() { this.constructor = t } e(t, n), t.prototype = null === n ? Object.create(n) : (i.prototype = n.prototype, new i) } var i = function () { this.firefox = !1, this.ie = !1, this.edge = !1, this.newEdge = !1, this.weChat = !1 }, r = new function () { this.browser = new i, this.node = !1, this.wxa = !1, this.worker = !1, this.svgSupported = !1, this.touchEventsSupported = !1, this.pointerEventsSupported = !1, this.domSupported = !1, this.transformSupported = !1, this.transform3dSupported = !1, this.hasGlobalWindow = \"undefined\" != typeof window }; \"object\" == typeof wx && \"function\" == typeof wx.getSystemInfoSync ? (r.wxa = !0, r.touchEventsSupported = !0) : \"undefined\" == typeof document && \"undefined\" != typeof self ? r.worker = !0 : \"undefined\" == typeof navigator ? (r.node = !0, r.svgSupported = !0) : function (t, e) { var n = e.browser, i = t.match(/Firefox\\/([\\d.]+)/), r = t.match(/MSIE\\s([\\d.]+)/) || t.match(/Trident\\/.+?rv:(([\\d.]+))/), o = t.match(/Edge?\\/([\\d.]+)/), a = /micromessenger/i.test(t); i && (n.firefox = !0, n.version = i[1]); r && (n.ie = !0, n.version = r[1]); o && (n.edge = !0, n.version = o[1], n.newEdge = +o[1].split(\".\")[0] > 18); a && (n.weChat = !0); e.svgSupported = \"undefined\" != typeof SVGRect, e.touchEventsSupported = \"ontouchstart\" in window && !n.ie && !n.edge, e.pointerEventsSupported = \"onpointerdown\" in window && (n.edge || n.ie && +n.version >= 11), e.domSupported = \"undefined\" != typeof document; var s = document.documentElement.style; e.transform3dSupported = (n.ie && \"transition\" in s || n.edge || \"WebKitCSSMatrix\" in window && \"m11\" in new WebKitCSSMatrix || \"MozPerspective\" in s) && !(\"OTransition\" in s), e.transformSupported = e.transform3dSupported || n.ie && +n.version >= 9 }(navigator.userAgent, r); var o = \"sans-serif\", a = \"12px sans-serif\"; var s, l, u = function (t) { var e = {}; if (\"undefined\" == typeof JSON) return e; for (var n = 0; n < t.length; n++) { var i = String.fromCharCode(n + 32), r = (t.charCodeAt(n) - 20) / 100; e[i] = r } return e }(\"007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\\\\\WQb\\\\0FWLg\\\\bWb\\\\WQ\\\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\\\FFF5.5N\"), h = { createCanvas: function () { return \"undefined\" != typeof document && document.createElement(\"canvas\") }, measureText: function (t, e) { if (!s) { var n = h.createCanvas(); s = n && n.getContext(\"2d\") } if (s) return l !== e && (l = s.font = e || a), s.measureText(t); t = t || \"\"; var i = /^([0-9]*?)px$/.exec(e = e || a), r = +(i && i[1]) || 12, o = 0; if (e.indexOf(\"mono\") >= 0) o = r * t.length; else for (var c = 0; c < t.length; c++) { var p = u[t[c]]; o += null == p ? r : p * r } return { width: o } }, loadImage: function (t, e, n) { var i = new Image; return i.onload = e, i.onerror = n, i.src = t, i } }; function c(t) { for (var e in h) t[e] && (h[e] = t[e]) } var p = V([\"Function\", \"RegExp\", \"Date\", \"Error\", \"CanvasGradient\", \"CanvasPattern\", \"Image\", \"Canvas\"], (function (t, e) { return t[\"[object \" + e + \"]\"] = !0, t }), {}), d = V([\"Int8\", \"Uint8\", \"Uint8Clamped\", \"Int16\", \"Uint16\", \"Int32\", \"Uint32\", \"Float32\", \"Float64\"], (function (t, e) { return t[\"[object \" + e + \"Array]\"] = !0, t }), {}), f = Object.prototype.toString, g = Array.prototype, y = g.forEach, v = g.filter, m = g.slice, x = g.map, _ = function () { }.constructor, b = _ ? _.prototype : null, w = \"__proto__\", S = 2311; function M() { return S++ } function I() { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; \"undefined\" != typeof console && console.error.apply(console, t) } function T(t) { if (null == t || \"object\" != typeof t) return t; var e = t, n = f.call(t); if (\"[object Array]\" === n) { if (!pt(t)) { e = []; for (var i = 0, r = t.length; i < r; i++)e[i] = T(t[i]) } } else if (d[n]) { if (!pt(t)) { var o = t.constructor; if (o.from) e = o.from(t); else { e = new o(t.length); for (i = 0, r = t.length; i < r; i++)e[i] = t[i] } } } else if (!p[n] && !pt(t) && !J(t)) for (var a in e = {}, t) t.hasOwnProperty(a) && a !== w && (e[a] = T(t[a])); return e } function C(t, e, n) { if (!q(e) || !q(t)) return n ? T(e) : t; for (var i in e) if (e.hasOwnProperty(i) && i !== w) { var r = t[i], o = e[i]; !q(o) || !q(r) || Y(o) || Y(r) || J(o) || J(r) || K(o) || K(r) || pt(o) || pt(r) ? !n && i in t || (t[i] = T(e[i])) : C(r, o, n) } return t } function D(t, e) { for (var n = t[0], i = 1, r = t.length; i < r; i++)n = C(n, t[i], e); return n } function A(t, e) { if (Object.assign) Object.assign(t, e); else for (var n in e) e.hasOwnProperty(n) && n !== w && (t[n] = e[n]); return t } function k(t, e, n) { for (var i = G(e), r = 0; r < i.length; r++) { var o = i[r]; (n ? null != e[o] : null == t[o]) && (t[o] = e[o]) } return t } var L = h.createCanvas; function P(t, e) { if (t) { if (t.indexOf) return t.indexOf(e); for (var n = 0, i = t.length; n < i; n++)if (t[n] === e) return n } return -1 } function O(t, e) { var n = t.prototype; function i() { } for (var r in i.prototype = e.prototype, t.prototype = new i, n) n.hasOwnProperty(r) && (t.prototype[r] = n[r]); t.prototype.constructor = t, t.superClass = e } function R(t, e, n) { if (t = \"prototype\" in t ? t.prototype : t, e = \"prototype\" in e ? e.prototype : e, Object.getOwnPropertyNames) for (var i = Object.getOwnPropertyNames(e), r = 0; r < i.length; r++) { var o = i[r]; \"constructor\" !== o && (n ? null != e[o] : null == t[o]) && (t[o] = e[o]) } else k(t, e, n) } function N(t) { return !!t && (\"string\" != typeof t && \"number\" == typeof t.length) } function E(t, e, n) { if (t && e) if (t.forEach && t.forEach === y) t.forEach(e, n); else if (t.length === +t.length) for (var i = 0, r = t.length; i < r; i++)e.call(n, t[i], i, t); else for (var o in t) t.hasOwnProperty(o) && e.call(n, t[o], o, t) } function z(t, e, n) { if (!t) return []; if (!e) return at(t); if (t.map && t.map === x) return t.map(e, n); for (var i = [], r = 0, o = t.length; r < o; r++)i.push(e.call(n, t[r], r, t)); return i } function V(t, e, n, i) { if (t && e) { for (var r = 0, o = t.length; r < o; r++)n = e.call(i, n, t[r], r, t); return n } } function B(t, e, n) { if (!t) return []; if (!e) return at(t); if (t.filter && t.filter === v) return t.filter(e, n); for (var i = [], r = 0, o = t.length; r < o; r++)e.call(n, t[r], r, t) && i.push(t[r]); return i } function F(t, e, n) { if (t && e) for (var i = 0, r = t.length; i < r; i++)if (e.call(n, t[i], i, t)) return t[i] } function G(t) { if (!t) return []; if (Object.keys) return Object.keys(t); var e = []; for (var n in t) t.hasOwnProperty(n) && e.push(n); return e } var W = b && U(b.bind) ? b.call.bind(b.bind) : function (t, e) { for (var n = [], i = 2; i < arguments.length; i++)n[i - 2] = arguments[i]; return function () { return t.apply(e, n.concat(m.call(arguments))) } }; function H(t) { for (var e = [], n = 1; n < arguments.length; n++)e[n - 1] = arguments[n]; return function () { return t.apply(this, e.concat(m.call(arguments))) } } function Y(t) { return Array.isArray ? Array.isArray(t) : \"[object Array]\" === f.call(t) } function U(t) { return \"function\" == typeof t } function X(t) { return \"string\" == typeof t } function Z(t) { return \"[object String]\" === f.call(t) } function j(t) { return \"number\" == typeof t } function q(t) { var e = typeof t; return \"function\" === e || !!t && \"object\" === e } function K(t) { return !!p[f.call(t)] } function $(t) { return !!d[f.call(t)] } function J(t) { return \"object\" == typeof t && \"number\" == typeof t.nodeType && \"object\" == typeof t.ownerDocument } function Q(t) { return null != t.colorStops } function tt(t) { return null != t.image } function et(t) { return \"[object RegExp]\" === f.call(t) } function nt(t) { return t != t } function it() { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; for (var n = 0, i = t.length; n < i; n++)if (null != t[n]) return t[n] } function rt(t, e) { return null != t ? t : e } function ot(t, e, n) { return null != t ? t : null != e ? e : n } function at(t) { for (var e = [], n = 1; n < arguments.length; n++)e[n - 1] = arguments[n]; return m.apply(t, e) } function st(t) { if (\"number\" == typeof t) return [t, t, t, t]; var e = t.length; return 2 === e ? [t[0], t[1], t[0], t[1]] : 3 === e ? [t[0], t[1], t[2], t[1]] : t } function lt(t, e) { if (!t) throw new Error(e) } function ut(t) { return null == t ? null : \"function\" == typeof t.trim ? t.trim() : t.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\") } var ht = \"__ec_primitive__\"; function ct(t) { t[ht] = !0 } function pt(t) { return t[ht] } var dt = function () { function t(e) { this.data = {}; var n = Y(e); this.data = {}; var i = this; function r(t, e) { n ? i.set(t, e) : i.set(e, t) } e instanceof t ? e.each(r) : e && E(e, r) } return t.prototype.get = function (t) { return this.data.hasOwnProperty(t) ? this.data[t] : null }, t.prototype.set = function (t, e) { return this.data[t] = e }, t.prototype.each = function (t, e) { for (var n in this.data) this.data.hasOwnProperty(n) && t.call(e, this.data[n], n) }, t.prototype.keys = function () { return G(this.data) }, t.prototype.removeKey = function (t) { delete this.data[t] }, t }(); function ft(t) { return new dt(t) } function gt(t, e) { for (var n = new t.constructor(t.length + e.length), i = 0; i < t.length; i++)n[i] = t[i]; var r = t.length; for (i = 0; i < e.length; i++)n[i + r] = e[i]; return n } function yt(t, e) { var n; if (Object.create) n = Object.create(t); else { var i = function () { }; i.prototype = t, n = new i } return e && A(n, e), n } function vt(t) { var e = t.style; e.webkitUserSelect = \"none\", e.userSelect = \"none\", e.webkitTapHighlightColor = \"rgba(0,0,0,0)\", e[\"-webkit-touch-callout\"] = \"none\" } function mt(t, e) { return t.hasOwnProperty(e) } function xt() { } var _t = 180 / Math.PI, bt = Object.freeze({ __proto__: null, guid: M, logError: I, clone: T, merge: C, mergeAll: D, extend: A, defaults: k, createCanvas: L, indexOf: P, inherits: O, mixin: R, isArrayLike: N, each: E, map: z, reduce: V, filter: B, find: F, keys: G, bind: W, curry: H, isArray: Y, isFunction: U, isString: X, isStringSafe: Z, isNumber: j, isObject: q, isBuiltInObject: K, isTypedArray: $, isDom: J, isGradientObject: Q, isImagePatternObject: tt, isRegExp: et, eqNaN: nt, retrieve: it, retrieve2: rt, retrieve3: ot, slice: at, normalizeCssArray: st, assert: lt, trim: ut, setAsPrimitive: ct, isPrimitive: pt, HashMap: dt, createHashMap: ft, concatArray: gt, createObject: yt, disableUserSelect: vt, hasOwn: mt, noop: xt, RADIAN_TO_DEGREE: _t }); function wt(t, e) { return null == t && (t = 0), null == e && (e = 0), [t, e] } function St(t, e) { return t[0] = e[0], t[1] = e[1], t } function Mt(t) { return [t[0], t[1]] } function It(t, e, n) { return t[0] = e, t[1] = n, t } function Tt(t, e, n) { return t[0] = e[0] + n[0], t[1] = e[1] + n[1], t } function Ct(t, e, n, i) { return t[0] = e[0] + n[0] * i, t[1] = e[1] + n[1] * i, t } function Dt(t, e, n) { return t[0] = e[0] - n[0], t[1] = e[1] - n[1], t } function At(t) { return Math.sqrt(Lt(t)) } var kt = At; function Lt(t) { return t[0] * t[0] + t[1] * t[1] } var Pt = Lt; function Ot(t, e, n) { return t[0] = e[0] * n, t[1] = e[1] * n, t } function Rt(t, e) { var n = At(e); return 0 === n ? (t[0] = 0, t[1] = 0) : (t[0] = e[0] / n, t[1] = e[1] / n), t } function Nt(t, e) { return Math.sqrt((t[0] - e[0]) * (t[0] - e[0]) + (t[1] - e[1]) * (t[1] - e[1])) } var Et = Nt; function zt(t, e) { return (t[0] - e[0]) * (t[0] - e[0]) + (t[1] - e[1]) * (t[1] - e[1]) } var Vt = zt; function Bt(t, e, n, i) { return t[0] = e[0] + i * (n[0] - e[0]), t[1] = e[1] + i * (n[1] - e[1]), t } function Ft(t, e, n) { var i = e[0], r = e[1]; return t[0] = n[0] * i + n[2] * r + n[4], t[1] = n[1] * i + n[3] * r + n[5], t } function Gt(t, e, n) { return t[0] = Math.min(e[0], n[0]), t[1] = Math.min(e[1], n[1]), t } function Wt(t, e, n) { return t[0] = Math.max(e[0], n[0]), t[1] = Math.max(e[1], n[1]), t } var Ht = Object.freeze({ __proto__: null, create: wt, copy: St, clone: Mt, set: It, add: Tt, scaleAndAdd: Ct, sub: Dt, len: At, length: kt, lenSquare: Lt, lengthSquare: Pt, mul: function (t, e, n) { return t[0] = e[0] * n[0], t[1] = e[1] * n[1], t }, div: function (t, e, n) { return t[0] = e[0] / n[0], t[1] = e[1] / n[1], t }, dot: function (t, e) { return t[0] * e[0] + t[1] * e[1] }, scale: Ot, normalize: Rt, distance: Nt, dist: Et, distanceSquare: zt, distSquare: Vt, negate: function (t, e) { return t[0] = -e[0], t[1] = -e[1], t }, lerp: Bt, applyTransform: Ft, min: Gt, max: Wt }), Yt = function (t, e) { this.target = t, this.topTarget = e && e.topTarget }, Ut = function () { function t(t) { this.handler = t, t.on(\"mousedown\", this._dragStart, this), t.on(\"mousemove\", this._drag, this), t.on(\"mouseup\", this._dragEnd, this) } return t.prototype._dragStart = function (t) { for (var e = t.target; e && !e.draggable;)e = e.parent || e.__hostTarget; e && (this._draggingTarget = e, e.dragging = !0, this._x = t.offsetX, this._y = t.offsetY, this.handler.dispatchToElement(new Yt(e, t), \"dragstart\", t.event)) }, t.prototype._drag = function (t) { var e = this._draggingTarget; if (e) { var n = t.offsetX, i = t.offsetY, r = n - this._x, o = i - this._y; this._x = n, this._y = i, e.drift(r, o, t), this.handler.dispatchToElement(new Yt(e, t), \"drag\", t.event); var a = this.handler.findHover(n, i, e).target, s = this._dropTarget; this._dropTarget = a, e !== a && (s && a !== s && this.handler.dispatchToElement(new Yt(s, t), \"dragleave\", t.event), a && a !== s && this.handler.dispatchToElement(new Yt(a, t), \"dragenter\", t.event)) } }, t.prototype._dragEnd = function (t) { var e = this._draggingTarget; e && (e.dragging = !1), this.handler.dispatchToElement(new Yt(e, t), \"dragend\", t.event), this._dropTarget && this.handler.dispatchToElement(new Yt(this._dropTarget, t), \"drop\", t.event), this._draggingTarget = null, this._dropTarget = null }, t }(), Xt = function () { function t(t) { t && (this._$eventProcessor = t) } return t.prototype.on = function (t, e, n, i) { this._$handlers || (this._$handlers = {}); var r = this._$handlers; if (\"function\" == typeof e && (i = n, n = e, e = null), !n || !t) return this; var o = this._$eventProcessor; null != e && o && o.normalizeQuery && (e = o.normalizeQuery(e)), r[t] || (r[t] = []); for (var a = 0; a < r[t].length; a++)if (r[t][a].h === n) return this; var s = { h: n, query: e, ctx: i || this, callAtLast: n.zrEventfulCallAtLast }, l = r[t].length - 1, u = r[t][l]; return u && u.callAtLast ? r[t].splice(l, 0, s) : r[t].push(s), this }, t.prototype.isSilent = function (t) { var e = this._$handlers; return !e || !e[t] || !e[t].length }, t.prototype.off = function (t, e) { var n = this._$handlers; if (!n) return this; if (!t) return this._$handlers = {}, this; if (e) { if (n[t]) { for (var i = [], r = 0, o = n[t].length; r < o; r++)n[t][r].h !== e && i.push(n[t][r]); n[t] = i } n[t] && 0 === n[t].length && delete n[t] } else delete n[t]; return this }, t.prototype.trigger = function (t) { for (var e = [], n = 1; n < arguments.length; n++)e[n - 1] = arguments[n]; if (!this._$handlers) return this; var i = this._$handlers[t], r = this._$eventProcessor; if (i) for (var o = e.length, a = i.length, s = 0; s < a; s++) { var l = i[s]; if (!r || !r.filter || null == l.query || r.filter(t, l.query)) switch (o) { case 0: l.h.call(l.ctx); break; case 1: l.h.call(l.ctx, e[0]); break; case 2: l.h.call(l.ctx, e[0], e[1]); break; default: l.h.apply(l.ctx, e) } } return r && r.afterTrigger && r.afterTrigger(t), this }, t.prototype.triggerWithContext = function (t) { for (var e = [], n = 1; n < arguments.length; n++)e[n - 1] = arguments[n]; if (!this._$handlers) return this; var i = this._$handlers[t], r = this._$eventProcessor; if (i) for (var o = e.length, a = e[o - 1], s = i.length, l = 0; l < s; l++) { var u = i[l]; if (!r || !r.filter || null == u.query || r.filter(t, u.query)) switch (o) { case 0: u.h.call(a); break; case 1: u.h.call(a, e[0]); break; case 2: u.h.call(a, e[0], e[1]); break; default: u.h.apply(a, e.slice(1, o - 1)) } } return r && r.afterTrigger && r.afterTrigger(t), this }, t }(), Zt = Math.log(2); function jt(t, e, n, i, r, o) { var a = i + \"-\" + r, s = t.length; if (o.hasOwnProperty(a)) return o[a]; if (1 === e) { var l = Math.round(Math.log((1 << s) - 1 & ~r) / Zt); return t[n][l] } for (var u = i | 1 << n, h = n + 1; i & 1 << h;)h++; for (var c = 0, p = 0, d = 0; p < s; p++) { var f = 1 << p; f & r || (c += (d % 2 ? -1 : 1) * t[n][p] * jt(t, e - 1, h, u, r | f, o), d++) } return o[a] = c, c } function qt(t, e) { var n = [[t[0], t[1], 1, 0, 0, 0, -e[0] * t[0], -e[0] * t[1]], [0, 0, 0, t[0], t[1], 1, -e[1] * t[0], -e[1] * t[1]], [t[2], t[3], 1, 0, 0, 0, -e[2] * t[2], -e[2] * t[3]], [0, 0, 0, t[2], t[3], 1, -e[3] * t[2], -e[3] * t[3]], [t[4], t[5], 1, 0, 0, 0, -e[4] * t[4], -e[4] * t[5]], [0, 0, 0, t[4], t[5], 1, -e[5] * t[4], -e[5] * t[5]], [t[6], t[7], 1, 0, 0, 0, -e[6] * t[6], -e[6] * t[7]], [0, 0, 0, t[6], t[7], 1, -e[7] * t[6], -e[7] * t[7]]], i = {}, r = jt(n, 8, 0, 0, 0, i); if (0 !== r) { for (var o = [], a = 0; a < 8; a++)for (var s = 0; s < 8; s++)null == o[s] && (o[s] = 0), o[s] += ((a + s) % 2 ? -1 : 1) * jt(n, 7, 0 === a ? 1 : 0, 1 << a, 1 << s, i) / r * e[a]; return function (t, e, n) { var i = e * o[6] + n * o[7] + 1; t[0] = (e * o[0] + n * o[1] + o[2]) / i, t[1] = (e * o[3] + n * o[4] + o[5]) / i } } } var Kt = []; function $t(t, e, n, i, o) { if (e.getBoundingClientRect && r.domSupported && !Jt(e)) { var a = e.___zrEVENTSAVED || (e.___zrEVENTSAVED = {}), s = function (t, e) { var n = e.markers; if (n) return n; n = e.markers = []; for (var i = [\"left\", \"right\"], r = [\"top\", \"bottom\"], o = 0; o < 4; o++) { var a = document.createElement(\"div\"), s = o % 2, l = (o >> 1) % 2; a.style.cssText = [\"position: absolute\", \"visibility: hidden\", \"padding: 0\", \"margin: 0\", \"border-width: 0\", \"user-select: none\", \"width:0\", \"height:0\", i[s] + \":0\", r[l] + \":0\", i[1 - s] + \":auto\", r[1 - l] + \":auto\", \"\"].join(\"!important;\"), t.appendChild(a), n.push(a) } return n }(e, a), l = function (t, e, n) { for (var i = n ? \"invTrans\" : \"trans\", r = e[i], o = e.srcCoords, a = [], s = [], l = !0, u = 0; u < 4; u++) { var h = t[u].getBoundingClientRect(), c = 2 * u, p = h.left, d = h.top; a.push(p, d), l = l && o && p === o[c] && d === o[c + 1], s.push(t[u].offsetLeft, t[u].offsetTop) } return l && r ? r : (e.srcCoords = a, e[i] = n ? qt(s, a) : qt(a, s)) }(s, a, o); if (l) return l(t, n, i), !0 } return !1 } function Jt(t) { return \"CANVAS\" === t.nodeName.toUpperCase() } var Qt = /([&<>\"'])/g, te = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }; function ee(t) { return null == t ? \"\" : (t + \"\").replace(Qt, (function (t, e) { return te[e] })) } var ne = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, ie = [], re = r.browser.firefox && +r.browser.version.split(\".\")[0] < 39; function oe(t, e, n, i) { return n = n || {}, i ? ae(t, e, n) : re && null != e.layerX && e.layerX !== e.offsetX ? (n.zrX = e.layerX, n.zrY = e.layerY) : null != e.offsetX ? (n.zrX = e.offsetX, n.zrY = e.offsetY) : ae(t, e, n), n } function ae(t, e, n) { if (r.domSupported && t.getBoundingClientRect) { var i = e.clientX, o = e.clientY; if (Jt(t)) { var a = t.getBoundingClientRect(); return n.zrX = i - a.left, void (n.zrY = o - a.top) } if ($t(ie, t, i, o)) return n.zrX = ie[0], void (n.zrY = ie[1]) } n.zrX = n.zrY = 0 } function se(t) { return t || window.event } function le(t, e, n) { if (null != (e = se(e)).zrX) return e; var i = e.type; if (i && i.indexOf(\"touch\") >= 0) { var r = \"touchend\" !== i ? e.targetTouches[0] : e.changedTouches[0]; r && oe(t, r, e, n) } else { oe(t, e, e, n); var o = function (t) { var e = t.wheelDelta; if (e) return e; var n = t.deltaX, i = t.deltaY; if (null == n || null == i) return e; return 3 * (0 !== i ? Math.abs(i) : Math.abs(n)) * (i > 0 ? -1 : i < 0 ? 1 : n > 0 ? -1 : 1) }(e); e.zrDelta = o ? o / 120 : -(e.detail || 0) / 3 } var a = e.button; return null == e.which && void 0 !== a && ne.test(e.type) && (e.which = 1 & a ? 1 : 2 & a ? 3 : 4 & a ? 2 : 0), e } function ue(t, e, n, i) { t.addEventListener(e, n, i) } var he = function (t) { t.preventDefault(), t.stopPropagation(), t.cancelBubble = !0 }; function ce(t) { return 2 === t.which || 3 === t.which } var pe = function () { function t() { this._track = [] } return t.prototype.recognize = function (t, e, n) { return this._doTrack(t, e, n), this._recognize(t) }, t.prototype.clear = function () { return this._track.length = 0, this }, t.prototype._doTrack = function (t, e, n) { var i = t.touches; if (i) { for (var r = { points: [], touches: [], target: e, event: t }, o = 0, a = i.length; o < a; o++) { var s = i[o], l = oe(n, s, {}); r.points.push([l.zrX, l.zrY]), r.touches.push(s) } this._track.push(r) } }, t.prototype._recognize = function (t) { for (var e in fe) if (fe.hasOwnProperty(e)) { var n = fe[e](this._track, t); if (n) return n } }, t }(); function de(t) { var e = t[1][0] - t[0][0], n = t[1][1] - t[0][1]; return Math.sqrt(e * e + n * n) } var fe = { pinch: function (t, e) { var n = t.length; if (n) { var i, r = (t[n - 1] || {}).points, o = (t[n - 2] || {}).points || r; if (o && o.length > 1 && r && r.length > 1) { var a = de(r) / de(o); !isFinite(a) && (a = 1), e.pinchScale = a; var s = [((i = r)[0][0] + i[1][0]) / 2, (i[0][1] + i[1][1]) / 2]; return e.pinchX = s[0], e.pinchY = s[1], { type: \"pinch\", target: t[0].target, event: e } } } } }; function ge() { return [1, 0, 0, 1, 0, 0] } function ye(t) { return t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 1, t[4] = 0, t[5] = 0, t } function ve(t, e) { return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t } function me(t, e, n) { var i = e[0] * n[0] + e[2] * n[1], r = e[1] * n[0] + e[3] * n[1], o = e[0] * n[2] + e[2] * n[3], a = e[1] * n[2] + e[3] * n[3], s = e[0] * n[4] + e[2] * n[5] + e[4], l = e[1] * n[4] + e[3] * n[5] + e[5]; return t[0] = i, t[1] = r, t[2] = o, t[3] = a, t[4] = s, t[5] = l, t } function xe(t, e, n) { return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4] + n[0], t[5] = e[5] + n[1], t } function _e(t, e, n) { var i = e[0], r = e[2], o = e[4], a = e[1], s = e[3], l = e[5], u = Math.sin(n), h = Math.cos(n); return t[0] = i * h + a * u, t[1] = -i * u + a * h, t[2] = r * h + s * u, t[3] = -r * u + h * s, t[4] = h * o + u * l, t[5] = h * l - u * o, t } function be(t, e, n) { var i = n[0], r = n[1]; return t[0] = e[0] * i, t[1] = e[1] * r, t[2] = e[2] * i, t[3] = e[3] * r, t[4] = e[4] * i, t[5] = e[5] * r, t } function we(t, e) { var n = e[0], i = e[2], r = e[4], o = e[1], a = e[3], s = e[5], l = n * a - o * i; return l ? (l = 1 / l, t[0] = a * l, t[1] = -o * l, t[2] = -i * l, t[3] = n * l, t[4] = (i * s - a * r) * l, t[5] = (o * r - n * s) * l, t) : null } function Se(t) { var e = [1, 0, 0, 1, 0, 0]; return ve(e, t), e } var Me = Object.freeze({ __proto__: null, create: ge, identity: ye, copy: ve, mul: me, translate: xe, rotate: _e, scale: be, invert: we, clone: Se }), Ie = function () { function t(t, e) { this.x = t || 0, this.y = e || 0 } return t.prototype.copy = function (t) { return this.x = t.x, this.y = t.y, this }, t.prototype.clone = function () { return new t(this.x, this.y) }, t.prototype.set = function (t, e) { return this.x = t, this.y = e, this }, t.prototype.equal = function (t) { return t.x === this.x && t.y === this.y }, t.prototype.add = function (t) { return this.x += t.x, this.y += t.y, this }, t.prototype.scale = function (t) { this.x *= t, this.y *= t }, t.prototype.scaleAndAdd = function (t, e) { this.x += t.x * e, this.y += t.y * e }, t.prototype.sub = function (t) { return this.x -= t.x, this.y -= t.y, this }, t.prototype.dot = function (t) { return this.x * t.x + this.y * t.y }, t.prototype.len = function () { return Math.sqrt(this.x * this.x + this.y * this.y) }, t.prototype.lenSquare = function () { return this.x * this.x + this.y * this.y }, t.prototype.normalize = function () { var t = this.len(); return this.x /= t, this.y /= t, this }, t.prototype.distance = function (t) { var e = this.x - t.x, n = this.y - t.y; return Math.sqrt(e * e + n * n) }, t.prototype.distanceSquare = function (t) { var e = this.x - t.x, n = this.y - t.y; return e * e + n * n }, t.prototype.negate = function () { return this.x = -this.x, this.y = -this.y, this }, t.prototype.transform = function (t) { if (t) { var e = this.x, n = this.y; return this.x = t[0] * e + t[2] * n + t[4], this.y = t[1] * e + t[3] * n + t[5], this } }, t.prototype.toArray = function (t) { return t[0] = this.x, t[1] = this.y, t }, t.prototype.fromArray = function (t) { this.x = t[0], this.y = t[1] }, t.set = function (t, e, n) { t.x = e, t.y = n }, t.copy = function (t, e) { t.x = e.x, t.y = e.y }, t.len = function (t) { return Math.sqrt(t.x * t.x + t.y * t.y) }, t.lenSquare = function (t) { return t.x * t.x + t.y * t.y }, t.dot = function (t, e) { return t.x * e.x + t.y * e.y }, t.add = function (t, e, n) { t.x = e.x + n.x, t.y = e.y + n.y }, t.sub = function (t, e, n) { t.x = e.x - n.x, t.y = e.y - n.y }, t.scale = function (t, e, n) { t.x = e.x * n, t.y = e.y * n }, t.scaleAndAdd = function (t, e, n, i) { t.x = e.x + n.x * i, t.y = e.y + n.y * i }, t.lerp = function (t, e, n, i) { var r = 1 - i; t.x = r * e.x + i * n.x, t.y = r * e.y + i * n.y }, t }(), Te = Math.min, Ce = Math.max, De = new Ie, Ae = new Ie, ke = new Ie, Le = new Ie, Pe = new Ie, Oe = new Ie, Re = function () { function t(t, e, n, i) { n < 0 && (t += n, n = -n), i < 0 && (e += i, i = -i), this.x = t, this.y = e, this.width = n, this.height = i } return t.prototype.union = function (t) { var e = Te(t.x, this.x), n = Te(t.y, this.y); isFinite(this.x) && isFinite(this.width) ? this.width = Ce(t.x + t.width, this.x + this.width) - e : this.width = t.width, isFinite(this.y) && isFinite(this.height) ? this.height = Ce(t.y + t.height, this.y + this.height) - n : this.height = t.height, this.x = e, this.y = n }, t.prototype.applyTransform = function (e) { t.applyTransform(this, this, e) }, t.prototype.calculateTransform = function (t) { var e = this, n = t.width / e.width, i = t.height / e.height, r = [1, 0, 0, 1, 0, 0]; return xe(r, r, [-e.x, -e.y]), be(r, r, [n, i]), xe(r, r, [t.x, t.y]), r }, t.prototype.intersect = function (e, n) { if (!e) return !1; e instanceof t || (e = t.create(e)); var i = this, r = i.x, o = i.x + i.width, a = i.y, s = i.y + i.height, l = e.x, u = e.x + e.width, h = e.y, c = e.y + e.height, p = !(o < l || u < r || s < h || c < a); if (n) { var d = 1 / 0, f = 0, g = Math.abs(o - l), y = Math.abs(u - r), v = Math.abs(s - h), m = Math.abs(c - a), x = Math.min(g, y), _ = Math.min(v, m); o < l || u < r ? x > f && (f = x, g < y ? Ie.set(Oe, -g, 0) : Ie.set(Oe, y, 0)) : x < d && (d = x, g < y ? Ie.set(Pe, g, 0) : Ie.set(Pe, -y, 0)), s < h || c < a ? _ > f && (f = _, v < m ? Ie.set(Oe, 0, -v) : Ie.set(Oe, 0, m)) : x < d && (d = x, v < m ? Ie.set(Pe, 0, v) : Ie.set(Pe, 0, -m)) } return n && Ie.copy(n, p ? Pe : Oe), p }, t.prototype.contain = function (t, e) { var n = this; return t >= n.x && t <= n.x + n.width && e >= n.y && e <= n.y + n.height }, t.prototype.clone = function () { return new t(this.x, this.y, this.width, this.height) }, t.prototype.copy = function (e) { t.copy(this, e) }, t.prototype.plain = function () { return { x: this.x, y: this.y, width: this.width, height: this.height } }, t.prototype.isFinite = function () { return isFinite(this.x) && isFinite(this.y) && isFinite(this.width) && isFinite(this.height) }, t.prototype.isZero = function () { return 0 === this.width || 0 === this.height }, t.create = function (e) { return new t(e.x, e.y, e.width, e.height) }, t.copy = function (t, e) { t.x = e.x, t.y = e.y, t.width = e.width, t.height = e.height }, t.applyTransform = function (e, n, i) { if (i) { if (i[1] < 1e-5 && i[1] > -1e-5 && i[2] < 1e-5 && i[2] > -1e-5) { var r = i[0], o = i[3], a = i[4], s = i[5]; return e.x = n.x * r + a, e.y = n.y * o + s, e.width = n.width * r, e.height = n.height * o, e.width < 0 && (e.x += e.width, e.width = -e.width), void (e.height < 0 && (e.y += e.height, e.height = -e.height)) } De.x = ke.x = n.x, De.y = Le.y = n.y, Ae.x = Le.x = n.x + n.width, Ae.y = ke.y = n.y + n.height, De.transform(i), Le.transform(i), Ae.transform(i), ke.transform(i), e.x = Te(De.x, Ae.x, ke.x, Le.x), e.y = Te(De.y, Ae.y, ke.y, Le.y); var l = Ce(De.x, Ae.x, ke.x, Le.x), u = Ce(De.y, Ae.y, ke.y, Le.y); e.width = l - e.x, e.height = u - e.y } else e !== n && t.copy(e, n) }, t }(), Ne = \"silent\"; function Ee() { he(this.event) } var ze = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.handler = null, e } return n(e, t), e.prototype.dispose = function () { }, e.prototype.setCursor = function () { }, e }(Xt), Ve = function (t, e) { this.x = t, this.y = e }, Be = [\"click\", \"dblclick\", \"mousewheel\", \"mouseout\", \"mouseup\", \"mousedown\", \"mousemove\", \"contextmenu\"], Fe = new Re(0, 0, 0, 0), Ge = function (t) { function e(e, n, i, r, o) { var a = t.call(this) || this; return a._hovered = new Ve(0, 0), a.storage = e, a.painter = n, a.painterRoot = r, a._pointerSize = o, i = i || new ze, a.proxy = null, a.setHandlerProxy(i), a._draggingMgr = new Ut(a), a } return n(e, t), e.prototype.setHandlerProxy = function (t) { this.proxy && this.proxy.dispose(), t && (E(Be, (function (e) { t.on && t.on(e, this[e], this) }), this), t.handler = this), this.proxy = t }, e.prototype.mousemove = function (t) { var e = t.zrX, n = t.zrY, i = Ye(this, e, n), r = this._hovered, o = r.target; o && !o.__zr && (o = (r = this.findHover(r.x, r.y)).target); var a = this._hovered = i ? new Ve(e, n) : this.findHover(e, n), s = a.target, l = this.proxy; l.setCursor && l.setCursor(s ? s.cursor : \"default\"), o && s !== o && this.dispatchToElement(r, \"mouseout\", t), this.dispatchToElement(a, \"mousemove\", t), s && s !== o && this.dispatchToElement(a, \"mouseover\", t) }, e.prototype.mouseout = function (t) { var e = t.zrEventControl; \"only_globalout\" !== e && this.dispatchToElement(this._hovered, \"mouseout\", t), \"no_globalout\" !== e && this.trigger(\"globalout\", { type: \"globalout\", event: t }) }, e.prototype.resize = function () { this._hovered = new Ve(0, 0) }, e.prototype.dispatch = function (t, e) { var n = this[t]; n && n.call(this, e) }, e.prototype.dispose = function () { this.proxy.dispose(), this.storage = null, this.proxy = null, this.painter = null }, e.prototype.setCursorStyle = function (t) { var e = this.proxy; e.setCursor && e.setCursor(t) }, e.prototype.dispatchToElement = function (t, e, n) { var i = (t = t || {}).target; if (!i || !i.silent) { for (var r = \"on\" + e, o = function (t, e, n) { return { type: t, event: n, target: e.target, topTarget: e.topTarget, cancelBubble: !1, offsetX: n.zrX, offsetY: n.zrY, gestureEvent: n.gestureEvent, pinchX: n.pinchX, pinchY: n.pinchY, pinchScale: n.pinchScale, wheelDelta: n.zrDelta, zrByTouch: n.zrByTouch, which: n.which, stop: Ee } }(e, t, n); i && (i[r] && (o.cancelBubble = !!i[r].call(i, o)), i.trigger(e, o), i = i.__hostTarget ? i.__hostTarget : i.parent, !o.cancelBubble);); o.cancelBubble || (this.trigger(e, o), this.painter && this.painter.eachOtherLayer && this.painter.eachOtherLayer((function (t) { \"function\" == typeof t[r] && t[r].call(t, o), t.trigger && t.trigger(e, o) }))) } }, e.prototype.findHover = function (t, e, n) { var i = this.storage.getDisplayList(), r = new Ve(t, e); if (He(i, r, t, e, n), this._pointerSize && !r.target) { for (var o = [], a = this._pointerSize, s = a / 2, l = new Re(t - s, e - s, a, a), u = i.length - 1; u >= 0; u--) { var h = i[u]; h === n || h.ignore || h.ignoreCoarsePointer || h.parent && h.parent.ignoreCoarsePointer || (Fe.copy(h.getBoundingRect()), h.transform && Fe.applyTransform(h.transform), Fe.intersect(l) && o.push(h)) } if (o.length) for (var c = Math.PI / 12, p = 2 * Math.PI, d = 0; d < s; d += 4)for (var f = 0; f < p; f += c) { if (He(o, r, t + d * Math.cos(f), e + d * Math.sin(f), n), r.target) return r } } return r }, e.prototype.processGesture = function (t, e) { this._gestureMgr || (this._gestureMgr = new pe); var n = this._gestureMgr; \"start\" === e && n.clear(); var i = n.recognize(t, this.findHover(t.zrX, t.zrY, null).target, this.proxy.dom); if (\"end\" === e && n.clear(), i) { var r = i.type; t.gestureEvent = r; var o = new Ve; o.target = i.target, this.dispatchToElement(o, r, i.event) } }, e }(Xt); function We(t, e, n) { if (t[t.rectHover ? \"rectContain\" : \"contain\"](e, n)) { for (var i = t, r = void 0, o = !1; i;) { if (i.ignoreClip && (o = !0), !o) { var a = i.getClipPath(); if (a && !a.contain(e, n)) return !1; i.silent && (r = !0) } var s = i.__hostTarget; i = s || i.parent } return !r || Ne } return !1 } function He(t, e, n, i, r) { for (var o = t.length - 1; o >= 0; o--) { var a = t[o], s = void 0; if (a !== r && !a.ignore && (s = We(a, n, i)) && (!e.topTarget && (e.topTarget = a), s !== Ne)) { e.target = a; break } } } function Ye(t, e, n) { var i = t.painter; return e < 0 || e > i.getWidth() || n < 0 || n > i.getHeight() } E([\"click\", \"mousedown\", \"mouseup\", \"mousewheel\", \"dblclick\", \"contextmenu\"], (function (t) { Ge.prototype[t] = function (e) { var n, i, r = e.zrX, o = e.zrY, a = Ye(this, r, o); if (\"mouseup\" === t && a || (i = (n = this.findHover(r, o)).target), \"mousedown\" === t) this._downEl = i, this._downPoint = [e.zrX, e.zrY], this._upEl = i; else if (\"mouseup\" === t) this._upEl = i; else if (\"click\" === t) { if (this._downEl !== this._upEl || !this._downPoint || Et(this._downPoint, [e.zrX, e.zrY]) > 4) return; this._downPoint = null } this.dispatchToElement(n, t, e) } })); function Ue(t, e, n, i) { var r = e + 1; if (r === n) return 1; if (i(t[r++], t[e]) < 0) { for (; r < n && i(t[r], t[r - 1]) < 0;)r++; !function (t, e, n) { n--; for (; e < n;) { var i = t[e]; t[e++] = t[n], t[n--] = i } }(t, e, r) } else for (; r < n && i(t[r], t[r - 1]) >= 0;)r++; return r - e } function Xe(t, e, n, i, r) { for (i === e && i++; i < n; i++) { for (var o, a = t[i], s = e, l = i; s < l;)r(a, t[o = s + l >>> 1]) < 0 ? l = o : s = o + 1; var u = i - s; switch (u) { case 3: t[s + 3] = t[s + 2]; case 2: t[s + 2] = t[s + 1]; case 1: t[s + 1] = t[s]; break; default: for (; u > 0;)t[s + u] = t[s + u - 1], u-- }t[s] = a } } function Ze(t, e, n, i, r, o) { var a = 0, s = 0, l = 1; if (o(t, e[n + r]) > 0) { for (s = i - r; l < s && o(t, e[n + r + l]) > 0;)a = l, (l = 1 + (l << 1)) <= 0 && (l = s); l > s && (l = s), a += r, l += r } else { for (s = r + 1; l < s && o(t, e[n + r - l]) <= 0;)a = l, (l = 1 + (l << 1)) <= 0 && (l = s); l > s && (l = s); var u = a; a = r - l, l = r - u } for (a++; a < l;) { var h = a + (l - a >>> 1); o(t, e[n + h]) > 0 ? a = h + 1 : l = h } return l } function je(t, e, n, i, r, o) { var a = 0, s = 0, l = 1; if (o(t, e[n + r]) < 0) { for (s = r + 1; l < s && o(t, e[n + r - l]) < 0;)a = l, (l = 1 + (l << 1)) <= 0 && (l = s); l > s && (l = s); var u = a; a = r - l, l = r - u } else { for (s = i - r; l < s && o(t, e[n + r + l]) >= 0;)a = l, (l = 1 + (l << 1)) <= 0 && (l = s); l > s && (l = s), a += r, l += r } for (a++; a < l;) { var h = a + (l - a >>> 1); o(t, e[n + h]) < 0 ? l = h : a = h + 1 } return l } function qe(t, e) { var n, i, r = 7, o = 0; t.length; var a = []; function s(s) { var l = n[s], u = i[s], h = n[s + 1], c = i[s + 1]; i[s] = u + c, s === o - 3 && (n[s + 1] = n[s + 2], i[s + 1] = i[s + 2]), o--; var p = je(t[h], t, l, u, 0, e); l += p, 0 !== (u -= p) && 0 !== (c = Ze(t[l + u - 1], t, h, c, c - 1, e)) && (u <= c ? function (n, i, o, s) { var l = 0; for (l = 0; l < i; l++)a[l] = t[n + l]; var u = 0, h = o, c = n; if (t[c++] = t[h++], 0 == --s) { for (l = 0; l < i; l++)t[c + l] = a[u + l]; return } if (1 === i) { for (l = 0; l < s; l++)t[c + l] = t[h + l]; return void (t[c + s] = a[u]) } var p, d, f, g = r; for (; ;) { p = 0, d = 0, f = !1; do { if (e(t[h], a[u]) < 0) { if (t[c++] = t[h++], d++, p = 0, 0 == --s) { f = !0; break } } else if (t[c++] = a[u++], p++, d = 0, 1 == --i) { f = !0; break } } while ((p | d) < g); if (f) break; do { if (0 !== (p = je(t[h], a, u, i, 0, e))) { for (l = 0; l < p; l++)t[c + l] = a[u + l]; if (c += p, u += p, (i -= p) <= 1) { f = !0; break } } if (t[c++] = t[h++], 0 == --s) { f = !0; break } if (0 !== (d = Ze(a[u], t, h, s, 0, e))) { for (l = 0; l < d; l++)t[c + l] = t[h + l]; if (c += d, h += d, 0 === (s -= d)) { f = !0; break } } if (t[c++] = a[u++], 1 == --i) { f = !0; break } g-- } while (p >= 7 || d >= 7); if (f) break; g < 0 && (g = 0), g += 2 } if ((r = g) < 1 && (r = 1), 1 === i) { for (l = 0; l < s; l++)t[c + l] = t[h + l]; t[c + s] = a[u] } else { if (0 === i) throw new Error; for (l = 0; l < i; l++)t[c + l] = a[u + l] } }(l, u, h, c) : function (n, i, o, s) { var l = 0; for (l = 0; l < s; l++)a[l] = t[o + l]; var u = n + i - 1, h = s - 1, c = o + s - 1, p = 0, d = 0; if (t[c--] = t[u--], 0 == --i) { for (p = c - (s - 1), l = 0; l < s; l++)t[p + l] = a[l]; return } if (1 === s) { for (d = (c -= i) + 1, p = (u -= i) + 1, l = i - 1; l >= 0; l--)t[d + l] = t[p + l]; return void (t[c] = a[h]) } var f = r; for (; ;) { var g = 0, y = 0, v = !1; do { if (e(a[h], t[u]) < 0) { if (t[c--] = t[u--], g++, y = 0, 0 == --i) { v = !0; break } } else if (t[c--] = a[h--], y++, g = 0, 1 == --s) { v = !0; break } } while ((g | y) < f); if (v) break; do { if (0 !== (g = i - je(a[h], t, n, i, i - 1, e))) { for (i -= g, d = (c -= g) + 1, p = (u -= g) + 1, l = g - 1; l >= 0; l--)t[d + l] = t[p + l]; if (0 === i) { v = !0; break } } if (t[c--] = a[h--], 1 == --s) { v = !0; break } if (0 !== (y = s - Ze(t[u], a, 0, s, s - 1, e))) { for (s -= y, d = (c -= y) + 1, p = (h -= y) + 1, l = 0; l < y; l++)t[d + l] = a[p + l]; if (s <= 1) { v = !0; break } } if (t[c--] = t[u--], 0 == --i) { v = !0; break } f-- } while (g >= 7 || y >= 7); if (v) break; f < 0 && (f = 0), f += 2 } (r = f) < 1 && (r = 1); if (1 === s) { for (d = (c -= i) + 1, p = (u -= i) + 1, l = i - 1; l >= 0; l--)t[d + l] = t[p + l]; t[c] = a[h] } else { if (0 === s) throw new Error; for (p = c - (s - 1), l = 0; l < s; l++)t[p + l] = a[l] } }(l, u, h, c)) } return n = [], i = [], { mergeRuns: function () { for (; o > 1;) { var t = o - 2; if (t >= 1 && i[t - 1] <= i[t] + i[t + 1] || t >= 2 && i[t - 2] <= i[t] + i[t - 1]) i[t - 1] < i[t + 1] && t--; else if (i[t] > i[t + 1]) break; s(t) } }, forceMergeRuns: function () { for (; o > 1;) { var t = o - 2; t > 0 && i[t - 1] < i[t + 1] && t--, s(t) } }, pushRun: function (t, e) { n[o] = t, i[o] = e, o += 1 } } } function Ke(t, e, n, i) { n || (n = 0), i || (i = t.length); var r = i - n; if (!(r < 2)) { var o = 0; if (r < 32) Xe(t, n, i, n + (o = Ue(t, n, i, e)), e); else { var a = qe(t, e), s = function (t) { for (var e = 0; t >= 32;)e |= 1 & t, t >>= 1; return t + e }(r); do { if ((o = Ue(t, n, i, e)) < s) { var l = r; l > s && (l = s), Xe(t, n, n + l, n + o, e), o = l } a.pushRun(n, o), a.mergeRuns(), r -= o, n += o } while (0 !== r); a.forceMergeRuns() } } } var $e = !1; function Je() { $e || ($e = !0, console.warn(\"z / z2 / zlevel of displayable is invalid, which may cause unexpected errors\")) } function Qe(t, e) { return t.zlevel === e.zlevel ? t.z === e.z ? t.z2 - e.z2 : t.z - e.z : t.zlevel - e.zlevel } var tn = function () { function t() { this._roots = [], this._displayList = [], this._displayListLen = 0, this.displayableSortFunc = Qe } return t.prototype.traverse = function (t, e) { for (var n = 0; n < this._roots.length; n++)this._roots[n].traverse(t, e) }, t.prototype.getDisplayList = function (t, e) { e = e || !1; var n = this._displayList; return !t && n.length || this.updateDisplayList(e), n }, t.prototype.updateDisplayList = function (t) { this._displayListLen = 0; for (var e = this._roots, n = this._displayList, i = 0, r = e.length; i < r; i++)this._updateAndAddDisplayable(e[i], null, t); n.length = this._displayListLen, Ke(n, Qe) }, t.prototype._updateAndAddDisplayable = function (t, e, n) { if (!t.ignore || n) { t.beforeUpdate(), t.update(), t.afterUpdate(); var i = t.getClipPath(); if (t.ignoreClip) e = null; else if (i) { e = e ? e.slice() : []; for (var r = i, o = t; r;)r.parent = o, r.updateTransform(), e.push(r), o = r, r = r.getClipPath() } if (t.childrenRef) { for (var a = t.childrenRef(), s = 0; s < a.length; s++) { var l = a[s]; t.__dirty && (l.__dirty |= 1), this._updateAndAddDisplayable(l, e, n) } t.__dirty = 0 } else { var u = t; e && e.length ? u.__clipPaths = e : u.__clipPaths && u.__clipPaths.length > 0 && (u.__clipPaths = []), isNaN(u.z) && (Je(), u.z = 0), isNaN(u.z2) && (Je(), u.z2 = 0), isNaN(u.zlevel) && (Je(), u.zlevel = 0), this._displayList[this._displayListLen++] = u } var h = t.getDecalElement && t.getDecalElement(); h && this._updateAndAddDisplayable(h, e, n); var c = t.getTextGuideLine(); c && this._updateAndAddDisplayable(c, e, n); var p = t.getTextContent(); p && this._updateAndAddDisplayable(p, e, n) } }, t.prototype.addRoot = function (t) { t.__zr && t.__zr.storage === this || this._roots.push(t) }, t.prototype.delRoot = function (t) { if (t instanceof Array) for (var e = 0, n = t.length; e < n; e++)this.delRoot(t[e]); else { var i = P(this._roots, t); i >= 0 && this._roots.splice(i, 1) } }, t.prototype.delAllRoots = function () { this._roots = [], this._displayList = [], this._displayListLen = 0 }, t.prototype.getRoots = function () { return this._roots }, t.prototype.dispose = function () { this._displayList = null, this._roots = null }, t }(), en = r.hasGlobalWindow && (window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window) || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame) || function (t) { return setTimeout(t, 16) }, nn = { linear: function (t) { return t }, quadraticIn: function (t) { return t * t }, quadraticOut: function (t) { return t * (2 - t) }, quadraticInOut: function (t) { return (t *= 2) < 1 ? .5 * t * t : -.5 * (--t * (t - 2) - 1) }, cubicIn: function (t) { return t * t * t }, cubicOut: function (t) { return --t * t * t + 1 }, cubicInOut: function (t) { return (t *= 2) < 1 ? .5 * t * t * t : .5 * ((t -= 2) * t * t + 2) }, quarticIn: function (t) { return t * t * t * t }, quarticOut: function (t) { return 1 - --t * t * t * t }, quarticInOut: function (t) { return (t *= 2) < 1 ? .5 * t * t * t * t : -.5 * ((t -= 2) * t * t * t - 2) }, quinticIn: function (t) { return t * t * t * t * t }, quinticOut: function (t) { return --t * t * t * t * t + 1 }, quinticInOut: function (t) { return (t *= 2) < 1 ? .5 * t * t * t * t * t : .5 * ((t -= 2) * t * t * t * t + 2) }, sinusoidalIn: function (t) { return 1 - Math.cos(t * Math.PI / 2) }, sinusoidalOut: function (t) { return Math.sin(t * Math.PI / 2) }, sinusoidalInOut: function (t) { return .5 * (1 - Math.cos(Math.PI * t)) }, exponentialIn: function (t) { return 0 === t ? 0 : Math.pow(1024, t - 1) }, exponentialOut: function (t) { return 1 === t ? 1 : 1 - Math.pow(2, -10 * t) }, exponentialInOut: function (t) { return 0 === t ? 0 : 1 === t ? 1 : (t *= 2) < 1 ? .5 * Math.pow(1024, t - 1) : .5 * (2 - Math.pow(2, -10 * (t - 1))) }, circularIn: function (t) { return 1 - Math.sqrt(1 - t * t) }, circularOut: function (t) { return Math.sqrt(1 - --t * t) }, circularInOut: function (t) { return (t *= 2) < 1 ? -.5 * (Math.sqrt(1 - t * t) - 1) : .5 * (Math.sqrt(1 - (t -= 2) * t) + 1) }, elasticIn: function (t) { var e, n = .1; return 0 === t ? 0 : 1 === t ? 1 : (!n || n < 1 ? (n = 1, e = .1) : e = .4 * Math.asin(1 / n) / (2 * Math.PI), -n * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / .4)) }, elasticOut: function (t) { var e, n = .1; return 0 === t ? 0 : 1 === t ? 1 : (!n || n < 1 ? (n = 1, e = .1) : e = .4 * Math.asin(1 / n) / (2 * Math.PI), n * Math.pow(2, -10 * t) * Math.sin((t - e) * (2 * Math.PI) / .4) + 1) }, elasticInOut: function (t) { var e, n = .1, i = .4; return 0 === t ? 0 : 1 === t ? 1 : (!n || n < 1 ? (n = 1, e = .1) : e = i * Math.asin(1 / n) / (2 * Math.PI), (t *= 2) < 1 ? n * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / i) * -.5 : n * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / i) * .5 + 1) }, backIn: function (t) { var e = 1.70158; return t * t * ((e + 1) * t - e) }, backOut: function (t) { var e = 1.70158; return --t * t * ((e + 1) * t + e) + 1 }, backInOut: function (t) { var e = 2.5949095; return (t *= 2) < 1 ? t * t * ((e + 1) * t - e) * .5 : .5 * ((t -= 2) * t * ((e + 1) * t + e) + 2) }, bounceIn: function (t) { return 1 - nn.bounceOut(1 - t) }, bounceOut: function (t) { return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375 }, bounceInOut: function (t) { return t < .5 ? .5 * nn.bounceIn(2 * t) : .5 * nn.bounceOut(2 * t - 1) + .5 } }, rn = Math.pow, on = Math.sqrt, an = 1e-8, sn = 1e-4, ln = on(3), un = 1 / 3, hn = wt(), cn = wt(), pn = wt(); function dn(t) { return t > -1e-8 && t < an } function fn(t) { return t > an || t < -1e-8 } function gn(t, e, n, i, r) { var o = 1 - r; return o * o * (o * t + 3 * r * e) + r * r * (r * i + 3 * o * n) } function yn(t, e, n, i, r) { var o = 1 - r; return 3 * (((e - t) * o + 2 * (n - e) * r) * o + (i - n) * r * r) } function vn(t, e, n, i, r, o) { var a = i + 3 * (e - n) - t, s = 3 * (n - 2 * e + t), l = 3 * (e - t), u = t - r, h = s * s - 3 * a * l, c = s * l - 9 * a * u, p = l * l - 3 * s * u, d = 0; if (dn(h) && dn(c)) { if (dn(s)) o[0] = 0; else (M = -l / s) >= 0 && M <= 1 && (o[d++] = M) } else { var f = c * c - 4 * h * p; if (dn(f)) { var g = c / h, y = -g / 2; (M = -s / a + g) >= 0 && M <= 1 && (o[d++] = M), y >= 0 && y <= 1 && (o[d++] = y) } else if (f > 0) { var v = on(f), m = h * s + 1.5 * a * (-c + v), x = h * s + 1.5 * a * (-c - v); (M = (-s - ((m = m < 0 ? -rn(-m, un) : rn(m, un)) + (x = x < 0 ? -rn(-x, un) : rn(x, un)))) / (3 * a)) >= 0 && M <= 1 && (o[d++] = M) } else { var _ = (2 * h * s - 3 * a * c) / (2 * on(h * h * h)), b = Math.acos(_) / 3, w = on(h), S = Math.cos(b), M = (-s - 2 * w * S) / (3 * a), I = (y = (-s + w * (S + ln * Math.sin(b))) / (3 * a), (-s + w * (S - ln * Math.sin(b))) / (3 * a)); M >= 0 && M <= 1 && (o[d++] = M), y >= 0 && y <= 1 && (o[d++] = y), I >= 0 && I <= 1 && (o[d++] = I) } } return d } function mn(t, e, n, i, r) { var o = 6 * n - 12 * e + 6 * t, a = 9 * e + 3 * i - 3 * t - 9 * n, s = 3 * e - 3 * t, l = 0; if (dn(a)) { if (fn(o)) (h = -s / o) >= 0 && h <= 1 && (r[l++] = h) } else { var u = o * o - 4 * a * s; if (dn(u)) r[0] = -o / (2 * a); else if (u > 0) { var h, c = on(u), p = (-o - c) / (2 * a); (h = (-o + c) / (2 * a)) >= 0 && h <= 1 && (r[l++] = h), p >= 0 && p <= 1 && (r[l++] = p) } } return l } function xn(t, e, n, i, r, o) { var a = (e - t) * r + t, s = (n - e) * r + e, l = (i - n) * r + n, u = (s - a) * r + a, h = (l - s) * r + s, c = (h - u) * r + u; o[0] = t, o[1] = a, o[2] = u, o[3] = c, o[4] = c, o[5] = h, o[6] = l, o[7] = i } function _n(t, e, n, i, r, o, a, s, l, u, h) { var c, p, d, f, g, y = .005, v = 1 / 0; hn[0] = l, hn[1] = u; for (var m = 0; m < 1; m += .05)cn[0] = gn(t, n, r, a, m), cn[1] = gn(e, i, o, s, m), (f = Vt(hn, cn)) < v && (c = m, v = f); v = 1 / 0; for (var x = 0; x < 32 && !(y < sn); x++)p = c - y, d = c + y, cn[0] = gn(t, n, r, a, p), cn[1] = gn(e, i, o, s, p), f = Vt(cn, hn), p >= 0 && f < v ? (c = p, v = f) : (pn[0] = gn(t, n, r, a, d), pn[1] = gn(e, i, o, s, d), g = Vt(pn, hn), d <= 1 && g < v ? (c = d, v = g) : y *= .5); return h && (h[0] = gn(t, n, r, a, c), h[1] = gn(e, i, o, s, c)), on(v) } function bn(t, e, n, i, r, o, a, s, l) { for (var u = t, h = e, c = 0, p = 1 / l, d = 1; d <= l; d++) { var f = d * p, g = gn(t, n, r, a, f), y = gn(e, i, o, s, f), v = g - u, m = y - h; c += Math.sqrt(v * v + m * m), u = g, h = y } return c } function wn(t, e, n, i) { var r = 1 - i; return r * (r * t + 2 * i * e) + i * i * n } function Sn(t, e, n, i) { return 2 * ((1 - i) * (e - t) + i * (n - e)) } function Mn(t, e, n) { var i = t + n - 2 * e; return 0 === i ? .5 : (t - e) / i } function In(t, e, n, i, r) { var o = (e - t) * i + t, a = (n - e) * i + e, s = (a - o) * i + o; r[0] = t, r[1] = o, r[2] = s, r[3] = s, r[4] = a, r[5] = n } function Tn(t, e, n, i, r, o, a, s, l) { var u, h = .005, c = 1 / 0; hn[0] = a, hn[1] = s; for (var p = 0; p < 1; p += .05) { cn[0] = wn(t, n, r, p), cn[1] = wn(e, i, o, p), (y = Vt(hn, cn)) < c && (u = p, c = y) } c = 1 / 0; for (var d = 0; d < 32 && !(h < sn); d++) { var f = u - h, g = u + h; cn[0] = wn(t, n, r, f), cn[1] = wn(e, i, o, f); var y = Vt(cn, hn); if (f >= 0 && y < c) u = f, c = y; else { pn[0] = wn(t, n, r, g), pn[1] = wn(e, i, o, g); var v = Vt(pn, hn); g <= 1 && v < c ? (u = g, c = v) : h *= .5 } } return l && (l[0] = wn(t, n, r, u), l[1] = wn(e, i, o, u)), on(c) } function Cn(t, e, n, i, r, o, a) { for (var s = t, l = e, u = 0, h = 1 / a, c = 1; c <= a; c++) { var p = c * h, d = wn(t, n, r, p), f = wn(e, i, o, p), g = d - s, y = f - l; u += Math.sqrt(g * g + y * y), s = d, l = f } return u } var Dn = /cubic-bezier\\(([0-9,\\.e ]+)\\)/; function An(t) { var e = t && Dn.exec(t); if (e) { var n = e[1].split(\",\"), i = +ut(n[0]), r = +ut(n[1]), o = +ut(n[2]), a = +ut(n[3]); if (isNaN(i + r + o + a)) return; var s = []; return function (t) { return t <= 0 ? 0 : t >= 1 ? 1 : vn(0, i, o, 1, t, s) && gn(0, r, a, 1, s[0]) } } } var kn = function () { function t(t) { this._inited = !1, this._startTime = 0, this._pausedTime = 0, this._paused = !1, this._life = t.life || 1e3, this._delay = t.delay || 0, this.loop = t.loop || !1, this.onframe = t.onframe || xt, this.ondestroy = t.ondestroy || xt, this.onrestart = t.onrestart || xt, t.easing && this.setEasing(t.easing) } return t.prototype.step = function (t, e) { if (this._inited || (this._startTime = t + this._delay, this._inited = !0), !this._paused) { var n = this._life, i = t - this._startTime - this._pausedTime, r = i / n; r < 0 && (r = 0), r = Math.min(r, 1); var o = this.easingFunc, a = o ? o(r) : r; if (this.onframe(a), 1 === r) { if (!this.loop) return !0; var s = i % n; this._startTime = t - s, this._pausedTime = 0, this.onrestart() } return !1 } this._pausedTime += e }, t.prototype.pause = function () { this._paused = !0 }, t.prototype.resume = function () { this._paused = !1 }, t.prototype.setEasing = function (t) { this.easing = t, this.easingFunc = U(t) ? t : nn[t] || An(t) }, t }(), Ln = function (t) { this.value = t }, Pn = function () { function t() { this._len = 0 } return t.prototype.insert = function (t) { var e = new Ln(t); return this.insertEntry(e), e }, t.prototype.insertEntry = function (t) { this.head ? (this.tail.next = t, t.prev = this.tail, t.next = null, this.tail = t) : this.head = this.tail = t, this._len++ }, t.prototype.remove = function (t) { var e = t.prev, n = t.next; e ? e.next = n : this.head = n, n ? n.prev = e : this.tail = e, t.next = t.prev = null, this._len-- }, t.prototype.len = function () { return this._len }, t.prototype.clear = function () { this.head = this.tail = null, this._len = 0 }, t }(), On = function () { function t(t) { this._list = new Pn, this._maxSize = 10, this._map = {}, this._maxSize = t } return t.prototype.put = function (t, e) { var n = this._list, i = this._map, r = null; if (null == i[t]) { var o = n.len(), a = this._lastRemovedEntry; if (o >= this._maxSize && o > 0) { var s = n.head; n.remove(s), delete i[s.key], r = s.value, this._lastRemovedEntry = s } a ? a.value = e : a = new Ln(e), a.key = t, n.insertEntry(a), i[t] = a } return r }, t.prototype.get = function (t) { var e = this._map[t], n = this._list; if (null != e) return e !== n.tail && (n.remove(e), n.insertEntry(e)), e.value }, t.prototype.clear = function () { this._list.clear(), this._map = {} }, t.prototype.len = function () { return this._list.len() }, t }(), Rn = { transparent: [0, 0, 0, 0], aliceblue: [240, 248, 255, 1], antiquewhite: [250, 235, 215, 1], aqua: [0, 255, 255, 1], aquamarine: [127, 255, 212, 1], azure: [240, 255, 255, 1], beige: [245, 245, 220, 1], bisque: [255, 228, 196, 1], black: [0, 0, 0, 1], blanchedalmond: [255, 235, 205, 1], blue: [0, 0, 255, 1], blueviolet: [138, 43, 226, 1], brown: [165, 42, 42, 1], burlywood: [222, 184, 135, 1], cadetblue: [95, 158, 160, 1], chartreuse: [127, 255, 0, 1], chocolate: [210, 105, 30, 1], coral: [255, 127, 80, 1], cornflowerblue: [100, 149, 237, 1], cornsilk: [255, 248, 220, 1], crimson: [220, 20, 60, 1], cyan: [0, 255, 255, 1], darkblue: [0, 0, 139, 1], darkcyan: [0, 139, 139, 1], darkgoldenrod: [184, 134, 11, 1], darkgray: [169, 169, 169, 1], darkgreen: [0, 100, 0, 1], darkgrey: [169, 169, 169, 1], darkkhaki: [189, 183, 107, 1], darkmagenta: [139, 0, 139, 1], darkolivegreen: [85, 107, 47, 1], darkorange: [255, 140, 0, 1], darkorchid: [153, 50, 204, 1], darkred: [139, 0, 0, 1], darksalmon: [233, 150, 122, 1], darkseagreen: [143, 188, 143, 1], darkslateblue: [72, 61, 139, 1], darkslategray: [47, 79, 79, 1], darkslategrey: [47, 79, 79, 1], darkturquoise: [0, 206, 209, 1], darkviolet: [148, 0, 211, 1], deeppink: [255, 20, 147, 1], deepskyblue: [0, 191, 255, 1], dimgray: [105, 105, 105, 1], dimgrey: [105, 105, 105, 1], dodgerblue: [30, 144, 255, 1], firebrick: [178, 34, 34, 1], floralwhite: [255, 250, 240, 1], forestgreen: [34, 139, 34, 1], fuchsia: [255, 0, 255, 1], gainsboro: [220, 220, 220, 1], ghostwhite: [248, 248, 255, 1], gold: [255, 215, 0, 1], goldenrod: [218, 165, 32, 1], gray: [128, 128, 128, 1], green: [0, 128, 0, 1], greenyellow: [173, 255, 47, 1], grey: [128, 128, 128, 1], honeydew: [240, 255, 240, 1], hotpink: [255, 105, 180, 1], indianred: [205, 92, 92, 1], indigo: [75, 0, 130, 1], ivory: [255, 255, 240, 1], khaki: [240, 230, 140, 1], lavender: [230, 230, 250, 1], lavenderblush: [255, 240, 245, 1], lawngreen: [124, 252, 0, 1], lemonchiffon: [255, 250, 205, 1], lightblue: [173, 216, 230, 1], lightcoral: [240, 128, 128, 1], lightcyan: [224, 255, 255, 1], lightgoldenrodyellow: [250, 250, 210, 1], lightgray: [211, 211, 211, 1], lightgreen: [144, 238, 144, 1], lightgrey: [211, 211, 211, 1], lightpink: [255, 182, 193, 1], lightsalmon: [255, 160, 122, 1], lightseagreen: [32, 178, 170, 1], lightskyblue: [135, 206, 250, 1], lightslategray: [119, 136, 153, 1], lightslategrey: [119, 136, 153, 1], lightsteelblue: [176, 196, 222, 1], lightyellow: [255, 255, 224, 1], lime: [0, 255, 0, 1], limegreen: [50, 205, 50, 1], linen: [250, 240, 230, 1], magenta: [255, 0, 255, 1], maroon: [128, 0, 0, 1], mediumaquamarine: [102, 205, 170, 1], mediumblue: [0, 0, 205, 1], mediumorchid: [186, 85, 211, 1], mediumpurple: [147, 112, 219, 1], mediumseagreen: [60, 179, 113, 1], mediumslateblue: [123, 104, 238, 1], mediumspringgreen: [0, 250, 154, 1], mediumturquoise: [72, 209, 204, 1], mediumvioletred: [199, 21, 133, 1], midnightblue: [25, 25, 112, 1], mintcream: [245, 255, 250, 1], mistyrose: [255, 228, 225, 1], moccasin: [255, 228, 181, 1], navajowhite: [255, 222, 173, 1], navy: [0, 0, 128, 1], oldlace: [253, 245, 230, 1], olive: [128, 128, 0, 1], olivedrab: [107, 142, 35, 1], orange: [255, 165, 0, 1], orangered: [255, 69, 0, 1], orchid: [218, 112, 214, 1], palegoldenrod: [238, 232, 170, 1], palegreen: [152, 251, 152, 1], paleturquoise: [175, 238, 238, 1], palevioletred: [219, 112, 147, 1], papayawhip: [255, 239, 213, 1], peachpuff: [255, 218, 185, 1], peru: [205, 133, 63, 1], pink: [255, 192, 203, 1], plum: [221, 160, 221, 1], powderblue: [176, 224, 230, 1], purple: [128, 0, 128, 1], red: [255, 0, 0, 1], rosybrown: [188, 143, 143, 1], royalblue: [65, 105, 225, 1], saddlebrown: [139, 69, 19, 1], salmon: [250, 128, 114, 1], sandybrown: [244, 164, 96, 1], seagreen: [46, 139, 87, 1], seashell: [255, 245, 238, 1], sienna: [160, 82, 45, 1], silver: [192, 192, 192, 1], skyblue: [135, 206, 235, 1], slateblue: [106, 90, 205, 1], slategray: [112, 128, 144, 1], slategrey: [112, 128, 144, 1], snow: [255, 250, 250, 1], springgreen: [0, 255, 127, 1], steelblue: [70, 130, 180, 1], tan: [210, 180, 140, 1], teal: [0, 128, 128, 1], thistle: [216, 191, 216, 1], tomato: [255, 99, 71, 1], turquoise: [64, 224, 208, 1], violet: [238, 130, 238, 1], wheat: [245, 222, 179, 1], white: [255, 255, 255, 1], whitesmoke: [245, 245, 245, 1], yellow: [255, 255, 0, 1], yellowgreen: [154, 205, 50, 1] }; function Nn(t) { return (t = Math.round(t)) < 0 ? 0 : t > 255 ? 255 : t } function En(t) { return t < 0 ? 0 : t > 1 ? 1 : t } function zn(t) { var e = t; return e.length && \"%\" === e.charAt(e.length - 1) ? Nn(parseFloat(e) / 100 * 255) : Nn(parseInt(e, 10)) } function Vn(t) { var e = t; return e.length && \"%\" === e.charAt(e.length - 1) ? En(parseFloat(e) / 100) : En(parseFloat(e)) } function Bn(t, e, n) { return n < 0 ? n += 1 : n > 1 && (n -= 1), 6 * n < 1 ? t + (e - t) * n * 6 : 2 * n < 1 ? e : 3 * n < 2 ? t + (e - t) * (2 / 3 - n) * 6 : t } function Fn(t, e, n) { return t + (e - t) * n } function Gn(t, e, n, i, r) { return t[0] = e, t[1] = n, t[2] = i, t[3] = r, t } function Wn(t, e) { return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t } var Hn = new On(20), Yn = null; function Un(t, e) { Yn && Wn(Yn, e), Yn = Hn.put(t, Yn || e.slice()) } function Xn(t, e) { if (t) { e = e || []; var n = Hn.get(t); if (n) return Wn(e, n); var i = (t += \"\").replace(/ /g, \"\").toLowerCase(); if (i in Rn) return Wn(e, Rn[i]), Un(t, e), e; var r, o = i.length; if (\"#\" === i.charAt(0)) return 4 === o || 5 === o ? (r = parseInt(i.slice(1, 4), 16)) >= 0 && r <= 4095 ? (Gn(e, (3840 & r) >> 4 | (3840 & r) >> 8, 240 & r | (240 & r) >> 4, 15 & r | (15 & r) << 4, 5 === o ? parseInt(i.slice(4), 16) / 15 : 1), Un(t, e), e) : void Gn(e, 0, 0, 0, 1) : 7 === o || 9 === o ? (r = parseInt(i.slice(1, 7), 16)) >= 0 && r <= 16777215 ? (Gn(e, (16711680 & r) >> 16, (65280 & r) >> 8, 255 & r, 9 === o ? parseInt(i.slice(7), 16) / 255 : 1), Un(t, e), e) : void Gn(e, 0, 0, 0, 1) : void 0; var a = i.indexOf(\"(\"), s = i.indexOf(\")\"); if (-1 !== a && s + 1 === o) { var l = i.substr(0, a), u = i.substr(a + 1, s - (a + 1)).split(\",\"), h = 1; switch (l) { case \"rgba\": if (4 !== u.length) return 3 === u.length ? Gn(e, +u[0], +u[1], +u[2], 1) : Gn(e, 0, 0, 0, 1); h = Vn(u.pop()); case \"rgb\": return u.length >= 3 ? (Gn(e, zn(u[0]), zn(u[1]), zn(u[2]), 3 === u.length ? h : Vn(u[3])), Un(t, e), e) : void Gn(e, 0, 0, 0, 1); case \"hsla\": return 4 !== u.length ? void Gn(e, 0, 0, 0, 1) : (u[3] = Vn(u[3]), Zn(u, e), Un(t, e), e); case \"hsl\": return 3 !== u.length ? void Gn(e, 0, 0, 0, 1) : (Zn(u, e), Un(t, e), e); default: return } } Gn(e, 0, 0, 0, 1) } } function Zn(t, e) { var n = (parseFloat(t[0]) % 360 + 360) % 360 / 360, i = Vn(t[1]), r = Vn(t[2]), o = r <= .5 ? r * (i + 1) : r + i - r * i, a = 2 * r - o; return Gn(e = e || [], Nn(255 * Bn(a, o, n + 1 / 3)), Nn(255 * Bn(a, o, n)), Nn(255 * Bn(a, o, n - 1 / 3)), 1), 4 === t.length && (e[3] = t[3]), e } function jn(t, e) { var n = Xn(t); if (n) { for (var i = 0; i < 3; i++)n[i] = e < 0 ? n[i] * (1 - e) | 0 : (255 - n[i]) * e + n[i] | 0, n[i] > 255 ? n[i] = 255 : n[i] < 0 && (n[i] = 0); return ei(n, 4 === n.length ? \"rgba\" : \"rgb\") } } function qn(t, e, n) { if (e && e.length && t >= 0 && t <= 1) { n = n || []; var i = t * (e.length - 1), r = Math.floor(i), o = Math.ceil(i), a = e[r], s = e[o], l = i - r; return n[0] = Nn(Fn(a[0], s[0], l)), n[1] = Nn(Fn(a[1], s[1], l)), n[2] = Nn(Fn(a[2], s[2], l)), n[3] = En(Fn(a[3], s[3], l)), n } } var Kn = qn; function $n(t, e, n) { if (e && e.length && t >= 0 && t <= 1) { var i = t * (e.length - 1), r = Math.floor(i), o = Math.ceil(i), a = Xn(e[r]), s = Xn(e[o]), l = i - r, u = ei([Nn(Fn(a[0], s[0], l)), Nn(Fn(a[1], s[1], l)), Nn(Fn(a[2], s[2], l)), En(Fn(a[3], s[3], l))], \"rgba\"); return n ? { color: u, leftIndex: r, rightIndex: o, value: i } : u } } var Jn = $n; function Qn(t, e, n, i) { var r = Xn(t); if (t) return r = function (t) { if (t) { var e, n, i = t[0] / 255, r = t[1] / 255, o = t[2] / 255, a = Math.min(i, r, o), s = Math.max(i, r, o), l = s - a, u = (s + a) / 2; if (0 === l) e = 0, n = 0; else { n = u < .5 ? l / (s + a) : l / (2 - s - a); var h = ((s - i) / 6 + l / 2) / l, c = ((s - r) / 6 + l / 2) / l, p = ((s - o) / 6 + l / 2) / l; i === s ? e = p - c : r === s ? e = 1 / 3 + h - p : o === s && (e = 2 / 3 + c - h), e < 0 && (e += 1), e > 1 && (e -= 1) } var d = [360 * e, n, u]; return null != t[3] && d.push(t[3]), d } }(r), null != e && (r[0] = function (t) { return (t = Math.round(t)) < 0 ? 0 : t > 360 ? 360 : t }(e)), null != n && (r[1] = Vn(n)), null != i && (r[2] = Vn(i)), ei(Zn(r), \"rgba\") } function ti(t, e) { var n = Xn(t); if (n && null != e) return n[3] = En(e), ei(n, \"rgba\") } function ei(t, e) { if (t && t.length) { var n = t[0] + \",\" + t[1] + \",\" + t[2]; return \"rgba\" !== e && \"hsva\" !== e && \"hsla\" !== e || (n += \",\" + t[3]), e + \"(\" + n + \")\" } } function ni(t, e) { var n = Xn(t); return n ? (.299 * n[0] + .587 * n[1] + .114 * n[2]) * n[3] / 255 + (1 - n[3]) * e : 0 } var ii = Object.freeze({ __proto__: null, parse: Xn, lift: jn, toHex: function (t) { var e = Xn(t); if (e) return ((1 << 24) + (e[0] << 16) + (e[1] << 8) + +e[2]).toString(16).slice(1) }, fastLerp: qn, fastMapToColor: Kn, lerp: $n, mapToColor: Jn, modifyHSL: Qn, modifyAlpha: ti, stringify: ei, lum: ni, random: function () { return ei([Math.round(255 * Math.random()), Math.round(255 * Math.random()), Math.round(255 * Math.random())], \"rgb\") } }), ri = Math.round; function oi(t) { var e; if (t && \"transparent\" !== t) { if (\"string\" == typeof t && t.indexOf(\"rgba\") > -1) { var n = Xn(t); n && (t = \"rgb(\" + n[0] + \",\" + n[1] + \",\" + n[2] + \")\", e = n[3]) } } else t = \"none\"; return { color: t, opacity: null == e ? 1 : e } } var ai = 1e-4; function si(t) { return t < ai && t > -1e-4 } function li(t) { return ri(1e3 * t) / 1e3 } function ui(t) { return ri(1e4 * t) / 1e4 } var hi = { left: \"start\", right: \"end\", center: \"middle\", middle: \"middle\" }; function ci(t) { return t && !!t.image } function pi(t) { return \"linear\" === t.type } function di(t) { return \"radial\" === t.type } function fi(t) { return \"url(#\" + t + \")\" } function gi(t) { var e = t.getGlobalScale(), n = Math.max(e[0], e[1]); return Math.max(Math.ceil(Math.log(n) / Math.log(10)), 1) } function yi(t) { var e = t.x || 0, n = t.y || 0, i = (t.rotation || 0) * _t, r = rt(t.scaleX, 1), o = rt(t.scaleY, 1), a = t.skewX || 0, s = t.skewY || 0, l = []; return (e || n) && l.push(\"translate(\" + e + \"px,\" + n + \"px)\"), i && l.push(\"rotate(\" + i + \")\"), 1 === r && 1 === o || l.push(\"scale(\" + r + \",\" + o + \")\"), (a || s) && l.push(\"skew(\" + ri(a * _t) + \"deg, \" + ri(s * _t) + \"deg)\"), l.join(\" \") } var vi = r.hasGlobalWindow && U(window.btoa) ? function (t) { return window.btoa(unescape(t)) } : \"undefined\" != typeof Buffer ? function (t) { return Buffer.from(t).toString(\"base64\") } : function (t) { return null }, mi = Array.prototype.slice; function xi(t, e, n) { return (e - t) * n + t } function _i(t, e, n, i) { for (var r = e.length, o = 0; o < r; o++)t[o] = xi(e[o], n[o], i); return t } function bi(t, e, n, i) { for (var r = e.length, o = 0; o < r; o++)t[o] = e[o] + n[o] * i; return t } function wi(t, e, n, i) { for (var r = e.length, o = r && e[0].length, a = 0; a < r; a++) { t[a] || (t[a] = []); for (var s = 0; s < o; s++)t[a][s] = e[a][s] + n[a][s] * i } return t } function Si(t, e) { for (var n = t.length, i = e.length, r = n > i ? e : t, o = Math.min(n, i), a = r[o - 1] || { color: [0, 0, 0, 0], offset: 0 }, s = o; s < Math.max(n, i); s++)r.push({ offset: a.offset, color: a.color.slice() }) } function Mi(t, e, n) { var i = t, r = e; if (i.push && r.push) { var o = i.length, a = r.length; if (o !== a) if (o > a) i.length = a; else for (var s = o; s < a; s++)i.push(1 === n ? r[s] : mi.call(r[s])); var l = i[0] && i[0].length; for (s = 0; s < i.length; s++)if (1 === n) isNaN(i[s]) && (i[s] = r[s]); else for (var u = 0; u < l; u++)isNaN(i[s][u]) && (i[s][u] = r[s][u]) } } function Ii(t) { if (N(t)) { var e = t.length; if (N(t[0])) { for (var n = [], i = 0; i < e; i++)n.push(mi.call(t[i])); return n } return mi.call(t) } return t } function Ti(t) { return t[0] = Math.floor(t[0]) || 0, t[1] = Math.floor(t[1]) || 0, t[2] = Math.floor(t[2]) || 0, t[3] = null == t[3] ? 1 : t[3], \"rgba(\" + t.join(\",\") + \")\" } function Ci(t) { return 4 === t || 5 === t } function Di(t) { return 1 === t || 2 === t } var Ai = [0, 0, 0, 0], ki = function () { function t(t) { this.keyframes = [], this.discrete = !1, this._invalid = !1, this._needsSort = !1, this._lastFr = 0, this._lastFrP = 0, this.propName = t } return t.prototype.isFinished = function () { return this._finished }, t.prototype.setFinished = function () { this._finished = !0, this._additiveTrack && this._additiveTrack.setFinished() }, t.prototype.needsAnimate = function () { return this.keyframes.length >= 1 }, t.prototype.getAdditiveTrack = function () { return this._additiveTrack }, t.prototype.addKeyframe = function (t, e, n) { this._needsSort = !0; var i = this.keyframes, r = i.length, o = !1, a = 6, s = e; if (N(e)) { var l = function (t) { return N(t && t[0]) ? 2 : 1 }(e); a = l, (1 === l && !j(e[0]) || 2 === l && !j(e[0][0])) && (o = !0) } else if (j(e) && !nt(e)) a = 0; else if (X(e)) if (isNaN(+e)) { var u = Xn(e); u && (s = u, a = 3) } else a = 0; else if (Q(e)) { var h = A({}, s); h.colorStops = z(e.colorStops, (function (t) { return { offset: t.offset, color: Xn(t.color) } })), pi(e) ? a = 4 : di(e) && (a = 5), s = h } 0 === r ? this.valType = a : a === this.valType && 6 !== a || (o = !0), this.discrete = this.discrete || o; var c = { time: t, value: s, rawValue: e, percent: 0 }; return n && (c.easing = n, c.easingFunc = U(n) ? n : nn[n] || An(n)), i.push(c), c }, t.prototype.prepare = function (t, e) { var n = this.keyframes; this._needsSort && n.sort((function (t, e) { return t.time - e.time })); for (var i = this.valType, r = n.length, o = n[r - 1], a = this.discrete, s = Di(i), l = Ci(i), u = 0; u < r; u++) { var h = n[u], c = h.value, p = o.value; h.percent = h.time / t, a || (s && u !== r - 1 ? Mi(c, p, i) : l && Si(c.colorStops, p.colorStops)) } if (!a && 5 !== i && e && this.needsAnimate() && e.needsAnimate() && i === e.valType && !e._finished) { this._additiveTrack = e; var d = n[0].value; for (u = 0; u < r; u++)0 === i ? n[u].additiveValue = n[u].value - d : 3 === i ? n[u].additiveValue = bi([], n[u].value, d, -1) : Di(i) && (n[u].additiveValue = 1 === i ? bi([], n[u].value, d, -1) : wi([], n[u].value, d, -1)) } }, t.prototype.step = function (t, e) { if (!this._finished) { this._additiveTrack && this._additiveTrack._finished && (this._additiveTrack = null); var n, i, r, o = null != this._additiveTrack, a = o ? \"additiveValue\" : \"value\", s = this.valType, l = this.keyframes, u = l.length, h = this.propName, c = 3 === s, p = this._lastFr, d = Math.min; if (1 === u) i = r = l[0]; else { if (e < 0) n = 0; else if (e < this._lastFrP) { for (n = d(p + 1, u - 1); n >= 0 && !(l[n].percent <= e); n--); n = d(n, u - 2) } else { for (n = p; n < u && !(l[n].percent > e); n++); n = d(n - 1, u - 2) } r = l[n + 1], i = l[n] } if (i && r) { this._lastFr = n, this._lastFrP = e; var f = r.percent - i.percent, g = 0 === f ? 1 : d((e - i.percent) / f, 1); r.easingFunc && (g = r.easingFunc(g)); var y = o ? this._additiveValue : c ? Ai : t[h]; if (!Di(s) && !c || y || (y = this._additiveValue = []), this.discrete) t[h] = g < 1 ? i.rawValue : r.rawValue; else if (Di(s)) 1 === s ? _i(y, i[a], r[a], g) : function (t, e, n, i) { for (var r = e.length, o = r && e[0].length, a = 0; a < r; a++) { t[a] || (t[a] = []); for (var s = 0; s < o; s++)t[a][s] = xi(e[a][s], n[a][s], i) } }(y, i[a], r[a], g); else if (Ci(s)) { var v = i[a], m = r[a], x = 4 === s; t[h] = { type: x ? \"linear\" : \"radial\", x: xi(v.x, m.x, g), y: xi(v.y, m.y, g), colorStops: z(v.colorStops, (function (t, e) { var n = m.colorStops[e]; return { offset: xi(t.offset, n.offset, g), color: Ti(_i([], t.color, n.color, g)) } })), global: m.global }, x ? (t[h].x2 = xi(v.x2, m.x2, g), t[h].y2 = xi(v.y2, m.y2, g)) : t[h].r = xi(v.r, m.r, g) } else if (c) _i(y, i[a], r[a], g), o || (t[h] = Ti(y)); else { var _ = xi(i[a], r[a], g); o ? this._additiveValue = _ : t[h] = _ } o && this._addToTarget(t) } } }, t.prototype._addToTarget = function (t) { var e = this.valType, n = this.propName, i = this._additiveValue; 0 === e ? t[n] = t[n] + i : 3 === e ? (Xn(t[n], Ai), bi(Ai, Ai, i, 1), t[n] = Ti(Ai)) : 1 === e ? bi(t[n], t[n], i, 1) : 2 === e && wi(t[n], t[n], i, 1) }, t }(), Li = function () { function t(t, e, n, i) { this._tracks = {}, this._trackKeys = [], this._maxTime = 0, this._started = 0, this._clip = null, this._target = t, this._loop = e, e && i ? I(\"Can' use additive animation on looped animation.\") : (this._additiveAnimators = i, this._allowDiscrete = n) } return t.prototype.getMaxTime = function () { return this._maxTime }, t.prototype.getDelay = function () { return this._delay }, t.prototype.getLoop = function () { return this._loop }, t.prototype.getTarget = function () { return this._target }, t.prototype.changeTarget = function (t) { this._target = t }, t.prototype.when = function (t, e, n) { return this.whenWithKeys(t, e, G(e), n) }, t.prototype.whenWithKeys = function (t, e, n, i) { for (var r = this._tracks, o = 0; o < n.length; o++) { var a = n[o], s = r[a]; if (!s) { s = r[a] = new ki(a); var l = void 0, u = this._getAdditiveTrack(a); if (u) { var h = u.keyframes, c = h[h.length - 1]; l = c && c.value, 3 === u.valType && l && (l = Ti(l)) } else l = this._target[a]; if (null == l) continue; t > 0 && s.addKeyframe(0, Ii(l), i), this._trackKeys.push(a) } s.addKeyframe(t, Ii(e[a]), i) } return this._maxTime = Math.max(this._maxTime, t), this }, t.prototype.pause = function () { this._clip.pause(), this._paused = !0 }, t.prototype.resume = function () { this._clip.resume(), this._paused = !1 }, t.prototype.isPaused = function () { return !!this._paused }, t.prototype.duration = function (t) { return this._maxTime = t, this._force = !0, this }, t.prototype._doneCallback = function () { this._setTracksFinished(), this._clip = null; var t = this._doneCbs; if (t) for (var e = t.length, n = 0; n < e; n++)t[n].call(this) }, t.prototype._abortedCallback = function () { this._setTracksFinished(); var t = this.animation, e = this._abortedCbs; if (t && t.removeClip(this._clip), this._clip = null, e) for (var n = 0; n < e.length; n++)e[n].call(this) }, t.prototype._setTracksFinished = function () { for (var t = this._tracks, e = this._trackKeys, n = 0; n < e.length; n++)t[e[n]].setFinished() }, t.prototype._getAdditiveTrack = function (t) { var e, n = this._additiveAnimators; if (n) for (var i = 0; i < n.length; i++) { var r = n[i].getTrack(t); r && (e = r) } return e }, t.prototype.start = function (t) { if (!(this._started > 0)) { this._started = 1; for (var e = this, n = [], i = this._maxTime || 0, r = 0; r < this._trackKeys.length; r++) { var o = this._trackKeys[r], a = this._tracks[o], s = this._getAdditiveTrack(o), l = a.keyframes, u = l.length; if (a.prepare(i, s), a.needsAnimate()) if (!this._allowDiscrete && a.discrete) { var h = l[u - 1]; h && (e._target[a.propName] = h.rawValue), a.setFinished() } else n.push(a) } if (n.length || this._force) { var c = new kn({ life: i, loop: this._loop, delay: this._delay || 0, onframe: function (t) { e._started = 2; var i = e._additiveAnimators; if (i) { for (var r = !1, o = 0; o < i.length; o++)if (i[o]._clip) { r = !0; break } r || (e._additiveAnimators = null) } for (o = 0; o < n.length; o++)n[o].step(e._target, t); var a = e._onframeCbs; if (a) for (o = 0; o < a.length; o++)a[o](e._target, t) }, ondestroy: function () { e._doneCallback() } }); this._clip = c, this.animation && this.animation.addClip(c), t && c.setEasing(t) } else this._doneCallback(); return this } }, t.prototype.stop = function (t) { if (this._clip) { var e = this._clip; t && e.onframe(1), this._abortedCallback() } }, t.prototype.delay = function (t) { return this._delay = t, this }, t.prototype.during = function (t) { return t && (this._onframeCbs || (this._onframeCbs = []), this._onframeCbs.push(t)), this }, t.prototype.done = function (t) { return t && (this._doneCbs || (this._doneCbs = []), this._doneCbs.push(t)), this }, t.prototype.aborted = function (t) { return t && (this._abortedCbs || (this._abortedCbs = []), this._abortedCbs.push(t)), this }, t.prototype.getClip = function () { return this._clip }, t.prototype.getTrack = function (t) { return this._tracks[t] }, t.prototype.getTracks = function () { var t = this; return z(this._trackKeys, (function (e) { return t._tracks[e] })) }, t.prototype.stopTracks = function (t, e) { if (!t.length || !this._clip) return !0; for (var n = this._tracks, i = this._trackKeys, r = 0; r < t.length; r++) { var o = n[t[r]]; o && !o.isFinished() && (e ? o.step(this._target, 1) : 1 === this._started && o.step(this._target, 0), o.setFinished()) } var a = !0; for (r = 0; r < i.length; r++)if (!n[i[r]].isFinished()) { a = !1; break } return a && this._abortedCallback(), a }, t.prototype.saveTo = function (t, e, n) { if (t) { e = e || this._trackKeys; for (var i = 0; i < e.length; i++) { var r = e[i], o = this._tracks[r]; if (o && !o.isFinished()) { var a = o.keyframes, s = a[n ? 0 : a.length - 1]; s && (t[r] = Ii(s.rawValue)) } } } }, t.prototype.__changeFinalValue = function (t, e) { e = e || G(t); for (var n = 0; n < e.length; n++) { var i = e[n], r = this._tracks[i]; if (r) { var o = r.keyframes; if (o.length > 1) { var a = o.pop(); r.addKeyframe(a.time, t[i]), r.prepare(this._maxTime, r.getAdditiveTrack()) } } } }, t }(); function Pi() { return (new Date).getTime() } var Oi, Ri, Ni = function (t) { function e(e) { var n = t.call(this) || this; return n._running = !1, n._time = 0, n._pausedTime = 0, n._pauseStart = 0, n._paused = !1, e = e || {}, n.stage = e.stage || {}, n } return n(e, t), e.prototype.addClip = function (t) { t.animation && this.removeClip(t), this._head ? (this._tail.next = t, t.prev = this._tail, t.next = null, this._tail = t) : this._head = this._tail = t, t.animation = this }, e.prototype.addAnimator = function (t) { t.animation = this; var e = t.getClip(); e && this.addClip(e) }, e.prototype.removeClip = function (t) { if (t.animation) { var e = t.prev, n = t.next; e ? e.next = n : this._head = n, n ? n.prev = e : this._tail = e, t.next = t.prev = t.animation = null } }, e.prototype.removeAnimator = function (t) { var e = t.getClip(); e && this.removeClip(e), t.animation = null }, e.prototype.update = function (t) { for (var e = Pi() - this._pausedTime, n = e - this._time, i = this._head; i;) { var r = i.next; i.step(e, n) ? (i.ondestroy(), this.removeClip(i), i = r) : i = r } this._time = e, t || (this.trigger(\"frame\", n), this.stage.update && this.stage.update()) }, e.prototype._startLoop = function () { var t = this; this._running = !0, en((function e() { t._running && (en(e), !t._paused && t.update()) })) }, e.prototype.start = function () { this._running || (this._time = Pi(), this._pausedTime = 0, this._startLoop()) }, e.prototype.stop = function () { this._running = !1 }, e.prototype.pause = function () { this._paused || (this._pauseStart = Pi(), this._paused = !0) }, e.prototype.resume = function () { this._paused && (this._pausedTime += Pi() - this._pauseStart, this._paused = !1) }, e.prototype.clear = function () { for (var t = this._head; t;) { var e = t.next; t.prev = t.next = t.animation = null, t = e } this._head = this._tail = null }, e.prototype.isFinished = function () { return null == this._head }, e.prototype.animate = function (t, e) { e = e || {}, this.start(); var n = new Li(t, e.loop); return this.addAnimator(n), n }, e }(Xt), Ei = r.domSupported, zi = (Ri = { pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 }, { mouse: Oi = [\"click\", \"dblclick\", \"mousewheel\", \"wheel\", \"mouseout\", \"mouseup\", \"mousedown\", \"mousemove\", \"contextmenu\"], touch: [\"touchstart\", \"touchend\", \"touchmove\"], pointer: z(Oi, (function (t) { var e = t.replace(\"mouse\", \"pointer\"); return Ri.hasOwnProperty(e) ? e : t })) }), Vi = [\"mousemove\", \"mouseup\"], Bi = [\"pointermove\", \"pointerup\"], Fi = !1; function Gi(t) { var e = t.pointerType; return \"pen\" === e || \"touch\" === e } function Wi(t) { t && (t.zrByTouch = !0) } function Hi(t, e) { for (var n = e, i = !1; n && 9 !== n.nodeType && !(i = n.domBelongToZr || n !== e && n === t.painterRoot);)n = n.parentNode; return i } var Yi = function (t, e) { this.stopPropagation = xt, this.stopImmediatePropagation = xt, this.preventDefault = xt, this.type = e.type, this.target = this.currentTarget = t.dom, this.pointerType = e.pointerType, this.clientX = e.clientX, this.clientY = e.clientY }, Ui = { mousedown: function (t) { t = le(this.dom, t), this.__mayPointerCapture = [t.zrX, t.zrY], this.trigger(\"mousedown\", t) }, mousemove: function (t) { t = le(this.dom, t); var e = this.__mayPointerCapture; !e || t.zrX === e[0] && t.zrY === e[1] || this.__togglePointerCapture(!0), this.trigger(\"mousemove\", t) }, mouseup: function (t) { t = le(this.dom, t), this.__togglePointerCapture(!1), this.trigger(\"mouseup\", t) }, mouseout: function (t) { Hi(this, (t = le(this.dom, t)).toElement || t.relatedTarget) || (this.__pointerCapturing && (t.zrEventControl = \"no_globalout\"), this.trigger(\"mouseout\", t)) }, wheel: function (t) { Fi = !0, t = le(this.dom, t), this.trigger(\"mousewheel\", t) }, mousewheel: function (t) { Fi || (t = le(this.dom, t), this.trigger(\"mousewheel\", t)) }, touchstart: function (t) { Wi(t = le(this.dom, t)), this.__lastTouchMoment = new Date, this.handler.processGesture(t, \"start\"), Ui.mousemove.call(this, t), Ui.mousedown.call(this, t) }, touchmove: function (t) { Wi(t = le(this.dom, t)), this.handler.processGesture(t, \"change\"), Ui.mousemove.call(this, t) }, touchend: function (t) { Wi(t = le(this.dom, t)), this.handler.processGesture(t, \"end\"), Ui.mouseup.call(this, t), +new Date - +this.__lastTouchMoment < 300 && Ui.click.call(this, t) }, pointerdown: function (t) { Ui.mousedown.call(this, t) }, pointermove: function (t) { Gi(t) || Ui.mousemove.call(this, t) }, pointerup: function (t) { Ui.mouseup.call(this, t) }, pointerout: function (t) { Gi(t) || Ui.mouseout.call(this, t) } }; E([\"click\", \"dblclick\", \"contextmenu\"], (function (t) { Ui[t] = function (e) { e = le(this.dom, e), this.trigger(t, e) } })); var Xi = { pointermove: function (t) { Gi(t) || Xi.mousemove.call(this, t) }, pointerup: function (t) { Xi.mouseup.call(this, t) }, mousemove: function (t) { this.trigger(\"mousemove\", t) }, mouseup: function (t) { var e = this.__pointerCapturing; this.__togglePointerCapture(!1), this.trigger(\"mouseup\", t), e && (t.zrEventControl = \"only_globalout\", this.trigger(\"mouseout\", t)) } }; function Zi(t, e) { var n = e.domHandlers; r.pointerEventsSupported ? E(zi.pointer, (function (i) { qi(e, i, (function (e) { n[i].call(t, e) })) })) : (r.touchEventsSupported && E(zi.touch, (function (i) { qi(e, i, (function (r) { n[i].call(t, r), function (t) { t.touching = !0, null != t.touchTimer && (clearTimeout(t.touchTimer), t.touchTimer = null), t.touchTimer = setTimeout((function () { t.touching = !1, t.touchTimer = null }), 700) }(e) })) })), E(zi.mouse, (function (i) { qi(e, i, (function (r) { r = se(r), e.touching || n[i].call(t, r) })) }))) } function ji(t, e) { function n(n) { qi(e, n, (function (i) { i = se(i), Hi(t, i.target) || (i = function (t, e) { return le(t.dom, new Yi(t, e), !0) }(t, i), e.domHandlers[n].call(t, i)) }), { capture: !0 }) } r.pointerEventsSupported ? E(Bi, n) : r.touchEventsSupported || E(Vi, n) } function qi(t, e, n, i) { t.mounted[e] = n, t.listenerOpts[e] = i, ue(t.domTarget, e, n, i) } function Ki(t) { var e, n, i, r, o = t.mounted; for (var a in o) o.hasOwnProperty(a) && (e = t.domTarget, n = a, i = o[a], r = t.listenerOpts[a], e.removeEventListener(n, i, r)); t.mounted = {} } var $i = function (t, e) { this.mounted = {}, this.listenerOpts = {}, this.touching = !1, this.domTarget = t, this.domHandlers = e }, Ji = function (t) { function e(e, n) { var i = t.call(this) || this; return i.__pointerCapturing = !1, i.dom = e, i.painterRoot = n, i._localHandlerScope = new $i(e, Ui), Ei && (i._globalHandlerScope = new $i(document, Xi)), Zi(i, i._localHandlerScope), i } return n(e, t), e.prototype.dispose = function () { Ki(this._localHandlerScope), Ei && Ki(this._globalHandlerScope) }, e.prototype.setCursor = function (t) { this.dom.style && (this.dom.style.cursor = t || \"default\") }, e.prototype.__togglePointerCapture = function (t) { if (this.__mayPointerCapture = null, Ei && +this.__pointerCapturing ^ +t) { this.__pointerCapturing = t; var e = this._globalHandlerScope; t ? ji(this, e) : Ki(e) } }, e }(Xt), Qi = 1; r.hasGlobalWindow && (Qi = Math.max(window.devicePixelRatio || window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI || 1, 1)); var tr = Qi, er = \"#333\", nr = \"#ccc\", ir = ye, rr = 5e-5; function or(t) { return t > rr || t < -5e-5 } var ar = [], sr = [], lr = [1, 0, 0, 1, 0, 0], ur = Math.abs, hr = function () { function t() { } return t.prototype.getLocalTransform = function (e) { return t.getLocalTransform(this, e) }, t.prototype.setPosition = function (t) { this.x = t[0], this.y = t[1] }, t.prototype.setScale = function (t) { this.scaleX = t[0], this.scaleY = t[1] }, t.prototype.setSkew = function (t) { this.skewX = t[0], this.skewY = t[1] }, t.prototype.setOrigin = function (t) { this.originX = t[0], this.originY = t[1] }, t.prototype.needLocalTransform = function () { return or(this.rotation) || or(this.x) || or(this.y) || or(this.scaleX - 1) || or(this.scaleY - 1) || or(this.skewX) || or(this.skewY) }, t.prototype.updateTransform = function () { var t = this.parent && this.parent.transform, e = this.needLocalTransform(), n = this.transform; e || t ? (n = n || [1, 0, 0, 1, 0, 0], e ? this.getLocalTransform(n) : ir(n), t && (e ? me(n, t, n) : ve(n, t)), this.transform = n, this._resolveGlobalScaleRatio(n)) : n && ir(n) }, t.prototype._resolveGlobalScaleRatio = function (t) { var e = this.globalScaleRatio; if (null != e && 1 !== e) { this.getGlobalScale(ar); var n = ar[0] < 0 ? -1 : 1, i = ar[1] < 0 ? -1 : 1, r = ((ar[0] - n) * e + n) / ar[0] || 0, o = ((ar[1] - i) * e + i) / ar[1] || 0; t[0] *= r, t[1] *= r, t[2] *= o, t[3] *= o } this.invTransform = this.invTransform || [1, 0, 0, 1, 0, 0], we(this.invTransform, t) }, t.prototype.getComputedTransform = function () { for (var t = this, e = []; t;)e.push(t), t = t.parent; for (; t = e.pop();)t.updateTransform(); return this.transform }, t.prototype.setLocalTransform = function (t) { if (t) { var e = t[0] * t[0] + t[1] * t[1], n = t[2] * t[2] + t[3] * t[3], i = Math.atan2(t[1], t[0]), r = Math.PI / 2 + i - Math.atan2(t[3], t[2]); n = Math.sqrt(n) * Math.cos(r), e = Math.sqrt(e), this.skewX = r, this.skewY = 0, this.rotation = -i, this.x = +t[4], this.y = +t[5], this.scaleX = e, this.scaleY = n, this.originX = 0, this.originY = 0 } }, t.prototype.decomposeTransform = function () { if (this.transform) { var t = this.parent, e = this.transform; t && t.transform && (me(sr, t.invTransform, e), e = sr); var n = this.originX, i = this.originY; (n || i) && (lr[4] = n, lr[5] = i, me(sr, e, lr), sr[4] -= n, sr[5] -= i, e = sr), this.setLocalTransform(e) } }, t.prototype.getGlobalScale = function (t) { var e = this.transform; return t = t || [], e ? (t[0] = Math.sqrt(e[0] * e[0] + e[1] * e[1]), t[1] = Math.sqrt(e[2] * e[2] + e[3] * e[3]), e[0] < 0 && (t[0] = -t[0]), e[3] < 0 && (t[1] = -t[1]), t) : (t[0] = 1, t[1] = 1, t) }, t.prototype.transformCoordToLocal = function (t, e) { var n = [t, e], i = this.invTransform; return i && Ft(n, n, i), n }, t.prototype.transformCoordToGlobal = function (t, e) { var n = [t, e], i = this.transform; return i && Ft(n, n, i), n }, t.prototype.getLineScale = function () { var t = this.transform; return t && ur(t[0] - 1) > 1e-10 && ur(t[3] - 1) > 1e-10 ? Math.sqrt(ur(t[0] * t[3] - t[2] * t[1])) : 1 }, t.prototype.copyTransform = function (t) { pr(this, t) }, t.getLocalTransform = function (t, e) { e = e || []; var n = t.originX || 0, i = t.originY || 0, r = t.scaleX, o = t.scaleY, a = t.anchorX, s = t.anchorY, l = t.rotation || 0, u = t.x, h = t.y, c = t.skewX ? Math.tan(t.skewX) : 0, p = t.skewY ? Math.tan(-t.skewY) : 0; if (n || i || a || s) { var d = n + a, f = i + s; e[4] = -d * r - c * f * o, e[5] = -f * o - p * d * r } else e[4] = e[5] = 0; return e[0] = r, e[3] = o, e[1] = p * r, e[2] = c * o, l && _e(e, e, l), e[4] += n + u, e[5] += i + h, e }, t.initDefaultProps = function () { var e = t.prototype; e.scaleX = e.scaleY = e.globalScaleRatio = 1, e.x = e.y = e.originX = e.originY = e.skewX = e.skewY = e.rotation = e.anchorX = e.anchorY = 0 }(), t }(), cr = [\"x\", \"y\", \"originX\", \"originY\", \"anchorX\", \"anchorY\", \"rotation\", \"scaleX\", \"scaleY\", \"skewX\", \"skewY\"]; function pr(t, e) { for (var n = 0; n < cr.length; n++) { var i = cr[n]; t[i] = e[i] } } var dr = {}; function fr(t, e) { var n = dr[e = e || a]; n || (n = dr[e] = new On(500)); var i = n.get(t); return null == i && (i = h.measureText(t, e).width, n.put(t, i)), i } function gr(t, e, n, i) { var r = fr(t, e), o = xr(e), a = vr(0, r, n), s = mr(0, o, i); return new Re(a, s, r, o) } function yr(t, e, n, i) { var r = ((t || \"\") + \"\").split(\"\\n\"); if (1 === r.length) return gr(r[0], e, n, i); for (var o = new Re(0, 0, 0, 0), a = 0; a < r.length; a++) { var s = gr(r[a], e, n, i); 0 === a ? o.copy(s) : o.union(s) } return o } function vr(t, e, n) { return \"right\" === n ? t -= e : \"center\" === n && (t -= e / 2), t } function mr(t, e, n) { return \"middle\" === n ? t -= e / 2 : \"bottom\" === n && (t -= e), t } function xr(t) { return fr(\"国\", t) } function _r(t, e) { return \"string\" == typeof t ? t.lastIndexOf(\"%\") >= 0 ? parseFloat(t) / 100 * e : parseFloat(t) : t } function br(t, e, n) { var i = e.position || \"inside\", r = null != e.distance ? e.distance : 5, o = n.height, a = n.width, s = o / 2, l = n.x, u = n.y, h = \"left\", c = \"top\"; if (i instanceof Array) l += _r(i[0], n.width), u += _r(i[1], n.height), h = null, c = null; else switch (i) { case \"left\": l -= r, u += s, h = \"right\", c = \"middle\"; break; case \"right\": l += r + a, u += s, c = \"middle\"; break; case \"top\": l += a / 2, u -= r, h = \"center\", c = \"bottom\"; break; case \"bottom\": l += a / 2, u += o + r, h = \"center\"; break; case \"inside\": l += a / 2, u += s, h = \"center\", c = \"middle\"; break; case \"insideLeft\": l += r, u += s, c = \"middle\"; break; case \"insideRight\": l += a - r, u += s, h = \"right\", c = \"middle\"; break; case \"insideTop\": l += a / 2, u += r, h = \"center\"; break; case \"insideBottom\": l += a / 2, u += o - r, h = \"center\", c = \"bottom\"; break; case \"insideTopLeft\": l += r, u += r; break; case \"insideTopRight\": l += a - r, u += r, h = \"right\"; break; case \"insideBottomLeft\": l += r, u += o - r, c = \"bottom\"; break; case \"insideBottomRight\": l += a - r, u += o - r, h = \"right\", c = \"bottom\" }return (t = t || {}).x = l, t.y = u, t.align = h, t.verticalAlign = c, t } var wr = \"__zr_normal__\", Sr = cr.concat([\"ignore\"]), Mr = V(cr, (function (t, e) { return t[e] = !0, t }), { ignore: !1 }), Ir = {}, Tr = new Re(0, 0, 0, 0), Cr = function () { function t(t) { this.id = M(), this.animators = [], this.currentStates = [], this.states = {}, this._init(t) } return t.prototype._init = function (t) { this.attr(t) }, t.prototype.drift = function (t, e, n) { switch (this.draggable) { case \"horizontal\": e = 0; break; case \"vertical\": t = 0 }var i = this.transform; i || (i = this.transform = [1, 0, 0, 1, 0, 0]), i[4] += t, i[5] += e, this.decomposeTransform(), this.markRedraw() }, t.prototype.beforeUpdate = function () { }, t.prototype.afterUpdate = function () { }, t.prototype.update = function () { this.updateTransform(), this.__dirty && this.updateInnerText() }, t.prototype.updateInnerText = function (t) { var e = this._textContent; if (e && (!e.ignore || t)) { this.textConfig || (this.textConfig = {}); var n = this.textConfig, i = n.local, r = e.innerTransformable, o = void 0, a = void 0, s = !1; r.parent = i ? this : null; var l = !1; if (r.copyTransform(e), null != n.position) { var u = Tr; n.layoutRect ? u.copy(n.layoutRect) : u.copy(this.getBoundingRect()), i || u.applyTransform(this.transform), this.calculateTextPosition ? this.calculateTextPosition(Ir, n, u) : br(Ir, n, u), r.x = Ir.x, r.y = Ir.y, o = Ir.align, a = Ir.verticalAlign; var h = n.origin; if (h && null != n.rotation) { var c = void 0, p = void 0; \"center\" === h ? (c = .5 * u.width, p = .5 * u.height) : (c = _r(h[0], u.width), p = _r(h[1], u.height)), l = !0, r.originX = -r.x + c + (i ? 0 : u.x), r.originY = -r.y + p + (i ? 0 : u.y) } } null != n.rotation && (r.rotation = n.rotation); var d = n.offset; d && (r.x += d[0], r.y += d[1], l || (r.originX = -d[0], r.originY = -d[1])); var f = null == n.inside ? \"string\" == typeof n.position && n.position.indexOf(\"inside\") >= 0 : n.inside, g = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}), y = void 0, v = void 0, m = void 0; f && this.canBeInsideText() ? (y = n.insideFill, v = n.insideStroke, null != y && \"auto\" !== y || (y = this.getInsideTextFill()), null != v && \"auto\" !== v || (v = this.getInsideTextStroke(y), m = !0)) : (y = n.outsideFill, v = n.outsideStroke, null != y && \"auto\" !== y || (y = this.getOutsideFill()), null != v && \"auto\" !== v || (v = this.getOutsideStroke(y), m = !0)), (y = y || \"#000\") === g.fill && v === g.stroke && m === g.autoStroke && o === g.align && a === g.verticalAlign || (s = !0, g.fill = y, g.stroke = v, g.autoStroke = m, g.align = o, g.verticalAlign = a, e.setDefaultTextStyle(g)), e.__dirty |= 1, s && e.dirtyStyle(!0) } }, t.prototype.canBeInsideText = function () { return !0 }, t.prototype.getInsideTextFill = function () { return \"#fff\" }, t.prototype.getInsideTextStroke = function (t) { return \"#000\" }, t.prototype.getOutsideFill = function () { return this.__zr && this.__zr.isDarkMode() ? nr : er }, t.prototype.getOutsideStroke = function (t) { var e = this.__zr && this.__zr.getBackgroundColor(), n = \"string\" == typeof e && Xn(e); n || (n = [255, 255, 255, 1]); for (var i = n[3], r = this.__zr.isDarkMode(), o = 0; o < 3; o++)n[o] = n[o] * i + (r ? 0 : 255) * (1 - i); return n[3] = 1, ei(n, \"rgba\") }, t.prototype.traverse = function (t, e) { }, t.prototype.attrKV = function (t, e) { \"textConfig\" === t ? this.setTextConfig(e) : \"textContent\" === t ? this.setTextContent(e) : \"clipPath\" === t ? this.setClipPath(e) : \"extra\" === t ? (this.extra = this.extra || {}, A(this.extra, e)) : this[t] = e }, t.prototype.hide = function () { this.ignore = !0, this.markRedraw() }, t.prototype.show = function () { this.ignore = !1, this.markRedraw() }, t.prototype.attr = function (t, e) { if (\"string\" == typeof t) this.attrKV(t, e); else if (q(t)) for (var n = G(t), i = 0; i < n.length; i++) { var r = n[i]; this.attrKV(r, t[r]) } return this.markRedraw(), this }, t.prototype.saveCurrentToNormalState = function (t) { this._innerSaveToNormal(t); for (var e = this._normalState, n = 0; n < this.animators.length; n++) { var i = this.animators[n], r = i.__fromStateTransition; if (!(i.getLoop() || r && r !== wr)) { var o = i.targetName, a = o ? e[o] : e; i.saveTo(a) } } }, t.prototype._innerSaveToNormal = function (t) { var e = this._normalState; e || (e = this._normalState = {}), t.textConfig && !e.textConfig && (e.textConfig = this.textConfig), this._savePrimaryToNormal(t, e, Sr) }, t.prototype._savePrimaryToNormal = function (t, e, n) { for (var i = 0; i < n.length; i++) { var r = n[i]; null == t[r] || r in e || (e[r] = this[r]) } }, t.prototype.hasState = function () { return this.currentStates.length > 0 }, t.prototype.getState = function (t) { return this.states[t] }, t.prototype.ensureState = function (t) { var e = this.states; return e[t] || (e[t] = {}), e[t] }, t.prototype.clearStates = function (t) { this.useState(wr, !1, t) }, t.prototype.useState = function (t, e, n, i) { var r = t === wr; if (this.hasState() || !r) { var o = this.currentStates, a = this.stateTransition; if (!(P(o, t) >= 0) || !e && 1 !== o.length) { var s; if (this.stateProxy && !r && (s = this.stateProxy(t)), s || (s = this.states && this.states[t]), s || r) { r || this.saveCurrentToNormalState(s); var l = !!(s && s.hoverLayer || i); l && this._toggleHoverLayerFlag(!0), this._applyStateObj(t, s, this._normalState, e, !n && !this.__inHover && a && a.duration > 0, a); var u = this._textContent, h = this._textGuide; return u && u.useState(t, e, n, l), h && h.useState(t, e, n, l), r ? (this.currentStates = [], this._normalState = {}) : e ? this.currentStates.push(t) : this.currentStates = [t], this._updateAnimationTargets(), this.markRedraw(), !l && this.__inHover && (this._toggleHoverLayerFlag(!1), this.__dirty &= -2), s } I(\"State \" + t + \" not exists.\") } } }, t.prototype.useStates = function (t, e, n) { if (t.length) { var i = [], r = this.currentStates, o = t.length, a = o === r.length; if (a) for (var s = 0; s < o; s++)if (t[s] !== r[s]) { a = !1; break } if (a) return; for (s = 0; s < o; s++) { var l = t[s], u = void 0; this.stateProxy && (u = this.stateProxy(l, t)), u || (u = this.states[l]), u && i.push(u) } var h = i[o - 1], c = !!(h && h.hoverLayer || n); c && this._toggleHoverLayerFlag(!0); var p = this._mergeStates(i), d = this.stateTransition; this.saveCurrentToNormalState(p), this._applyStateObj(t.join(\",\"), p, this._normalState, !1, !e && !this.__inHover && d && d.duration > 0, d); var f = this._textContent, g = this._textGuide; f && f.useStates(t, e, c), g && g.useStates(t, e, c), this._updateAnimationTargets(), this.currentStates = t.slice(), this.markRedraw(), !c && this.__inHover && (this._toggleHoverLayerFlag(!1), this.__dirty &= -2) } else this.clearStates() }, t.prototype._updateAnimationTargets = function () { for (var t = 0; t < this.animators.length; t++) { var e = this.animators[t]; e.targetName && e.changeTarget(this[e.targetName]) } }, t.prototype.removeState = function (t) { var e = P(this.currentStates, t); if (e >= 0) { var n = this.currentStates.slice(); n.splice(e, 1), this.useStates(n) } }, t.prototype.replaceState = function (t, e, n) { var i = this.currentStates.slice(), r = P(i, t), o = P(i, e) >= 0; r >= 0 ? o ? i.splice(r, 1) : i[r] = e : n && !o && i.push(e), this.useStates(i) }, t.prototype.toggleState = function (t, e) { e ? this.useState(t, !0) : this.removeState(t) }, t.prototype._mergeStates = function (t) { for (var e, n = {}, i = 0; i < t.length; i++) { var r = t[i]; A(n, r), r.textConfig && A(e = e || {}, r.textConfig) } return e && (n.textConfig = e), n }, t.prototype._applyStateObj = function (t, e, n, i, r, o) { var a = !(e && i); e && e.textConfig ? (this.textConfig = A({}, i ? this.textConfig : n.textConfig), A(this.textConfig, e.textConfig)) : a && n.textConfig && (this.textConfig = n.textConfig); for (var s = {}, l = !1, u = 0; u < Sr.length; u++) { var h = Sr[u], c = r && Mr[h]; e && null != e[h] ? c ? (l = !0, s[h] = e[h]) : this[h] = e[h] : a && null != n[h] && (c ? (l = !0, s[h] = n[h]) : this[h] = n[h]) } if (!r) for (u = 0; u < this.animators.length; u++) { var p = this.animators[u], d = p.targetName; p.getLoop() || p.__changeFinalValue(d ? (e || n)[d] : e || n) } l && this._transitionState(t, s, o) }, t.prototype._attachComponent = function (t) { if ((!t.__zr || t.__hostTarget) && t !== this) { var e = this.__zr; e && t.addSelfToZr(e), t.__zr = e, t.__hostTarget = this } }, t.prototype._detachComponent = function (t) { t.__zr && t.removeSelfFromZr(t.__zr), t.__zr = null, t.__hostTarget = null }, t.prototype.getClipPath = function () { return this._clipPath }, t.prototype.setClipPath = function (t) { this._clipPath && this._clipPath !== t && this.removeClipPath(), this._attachComponent(t), this._clipPath = t, this.markRedraw() }, t.prototype.removeClipPath = function () { var t = this._clipPath; t && (this._detachComponent(t), this._clipPath = null, this.markRedraw()) }, t.prototype.getTextContent = function () { return this._textContent }, t.prototype.setTextContent = function (t) { var e = this._textContent; e !== t && (e && e !== t && this.removeTextContent(), t.innerTransformable = new hr, this._attachComponent(t), this._textContent = t, this.markRedraw()) }, t.prototype.setTextConfig = function (t) { this.textConfig || (this.textConfig = {}), A(this.textConfig, t), this.markRedraw() }, t.prototype.removeTextConfig = function () { this.textConfig = null, this.markRedraw() }, t.prototype.removeTextContent = function () { var t = this._textContent; t && (t.innerTransformable = null, this._detachComponent(t), this._textContent = null, this._innerTextDefaultStyle = null, this.markRedraw()) }, t.prototype.getTextGuideLine = function () { return this._textGuide }, t.prototype.setTextGuideLine = function (t) { this._textGuide && this._textGuide !== t && this.removeTextGuideLine(), this._attachComponent(t), this._textGuide = t, this.markRedraw() }, t.prototype.removeTextGuideLine = function () { var t = this._textGuide; t && (this._detachComponent(t), this._textGuide = null, this.markRedraw()) }, t.prototype.markRedraw = function () { this.__dirty |= 1; var t = this.__zr; t && (this.__inHover ? t.refreshHover() : t.refresh()), this.__hostTarget && this.__hostTarget.markRedraw() }, t.prototype.dirty = function () { this.markRedraw() }, t.prototype._toggleHoverLayerFlag = function (t) { this.__inHover = t; var e = this._textContent, n = this._textGuide; e && (e.__inHover = t), n && (n.__inHover = t) }, t.prototype.addSelfToZr = function (t) { if (this.__zr !== t) { this.__zr = t; var e = this.animators; if (e) for (var n = 0; n < e.length; n++)t.animation.addAnimator(e[n]); this._clipPath && this._clipPath.addSelfToZr(t), this._textContent && this._textContent.addSelfToZr(t), this._textGuide && this._textGuide.addSelfToZr(t) } }, t.prototype.removeSelfFromZr = function (t) { if (this.__zr) { this.__zr = null; var e = this.animators; if (e) for (var n = 0; n < e.length; n++)t.animation.removeAnimator(e[n]); this._clipPath && this._clipPath.removeSelfFromZr(t), this._textContent && this._textContent.removeSelfFromZr(t), this._textGuide && this._textGuide.removeSelfFromZr(t) } }, t.prototype.animate = function (t, e, n) { var i = t ? this[t] : this; var r = new Li(i, e, n); return t && (r.targetName = t), this.addAnimator(r, t), r }, t.prototype.addAnimator = function (t, e) { var n = this.__zr, i = this; t.during((function () { i.updateDuringAnimation(e) })).done((function () { var e = i.animators, n = P(e, t); n >= 0 && e.splice(n, 1) })), this.animators.push(t), n && n.animation.addAnimator(t), n && n.wakeUp() }, t.prototype.updateDuringAnimation = function (t) { this.markRedraw() }, t.prototype.stopAnimation = function (t, e) { for (var n = this.animators, i = n.length, r = [], o = 0; o < i; o++) { var a = n[o]; t && t !== a.scope ? r.push(a) : a.stop(e) } return this.animators = r, this }, t.prototype.animateTo = function (t, e, n) { Dr(this, t, e, n) }, t.prototype.animateFrom = function (t, e, n) { Dr(this, t, e, n, !0) }, t.prototype._transitionState = function (t, e, n, i) { for (var r = Dr(this, e, n, i), o = 0; o < r.length; o++)r[o].__fromStateTransition = t }, t.prototype.getBoundingRect = function () { return null }, t.prototype.getPaintRect = function () { return null }, t.initDefaultProps = function () { var e = t.prototype; e.type = \"element\", e.name = \"\", e.ignore = e.silent = e.isGroup = e.draggable = e.dragging = e.ignoreClip = e.__inHover = !1, e.__dirty = 1; function n(t, n, i, r) { function o(t, e) { Object.defineProperty(e, 0, { get: function () { return t[i] }, set: function (e) { t[i] = e } }), Object.defineProperty(e, 1, { get: function () { return t[r] }, set: function (e) { t[r] = e } }) } Object.defineProperty(e, t, { get: function () { this[n] || o(this, this[n] = []); return this[n] }, set: function (t) { this[i] = t[0], this[r] = t[1], this[n] = t, o(this, t) } }) } Object.defineProperty && (n(\"position\", \"_legacyPos\", \"x\", \"y\"), n(\"scale\", \"_legacyScale\", \"scaleX\", \"scaleY\"), n(\"origin\", \"_legacyOrigin\", \"originX\", \"originY\")) }(), t }(); function Dr(t, e, n, i, r) { var o = []; Lr(t, \"\", t, e, n = n || {}, i, o, r); var a = o.length, s = !1, l = n.done, u = n.aborted, h = function () { s = !0, --a <= 0 && (s ? l && l() : u && u()) }, c = function () { --a <= 0 && (s ? l && l() : u && u()) }; a || l && l(), o.length > 0 && n.during && o[0].during((function (t, e) { n.during(e) })); for (var p = 0; p < o.length; p++) { var d = o[p]; h && d.done(h), c && d.aborted(c), n.force && d.duration(n.duration), d.start(n.easing) } return o } function Ar(t, e, n) { for (var i = 0; i < n; i++)t[i] = e[i] } function kr(t, e, n) { if (N(e[n])) if (N(t[n]) || (t[n] = []), $(e[n])) { var i = e[n].length; t[n].length !== i && (t[n] = new e[n].constructor(i), Ar(t[n], e[n], i)) } else { var r = e[n], o = t[n], a = r.length; if (N(r[0])) for (var s = r[0].length, l = 0; l < a; l++)o[l] ? Ar(o[l], r[l], s) : o[l] = Array.prototype.slice.call(r[l]); else Ar(o, r, a); o.length = r.length } else t[n] = e[n] } function Lr(t, e, n, i, r, o, a, s) { for (var l = G(i), u = r.duration, h = r.delay, c = r.additive, p = r.setToFinal, d = !q(o), f = t.animators, g = [], y = 0; y < l.length; y++) { var v = l[y], m = i[v]; if (null != m && null != n[v] && (d || o[v])) if (!q(m) || N(m) || Q(m)) g.push(v); else { if (e) { s || (n[v] = m, t.updateDuringAnimation(e)); continue } Lr(t, v, n[v], m, r, o && o[v], a, s) } else s || (n[v] = m, t.updateDuringAnimation(e), g.push(v)) } var x = g.length; if (!c && x) for (var _ = 0; _ < f.length; _++) { if ((w = f[_]).targetName === e) if (w.stopTracks(g)) { var b = P(f, w); f.splice(b, 1) } } if (r.force || (g = B(g, (function (t) { return e = i[t], r = n[t], !(e === r || N(e) && N(r) && function (t, e) { var n = t.length; if (n !== e.length) return !1; for (var i = 0; i < n; i++)if (t[i] !== e[i]) return !1; return !0 }(e, r)); var e, r })), x = g.length), x > 0 || r.force && !a.length) { var w, S = void 0, M = void 0, I = void 0; if (s) { M = {}, p && (S = {}); for (_ = 0; _ < x; _++) { M[v = g[_]] = n[v], p ? S[v] = i[v] : n[v] = i[v] } } else if (p) { I = {}; for (_ = 0; _ < x; _++) { I[v = g[_]] = Ii(n[v]), kr(n, i, v) } } (w = new Li(n, !1, !1, c ? B(f, (function (t) { return t.targetName === e })) : null)).targetName = e, r.scope && (w.scope = r.scope), p && S && w.whenWithKeys(0, S, g), I && w.whenWithKeys(0, I, g), w.whenWithKeys(null == u ? 500 : u, s ? M : i, g).delay(h || 0), t.addAnimator(w, e), a.push(w) } } R(Cr, Xt), R(Cr, hr); var Pr = function (t) { function e(e) { var n = t.call(this) || this; return n.isGroup = !0, n._children = [], n.attr(e), n } return n(e, t), e.prototype.childrenRef = function () { return this._children }, e.prototype.children = function () { return this._children.slice() }, e.prototype.childAt = function (t) { return this._children[t] }, e.prototype.childOfName = function (t) { for (var e = this._children, n = 0; n < e.length; n++)if (e[n].name === t) return e[n] }, e.prototype.childCount = function () { return this._children.length }, e.prototype.add = function (t) { return t && t !== this && t.parent !== this && (this._children.push(t), this._doAdd(t)), this }, e.prototype.addBefore = function (t, e) { if (t && t !== this && t.parent !== this && e && e.parent === this) { var n = this._children, i = n.indexOf(e); i >= 0 && (n.splice(i, 0, t), this._doAdd(t)) } return this }, e.prototype.replace = function (t, e) { var n = P(this._children, t); return n >= 0 && this.replaceAt(e, n), this }, e.prototype.replaceAt = function (t, e) { var n = this._children, i = n[e]; if (t && t !== this && t.parent !== this && t !== i) { n[e] = t, i.parent = null; var r = this.__zr; r && i.removeSelfFromZr(r), this._doAdd(t) } return this }, e.prototype._doAdd = function (t) { t.parent && t.parent.remove(t), t.parent = this; var e = this.__zr; e && e !== t.__zr && t.addSelfToZr(e), e && e.refresh() }, e.prototype.remove = function (t) { var e = this.__zr, n = this._children, i = P(n, t); return i < 0 || (n.splice(i, 1), t.parent = null, e && t.removeSelfFromZr(e), e && e.refresh()), this }, e.prototype.removeAll = function () { for (var t = this._children, e = this.__zr, n = 0; n < t.length; n++) { var i = t[n]; e && i.removeSelfFromZr(e), i.parent = null } return t.length = 0, this }, e.prototype.eachChild = function (t, e) { for (var n = this._children, i = 0; i < n.length; i++) { var r = n[i]; t.call(e, r, i) } return this }, e.prototype.traverse = function (t, e) { for (var n = 0; n < this._children.length; n++) { var i = this._children[n], r = t.call(e, i); i.isGroup && !r && i.traverse(t, e) } return this }, e.prototype.addSelfToZr = function (e) { t.prototype.addSelfToZr.call(this, e); for (var n = 0; n < this._children.length; n++) { this._children[n].addSelfToZr(e) } }, e.prototype.removeSelfFromZr = function (e) { t.prototype.removeSelfFromZr.call(this, e); for (var n = 0; n < this._children.length; n++) { this._children[n].removeSelfFromZr(e) } }, e.prototype.getBoundingRect = function (t) { for (var e = new Re(0, 0, 0, 0), n = t || this._children, i = [], r = null, o = 0; o < n.length; o++) { var a = n[o]; if (!a.ignore && !a.invisible) { var s = a.getBoundingRect(), l = a.getLocalTransform(i); l ? (Re.applyTransform(e, s, l), (r = r || e.clone()).union(e)) : (r = r || s.clone()).union(s) } } return r || e }, e }(Cr); Pr.prototype.type = \"group\";\n  /*!\n      * ZRender, a high performance 2d drawing library.\n      *\n      * Copyright (c) 2013, Baidu Inc.\n      * All rights reserved.\n      *\n      * LICENSE\n      * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt\n      */\n  var Or = {}, Rr = {}; var Nr = function () { function t(t, e, n) { var i = this; this._sleepAfterStill = 10, this._stillFrameAccum = 0, this._needsRefresh = !0, this._needsRefreshHover = !0, this._darkMode = !1, n = n || {}, this.dom = e, this.id = t; var o = new tn, a = n.renderer || \"canvas\"; Or[a] || (a = G(Or)[0]), n.useDirtyRect = null != n.useDirtyRect && n.useDirtyRect; var s = new Or[a](e, o, n, t), l = n.ssr || s.ssrOnly; this.storage = o, this.painter = s; var u, h = r.node || r.worker || l ? null : new Ji(s.getViewportRoot(), s.root), c = n.useCoarsePointer; (null == c || \"auto\" === c ? r.touchEventsSupported : !!c) && (u = rt(n.pointerSize, 44)), this.handler = new Ge(o, s, h, s.root, u), this.animation = new Ni({ stage: { update: l ? null : function () { return i._flush(!0) } } }), l || this.animation.start() } return t.prototype.add = function (t) { t && (this.storage.addRoot(t), t.addSelfToZr(this), this.refresh()) }, t.prototype.remove = function (t) { t && (this.storage.delRoot(t), t.removeSelfFromZr(this), this.refresh()) }, t.prototype.configLayer = function (t, e) { this.painter.configLayer && this.painter.configLayer(t, e), this.refresh() }, t.prototype.setBackgroundColor = function (t) { this.painter.setBackgroundColor && this.painter.setBackgroundColor(t), this.refresh(), this._backgroundColor = t, this._darkMode = function (t) { if (!t) return !1; if (\"string\" == typeof t) return ni(t, 1) < .4; if (t.colorStops) { for (var e = t.colorStops, n = 0, i = e.length, r = 0; r < i; r++)n += ni(e[r].color, 1); return (n /= i) < .4 } return !1 }(t) }, t.prototype.getBackgroundColor = function () { return this._backgroundColor }, t.prototype.setDarkMode = function (t) { this._darkMode = t }, t.prototype.isDarkMode = function () { return this._darkMode }, t.prototype.refreshImmediately = function (t) { t || this.animation.update(!0), this._needsRefresh = !1, this.painter.refresh(), this._needsRefresh = !1 }, t.prototype.refresh = function () { this._needsRefresh = !0, this.animation.start() }, t.prototype.flush = function () { this._flush(!1) }, t.prototype._flush = function (t) { var e, n = Pi(); this._needsRefresh && (e = !0, this.refreshImmediately(t)), this._needsRefreshHover && (e = !0, this.refreshHoverImmediately()); var i = Pi(); e ? (this._stillFrameAccum = 0, this.trigger(\"rendered\", { elapsedTime: i - n })) : this._sleepAfterStill > 0 && (this._stillFrameAccum++, this._stillFrameAccum > this._sleepAfterStill && this.animation.stop()) }, t.prototype.setSleepAfterStill = function (t) { this._sleepAfterStill = t }, t.prototype.wakeUp = function () { this.animation.start(), this._stillFrameAccum = 0 }, t.prototype.refreshHover = function () { this._needsRefreshHover = !0 }, t.prototype.refreshHoverImmediately = function () { this._needsRefreshHover = !1, this.painter.refreshHover && \"canvas\" === this.painter.getType() && this.painter.refreshHover() }, t.prototype.resize = function (t) { t = t || {}, this.painter.resize(t.width, t.height), this.handler.resize() }, t.prototype.clearAnimation = function () { this.animation.clear() }, t.prototype.getWidth = function () { return this.painter.getWidth() }, t.prototype.getHeight = function () { return this.painter.getHeight() }, t.prototype.setCursorStyle = function (t) { this.handler.setCursorStyle(t) }, t.prototype.findHover = function (t, e) { return this.handler.findHover(t, e) }, t.prototype.on = function (t, e, n) { return this.handler.on(t, e, n), this }, t.prototype.off = function (t, e) { this.handler.off(t, e) }, t.prototype.trigger = function (t, e) { this.handler.trigger(t, e) }, t.prototype.clear = function () { for (var t = this.storage.getRoots(), e = 0; e < t.length; e++)t[e] instanceof Pr && t[e].removeSelfFromZr(this); this.storage.delAllRoots(), this.painter.clear() }, t.prototype.dispose = function () { var t; this.animation.stop(), this.clear(), this.storage.dispose(), this.painter.dispose(), this.handler.dispose(), this.animation = this.storage = this.painter = this.handler = null, t = this.id, delete Rr[t] }, t }(); function Er(t, e) { var n = new Nr(M(), t, e); return Rr[n.id] = n, n } function zr(t, e) { Or[t] = e } var Vr = Object.freeze({ __proto__: null, init: Er, dispose: function (t) { t.dispose() }, disposeAll: function () { for (var t in Rr) Rr.hasOwnProperty(t) && Rr[t].dispose(); Rr = {} }, getInstance: function (t) { return Rr[t] }, registerPainter: zr, version: \"5.4.0\" }), Br = 1e-4; function Fr(t, e, n, i) { var r = e[0], o = e[1], a = n[0], s = n[1], l = o - r, u = s - a; if (0 === l) return 0 === u ? a : (a + s) / 2; if (i) if (l > 0) { if (t <= r) return a; if (t >= o) return s } else { if (t >= r) return a; if (t <= o) return s } else { if (t === r) return a; if (t === o) return s } return (t - r) / l * u + a } function Gr(t, e) { switch (t) { case \"center\": case \"middle\": t = \"50%\"; break; case \"left\": case \"top\": t = \"0%\"; break; case \"right\": case \"bottom\": t = \"100%\" }return X(t) ? (n = t, n.replace(/^\\s+|\\s+$/g, \"\")).match(/%$/) ? parseFloat(t) / 100 * e : parseFloat(t) : null == t ? NaN : +t; var n } function Wr(t, e, n) { return null == e && (e = 10), e = Math.min(Math.max(0, e), 20), t = (+t).toFixed(e), n ? t : +t } function Hr(t) { return t.sort((function (t, e) { return t - e })), t } function Yr(t) { if (t = +t, isNaN(t)) return 0; if (t > 1e-14) for (var e = 1, n = 0; n < 15; n++, e *= 10)if (Math.round(t * e) / e === t) return n; return Ur(t) } function Ur(t) { var e = t.toString().toLowerCase(), n = e.indexOf(\"e\"), i = n > 0 ? +e.slice(n + 1) : 0, r = n > 0 ? n : e.length, o = e.indexOf(\".\"), a = o < 0 ? 0 : r - 1 - o; return Math.max(0, a - i) } function Xr(t, e) { var n = Math.log, i = Math.LN10, r = Math.floor(n(t[1] - t[0]) / i), o = Math.round(n(Math.abs(e[1] - e[0])) / i), a = Math.min(Math.max(-r + o, 0), 20); return isFinite(a) ? a : 20 } function Zr(t, e) { var n = V(t, (function (t, e) { return t + (isNaN(e) ? 0 : e) }), 0); if (0 === n) return []; for (var i = Math.pow(10, e), r = z(t, (function (t) { return (isNaN(t) ? 0 : t) / n * i * 100 })), o = 100 * i, a = z(r, (function (t) { return Math.floor(t) })), s = V(a, (function (t, e) { return t + e }), 0), l = z(r, (function (t, e) { return t - a[e] })); s < o;) { for (var u = Number.NEGATIVE_INFINITY, h = null, c = 0, p = l.length; c < p; ++c)l[c] > u && (u = l[c], h = c); ++a[h], l[h] = 0, ++s } return z(a, (function (t) { return t / i })) } function jr(t, e) { var n = Math.max(Yr(t), Yr(e)), i = t + e; return n > 20 ? i : Wr(i, n) } var qr = 9007199254740991; function Kr(t) { var e = 2 * Math.PI; return (t % e + e) % e } function $r(t) { return t > -1e-4 && t < Br } var Jr = /^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2})(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/; function Qr(t) { if (t instanceof Date) return t; if (X(t)) { var e = Jr.exec(t); if (!e) return new Date(NaN); if (e[8]) { var n = +e[4] || 0; return \"Z\" !== e[8].toUpperCase() && (n -= +e[8].slice(0, 3)), new Date(Date.UTC(+e[1], +(e[2] || 1) - 1, +e[3] || 1, n, +(e[5] || 0), +e[6] || 0, e[7] ? +e[7].substring(0, 3) : 0)) } return new Date(+e[1], +(e[2] || 1) - 1, +e[3] || 1, +e[4] || 0, +(e[5] || 0), +e[6] || 0, e[7] ? +e[7].substring(0, 3) : 0) } return null == t ? new Date(NaN) : new Date(Math.round(t)) } function to(t) { return Math.pow(10, eo(t)) } function eo(t) { if (0 === t) return 0; var e = Math.floor(Math.log(t) / Math.LN10); return t / Math.pow(10, e) >= 10 && e++, e } function no(t, e) { var n = eo(t), i = Math.pow(10, n), r = t / i; return t = (e ? r < 1.5 ? 1 : r < 2.5 ? 2 : r < 4 ? 3 : r < 7 ? 5 : 10 : r < 1 ? 1 : r < 2 ? 2 : r < 3 ? 3 : r < 5 ? 5 : 10) * i, n >= -20 ? +t.toFixed(n < 0 ? -n : 0) : t } function io(t, e) { var n = (t.length - 1) * e + 1, i = Math.floor(n), r = +t[i - 1], o = n - i; return o ? r + o * (t[i] - r) : r } function ro(t) { t.sort((function (t, e) { return s(t, e, 0) ? -1 : 1 })); for (var e = -1 / 0, n = 1, i = 0; i < t.length;) { for (var r = t[i].interval, o = t[i].close, a = 0; a < 2; a++)r[a] <= e && (r[a] = e, o[a] = a ? 1 : 1 - n), e = r[a], n = o[a]; r[0] === r[1] && o[0] * o[1] != 1 ? t.splice(i, 1) : i++ } return t; function s(t, e, n) { return t.interval[n] < e.interval[n] || t.interval[n] === e.interval[n] && (t.close[n] - e.close[n] == (n ? -1 : 1) || !n && s(t, e, 1)) } } function oo(t) { var e = parseFloat(t); return e == t && (0 !== e || !X(t) || t.indexOf(\"x\") <= 0) ? e : NaN } function ao(t) { return !isNaN(oo(t)) } function so() { return Math.round(9 * Math.random()) } function lo(t, e) { return 0 === e ? t : lo(e, t % e) } function uo(t, e) { return null == t ? e : null == e ? t : t * e / lo(t, e) } \"undefined\" != typeof console && console.warn && console.log; function ho(t) { 0 } function co(t) { throw new Error(t) } function po(t, e, n) { return (e - t) * n + t } var fo = \"series\\0\", go = \"\\0_ec_\\0\"; function yo(t) { return t instanceof Array ? t : null == t ? [] : [t] } function vo(t, e, n) { if (t) { t[e] = t[e] || {}, t.emphasis = t.emphasis || {}, t.emphasis[e] = t.emphasis[e] || {}; for (var i = 0, r = n.length; i < r; i++) { var o = n[i]; !t.emphasis[e].hasOwnProperty(o) && t[e].hasOwnProperty(o) && (t.emphasis[e][o] = t[e][o]) } } } var mo = [\"fontStyle\", \"fontWeight\", \"fontSize\", \"fontFamily\", \"rich\", \"tag\", \"color\", \"textBorderColor\", \"textBorderWidth\", \"width\", \"height\", \"lineHeight\", \"align\", \"verticalAlign\", \"baseline\", \"shadowColor\", \"shadowBlur\", \"shadowOffsetX\", \"shadowOffsetY\", \"textShadowColor\", \"textShadowBlur\", \"textShadowOffsetX\", \"textShadowOffsetY\", \"backgroundColor\", \"borderColor\", \"borderWidth\", \"borderRadius\", \"padding\"]; function xo(t) { return !q(t) || Y(t) || t instanceof Date ? t : t.value } function _o(t) { return q(t) && !(t instanceof Array) } function bo(t, e, n) { var i = \"normalMerge\" === n, r = \"replaceMerge\" === n, o = \"replaceAll\" === n; t = t || [], e = (e || []).slice(); var a = ft(); E(e, (function (t, n) { q(t) || (e[n] = null) })); var s, l, u = function (t, e, n) { var i = []; if (\"replaceAll\" === n) return i; for (var r = 0; r < t.length; r++) { var o = t[r]; o && null != o.id && e.set(o.id, r), i.push({ existing: \"replaceMerge\" === n || To(o) ? null : o, newOption: null, keyInfo: null, brandNew: null }) } return i }(t, a, n); return (i || r) && function (t, e, n, i) { E(i, (function (r, o) { if (r && null != r.id) { var a = So(r.id), s = n.get(a); if (null != s) { var l = t[s]; lt(!l.newOption, 'Duplicated option on id \"' + a + '\".'), l.newOption = r, l.existing = e[s], i[o] = null } } })) }(u, t, a, e), i && function (t, e) { E(e, (function (n, i) { if (n && null != n.name) for (var r = 0; r < t.length; r++) { var o = t[r].existing; if (!t[r].newOption && o && (null == o.id || null == n.id) && !To(n) && !To(o) && wo(\"name\", o, n)) return t[r].newOption = n, void (e[i] = null) } })) }(u, e), i || r ? function (t, e, n) { E(e, (function (e) { if (e) { for (var i, r = 0; (i = t[r]) && (i.newOption || To(i.existing) || i.existing && null != e.id && !wo(\"id\", e, i.existing));)r++; i ? (i.newOption = e, i.brandNew = n) : t.push({ newOption: e, brandNew: n, existing: null, keyInfo: null }), r++ } })) }(u, e, r) : o && function (t, e) { E(e, (function (e) { t.push({ newOption: e, brandNew: !0, existing: null, keyInfo: null }) })) }(u, e), s = u, l = ft(), E(s, (function (t) { var e = t.existing; e && l.set(e.id, t) })), E(s, (function (t) { var e = t.newOption; lt(!e || null == e.id || !l.get(e.id) || l.get(e.id) === t, \"id duplicates: \" + (e && e.id)), e && null != e.id && l.set(e.id, t), !t.keyInfo && (t.keyInfo = {}) })), E(s, (function (t, e) { var n = t.existing, i = t.newOption, r = t.keyInfo; if (q(i)) { if (r.name = null != i.name ? So(i.name) : n ? n.name : fo + e, n) r.id = So(n.id); else if (null != i.id) r.id = So(i.id); else { var o = 0; do { r.id = \"\\0\" + r.name + \"\\0\" + o++ } while (l.get(r.id)) } l.set(r.id, t) } })), u } function wo(t, e, n) { var i = Mo(e[t], null), r = Mo(n[t], null); return null != i && null != r && i === r } function So(t) { return Mo(t, \"\") } function Mo(t, e) { return null == t ? e : X(t) ? t : j(t) || Z(t) ? t + \"\" : e } function Io(t) { var e = t.name; return !(!e || !e.indexOf(fo)) } function To(t) { return t && null != t.id && 0 === So(t.id).indexOf(go) } function Co(t, e) { return null != e.dataIndexInside ? e.dataIndexInside : null != e.dataIndex ? Y(e.dataIndex) ? z(e.dataIndex, (function (e) { return t.indexOfRawIndex(e) })) : t.indexOfRawIndex(e.dataIndex) : null != e.name ? Y(e.name) ? z(e.name, (function (e) { return t.indexOfName(e) })) : t.indexOfName(e.name) : void 0 } function Do() { var t = \"__ec_inner_\" + Ao++; return function (e) { return e[t] || (e[t] = {}) } } var Ao = so(); function ko(t, e, n) { var i = Lo(e, n), r = i.mainTypeSpecified, o = i.queryOptionMap, a = i.others, s = n ? n.defaultMainType : null; return !r && s && o.set(s, {}), o.each((function (e, i) { var r = Ro(t, i, e, { useDefault: s === i, enableAll: !n || null == n.enableAll || n.enableAll, enableNone: !n || null == n.enableNone || n.enableNone }); a[i + \"Models\"] = r.models, a[i + \"Model\"] = r.models[0] })), a } function Lo(t, e) { var n; if (X(t)) { var i = {}; i[t + \"Index\"] = 0, n = i } else n = t; var r = ft(), o = {}, a = !1; return E(n, (function (t, n) { if (\"dataIndex\" !== n && \"dataIndexInside\" !== n) { var i = n.match(/^(\\w+)(Index|Id|Name)$/) || [], s = i[1], l = (i[2] || \"\").toLowerCase(); if (s && l && !(e && e.includeMainTypes && P(e.includeMainTypes, s) < 0)) a = a || !!s, (r.get(s) || r.set(s, {}))[l] = t } else o[n] = t })), { mainTypeSpecified: a, queryOptionMap: r, others: o } } var Po = { useDefault: !0, enableAll: !1, enableNone: !1 }, Oo = { useDefault: !1, enableAll: !0, enableNone: !0 }; function Ro(t, e, n, i) { i = i || Po; var r = n.index, o = n.id, a = n.name, s = { models: null, specified: null != r || null != o || null != a }; if (!s.specified) { var l = void 0; return s.models = i.useDefault && (l = t.getComponent(e)) ? [l] : [], s } return \"none\" === r || !1 === r ? (lt(i.enableNone, '`\"none\"` or `false` is not a valid value on index option.'), s.models = [], s) : (\"all\" === r && (lt(i.enableAll, '`\"all\"` is not a valid value on index option.'), r = o = a = null), s.models = t.queryComponents({ mainType: e, index: r, id: o, name: a }), s) } function No(t, e, n) { t.setAttribute ? t.setAttribute(e, n) : t[e] = n } function Eo(t, e) { var n = ft(), i = []; return E(t, (function (t) { var r = e(t); (n.get(r) || (i.push(r), n.set(r, []))).push(t) })), { keys: i, buckets: n } } function zo(t, e, n, i, r) { var o = null == e || \"auto\" === e; if (null == i) return i; if (j(i)) return Wr(f = po(n || 0, i, r), o ? Math.max(Yr(n || 0), Yr(i)) : e); if (X(i)) return r < 1 ? n : i; for (var a = [], s = n, l = i, u = Math.max(s ? s.length : 0, l.length), h = 0; h < u; ++h) { var c = t.getDimensionInfo(h); if (c && \"ordinal\" === c.type) a[h] = (r < 1 && s ? s : l)[h]; else { var p = s && s[h] ? s[h] : 0, d = l[h], f = po(p, d, r); a[h] = Wr(f, o ? Math.max(Yr(p), Yr(d)) : e) } } return a } var Vo = \"___EC__COMPONENT__CONTAINER___\", Bo = \"___EC__EXTENDED_CLASS___\"; function Fo(t) { var e = { main: \"\", sub: \"\" }; if (t) { var n = t.split(\".\"); e.main = n[0] || \"\", e.sub = n[1] || \"\" } return e } function Go(t, e) { t.$constructor = t, t.extend = function (t) { var e, i, r = this; return U(i = r) && /^class\\s/.test(Function.prototype.toString.call(i)) ? e = function (t) { function e() { return t.apply(this, arguments) || this } return n(e, t), e }(r) : (e = function () { (t.$constructor || r).apply(this, arguments) }, O(e, this)), A(e.prototype, t), e[Bo] = !0, e.extend = this.extend, e.superCall = Yo, e.superApply = Uo, e.superClass = r, e } } function Wo(t, e) { t.extend = e.extend } var Ho = Math.round(10 * Math.random()); function Yo(t, e) { for (var n = [], i = 2; i < arguments.length; i++)n[i - 2] = arguments[i]; return this.superClass.prototype[e].apply(t, n) } function Uo(t, e, n) { return this.superClass.prototype[e].apply(t, n) } function Xo(t) { var e = {}; t.registerClass = function (t) { var n, i = t.type || t.prototype.type; if (i) { lt(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(n = i), 'componentType \"' + n + '\" illegal'), t.prototype.type = i; var r = Fo(i); if (r.sub) { if (r.sub !== Vo) { var o = function (t) { var n = e[t.main]; n && n[Vo] || ((n = e[t.main] = {})[Vo] = !0); return n }(r); o[r.sub] = t } } else e[r.main] = t } return t }, t.getClass = function (t, n, i) { var r = e[t]; if (r && r[Vo] && (r = n ? r[n] : null), i && !r) throw new Error(n ? \"Component \" + t + \".\" + (n || \"\") + \" is used but not imported.\" : t + \".type should be specified.\"); return r }, t.getClassesByMainType = function (t) { var n = Fo(t), i = [], r = e[n.main]; return r && r[Vo] ? E(r, (function (t, e) { e !== Vo && i.push(t) })) : i.push(r), i }, t.hasClass = function (t) { var n = Fo(t); return !!e[n.main] }, t.getAllClassMainTypes = function () { var t = []; return E(e, (function (e, n) { t.push(n) })), t }, t.hasSubTypes = function (t) { var n = Fo(t), i = e[n.main]; return i && i[Vo] } } function Zo(t, e) { for (var n = 0; n < t.length; n++)t[n][1] || (t[n][1] = t[n][0]); return e = e || !1, function (n, i, r) { for (var o = {}, a = 0; a < t.length; a++) { var s = t[a][1]; if (!(i && P(i, s) >= 0 || r && P(r, s) < 0)) { var l = n.getShallow(s, e); null != l && (o[t[a][0]] = l) } } return o } } var jo = Zo([[\"fill\", \"color\"], [\"shadowBlur\"], [\"shadowOffsetX\"], [\"shadowOffsetY\"], [\"opacity\"], [\"shadowColor\"]]), qo = function () { function t() { } return t.prototype.getAreaStyle = function (t, e) { return jo(this, t, e) }, t }(), Ko = new On(50); function $o(t) { if (\"string\" == typeof t) { var e = Ko.get(t); return e && e.image } return t } function Jo(t, e, n, i, r) { if (t) { if (\"string\" == typeof t) { if (e && e.__zrImageSrc === t || !n) return e; var o = Ko.get(t), a = { hostEl: n, cb: i, cbPayload: r }; return o ? !ta(e = o.image) && o.pending.push(a) : ((e = h.loadImage(t, Qo, Qo)).__zrImageSrc = t, Ko.put(t, e.__cachedImgObj = { image: e, pending: [a] })), e } return t } return e } function Qo() { var t = this.__cachedImgObj; this.onload = this.onerror = this.__cachedImgObj = null; for (var e = 0; e < t.pending.length; e++) { var n = t.pending[e], i = n.cb; i && i(this, n.cbPayload), n.hostEl.dirty() } t.pending.length = 0 } function ta(t) { return t && t.width && t.height } var ea = /\\{([a-zA-Z0-9_]+)\\|([^}]*)\\}/g; function na(t, e, n, i, r) { if (!e) return \"\"; var o = (t + \"\").split(\"\\n\"); r = ia(e, n, i, r); for (var a = 0, s = o.length; a < s; a++)o[a] = ra(o[a], r); return o.join(\"\\n\") } function ia(t, e, n, i) { var r = A({}, i = i || {}); r.font = e, n = rt(n, \"...\"), r.maxIterations = rt(i.maxIterations, 2); var o = r.minChar = rt(i.minChar, 0); r.cnCharWidth = fr(\"国\", e); var a = r.ascCharWidth = fr(\"a\", e); r.placeholder = rt(i.placeholder, \"\"); for (var s = t = Math.max(0, t - 1), l = 0; l < o && s >= a; l++)s -= a; var u = fr(n, e); return u > s && (n = \"\", u = 0), s = t - u, r.ellipsis = n, r.ellipsisWidth = u, r.contentWidth = s, r.containerWidth = t, r } function ra(t, e) { var n = e.containerWidth, i = e.font, r = e.contentWidth; if (!n) return \"\"; var o = fr(t, i); if (o <= n) return t; for (var a = 0; ; a++) { if (o <= r || a >= e.maxIterations) { t += e.ellipsis; break } var s = 0 === a ? oa(t, r, e.ascCharWidth, e.cnCharWidth) : o > 0 ? Math.floor(t.length * r / o) : 0; o = fr(t = t.substr(0, s), i) } return \"\" === t && (t = e.placeholder), t } function oa(t, e, n, i) { for (var r = 0, o = 0, a = t.length; o < a && r < e; o++) { var s = t.charCodeAt(o); r += 0 <= s && s <= 127 ? n : i } return o } var aa = function () { }, sa = function (t) { this.tokens = [], t && (this.tokens = t) }, la = function () { this.width = 0, this.height = 0, this.contentWidth = 0, this.contentHeight = 0, this.outerWidth = 0, this.outerHeight = 0, this.lines = [] }; function ua(t, e, n, i, r) { var o, a, s = \"\" === e, l = r && n.rich[r] || {}, u = t.lines, h = l.font || n.font, c = !1; if (i) { var p = l.padding, d = p ? p[1] + p[3] : 0; if (null != l.width && \"auto\" !== l.width) { var f = _r(l.width, i.width) + d; u.length > 0 && f + i.accumWidth > i.width && (o = e.split(\"\\n\"), c = !0), i.accumWidth = f } else { var g = pa(e, h, i.width, i.breakAll, i.accumWidth); i.accumWidth = g.accumWidth + d, a = g.linesWidths, o = g.lines } } else o = e.split(\"\\n\"); for (var y = 0; y < o.length; y++) { var v = o[y], m = new aa; if (m.styleName = r, m.text = v, m.isLineHolder = !v && !s, \"number\" == typeof l.width ? m.width = l.width : m.width = a ? a[y] : fr(v, h), y || c) u.push(new sa([m])); else { var x = (u[u.length - 1] || (u[0] = new sa)).tokens, _ = x.length; 1 === _ && x[0].isLineHolder ? x[0] = m : (v || !_ || s) && x.push(m) } } } var ha = V(\",&?/;] \".split(\"\"), (function (t, e) { return t[e] = !0, t }), {}); function ca(t) { return !function (t) { var e = t.charCodeAt(0); return e >= 33 && e <= 383 }(t) || !!ha[t] } function pa(t, e, n, i, r) { for (var o = [], a = [], s = \"\", l = \"\", u = 0, h = 0, c = 0; c < t.length; c++) { var p = t.charAt(c); if (\"\\n\" !== p) { var d = fr(p, e), f = !i && !ca(p); (o.length ? h + d > n : r + h + d > n) ? h ? (s || l) && (f ? (s || (s = l, l = \"\", h = u = 0), o.push(s), a.push(h - u), l += p, s = \"\", h = u += d) : (l && (s += l, l = \"\", u = 0), o.push(s), a.push(h), s = p, h = d)) : f ? (o.push(l), a.push(u), l = p, u = d) : (o.push(p), a.push(d)) : (h += d, f ? (l += p, u += d) : (l && (s += l, l = \"\", u = 0), s += p)) } else l && (s += l, h += u), o.push(s), a.push(h), s = \"\", l = \"\", u = 0, h = 0 } return o.length || s || (s = t, l = \"\", u = 0), l && (s += l), s && (o.push(s), a.push(h)), 1 === o.length && (h += r), { accumWidth: h, lines: o, linesWidths: a } } var da = \"__zr_style_\" + Math.round(10 * Math.random()), fa = { shadowBlur: 0, shadowOffsetX: 0, shadowOffsetY: 0, shadowColor: \"#000\", opacity: 1, blend: \"source-over\" }, ga = { style: { shadowBlur: !0, shadowOffsetX: !0, shadowOffsetY: !0, shadowColor: !0, opacity: !0 } }; fa[da] = !0; var ya = [\"z\", \"z2\", \"invisible\"], va = [\"invisible\"], ma = function (t) { function e(e) { return t.call(this, e) || this } var i; return n(e, t), e.prototype._init = function (e) { for (var n = G(e), i = 0; i < n.length; i++) { var r = n[i]; \"style\" === r ? this.useStyle(e[r]) : t.prototype.attrKV.call(this, r, e[r]) } this.style || this.useStyle({}) }, e.prototype.beforeBrush = function () { }, e.prototype.afterBrush = function () { }, e.prototype.innerBeforeBrush = function () { }, e.prototype.innerAfterBrush = function () { }, e.prototype.shouldBePainted = function (t, e, n, i) { var r = this.transform; if (this.ignore || this.invisible || 0 === this.style.opacity || this.culling && function (t, e, n) { xa.copy(t.getBoundingRect()), t.transform && xa.applyTransform(t.transform); return _a.width = e, _a.height = n, !xa.intersect(_a) }(this, t, e) || r && !r[0] && !r[3]) return !1; if (n && this.__clipPaths) for (var o = 0; o < this.__clipPaths.length; ++o)if (this.__clipPaths[o].isZeroArea()) return !1; if (i && this.parent) for (var a = this.parent; a;) { if (a.ignore) return !1; a = a.parent } return !0 }, e.prototype.contain = function (t, e) { return this.rectContain(t, e) }, e.prototype.traverse = function (t, e) { t.call(e, this) }, e.prototype.rectContain = function (t, e) { var n = this.transformCoordToLocal(t, e); return this.getBoundingRect().contain(n[0], n[1]) }, e.prototype.getPaintRect = function () { var t = this._paintRect; if (!this._paintRect || this.__dirty) { var e = this.transform, n = this.getBoundingRect(), i = this.style, r = i.shadowBlur || 0, o = i.shadowOffsetX || 0, a = i.shadowOffsetY || 0; t = this._paintRect || (this._paintRect = new Re(0, 0, 0, 0)), e ? Re.applyTransform(t, n, e) : t.copy(n), (r || o || a) && (t.width += 2 * r + Math.abs(o), t.height += 2 * r + Math.abs(a), t.x = Math.min(t.x, t.x + o - r), t.y = Math.min(t.y, t.y + a - r)); var s = this.dirtyRectTolerance; t.isZero() || (t.x = Math.floor(t.x - s), t.y = Math.floor(t.y - s), t.width = Math.ceil(t.width + 1 + 2 * s), t.height = Math.ceil(t.height + 1 + 2 * s)) } return t }, e.prototype.setPrevPaintRect = function (t) { t ? (this._prevPaintRect = this._prevPaintRect || new Re(0, 0, 0, 0), this._prevPaintRect.copy(t)) : this._prevPaintRect = null }, e.prototype.getPrevPaintRect = function () { return this._prevPaintRect }, e.prototype.animateStyle = function (t) { return this.animate(\"style\", t) }, e.prototype.updateDuringAnimation = function (t) { \"style\" === t ? this.dirtyStyle() : this.markRedraw() }, e.prototype.attrKV = function (e, n) { \"style\" !== e ? t.prototype.attrKV.call(this, e, n) : this.style ? this.setStyle(n) : this.useStyle(n) }, e.prototype.setStyle = function (t, e) { return \"string\" == typeof t ? this.style[t] = e : A(this.style, t), this.dirtyStyle(), this }, e.prototype.dirtyStyle = function (t) { t || this.markRedraw(), this.__dirty |= 2, this._rect && (this._rect = null) }, e.prototype.dirty = function () { this.dirtyStyle() }, e.prototype.styleChanged = function () { return !!(2 & this.__dirty) }, e.prototype.styleUpdated = function () { this.__dirty &= -3 }, e.prototype.createStyle = function (t) { return yt(fa, t) }, e.prototype.useStyle = function (t) { t[da] || (t = this.createStyle(t)), this.__inHover ? this.__hoverStyle = t : this.style = t, this.dirtyStyle() }, e.prototype.isStyleObject = function (t) { return t[da] }, e.prototype._innerSaveToNormal = function (e) { t.prototype._innerSaveToNormal.call(this, e); var n = this._normalState; e.style && !n.style && (n.style = this._mergeStyle(this.createStyle(), this.style)), this._savePrimaryToNormal(e, n, ya) }, e.prototype._applyStateObj = function (e, n, i, r, o, a) { t.prototype._applyStateObj.call(this, e, n, i, r, o, a); var s, l = !(n && r); if (n && n.style ? o ? r ? s = n.style : (s = this._mergeStyle(this.createStyle(), i.style), this._mergeStyle(s, n.style)) : (s = this._mergeStyle(this.createStyle(), r ? this.style : i.style), this._mergeStyle(s, n.style)) : l && (s = i.style), s) if (o) { var u = this.style; if (this.style = this.createStyle(l ? {} : u), l) for (var h = G(u), c = 0; c < h.length; c++) { (d = h[c]) in s && (s[d] = s[d], this.style[d] = u[d]) } var p = G(s); for (c = 0; c < p.length; c++) { var d = p[c]; this.style[d] = this.style[d] } this._transitionState(e, { style: s }, a, this.getAnimationStyleProps()) } else this.useStyle(s); var f = this.__inHover ? va : ya; for (c = 0; c < f.length; c++) { d = f[c]; n && null != n[d] ? this[d] = n[d] : l && null != i[d] && (this[d] = i[d]) } }, e.prototype._mergeStates = function (e) { for (var n, i = t.prototype._mergeStates.call(this, e), r = 0; r < e.length; r++) { var o = e[r]; o.style && (n = n || {}, this._mergeStyle(n, o.style)) } return n && (i.style = n), i }, e.prototype._mergeStyle = function (t, e) { return A(t, e), t }, e.prototype.getAnimationStyleProps = function () { return ga }, e.initDefaultProps = ((i = e.prototype).type = \"displayable\", i.invisible = !1, i.z = 0, i.z2 = 0, i.zlevel = 0, i.culling = !1, i.cursor = \"pointer\", i.rectHover = !1, i.incremental = !1, i._rect = null, i.dirtyRectTolerance = 0, void (i.__dirty = 3)), e }(Cr), xa = new Re(0, 0, 0, 0), _a = new Re(0, 0, 0, 0); var ba = Math.min, wa = Math.max, Sa = Math.sin, Ma = Math.cos, Ia = 2 * Math.PI, Ta = wt(), Ca = wt(), Da = wt(); function Aa(t, e, n) { if (0 !== t.length) { for (var i = t[0], r = i[0], o = i[0], a = i[1], s = i[1], l = 1; l < t.length; l++)i = t[l], r = ba(r, i[0]), o = wa(o, i[0]), a = ba(a, i[1]), s = wa(s, i[1]); e[0] = r, e[1] = a, n[0] = o, n[1] = s } } function ka(t, e, n, i, r, o) { r[0] = ba(t, n), r[1] = ba(e, i), o[0] = wa(t, n), o[1] = wa(e, i) } var La = [], Pa = []; function Oa(t, e, n, i, r, o, a, s, l, u) { var h = mn, c = gn, p = h(t, n, r, a, La); l[0] = 1 / 0, l[1] = 1 / 0, u[0] = -1 / 0, u[1] = -1 / 0; for (var d = 0; d < p; d++) { var f = c(t, n, r, a, La[d]); l[0] = ba(f, l[0]), u[0] = wa(f, u[0]) } p = h(e, i, o, s, Pa); for (d = 0; d < p; d++) { var g = c(e, i, o, s, Pa[d]); l[1] = ba(g, l[1]), u[1] = wa(g, u[1]) } l[0] = ba(t, l[0]), u[0] = wa(t, u[0]), l[0] = ba(a, l[0]), u[0] = wa(a, u[0]), l[1] = ba(e, l[1]), u[1] = wa(e, u[1]), l[1] = ba(s, l[1]), u[1] = wa(s, u[1]) } function Ra(t, e, n, i, r, o, a, s) { var l = Mn, u = wn, h = wa(ba(l(t, n, r), 1), 0), c = wa(ba(l(e, i, o), 1), 0), p = u(t, n, r, h), d = u(e, i, o, c); a[0] = ba(t, r, p), a[1] = ba(e, o, d), s[0] = wa(t, r, p), s[1] = wa(e, o, d) } function Na(t, e, n, i, r, o, a, s, l) { var u = Gt, h = Wt, c = Math.abs(r - o); if (c % Ia < 1e-4 && c > 1e-4) return s[0] = t - n, s[1] = e - i, l[0] = t + n, void (l[1] = e + i); if (Ta[0] = Ma(r) * n + t, Ta[1] = Sa(r) * i + e, Ca[0] = Ma(o) * n + t, Ca[1] = Sa(o) * i + e, u(s, Ta, Ca), h(l, Ta, Ca), (r %= Ia) < 0 && (r += Ia), (o %= Ia) < 0 && (o += Ia), r > o && !a ? o += Ia : r < o && a && (r += Ia), a) { var p = o; o = r, r = p } for (var d = 0; d < o; d += Math.PI / 2)d > r && (Da[0] = Ma(d) * n + t, Da[1] = Sa(d) * i + e, u(s, Da, s), h(l, Da, l)) } var Ea = { M: 1, L: 2, C: 3, Q: 4, A: 5, Z: 6, R: 7 }, za = [], Va = [], Ba = [], Fa = [], Ga = [], Wa = [], Ha = Math.min, Ya = Math.max, Ua = Math.cos, Xa = Math.sin, Za = Math.abs, ja = Math.PI, qa = 2 * ja, Ka = \"undefined\" != typeof Float32Array, $a = []; function Ja(t) { return Math.round(t / ja * 1e8) / 1e8 % 2 * ja } function Qa(t, e) { var n = Ja(t[0]); n < 0 && (n += qa); var i = n - t[0], r = t[1]; r += i, !e && r - n >= qa ? r = n + qa : e && n - r >= qa ? r = n - qa : !e && n > r ? r = n + (qa - Ja(n - r)) : e && n < r && (r = n - (qa - Ja(r - n))), t[0] = n, t[1] = r } var ts = function () { function t(t) { this.dpr = 1, this._xi = 0, this._yi = 0, this._x0 = 0, this._y0 = 0, this._len = 0, t && (this._saveData = !1), this._saveData && (this.data = []) } return t.prototype.increaseVersion = function () { this._version++ }, t.prototype.getVersion = function () { return this._version }, t.prototype.setScale = function (t, e, n) { (n = n || 0) > 0 && (this._ux = Za(n / tr / t) || 0, this._uy = Za(n / tr / e) || 0) }, t.prototype.setDPR = function (t) { this.dpr = t }, t.prototype.setContext = function (t) { this._ctx = t }, t.prototype.getContext = function () { return this._ctx }, t.prototype.beginPath = function () { return this._ctx && this._ctx.beginPath(), this.reset(), this }, t.prototype.reset = function () { this._saveData && (this._len = 0), this._pathSegLen && (this._pathSegLen = null, this._pathLen = 0), this._version++ }, t.prototype.moveTo = function (t, e) { return this._drawPendingPt(), this.addData(Ea.M, t, e), this._ctx && this._ctx.moveTo(t, e), this._x0 = t, this._y0 = e, this._xi = t, this._yi = e, this }, t.prototype.lineTo = function (t, e) { var n = Za(t - this._xi), i = Za(e - this._yi), r = n > this._ux || i > this._uy; if (this.addData(Ea.L, t, e), this._ctx && r && this._ctx.lineTo(t, e), r) this._xi = t, this._yi = e, this._pendingPtDist = 0; else { var o = n * n + i * i; o > this._pendingPtDist && (this._pendingPtX = t, this._pendingPtY = e, this._pendingPtDist = o) } return this }, t.prototype.bezierCurveTo = function (t, e, n, i, r, o) { return this._drawPendingPt(), this.addData(Ea.C, t, e, n, i, r, o), this._ctx && this._ctx.bezierCurveTo(t, e, n, i, r, o), this._xi = r, this._yi = o, this }, t.prototype.quadraticCurveTo = function (t, e, n, i) { return this._drawPendingPt(), this.addData(Ea.Q, t, e, n, i), this._ctx && this._ctx.quadraticCurveTo(t, e, n, i), this._xi = n, this._yi = i, this }, t.prototype.arc = function (t, e, n, i, r, o) { this._drawPendingPt(), $a[0] = i, $a[1] = r, Qa($a, o), i = $a[0]; var a = (r = $a[1]) - i; return this.addData(Ea.A, t, e, n, n, i, a, 0, o ? 0 : 1), this._ctx && this._ctx.arc(t, e, n, i, r, o), this._xi = Ua(r) * n + t, this._yi = Xa(r) * n + e, this }, t.prototype.arcTo = function (t, e, n, i, r) { return this._drawPendingPt(), this._ctx && this._ctx.arcTo(t, e, n, i, r), this }, t.prototype.rect = function (t, e, n, i) { return this._drawPendingPt(), this._ctx && this._ctx.rect(t, e, n, i), this.addData(Ea.R, t, e, n, i), this }, t.prototype.closePath = function () { this._drawPendingPt(), this.addData(Ea.Z); var t = this._ctx, e = this._x0, n = this._y0; return t && t.closePath(), this._xi = e, this._yi = n, this }, t.prototype.fill = function (t) { t && t.fill(), this.toStatic() }, t.prototype.stroke = function (t) { t && t.stroke(), this.toStatic() }, t.prototype.len = function () { return this._len }, t.prototype.setData = function (t) { var e = t.length; this.data && this.data.length === e || !Ka || (this.data = new Float32Array(e)); for (var n = 0; n < e; n++)this.data[n] = t[n]; this._len = e }, t.prototype.appendPath = function (t) { t instanceof Array || (t = [t]); for (var e = t.length, n = 0, i = this._len, r = 0; r < e; r++)n += t[r].len(); Ka && this.data instanceof Float32Array && (this.data = new Float32Array(i + n)); for (r = 0; r < e; r++)for (var o = t[r].data, a = 0; a < o.length; a++)this.data[i++] = o[a]; this._len = i }, t.prototype.addData = function (t, e, n, i, r, o, a, s, l) { if (this._saveData) { var u = this.data; this._len + arguments.length > u.length && (this._expandData(), u = this.data); for (var h = 0; h < arguments.length; h++)u[this._len++] = arguments[h] } }, t.prototype._drawPendingPt = function () { this._pendingPtDist > 0 && (this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY), this._pendingPtDist = 0) }, t.prototype._expandData = function () { if (!(this.data instanceof Array)) { for (var t = [], e = 0; e < this._len; e++)t[e] = this.data[e]; this.data = t } }, t.prototype.toStatic = function () { if (this._saveData) { this._drawPendingPt(); var t = this.data; t instanceof Array && (t.length = this._len, Ka && this._len > 11 && (this.data = new Float32Array(t))) } }, t.prototype.getBoundingRect = function () { Ba[0] = Ba[1] = Ga[0] = Ga[1] = Number.MAX_VALUE, Fa[0] = Fa[1] = Wa[0] = Wa[1] = -Number.MAX_VALUE; var t, e = this.data, n = 0, i = 0, r = 0, o = 0; for (t = 0; t < this._len;) { var a = e[t++], s = 1 === t; switch (s && (r = n = e[t], o = i = e[t + 1]), a) { case Ea.M: n = r = e[t++], i = o = e[t++], Ga[0] = r, Ga[1] = o, Wa[0] = r, Wa[1] = o; break; case Ea.L: ka(n, i, e[t], e[t + 1], Ga, Wa), n = e[t++], i = e[t++]; break; case Ea.C: Oa(n, i, e[t++], e[t++], e[t++], e[t++], e[t], e[t + 1], Ga, Wa), n = e[t++], i = e[t++]; break; case Ea.Q: Ra(n, i, e[t++], e[t++], e[t], e[t + 1], Ga, Wa), n = e[t++], i = e[t++]; break; case Ea.A: var l = e[t++], u = e[t++], h = e[t++], c = e[t++], p = e[t++], d = e[t++] + p; t += 1; var f = !e[t++]; s && (r = Ua(p) * h + l, o = Xa(p) * c + u), Na(l, u, h, c, p, d, f, Ga, Wa), n = Ua(d) * h + l, i = Xa(d) * c + u; break; case Ea.R: ka(r = n = e[t++], o = i = e[t++], r + e[t++], o + e[t++], Ga, Wa); break; case Ea.Z: n = r, i = o }Gt(Ba, Ba, Ga), Wt(Fa, Fa, Wa) } return 0 === t && (Ba[0] = Ba[1] = Fa[0] = Fa[1] = 0), new Re(Ba[0], Ba[1], Fa[0] - Ba[0], Fa[1] - Ba[1]) }, t.prototype._calculateLength = function () { var t = this.data, e = this._len, n = this._ux, i = this._uy, r = 0, o = 0, a = 0, s = 0; this._pathSegLen || (this._pathSegLen = []); for (var l = this._pathSegLen, u = 0, h = 0, c = 0; c < e;) { var p = t[c++], d = 1 === c; d && (a = r = t[c], s = o = t[c + 1]); var f = -1; switch (p) { case Ea.M: r = a = t[c++], o = s = t[c++]; break; case Ea.L: var g = t[c++], y = (x = t[c++]) - o; (Za(A = g - r) > n || Za(y) > i || c === e - 1) && (f = Math.sqrt(A * A + y * y), r = g, o = x); break; case Ea.C: var v = t[c++], m = t[c++], x = (g = t[c++], t[c++]), _ = t[c++], b = t[c++]; f = bn(r, o, v, m, g, x, _, b, 10), r = _, o = b; break; case Ea.Q: f = Cn(r, o, v = t[c++], m = t[c++], g = t[c++], x = t[c++], 10), r = g, o = x; break; case Ea.A: var w = t[c++], S = t[c++], M = t[c++], I = t[c++], T = t[c++], C = t[c++], D = C + T; c += 1; t[c++]; d && (a = Ua(T) * M + w, s = Xa(T) * I + S), f = Ya(M, I) * Ha(qa, Math.abs(C)), r = Ua(D) * M + w, o = Xa(D) * I + S; break; case Ea.R: a = r = t[c++], s = o = t[c++], f = 2 * t[c++] + 2 * t[c++]; break; case Ea.Z: var A = a - r; y = s - o; f = Math.sqrt(A * A + y * y), r = a, o = s }f >= 0 && (l[h++] = f, u += f) } return this._pathLen = u, u }, t.prototype.rebuildPath = function (t, e) { var n, i, r, o, a, s, l, u, h, c, p = this.data, d = this._ux, f = this._uy, g = this._len, y = e < 1, v = 0, m = 0, x = 0; if (!y || (this._pathSegLen || this._calculateLength(), l = this._pathSegLen, u = e * this._pathLen)) t: for (var _ = 0; _ < g;) { var b = p[_++], w = 1 === _; switch (w && (n = r = p[_], i = o = p[_ + 1]), b !== Ea.L && x > 0 && (t.lineTo(h, c), x = 0), b) { case Ea.M: n = r = p[_++], i = o = p[_++], t.moveTo(r, o); break; case Ea.L: a = p[_++], s = p[_++]; var S = Za(a - r), M = Za(s - o); if (S > d || M > f) { if (y) { if (v + (j = l[m++]) > u) { var I = (u - v) / j; t.lineTo(r * (1 - I) + a * I, o * (1 - I) + s * I); break t } v += j } t.lineTo(a, s), r = a, o = s, x = 0 } else { var T = S * S + M * M; T > x && (h = a, c = s, x = T) } break; case Ea.C: var C = p[_++], D = p[_++], A = p[_++], k = p[_++], L = p[_++], P = p[_++]; if (y) { if (v + (j = l[m++]) > u) { xn(r, C, A, L, I = (u - v) / j, za), xn(o, D, k, P, I, Va), t.bezierCurveTo(za[1], Va[1], za[2], Va[2], za[3], Va[3]); break t } v += j } t.bezierCurveTo(C, D, A, k, L, P), r = L, o = P; break; case Ea.Q: C = p[_++], D = p[_++], A = p[_++], k = p[_++]; if (y) { if (v + (j = l[m++]) > u) { In(r, C, A, I = (u - v) / j, za), In(o, D, k, I, Va), t.quadraticCurveTo(za[1], Va[1], za[2], Va[2]); break t } v += j } t.quadraticCurveTo(C, D, A, k), r = A, o = k; break; case Ea.A: var O = p[_++], R = p[_++], N = p[_++], E = p[_++], z = p[_++], V = p[_++], B = p[_++], F = !p[_++], G = N > E ? N : E, W = Za(N - E) > .001, H = z + V, Y = !1; if (y) v + (j = l[m++]) > u && (H = z + V * (u - v) / j, Y = !0), v += j; if (W && t.ellipse ? t.ellipse(O, R, N, E, B, z, H, F) : t.arc(O, R, G, z, H, F), Y) break t; w && (n = Ua(z) * N + O, i = Xa(z) * E + R), r = Ua(H) * N + O, o = Xa(H) * E + R; break; case Ea.R: n = r = p[_], i = o = p[_ + 1], a = p[_++], s = p[_++]; var U = p[_++], X = p[_++]; if (y) { if (v + (j = l[m++]) > u) { var Z = u - v; t.moveTo(a, s), t.lineTo(a + Ha(Z, U), s), (Z -= U) > 0 && t.lineTo(a + U, s + Ha(Z, X)), (Z -= X) > 0 && t.lineTo(a + Ya(U - Z, 0), s + X), (Z -= U) > 0 && t.lineTo(a, s + Ya(X - Z, 0)); break t } v += j } t.rect(a, s, U, X); break; case Ea.Z: if (y) { var j; if (v + (j = l[m++]) > u) { I = (u - v) / j; t.lineTo(r * (1 - I) + n * I, o * (1 - I) + i * I); break t } v += j } t.closePath(), r = n, o = i } } }, t.prototype.clone = function () { var e = new t, n = this.data; return e.data = n.slice ? n.slice() : Array.prototype.slice.call(n), e._len = this._len, e }, t.CMD = Ea, t.initDefaultProps = function () { var e = t.prototype; e._saveData = !0, e._ux = 0, e._uy = 0, e._pendingPtDist = 0, e._version = 0 }(), t }(); function es(t, e, n, i, r, o, a) { if (0 === r) return !1; var s = r, l = 0; if (a > e + s && a > i + s || a < e - s && a < i - s || o > t + s && o > n + s || o < t - s && o < n - s) return !1; if (t === n) return Math.abs(o - t) <= s / 2; var u = (l = (e - i) / (t - n)) * o - a + (t * i - n * e) / (t - n); return u * u / (l * l + 1) <= s / 2 * s / 2 } function ns(t, e, n, i, r, o, a, s, l, u, h) { if (0 === l) return !1; var c = l; return !(h > e + c && h > i + c && h > o + c && h > s + c || h < e - c && h < i - c && h < o - c && h < s - c || u > t + c && u > n + c && u > r + c && u > a + c || u < t - c && u < n - c && u < r - c && u < a - c) && _n(t, e, n, i, r, o, a, s, u, h, null) <= c / 2 } function is(t, e, n, i, r, o, a, s, l) { if (0 === a) return !1; var u = a; return !(l > e + u && l > i + u && l > o + u || l < e - u && l < i - u && l < o - u || s > t + u && s > n + u && s > r + u || s < t - u && s < n - u && s < r - u) && Tn(t, e, n, i, r, o, s, l, null) <= u / 2 } var rs = 2 * Math.PI; function os(t) { return (t %= rs) < 0 && (t += rs), t } var as = 2 * Math.PI; function ss(t, e, n, i, r, o, a, s, l) { if (0 === a) return !1; var u = a; s -= t, l -= e; var h = Math.sqrt(s * s + l * l); if (h - u > n || h + u < n) return !1; if (Math.abs(i - r) % as < 1e-4) return !0; if (o) { var c = i; i = os(r), r = os(c) } else i = os(i), r = os(r); i > r && (r += as); var p = Math.atan2(l, s); return p < 0 && (p += as), p >= i && p <= r || p + as >= i && p + as <= r } function ls(t, e, n, i, r, o) { if (o > e && o > i || o < e && o < i) return 0; if (i === e) return 0; var a = (o - e) / (i - e), s = i < e ? 1 : -1; 1 !== a && 0 !== a || (s = i < e ? .5 : -.5); var l = a * (n - t) + t; return l === r ? 1 / 0 : l > r ? s : 0 } var us = ts.CMD, hs = 2 * Math.PI; var cs = [-1, -1, -1], ps = [-1, -1]; function ds(t, e, n, i, r, o, a, s, l, u) { if (u > e && u > i && u > o && u > s || u < e && u < i && u < o && u < s) return 0; var h, c = vn(e, i, o, s, u, cs); if (0 === c) return 0; for (var p = 0, d = -1, f = void 0, g = void 0, y = 0; y < c; y++) { var v = cs[y], m = 0 === v || 1 === v ? .5 : 1; gn(t, n, r, a, v) < l || (d < 0 && (d = mn(e, i, o, s, ps), ps[1] < ps[0] && d > 1 && (h = void 0, h = ps[0], ps[0] = ps[1], ps[1] = h), f = gn(e, i, o, s, ps[0]), d > 1 && (g = gn(e, i, o, s, ps[1]))), 2 === d ? v < ps[0] ? p += f < e ? m : -m : v < ps[1] ? p += g < f ? m : -m : p += s < g ? m : -m : v < ps[0] ? p += f < e ? m : -m : p += s < f ? m : -m) } return p } function fs(t, e, n, i, r, o, a, s) { if (s > e && s > i && s > o || s < e && s < i && s < o) return 0; var l = function (t, e, n, i, r) { var o = t - 2 * e + n, a = 2 * (e - t), s = t - i, l = 0; if (dn(o)) fn(a) && (h = -s / a) >= 0 && h <= 1 && (r[l++] = h); else { var u = a * a - 4 * o * s; if (dn(u)) (h = -a / (2 * o)) >= 0 && h <= 1 && (r[l++] = h); else if (u > 0) { var h, c = on(u), p = (-a - c) / (2 * o); (h = (-a + c) / (2 * o)) >= 0 && h <= 1 && (r[l++] = h), p >= 0 && p <= 1 && (r[l++] = p) } } return l }(e, i, o, s, cs); if (0 === l) return 0; var u = Mn(e, i, o); if (u >= 0 && u <= 1) { for (var h = 0, c = wn(e, i, o, u), p = 0; p < l; p++) { var d = 0 === cs[p] || 1 === cs[p] ? .5 : 1; wn(t, n, r, cs[p]) < a || (cs[p] < u ? h += c < e ? d : -d : h += o < c ? d : -d) } return h } d = 0 === cs[0] || 1 === cs[0] ? .5 : 1; return wn(t, n, r, cs[0]) < a ? 0 : o < e ? d : -d } function gs(t, e, n, i, r, o, a, s) { if ((s -= e) > n || s < -n) return 0; var l = Math.sqrt(n * n - s * s); cs[0] = -l, cs[1] = l; var u = Math.abs(i - r); if (u < 1e-4) return 0; if (u >= hs - 1e-4) { i = 0, r = hs; var h = o ? 1 : -1; return a >= cs[0] + t && a <= cs[1] + t ? h : 0 } if (i > r) { var c = i; i = r, r = c } i < 0 && (i += hs, r += hs); for (var p = 0, d = 0; d < 2; d++) { var f = cs[d]; if (f + t > a) { var g = Math.atan2(s, f); h = o ? 1 : -1; g < 0 && (g = hs + g), (g >= i && g <= r || g + hs >= i && g + hs <= r) && (g > Math.PI / 2 && g < 1.5 * Math.PI && (h = -h), p += h) } } return p } function ys(t, e, n, i, r) { for (var o, a, s, l, u = t.data, h = t.len(), c = 0, p = 0, d = 0, f = 0, g = 0, y = 0; y < h;) { var v = u[y++], m = 1 === y; switch (v === us.M && y > 1 && (n || (c += ls(p, d, f, g, i, r))), m && (f = p = u[y], g = d = u[y + 1]), v) { case us.M: p = f = u[y++], d = g = u[y++]; break; case us.L: if (n) { if (es(p, d, u[y], u[y + 1], e, i, r)) return !0 } else c += ls(p, d, u[y], u[y + 1], i, r) || 0; p = u[y++], d = u[y++]; break; case us.C: if (n) { if (ns(p, d, u[y++], u[y++], u[y++], u[y++], u[y], u[y + 1], e, i, r)) return !0 } else c += ds(p, d, u[y++], u[y++], u[y++], u[y++], u[y], u[y + 1], i, r) || 0; p = u[y++], d = u[y++]; break; case us.Q: if (n) { if (is(p, d, u[y++], u[y++], u[y], u[y + 1], e, i, r)) return !0 } else c += fs(p, d, u[y++], u[y++], u[y], u[y + 1], i, r) || 0; p = u[y++], d = u[y++]; break; case us.A: var x = u[y++], _ = u[y++], b = u[y++], w = u[y++], S = u[y++], M = u[y++]; y += 1; var I = !!(1 - u[y++]); o = Math.cos(S) * b + x, a = Math.sin(S) * w + _, m ? (f = o, g = a) : c += ls(p, d, o, a, i, r); var T = (i - x) * w / b + x; if (n) { if (ss(x, _, w, S, S + M, I, e, T, r)) return !0 } else c += gs(x, _, w, S, S + M, I, T, r); p = Math.cos(S + M) * b + x, d = Math.sin(S + M) * w + _; break; case us.R: if (f = p = u[y++], g = d = u[y++], o = f + u[y++], a = g + u[y++], n) { if (es(f, g, o, g, e, i, r) || es(o, g, o, a, e, i, r) || es(o, a, f, a, e, i, r) || es(f, a, f, g, e, i, r)) return !0 } else c += ls(o, g, o, a, i, r), c += ls(f, a, f, g, i, r); break; case us.Z: if (n) { if (es(p, d, f, g, e, i, r)) return !0 } else c += ls(p, d, f, g, i, r); p = f, d = g } } return n || (s = d, l = g, Math.abs(s - l) < 1e-4) || (c += ls(p, d, f, g, i, r) || 0), 0 !== c } var vs = k({ fill: \"#000\", stroke: null, strokePercent: 1, fillOpacity: 1, strokeOpacity: 1, lineDashOffset: 0, lineWidth: 1, lineCap: \"butt\", miterLimit: 10, strokeNoScale: !1, strokeFirst: !1 }, fa), ms = { style: k({ fill: !0, stroke: !0, strokePercent: !0, fillOpacity: !0, strokeOpacity: !0, lineDashOffset: !0, lineWidth: !0, miterLimit: !0 }, ga.style) }, xs = cr.concat([\"invisible\", \"culling\", \"z\", \"z2\", \"zlevel\", \"parent\"]), _s = function (t) { function e(e) { return t.call(this, e) || this } var i; return n(e, t), e.prototype.update = function () { var n = this; t.prototype.update.call(this); var i = this.style; if (i.decal) { var r = this._decalEl = this._decalEl || new e; r.buildPath === e.prototype.buildPath && (r.buildPath = function (t) { n.buildPath(t, n.shape) }), r.silent = !0; var o = r.style; for (var a in i) o[a] !== i[a] && (o[a] = i[a]); o.fill = i.fill ? i.decal : null, o.decal = null, o.shadowColor = null, i.strokeFirst && (o.stroke = null); for (var s = 0; s < xs.length; ++s)r[xs[s]] = this[xs[s]]; r.__dirty |= 1 } else this._decalEl && (this._decalEl = null) }, e.prototype.getDecalElement = function () { return this._decalEl }, e.prototype._init = function (e) { var n = G(e); this.shape = this.getDefaultShape(); var i = this.getDefaultStyle(); i && this.useStyle(i); for (var r = 0; r < n.length; r++) { var o = n[r], a = e[o]; \"style\" === o ? this.style ? A(this.style, a) : this.useStyle(a) : \"shape\" === o ? A(this.shape, a) : t.prototype.attrKV.call(this, o, a) } this.style || this.useStyle({}) }, e.prototype.getDefaultStyle = function () { return null }, e.prototype.getDefaultShape = function () { return {} }, e.prototype.canBeInsideText = function () { return this.hasFill() }, e.prototype.getInsideTextFill = function () { var t = this.style.fill; if (\"none\" !== t) { if (X(t)) { var e = ni(t, 0); return e > .5 ? er : e > .2 ? \"#eee\" : nr } if (t) return nr } return er }, e.prototype.getInsideTextStroke = function (t) { var e = this.style.fill; if (X(e)) { var n = this.__zr; if (!(!n || !n.isDarkMode()) === ni(t, 0) < .4) return e } }, e.prototype.buildPath = function (t, e, n) { }, e.prototype.pathUpdated = function () { this.__dirty &= -5 }, e.prototype.getUpdatedPathProxy = function (t) { return !this.path && this.createPathProxy(), this.path.beginPath(), this.buildPath(this.path, this.shape, t), this.path }, e.prototype.createPathProxy = function () { this.path = new ts(!1) }, e.prototype.hasStroke = function () { var t = this.style, e = t.stroke; return !(null == e || \"none\" === e || !(t.lineWidth > 0)) }, e.prototype.hasFill = function () { var t = this.style.fill; return null != t && \"none\" !== t }, e.prototype.getBoundingRect = function () { var t = this._rect, e = this.style, n = !t; if (n) { var i = !1; this.path || (i = !0, this.createPathProxy()); var r = this.path; (i || 4 & this.__dirty) && (r.beginPath(), this.buildPath(r, this.shape, !1), this.pathUpdated()), t = r.getBoundingRect() } if (this._rect = t, this.hasStroke() && this.path && this.path.len() > 0) { var o = this._rectStroke || (this._rectStroke = t.clone()); if (this.__dirty || n) { o.copy(t); var a = e.strokeNoScale ? this.getLineScale() : 1, s = e.lineWidth; if (!this.hasFill()) { var l = this.strokeContainThreshold; s = Math.max(s, null == l ? 4 : l) } a > 1e-10 && (o.width += s / a, o.height += s / a, o.x -= s / a / 2, o.y -= s / a / 2) } return o } return t }, e.prototype.contain = function (t, e) { var n = this.transformCoordToLocal(t, e), i = this.getBoundingRect(), r = this.style; if (t = n[0], e = n[1], i.contain(t, e)) { var o = this.path; if (this.hasStroke()) { var a = r.lineWidth, s = r.strokeNoScale ? this.getLineScale() : 1; if (s > 1e-10 && (this.hasFill() || (a = Math.max(a, this.strokeContainThreshold)), function (t, e, n, i) { return ys(t, e, !0, n, i) }(o, a / s, t, e))) return !0 } if (this.hasFill()) return function (t, e, n) { return ys(t, 0, !1, e, n) }(o, t, e) } return !1 }, e.prototype.dirtyShape = function () { this.__dirty |= 4, this._rect && (this._rect = null), this._decalEl && this._decalEl.dirtyShape(), this.markRedraw() }, e.prototype.dirty = function () { this.dirtyStyle(), this.dirtyShape() }, e.prototype.animateShape = function (t) { return this.animate(\"shape\", t) }, e.prototype.updateDuringAnimation = function (t) { \"style\" === t ? this.dirtyStyle() : \"shape\" === t ? this.dirtyShape() : this.markRedraw() }, e.prototype.attrKV = function (e, n) { \"shape\" === e ? this.setShape(n) : t.prototype.attrKV.call(this, e, n) }, e.prototype.setShape = function (t, e) { var n = this.shape; return n || (n = this.shape = {}), \"string\" == typeof t ? n[t] = e : A(n, t), this.dirtyShape(), this }, e.prototype.shapeChanged = function () { return !!(4 & this.__dirty) }, e.prototype.createStyle = function (t) { return yt(vs, t) }, e.prototype._innerSaveToNormal = function (e) { t.prototype._innerSaveToNormal.call(this, e); var n = this._normalState; e.shape && !n.shape && (n.shape = A({}, this.shape)) }, e.prototype._applyStateObj = function (e, n, i, r, o, a) { t.prototype._applyStateObj.call(this, e, n, i, r, o, a); var s, l = !(n && r); if (n && n.shape ? o ? r ? s = n.shape : (s = A({}, i.shape), A(s, n.shape)) : (s = A({}, r ? this.shape : i.shape), A(s, n.shape)) : l && (s = i.shape), s) if (o) { this.shape = A({}, this.shape); for (var u = {}, h = G(s), c = 0; c < h.length; c++) { var p = h[c]; \"object\" == typeof s[p] ? this.shape[p] = s[p] : u[p] = s[p] } this._transitionState(e, { shape: u }, a) } else this.shape = s, this.dirtyShape() }, e.prototype._mergeStates = function (e) { for (var n, i = t.prototype._mergeStates.call(this, e), r = 0; r < e.length; r++) { var o = e[r]; o.shape && (n = n || {}, this._mergeStyle(n, o.shape)) } return n && (i.shape = n), i }, e.prototype.getAnimationStyleProps = function () { return ms }, e.prototype.isZeroArea = function () { return !1 }, e.extend = function (t) { var i = function (e) { function i(n) { var i = e.call(this, n) || this; return t.init && t.init.call(i, n), i } return n(i, e), i.prototype.getDefaultStyle = function () { return T(t.style) }, i.prototype.getDefaultShape = function () { return T(t.shape) }, i }(e); for (var r in t) \"function\" == typeof t[r] && (i.prototype[r] = t[r]); return i }, e.initDefaultProps = ((i = e.prototype).type = \"path\", i.strokeContainThreshold = 5, i.segmentIgnoreThreshold = 0, i.subPixelOptimize = !1, i.autoBatch = !1, void (i.__dirty = 7)), e }(ma), bs = k({ strokeFirst: !0, font: a, x: 0, y: 0, textAlign: \"left\", textBaseline: \"top\", miterLimit: 2 }, vs), ws = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.hasStroke = function () { var t = this.style, e = t.stroke; return null != e && \"none\" !== e && t.lineWidth > 0 }, e.prototype.hasFill = function () { var t = this.style.fill; return null != t && \"none\" !== t }, e.prototype.createStyle = function (t) { return yt(bs, t) }, e.prototype.setBoundingRect = function (t) { this._rect = t }, e.prototype.getBoundingRect = function () { var t = this.style; if (!this._rect) { var e = t.text; null != e ? e += \"\" : e = \"\"; var n = yr(e, t.font, t.textAlign, t.textBaseline); if (n.x += t.x || 0, n.y += t.y || 0, this.hasStroke()) { var i = t.lineWidth; n.x -= i / 2, n.y -= i / 2, n.width += i, n.height += i } this._rect = n } return this._rect }, e.initDefaultProps = void (e.prototype.dirtyRectTolerance = 10), e }(ma); ws.prototype.type = \"tspan\"; var Ss = k({ x: 0, y: 0 }, fa), Ms = { style: k({ x: !0, y: !0, width: !0, height: !0, sx: !0, sy: !0, sWidth: !0, sHeight: !0 }, ga.style) }; var Is = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.createStyle = function (t) { return yt(Ss, t) }, e.prototype._getSize = function (t) { var e = this.style, n = e[t]; if (null != n) return n; var i, r = (i = e.image) && \"string\" != typeof i && i.width && i.height ? e.image : this.__image; if (!r) return 0; var o = \"width\" === t ? \"height\" : \"width\", a = e[o]; return null == a ? r[t] : r[t] / r[o] * a }, e.prototype.getWidth = function () { return this._getSize(\"width\") }, e.prototype.getHeight = function () { return this._getSize(\"height\") }, e.prototype.getAnimationStyleProps = function () { return Ms }, e.prototype.getBoundingRect = function () { var t = this.style; return this._rect || (this._rect = new Re(t.x || 0, t.y || 0, this.getWidth(), this.getHeight())), this._rect }, e }(ma); Is.prototype.type = \"image\"; var Ts = Math.round; function Cs(t, e, n) { if (e) { var i = e.x1, r = e.x2, o = e.y1, a = e.y2; t.x1 = i, t.x2 = r, t.y1 = o, t.y2 = a; var s = n && n.lineWidth; return s ? (Ts(2 * i) === Ts(2 * r) && (t.x1 = t.x2 = As(i, s, !0)), Ts(2 * o) === Ts(2 * a) && (t.y1 = t.y2 = As(o, s, !0)), t) : t } } function Ds(t, e, n) { if (e) { var i = e.x, r = e.y, o = e.width, a = e.height; t.x = i, t.y = r, t.width = o, t.height = a; var s = n && n.lineWidth; return s ? (t.x = As(i, s, !0), t.y = As(r, s, !0), t.width = Math.max(As(i + o, s, !1) - t.x, 0 === o ? 0 : 1), t.height = Math.max(As(r + a, s, !1) - t.y, 0 === a ? 0 : 1), t) : t } } function As(t, e, n) { if (!e) return t; var i = Ts(2 * t); return (i + Ts(e)) % 2 == 0 ? i / 2 : (i + (n ? 1 : -1)) / 2 } var ks = function () { this.x = 0, this.y = 0, this.width = 0, this.height = 0 }, Ls = {}, Ps = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultShape = function () { return new ks }, e.prototype.buildPath = function (t, e) { var n, i, r, o; if (this.subPixelOptimize) { var a = Ds(Ls, e, this.style); n = a.x, i = a.y, r = a.width, o = a.height, a.r = e.r, e = a } else n = e.x, i = e.y, r = e.width, o = e.height; e.r ? function (t, e) { var n, i, r, o, a, s = e.x, l = e.y, u = e.width, h = e.height, c = e.r; u < 0 && (s += u, u = -u), h < 0 && (l += h, h = -h), \"number\" == typeof c ? n = i = r = o = c : c instanceof Array ? 1 === c.length ? n = i = r = o = c[0] : 2 === c.length ? (n = r = c[0], i = o = c[1]) : 3 === c.length ? (n = c[0], i = o = c[1], r = c[2]) : (n = c[0], i = c[1], r = c[2], o = c[3]) : n = i = r = o = 0, n + i > u && (n *= u / (a = n + i), i *= u / a), r + o > u && (r *= u / (a = r + o), o *= u / a), i + r > h && (i *= h / (a = i + r), r *= h / a), n + o > h && (n *= h / (a = n + o), o *= h / a), t.moveTo(s + n, l), t.lineTo(s + u - i, l), 0 !== i && t.arc(s + u - i, l + i, i, -Math.PI / 2, 0), t.lineTo(s + u, l + h - r), 0 !== r && t.arc(s + u - r, l + h - r, r, 0, Math.PI / 2), t.lineTo(s + o, l + h), 0 !== o && t.arc(s + o, l + h - o, o, Math.PI / 2, Math.PI), t.lineTo(s, l + n), 0 !== n && t.arc(s + n, l + n, n, Math.PI, 1.5 * Math.PI) }(t, e) : t.rect(n, i, r, o) }, e.prototype.isZeroArea = function () { return !this.shape.width || !this.shape.height }, e }(_s); Ps.prototype.type = \"rect\"; var Os = { fill: \"#000\" }, Rs = { style: k({ fill: !0, stroke: !0, fillOpacity: !0, strokeOpacity: !0, lineWidth: !0, fontSize: !0, lineHeight: !0, width: !0, height: !0, textShadowColor: !0, textShadowBlur: !0, textShadowOffsetX: !0, textShadowOffsetY: !0, backgroundColor: !0, padding: !0, borderColor: !0, borderWidth: !0, borderRadius: !0 }, ga.style) }, Ns = function (t) { function e(e) { var n = t.call(this) || this; return n.type = \"text\", n._children = [], n._defaultStyle = Os, n.attr(e), n } return n(e, t), e.prototype.childrenRef = function () { return this._children }, e.prototype.update = function () { t.prototype.update.call(this), this.styleChanged() && this._updateSubTexts(); for (var e = 0; e < this._children.length; e++) { var n = this._children[e]; n.zlevel = this.zlevel, n.z = this.z, n.z2 = this.z2, n.culling = this.culling, n.cursor = this.cursor, n.invisible = this.invisible } }, e.prototype.updateTransform = function () { var e = this.innerTransformable; e ? (e.updateTransform(), e.transform && (this.transform = e.transform)) : t.prototype.updateTransform.call(this) }, e.prototype.getLocalTransform = function (e) { var n = this.innerTransformable; return n ? n.getLocalTransform(e) : t.prototype.getLocalTransform.call(this, e) }, e.prototype.getComputedTransform = function () { return this.__hostTarget && (this.__hostTarget.getComputedTransform(), this.__hostTarget.updateInnerText(!0)), t.prototype.getComputedTransform.call(this) }, e.prototype._updateSubTexts = function () { var t; this._childCursor = 0, Ws(t = this.style), E(t.rich, Ws), this.style.rich ? this._updateRichTexts() : this._updatePlainTexts(), this._children.length = this._childCursor, this.styleUpdated() }, e.prototype.addSelfToZr = function (e) { t.prototype.addSelfToZr.call(this, e); for (var n = 0; n < this._children.length; n++)this._children[n].__zr = e }, e.prototype.removeSelfFromZr = function (e) { t.prototype.removeSelfFromZr.call(this, e); for (var n = 0; n < this._children.length; n++)this._children[n].__zr = null }, e.prototype.getBoundingRect = function () { if (this.styleChanged() && this._updateSubTexts(), !this._rect) { for (var t = new Re(0, 0, 0, 0), e = this._children, n = [], i = null, r = 0; r < e.length; r++) { var o = e[r], a = o.getBoundingRect(), s = o.getLocalTransform(n); s ? (t.copy(a), t.applyTransform(s), (i = i || t.clone()).union(t)) : (i = i || a.clone()).union(a) } this._rect = i || t } return this._rect }, e.prototype.setDefaultTextStyle = function (t) { this._defaultStyle = t || Os }, e.prototype.setTextContent = function (t) { 0 }, e.prototype._mergeStyle = function (t, e) { if (!e) return t; var n = e.rich, i = t.rich || n && {}; return A(t, e), n && i ? (this._mergeRich(i, n), t.rich = i) : i && (t.rich = i), t }, e.prototype._mergeRich = function (t, e) { for (var n = G(e), i = 0; i < n.length; i++) { var r = n[i]; t[r] = t[r] || {}, A(t[r], e[r]) } }, e.prototype.getAnimationStyleProps = function () { return Rs }, e.prototype._getOrCreateChild = function (t) { var e = this._children[this._childCursor]; return e && e instanceof t || (e = new t), this._children[this._childCursor++] = e, e.__zr = this.__zr, e.parent = this, e }, e.prototype._updatePlainTexts = function () { var t = this.style, e = t.font || a, n = t.padding, i = function (t, e) { null != t && (t += \"\"); var n, i = e.overflow, r = e.padding, o = e.font, a = \"truncate\" === i, s = xr(o), l = rt(e.lineHeight, s), u = !!e.backgroundColor, h = \"truncate\" === e.lineOverflow, c = e.width, p = (n = null == c || \"break\" !== i && \"breakAll\" !== i ? t ? t.split(\"\\n\") : [] : t ? pa(t, e.font, c, \"breakAll\" === i, 0).lines : []).length * l, d = rt(e.height, p); if (p > d && h) { var f = Math.floor(d / l); n = n.slice(0, f) } if (t && a && null != c) for (var g = ia(c, o, e.ellipsis, { minChar: e.truncateMinChar, placeholder: e.placeholder }), y = 0; y < n.length; y++)n[y] = ra(n[y], g); var v = d, m = 0; for (y = 0; y < n.length; y++)m = Math.max(fr(n[y], o), m); null == c && (c = m); var x = m; return r && (v += r[0] + r[2], x += r[1] + r[3], c += r[1] + r[3]), u && (x = c), { lines: n, height: d, outerWidth: x, outerHeight: v, lineHeight: l, calculatedLineHeight: s, contentWidth: m, contentHeight: p, width: c } }(Xs(t), t), r = Zs(t), o = !!t.backgroundColor, s = i.outerHeight, l = i.outerWidth, u = i.contentWidth, h = i.lines, c = i.lineHeight, p = this._defaultStyle, d = t.x || 0, f = t.y || 0, g = t.align || p.align || \"left\", y = t.verticalAlign || p.verticalAlign || \"top\", v = d, m = mr(f, i.contentHeight, y); if (r || n) { var x = vr(d, l, g), _ = mr(f, s, y); r && this._renderBackground(t, t, x, _, l, s) } m += c / 2, n && (v = Us(d, g, n), \"top\" === y ? m += n[0] : \"bottom\" === y && (m -= n[2])); for (var b = 0, w = !1, S = (Ys(\"fill\" in t ? t.fill : (w = !0, p.fill))), M = (Hs(\"stroke\" in t ? t.stroke : o || p.autoStroke && !w ? null : (b = 2, p.stroke))), I = t.textShadowBlur > 0, T = null != t.width && (\"truncate\" === t.overflow || \"break\" === t.overflow || \"breakAll\" === t.overflow), C = i.calculatedLineHeight, D = 0; D < h.length; D++) { var A = this._getOrCreateChild(ws), k = A.createStyle(); A.useStyle(k), k.text = h[D], k.x = v, k.y = m, g && (k.textAlign = g), k.textBaseline = \"middle\", k.opacity = t.opacity, k.strokeFirst = !0, I && (k.shadowBlur = t.textShadowBlur || 0, k.shadowColor = t.textShadowColor || \"transparent\", k.shadowOffsetX = t.textShadowOffsetX || 0, k.shadowOffsetY = t.textShadowOffsetY || 0), k.stroke = M, k.fill = S, M && (k.lineWidth = t.lineWidth || b, k.lineDash = t.lineDash, k.lineDashOffset = t.lineDashOffset || 0), k.font = e, Fs(k, t), m += c, T && A.setBoundingRect(new Re(vr(k.x, t.width, k.textAlign), mr(k.y, C, k.textBaseline), u, C)) } }, e.prototype._updateRichTexts = function () { var t = this.style, e = function (t, e) { var n = new la; if (null != t && (t += \"\"), !t) return n; for (var i, r = e.width, o = e.height, a = e.overflow, s = \"break\" !== a && \"breakAll\" !== a || null == r ? null : { width: r, accumWidth: 0, breakAll: \"breakAll\" === a }, l = ea.lastIndex = 0; null != (i = ea.exec(t));) { var u = i.index; u > l && ua(n, t.substring(l, u), e, s), ua(n, i[2], e, s, i[1]), l = ea.lastIndex } l < t.length && ua(n, t.substring(l, t.length), e, s); var h = [], c = 0, p = 0, d = e.padding, f = \"truncate\" === a, g = \"truncate\" === e.lineOverflow; function y(t, e, n) { t.width = e, t.lineHeight = n, c += n, p = Math.max(p, e) } t: for (var v = 0; v < n.lines.length; v++) { for (var m = n.lines[v], x = 0, _ = 0, b = 0; b < m.tokens.length; b++) { var w = (P = m.tokens[b]).styleName && e.rich[P.styleName] || {}, S = P.textPadding = w.padding, M = S ? S[1] + S[3] : 0, I = P.font = w.font || e.font; P.contentHeight = xr(I); var T = rt(w.height, P.contentHeight); if (P.innerHeight = T, S && (T += S[0] + S[2]), P.height = T, P.lineHeight = ot(w.lineHeight, e.lineHeight, T), P.align = w && w.align || e.align, P.verticalAlign = w && w.verticalAlign || \"middle\", g && null != o && c + P.lineHeight > o) { b > 0 ? (m.tokens = m.tokens.slice(0, b), y(m, _, x), n.lines = n.lines.slice(0, v + 1)) : n.lines = n.lines.slice(0, v); break t } var C = w.width, D = null == C || \"auto\" === C; if (\"string\" == typeof C && \"%\" === C.charAt(C.length - 1)) P.percentWidth = C, h.push(P), P.contentWidth = fr(P.text, I); else { if (D) { var A = w.backgroundColor, k = A && A.image; k && ta(k = $o(k)) && (P.width = Math.max(P.width, k.width * T / k.height)) } var L = f && null != r ? r - _ : null; null != L && L < P.width ? !D || L < M ? (P.text = \"\", P.width = P.contentWidth = 0) : (P.text = na(P.text, L - M, I, e.ellipsis, { minChar: e.truncateMinChar }), P.width = P.contentWidth = fr(P.text, I)) : P.contentWidth = fr(P.text, I) } P.width += M, _ += P.width, w && (x = Math.max(x, P.lineHeight)) } y(m, _, x) } for (n.outerWidth = n.width = rt(r, p), n.outerHeight = n.height = rt(o, c), n.contentHeight = c, n.contentWidth = p, d && (n.outerWidth += d[1] + d[3], n.outerHeight += d[0] + d[2]), v = 0; v < h.length; v++) { var P, O = (P = h[v]).percentWidth; P.width = parseInt(O, 10) / 100 * n.width } return n }(Xs(t), t), n = e.width, i = e.outerWidth, r = e.outerHeight, o = t.padding, a = t.x || 0, s = t.y || 0, l = this._defaultStyle, u = t.align || l.align, h = t.verticalAlign || l.verticalAlign, c = vr(a, i, u), p = mr(s, r, h), d = c, f = p; o && (d += o[3], f += o[0]); var g = d + n; Zs(t) && this._renderBackground(t, t, c, p, i, r); for (var y = !!t.backgroundColor, v = 0; v < e.lines.length; v++) { for (var m = e.lines[v], x = m.tokens, _ = x.length, b = m.lineHeight, w = m.width, S = 0, M = d, I = g, T = _ - 1, C = void 0; S < _ && (!(C = x[S]).align || \"left\" === C.align);)this._placeToken(C, t, b, f, M, \"left\", y), w -= C.width, M += C.width, S++; for (; T >= 0 && \"right\" === (C = x[T]).align;)this._placeToken(C, t, b, f, I, \"right\", y), w -= C.width, I -= C.width, T--; for (M += (n - (M - d) - (g - I) - w) / 2; S <= T;)C = x[S], this._placeToken(C, t, b, f, M + C.width / 2, \"center\", y), M += C.width, S++; f += b } }, e.prototype._placeToken = function (t, e, n, i, r, o, s) { var l = e.rich[t.styleName] || {}; l.text = t.text; var u = t.verticalAlign, h = i + n / 2; \"top\" === u ? h = i + t.height / 2 : \"bottom\" === u && (h = i + n - t.height / 2), !t.isLineHolder && Zs(l) && this._renderBackground(l, e, \"right\" === o ? r - t.width : \"center\" === o ? r - t.width / 2 : r, h - t.height / 2, t.width, t.height); var c = !!l.backgroundColor, p = t.textPadding; p && (r = Us(r, o, p), h -= t.height / 2 - p[0] - t.innerHeight / 2); var d = this._getOrCreateChild(ws), f = d.createStyle(); d.useStyle(f); var g = this._defaultStyle, y = !1, v = 0, m = Ys(\"fill\" in l ? l.fill : \"fill\" in e ? e.fill : (y = !0, g.fill)), x = Hs(\"stroke\" in l ? l.stroke : \"stroke\" in e ? e.stroke : c || s || g.autoStroke && !y ? null : (v = 2, g.stroke)), _ = l.textShadowBlur > 0 || e.textShadowBlur > 0; f.text = t.text, f.x = r, f.y = h, _ && (f.shadowBlur = l.textShadowBlur || e.textShadowBlur || 0, f.shadowColor = l.textShadowColor || e.textShadowColor || \"transparent\", f.shadowOffsetX = l.textShadowOffsetX || e.textShadowOffsetX || 0, f.shadowOffsetY = l.textShadowOffsetY || e.textShadowOffsetY || 0), f.textAlign = o, f.textBaseline = \"middle\", f.font = t.font || a, f.opacity = ot(l.opacity, e.opacity, 1), Fs(f, l), x && (f.lineWidth = ot(l.lineWidth, e.lineWidth, v), f.lineDash = rt(l.lineDash, e.lineDash), f.lineDashOffset = e.lineDashOffset || 0, f.stroke = x), m && (f.fill = m); var b = t.contentWidth, w = t.contentHeight; d.setBoundingRect(new Re(vr(f.x, b, f.textAlign), mr(f.y, w, f.textBaseline), b, w)) }, e.prototype._renderBackground = function (t, e, n, i, r, o) { var a, s, l, u = t.backgroundColor, h = t.borderWidth, c = t.borderColor, p = u && u.image, d = u && !p, f = t.borderRadius, g = this; if (d || t.lineHeight || h && c) { (a = this._getOrCreateChild(Ps)).useStyle(a.createStyle()), a.style.fill = null; var y = a.shape; y.x = n, y.y = i, y.width = r, y.height = o, y.r = f, a.dirtyShape() } if (d) (l = a.style).fill = u || null, l.fillOpacity = rt(t.fillOpacity, 1); else if (p) { (s = this._getOrCreateChild(Is)).onload = function () { g.dirtyStyle() }; var v = s.style; v.image = u.image, v.x = n, v.y = i, v.width = r, v.height = o } h && c && ((l = a.style).lineWidth = h, l.stroke = c, l.strokeOpacity = rt(t.strokeOpacity, 1), l.lineDash = t.borderDash, l.lineDashOffset = t.borderDashOffset || 0, a.strokeContainThreshold = 0, a.hasFill() && a.hasStroke() && (l.strokeFirst = !0, l.lineWidth *= 2)); var m = (a || s).style; m.shadowBlur = t.shadowBlur || 0, m.shadowColor = t.shadowColor || \"transparent\", m.shadowOffsetX = t.shadowOffsetX || 0, m.shadowOffsetY = t.shadowOffsetY || 0, m.opacity = ot(t.opacity, e.opacity, 1) }, e.makeFont = function (t) { var e = \"\"; return Gs(t) && (e = [t.fontStyle, t.fontWeight, Bs(t.fontSize), t.fontFamily || \"sans-serif\"].join(\" \")), e && ut(e) || t.textFont || t.font }, e }(ma), Es = { left: !0, right: 1, center: 1 }, zs = { top: 1, bottom: 1, middle: 1 }, Vs = [\"fontStyle\", \"fontWeight\", \"fontSize\", \"fontFamily\"]; function Bs(t) { return \"string\" != typeof t || -1 === t.indexOf(\"px\") && -1 === t.indexOf(\"rem\") && -1 === t.indexOf(\"em\") ? isNaN(+t) ? \"12px\" : t + \"px\" : t } function Fs(t, e) { for (var n = 0; n < Vs.length; n++) { var i = Vs[n], r = e[i]; null != r && (t[i] = r) } } function Gs(t) { return null != t.fontSize || t.fontFamily || t.fontWeight } function Ws(t) { if (t) { t.font = Ns.makeFont(t); var e = t.align; \"middle\" === e && (e = \"center\"), t.align = null == e || Es[e] ? e : \"left\"; var n = t.verticalAlign; \"center\" === n && (n = \"middle\"), t.verticalAlign = null == n || zs[n] ? n : \"top\", t.padding && (t.padding = st(t.padding)) } } function Hs(t, e) { return null == t || e <= 0 || \"transparent\" === t || \"none\" === t ? null : t.image || t.colorStops ? \"#000\" : t } function Ys(t) { return null == t || \"none\" === t ? null : t.image || t.colorStops ? \"#000\" : t } function Us(t, e, n) { return \"right\" === e ? t - n[1] : \"center\" === e ? t + n[3] / 2 - n[1] / 2 : t + n[3] } function Xs(t) { var e = t.text; return null != e && (e += \"\"), e } function Zs(t) { return !!(t.backgroundColor || t.lineHeight || t.borderWidth && t.borderColor) } var js = Do(), qs = function (t, e, n, i) { if (i) { var r = js(i); r.dataIndex = n, r.dataType = e, r.seriesIndex = t, \"group\" === i.type && i.traverse((function (i) { var r = js(i); r.seriesIndex = t, r.dataIndex = n, r.dataType = e })) } }, Ks = 1, $s = {}, Js = Do(), Qs = Do(), tl = [\"emphasis\", \"blur\", \"select\"], el = [\"normal\", \"emphasis\", \"blur\", \"select\"], nl = 10, il = \"highlight\", rl = \"downplay\", ol = \"select\", al = \"unselect\", sl = \"toggleSelect\"; function ll(t) { return null != t && \"none\" !== t } var ul = new On(100); function hl(t) { if (X(t)) { var e = ul.get(t); return e || (e = jn(t, -.1), ul.put(t, e)), e } if (Q(t)) { var n = A({}, t); return n.colorStops = z(t.colorStops, (function (t) { return { offset: t.offset, color: jn(t.color, -.1) } })), n } return t } function cl(t, e, n) { t.onHoverStateChange && (t.hoverState || 0) !== n && t.onHoverStateChange(e), t.hoverState = n } function pl(t) { cl(t, \"emphasis\", 2) } function dl(t) { 2 === t.hoverState && cl(t, \"normal\", 0) } function fl(t) { cl(t, \"blur\", 1) } function gl(t) { 1 === t.hoverState && cl(t, \"normal\", 0) } function yl(t) { t.selected = !0 } function vl(t) { t.selected = !1 } function ml(t, e, n) { e(t, n) } function xl(t, e, n) { ml(t, e, n), t.isGroup && t.traverse((function (t) { ml(t, e, n) })) } function _l(t, e) { switch (e) { case \"emphasis\": t.hoverState = 2; break; case \"normal\": t.hoverState = 0; break; case \"blur\": t.hoverState = 1; break; case \"select\": t.selected = !0 } } function bl(t, e) { var n = this.states[t]; if (this.style) { if (\"emphasis\" === t) return function (t, e, n, i) { var r = n && P(n, \"select\") >= 0, o = !1; if (t instanceof _s) { var a = Js(t), s = r && a.selectFill || a.normalFill, l = r && a.selectStroke || a.normalStroke; if (ll(s) || ll(l)) { var u = (i = i || {}).style || {}; \"inherit\" === u.fill ? (o = !0, i = A({}, i), (u = A({}, u)).fill = s) : !ll(u.fill) && ll(s) ? (o = !0, i = A({}, i), (u = A({}, u)).fill = hl(s)) : !ll(u.stroke) && ll(l) && (o || (i = A({}, i), u = A({}, u)), u.stroke = hl(l)), i.style = u } } if (i && null == i.z2) { o || (i = A({}, i)); var h = t.z2EmphasisLift; i.z2 = t.z2 + (null != h ? h : nl) } return i }(this, 0, e, n); if (\"blur\" === t) return function (t, e, n) { var i = P(t.currentStates, e) >= 0, r = t.style.opacity, o = i ? null : function (t, e, n, i) { for (var r = t.style, o = {}, a = 0; a < e.length; a++) { var s = e[a], l = r[s]; o[s] = null == l ? i && i[s] : l } for (a = 0; a < t.animators.length; a++) { var u = t.animators[a]; u.__fromStateTransition && u.__fromStateTransition.indexOf(n) < 0 && \"style\" === u.targetName && u.saveTo(o, e) } return o }(t, [\"opacity\"], e, { opacity: 1 }), a = (n = n || {}).style || {}; return null == a.opacity && (n = A({}, n), a = A({ opacity: i ? r : .1 * o.opacity }, a), n.style = a), n }(this, t, n); if (\"select\" === t) return function (t, e, n) { if (n && null == n.z2) { n = A({}, n); var i = t.z2SelectLift; n.z2 = t.z2 + (null != i ? i : 9) } return n }(this, 0, n) } return n } function wl(t) { t.stateProxy = bl; var e = t.getTextContent(), n = t.getTextGuideLine(); e && (e.stateProxy = bl), n && (n.stateProxy = bl) } function Sl(t, e) { !Ll(t, e) && !t.__highByOuter && xl(t, pl) } function Ml(t, e) { !Ll(t, e) && !t.__highByOuter && xl(t, dl) } function Il(t, e) { t.__highByOuter |= 1 << (e || 0), xl(t, pl) } function Tl(t, e) { !(t.__highByOuter &= ~(1 << (e || 0))) && xl(t, dl) } function Cl(t) { xl(t, fl) } function Dl(t) { xl(t, gl) } function Al(t) { xl(t, yl) } function kl(t) { xl(t, vl) } function Ll(t, e) { return t.__highDownSilentOnTouch && e.zrByTouch } function Pl(t) { var e = t.getModel(), n = [], i = []; e.eachComponent((function (e, r) { var o = Qs(r), a = \"series\" === e, s = a ? t.getViewOfSeriesModel(r) : t.getViewOfComponentModel(r); !a && i.push(s), o.isBlured && (s.group.traverse((function (t) { gl(t) })), a && n.push(r)), o.isBlured = !1 })), E(i, (function (t) { t && t.toggleBlurSeries && t.toggleBlurSeries(n, !1, e) })) } function Ol(t, e, n, i) { var r = i.getModel(); function o(t, e) { for (var n = 0; n < e.length; n++) { var i = t.getItemGraphicEl(e[n]); i && Dl(i) } } if (n = n || \"coordinateSystem\", null != t && e && \"none\" !== e) { var a = r.getSeriesByIndex(t), s = a.coordinateSystem; s && s.master && (s = s.master); var l = []; r.eachSeries((function (t) { var r = a === t, u = t.coordinateSystem; if (u && u.master && (u = u.master), !(\"series\" === n && !r || \"coordinateSystem\" === n && !(u && s ? u === s : r) || \"series\" === e && r)) { if (i.getViewOfSeriesModel(t).group.traverse((function (t) { fl(t) })), N(e)) o(t.getData(), e); else if (q(e)) for (var h = G(e), c = 0; c < h.length; c++)o(t.getData(h[c]), e[h[c]]); l.push(t), Qs(t).isBlured = !0 } })), r.eachComponent((function (t, e) { if (\"series\" !== t) { var n = i.getViewOfComponentModel(e); n && n.toggleBlurSeries && n.toggleBlurSeries(l, !0, r) } })) } } function Rl(t, e, n) { if (null != t && null != e) { var i = n.getModel().getComponent(t, e); if (i) { Qs(i).isBlured = !0; var r = n.getViewOfComponentModel(i); r && r.focusBlurEnabled && r.group.traverse((function (t) { fl(t) })) } } } function Nl(t, e, n, i) { var r = { focusSelf: !1, dispatchers: null }; if (null == t || \"series\" === t || null == e || null == n) return r; var o = i.getModel().getComponent(t, e); if (!o) return r; var a = i.getViewOfComponentModel(o); if (!a || !a.findHighDownDispatchers) return r; for (var s, l = a.findHighDownDispatchers(n), u = 0; u < l.length; u++)if (\"self\" === js(l[u]).focus) { s = !0; break } return { focusSelf: s, dispatchers: l } } function El(t) { E(t.getAllData(), (function (e) { var n = e.data, i = e.type; n.eachItemGraphicEl((function (e, n) { t.isSelected(n, i) ? Al(e) : kl(e) })) })) } function zl(t) { var e = []; return t.eachSeries((function (t) { E(t.getAllData(), (function (n) { n.data; var i = n.type, r = t.getSelectedDataIndices(); if (r.length > 0) { var o = { dataIndex: r, seriesIndex: t.seriesIndex }; null != i && (o.dataType = i), e.push(o) } })) })), e } function Vl(t, e, n) { Yl(t, !0), xl(t, wl), Fl(t, e, n) } function Bl(t, e, n, i) { i ? function (t) { Yl(t, !1) }(t) : Vl(t, e, n) } function Fl(t, e, n) { var i = js(t); null != e ? (i.focus = e, i.blurScope = n) : i.focus && (i.focus = null) } var Gl = [\"emphasis\", \"blur\", \"select\"], Wl = { itemStyle: \"getItemStyle\", lineStyle: \"getLineStyle\", areaStyle: \"getAreaStyle\" }; function Hl(t, e, n, i) { n = n || \"itemStyle\"; for (var r = 0; r < Gl.length; r++) { var o = Gl[r], a = e.getModel([o, n]); t.ensureState(o).style = i ? i(a) : a[Wl[n]]() } } function Yl(t, e) { var n = !1 === e, i = t; t.highDownSilentOnTouch && (i.__highDownSilentOnTouch = t.highDownSilentOnTouch), n && !i.__highDownDispatcher || (i.__highByOuter = i.__highByOuter || 0, i.__highDownDispatcher = !n) } function Ul(t) { return !(!t || !t.__highDownDispatcher) } function Xl(t) { var e = t.type; return e === ol || e === al || e === sl } function Zl(t) { var e = t.type; return e === il || e === rl } var jl = ts.CMD, ql = [[], [], []], Kl = Math.sqrt, $l = Math.atan2; function Jl(t, e) { if (e) { var n, i, r, o, a, s, l = t.data, u = t.len(), h = jl.M, c = jl.C, p = jl.L, d = jl.R, f = jl.A, g = jl.Q; for (r = 0, o = 0; r < u;) { switch (n = l[r++], o = r, i = 0, n) { case h: case p: i = 1; break; case c: i = 3; break; case g: i = 2; break; case f: var y = e[4], v = e[5], m = Kl(e[0] * e[0] + e[1] * e[1]), x = Kl(e[2] * e[2] + e[3] * e[3]), _ = $l(-e[1] / x, e[0] / m); l[r] *= m, l[r++] += y, l[r] *= x, l[r++] += v, l[r++] *= m, l[r++] *= x, l[r++] += _, l[r++] += _, o = r += 2; break; case d: s[0] = l[r++], s[1] = l[r++], Ft(s, s, e), l[o++] = s[0], l[o++] = s[1], s[0] += l[r++], s[1] += l[r++], Ft(s, s, e), l[o++] = s[0], l[o++] = s[1] }for (a = 0; a < i; a++) { var b = ql[a]; b[0] = l[r++], b[1] = l[r++], Ft(b, b, e), l[o++] = b[0], l[o++] = b[1] } } t.increaseVersion() } } var Ql = Math.sqrt, tu = Math.sin, eu = Math.cos, nu = Math.PI; function iu(t) { return Math.sqrt(t[0] * t[0] + t[1] * t[1]) } function ru(t, e) { return (t[0] * e[0] + t[1] * e[1]) / (iu(t) * iu(e)) } function ou(t, e) { return (t[0] * e[1] < t[1] * e[0] ? -1 : 1) * Math.acos(ru(t, e)) } function au(t, e, n, i, r, o, a, s, l, u, h) { var c = l * (nu / 180), p = eu(c) * (t - n) / 2 + tu(c) * (e - i) / 2, d = -1 * tu(c) * (t - n) / 2 + eu(c) * (e - i) / 2, f = p * p / (a * a) + d * d / (s * s); f > 1 && (a *= Ql(f), s *= Ql(f)); var g = (r === o ? -1 : 1) * Ql((a * a * (s * s) - a * a * (d * d) - s * s * (p * p)) / (a * a * (d * d) + s * s * (p * p))) || 0, y = g * a * d / s, v = g * -s * p / a, m = (t + n) / 2 + eu(c) * y - tu(c) * v, x = (e + i) / 2 + tu(c) * y + eu(c) * v, _ = ou([1, 0], [(p - y) / a, (d - v) / s]), b = [(p - y) / a, (d - v) / s], w = [(-1 * p - y) / a, (-1 * d - v) / s], S = ou(b, w); if (ru(b, w) <= -1 && (S = nu), ru(b, w) >= 1 && (S = 0), S < 0) { var M = Math.round(S / nu * 1e6) / 1e6; S = 2 * nu + M % 2 * nu } h.addData(u, m, x, a, s, _, S, c, o) } var su = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi, lu = /-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g; var uu = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.applyTransform = function (t) { }, e }(_s); function hu(t) { return null != t.setData } function cu(t, e) { var n = function (t) { var e = new ts; if (!t) return e; var n, i = 0, r = 0, o = i, a = r, s = ts.CMD, l = t.match(su); if (!l) return e; for (var u = 0; u < l.length; u++) { for (var h = l[u], c = h.charAt(0), p = void 0, d = h.match(lu) || [], f = d.length, g = 0; g < f; g++)d[g] = parseFloat(d[g]); for (var y = 0; y < f;) { var v = void 0, m = void 0, x = void 0, _ = void 0, b = void 0, w = void 0, S = void 0, M = i, I = r, T = void 0, C = void 0; switch (c) { case \"l\": i += d[y++], r += d[y++], p = s.L, e.addData(p, i, r); break; case \"L\": i = d[y++], r = d[y++], p = s.L, e.addData(p, i, r); break; case \"m\": i += d[y++], r += d[y++], p = s.M, e.addData(p, i, r), o = i, a = r, c = \"l\"; break; case \"M\": i = d[y++], r = d[y++], p = s.M, e.addData(p, i, r), o = i, a = r, c = \"L\"; break; case \"h\": i += d[y++], p = s.L, e.addData(p, i, r); break; case \"H\": i = d[y++], p = s.L, e.addData(p, i, r); break; case \"v\": r += d[y++], p = s.L, e.addData(p, i, r); break; case \"V\": r = d[y++], p = s.L, e.addData(p, i, r); break; case \"C\": p = s.C, e.addData(p, d[y++], d[y++], d[y++], d[y++], d[y++], d[y++]), i = d[y - 2], r = d[y - 1]; break; case \"c\": p = s.C, e.addData(p, d[y++] + i, d[y++] + r, d[y++] + i, d[y++] + r, d[y++] + i, d[y++] + r), i += d[y - 2], r += d[y - 1]; break; case \"S\": v = i, m = r, T = e.len(), C = e.data, n === s.C && (v += i - C[T - 4], m += r - C[T - 3]), p = s.C, M = d[y++], I = d[y++], i = d[y++], r = d[y++], e.addData(p, v, m, M, I, i, r); break; case \"s\": v = i, m = r, T = e.len(), C = e.data, n === s.C && (v += i - C[T - 4], m += r - C[T - 3]), p = s.C, M = i + d[y++], I = r + d[y++], i += d[y++], r += d[y++], e.addData(p, v, m, M, I, i, r); break; case \"Q\": M = d[y++], I = d[y++], i = d[y++], r = d[y++], p = s.Q, e.addData(p, M, I, i, r); break; case \"q\": M = d[y++] + i, I = d[y++] + r, i += d[y++], r += d[y++], p = s.Q, e.addData(p, M, I, i, r); break; case \"T\": v = i, m = r, T = e.len(), C = e.data, n === s.Q && (v += i - C[T - 4], m += r - C[T - 3]), i = d[y++], r = d[y++], p = s.Q, e.addData(p, v, m, i, r); break; case \"t\": v = i, m = r, T = e.len(), C = e.data, n === s.Q && (v += i - C[T - 4], m += r - C[T - 3]), i += d[y++], r += d[y++], p = s.Q, e.addData(p, v, m, i, r); break; case \"A\": x = d[y++], _ = d[y++], b = d[y++], w = d[y++], S = d[y++], au(M = i, I = r, i = d[y++], r = d[y++], w, S, x, _, b, p = s.A, e); break; case \"a\": x = d[y++], _ = d[y++], b = d[y++], w = d[y++], S = d[y++], au(M = i, I = r, i += d[y++], r += d[y++], w, S, x, _, b, p = s.A, e) } } \"z\" !== c && \"Z\" !== c || (p = s.Z, e.addData(p), i = o, r = a), n = p } return e.toStatic(), e }(t), i = A({}, e); return i.buildPath = function (t) { if (hu(t)) { t.setData(n.data), (e = t.getContext()) && t.rebuildPath(e, 1) } else { var e = t; n.rebuildPath(e, 1) } }, i.applyTransform = function (t) { Jl(n, t), this.dirtyShape() }, i } function pu(t, e) { return new uu(cu(t, e)) } function du(t, e) { e = e || {}; var n = new _s; return t.shape && n.setShape(t.shape), n.setStyle(t.style), e.bakeTransform ? Jl(n.path, t.getComputedTransform()) : e.toLocal ? n.setLocalTransform(t.getComputedTransform()) : n.copyTransform(t), n.buildPath = t.buildPath, n.applyTransform = n.applyTransform, n.z = t.z, n.z2 = t.z2, n.zlevel = t.zlevel, n } var fu = function () { this.cx = 0, this.cy = 0, this.r = 0 }, gu = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultShape = function () { return new fu }, e.prototype.buildPath = function (t, e) { t.moveTo(e.cx + e.r, e.cy), t.arc(e.cx, e.cy, e.r, 0, 2 * Math.PI) }, e }(_s); gu.prototype.type = \"circle\"; var yu = function () { this.cx = 0, this.cy = 0, this.rx = 0, this.ry = 0 }, vu = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultShape = function () { return new yu }, e.prototype.buildPath = function (t, e) { var n = .5522848, i = e.cx, r = e.cy, o = e.rx, a = e.ry, s = o * n, l = a * n; t.moveTo(i - o, r), t.bezierCurveTo(i - o, r - l, i - s, r - a, i, r - a), t.bezierCurveTo(i + s, r - a, i + o, r - l, i + o, r), t.bezierCurveTo(i + o, r + l, i + s, r + a, i, r + a), t.bezierCurveTo(i - s, r + a, i - o, r + l, i - o, r), t.closePath() }, e }(_s); vu.prototype.type = \"ellipse\"; var mu = Math.PI, xu = 2 * mu, _u = Math.sin, bu = Math.cos, wu = Math.acos, Su = Math.atan2, Mu = Math.abs, Iu = Math.sqrt, Tu = Math.max, Cu = Math.min, Du = 1e-4; function Au(t, e, n, i, r, o, a) { var s = t - n, l = e - i, u = (a ? o : -o) / Iu(s * s + l * l), h = u * l, c = -u * s, p = t + h, d = e + c, f = n + h, g = i + c, y = (p + f) / 2, v = (d + g) / 2, m = f - p, x = g - d, _ = m * m + x * x, b = r - o, w = p * g - f * d, S = (x < 0 ? -1 : 1) * Iu(Tu(0, b * b * _ - w * w)), M = (w * x - m * S) / _, I = (-w * m - x * S) / _, T = (w * x + m * S) / _, C = (-w * m + x * S) / _, D = M - y, A = I - v, k = T - y, L = C - v; return D * D + A * A > k * k + L * L && (M = T, I = C), { cx: M, cy: I, x0: -h, y0: -c, x1: M * (r / b - 1), y1: I * (r / b - 1) } } function ku(t, e) { var n, i = Tu(e.r, 0), r = Tu(e.r0 || 0, 0), o = i > 0; if (o || r > 0) { if (o || (i = r, r = 0), r > i) { var a = i; i = r, r = a } var s = e.startAngle, l = e.endAngle; if (!isNaN(s) && !isNaN(l)) { var u = e.cx, h = e.cy, c = !!e.clockwise, p = Mu(l - s), d = p > xu && p % xu; if (d > Du && (p = d), i > Du) if (p > xu - Du) t.moveTo(u + i * bu(s), h + i * _u(s)), t.arc(u, h, i, s, l, !c), r > Du && (t.moveTo(u + r * bu(l), h + r * _u(l)), t.arc(u, h, r, l, s, c)); else { var f = void 0, g = void 0, y = void 0, v = void 0, m = void 0, x = void 0, _ = void 0, b = void 0, w = void 0, S = void 0, M = void 0, I = void 0, T = void 0, C = void 0, D = void 0, A = void 0, k = i * bu(s), L = i * _u(s), P = r * bu(l), O = r * _u(l), R = p > Du; if (R) { var N = e.cornerRadius; N && (n = function (t) { var e; if (Y(t)) { var n = t.length; if (!n) return t; e = 1 === n ? [t[0], t[0], 0, 0] : 2 === n ? [t[0], t[0], t[1], t[1]] : 3 === n ? t.concat(t[2]) : t } else e = [t, t, t, t]; return e }(N), f = n[0], g = n[1], y = n[2], v = n[3]); var E = Mu(i - r) / 2; if (m = Cu(E, y), x = Cu(E, v), _ = Cu(E, f), b = Cu(E, g), M = w = Tu(m, x), I = S = Tu(_, b), (w > Du || S > Du) && (T = i * bu(l), C = i * _u(l), D = r * bu(s), A = r * _u(s), p < mu)) { var z = function (t, e, n, i, r, o, a, s) { var l = n - t, u = i - e, h = a - r, c = s - o, p = c * l - h * u; if (!(p * p < Du)) return [t + (p = (h * (e - o) - c * (t - r)) / p) * l, e + p * u] }(k, L, D, A, T, C, P, O); if (z) { var V = k - z[0], B = L - z[1], F = T - z[0], G = C - z[1], W = 1 / _u(wu((V * F + B * G) / (Iu(V * V + B * B) * Iu(F * F + G * G))) / 2), H = Iu(z[0] * z[0] + z[1] * z[1]); M = Cu(w, (i - H) / (W + 1)), I = Cu(S, (r - H) / (W - 1)) } } } if (R) if (M > Du) { var U = Cu(y, M), X = Cu(v, M), Z = Au(D, A, k, L, i, U, c), j = Au(T, C, P, O, i, X, c); t.moveTo(u + Z.cx + Z.x0, h + Z.cy + Z.y0), M < w && U === X ? t.arc(u + Z.cx, h + Z.cy, M, Su(Z.y0, Z.x0), Su(j.y0, j.x0), !c) : (U > 0 && t.arc(u + Z.cx, h + Z.cy, U, Su(Z.y0, Z.x0), Su(Z.y1, Z.x1), !c), t.arc(u, h, i, Su(Z.cy + Z.y1, Z.cx + Z.x1), Su(j.cy + j.y1, j.cx + j.x1), !c), X > 0 && t.arc(u + j.cx, h + j.cy, X, Su(j.y1, j.x1), Su(j.y0, j.x0), !c)) } else t.moveTo(u + k, h + L), t.arc(u, h, i, s, l, !c); else t.moveTo(u + k, h + L); if (r > Du && R) if (I > Du) { U = Cu(f, I), Z = Au(P, O, T, C, r, -(X = Cu(g, I)), c), j = Au(k, L, D, A, r, -U, c); t.lineTo(u + Z.cx + Z.x0, h + Z.cy + Z.y0), I < S && U === X ? t.arc(u + Z.cx, h + Z.cy, I, Su(Z.y0, Z.x0), Su(j.y0, j.x0), !c) : (X > 0 && t.arc(u + Z.cx, h + Z.cy, X, Su(Z.y0, Z.x0), Su(Z.y1, Z.x1), !c), t.arc(u, h, r, Su(Z.cy + Z.y1, Z.cx + Z.x1), Su(j.cy + j.y1, j.cx + j.x1), c), U > 0 && t.arc(u + j.cx, h + j.cy, U, Su(j.y1, j.x1), Su(j.y0, j.x0), !c)) } else t.lineTo(u + P, h + O), t.arc(u, h, r, l, s, c); else t.lineTo(u + P, h + O) } else t.moveTo(u, h); t.closePath() } } } var Lu = function () { this.cx = 0, this.cy = 0, this.r0 = 0, this.r = 0, this.startAngle = 0, this.endAngle = 2 * Math.PI, this.clockwise = !0, this.cornerRadius = 0 }, Pu = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultShape = function () { return new Lu }, e.prototype.buildPath = function (t, e) { ku(t, e) }, e.prototype.isZeroArea = function () { return this.shape.startAngle === this.shape.endAngle || this.shape.r === this.shape.r0 }, e }(_s); Pu.prototype.type = \"sector\"; var Ou = function () { this.cx = 0, this.cy = 0, this.r = 0, this.r0 = 0 }, Ru = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultShape = function () { return new Ou }, e.prototype.buildPath = function (t, e) { var n = e.cx, i = e.cy, r = 2 * Math.PI; t.moveTo(n + e.r, i), t.arc(n, i, e.r, 0, r, !1), t.moveTo(n + e.r0, i), t.arc(n, i, e.r0, 0, r, !0) }, e }(_s); function Nu(t, e, n) { var i = e.smooth, r = e.points; if (r && r.length >= 2) { if (i) { var o = function (t, e, n, i) { var r, o, a, s, l = [], u = [], h = [], c = []; if (i) { a = [1 / 0, 1 / 0], s = [-1 / 0, -1 / 0]; for (var p = 0, d = t.length; p < d; p++)Gt(a, a, t[p]), Wt(s, s, t[p]); Gt(a, a, i[0]), Wt(s, s, i[1]) } for (p = 0, d = t.length; p < d; p++) { var f = t[p]; if (n) r = t[p ? p - 1 : d - 1], o = t[(p + 1) % d]; else { if (0 === p || p === d - 1) { l.push(Mt(t[p])); continue } r = t[p - 1], o = t[p + 1] } Dt(u, o, r), Ot(u, u, e); var g = Nt(f, r), y = Nt(f, o), v = g + y; 0 !== v && (g /= v, y /= v), Ot(h, u, -g), Ot(c, u, y); var m = Tt([], f, h), x = Tt([], f, c); i && (Wt(m, m, a), Gt(m, m, s), Wt(x, x, a), Gt(x, x, s)), l.push(m), l.push(x) } return n && l.push(l.shift()), l }(r, i, n, e.smoothConstraint); t.moveTo(r[0][0], r[0][1]); for (var a = r.length, s = 0; s < (n ? a : a - 1); s++) { var l = o[2 * s], u = o[2 * s + 1], h = r[(s + 1) % a]; t.bezierCurveTo(l[0], l[1], u[0], u[1], h[0], h[1]) } } else { t.moveTo(r[0][0], r[0][1]); s = 1; for (var c = r.length; s < c; s++)t.lineTo(r[s][0], r[s][1]) } n && t.closePath() } } Ru.prototype.type = \"ring\"; var Eu = function () { this.points = null, this.smooth = 0, this.smoothConstraint = null }, zu = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultShape = function () { return new Eu }, e.prototype.buildPath = function (t, e) { Nu(t, e, !0) }, e }(_s); zu.prototype.type = \"polygon\"; var Vu = function () { this.points = null, this.percent = 1, this.smooth = 0, this.smoothConstraint = null }, Bu = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new Vu }, e.prototype.buildPath = function (t, e) { Nu(t, e, !1) }, e }(_s); Bu.prototype.type = \"polyline\"; var Fu = {}, Gu = function () { this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.percent = 1 }, Wu = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new Gu }, e.prototype.buildPath = function (t, e) { var n, i, r, o; if (this.subPixelOptimize) { var a = Cs(Fu, e, this.style); n = a.x1, i = a.y1, r = a.x2, o = a.y2 } else n = e.x1, i = e.y1, r = e.x2, o = e.y2; var s = e.percent; 0 !== s && (t.moveTo(n, i), s < 1 && (r = n * (1 - s) + r * s, o = i * (1 - s) + o * s), t.lineTo(r, o)) }, e.prototype.pointAt = function (t) { var e = this.shape; return [e.x1 * (1 - t) + e.x2 * t, e.y1 * (1 - t) + e.y2 * t] }, e }(_s); Wu.prototype.type = \"line\"; var Hu = [], Yu = function () { this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.cpx1 = 0, this.cpy1 = 0, this.percent = 1 }; function Uu(t, e, n) { var i = t.cpx2, r = t.cpy2; return null != i || null != r ? [(n ? yn : gn)(t.x1, t.cpx1, t.cpx2, t.x2, e), (n ? yn : gn)(t.y1, t.cpy1, t.cpy2, t.y2, e)] : [(n ? Sn : wn)(t.x1, t.cpx1, t.x2, e), (n ? Sn : wn)(t.y1, t.cpy1, t.y2, e)] } var Xu = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new Yu }, e.prototype.buildPath = function (t, e) { var n = e.x1, i = e.y1, r = e.x2, o = e.y2, a = e.cpx1, s = e.cpy1, l = e.cpx2, u = e.cpy2, h = e.percent; 0 !== h && (t.moveTo(n, i), null == l || null == u ? (h < 1 && (In(n, a, r, h, Hu), a = Hu[1], r = Hu[2], In(i, s, o, h, Hu), s = Hu[1], o = Hu[2]), t.quadraticCurveTo(a, s, r, o)) : (h < 1 && (xn(n, a, l, r, h, Hu), a = Hu[1], l = Hu[2], r = Hu[3], xn(i, s, u, o, h, Hu), s = Hu[1], u = Hu[2], o = Hu[3]), t.bezierCurveTo(a, s, l, u, r, o))) }, e.prototype.pointAt = function (t) { return Uu(this.shape, t, !1) }, e.prototype.tangentAt = function (t) { var e = Uu(this.shape, t, !0); return Rt(e, e) }, e }(_s); Xu.prototype.type = \"bezier-curve\"; var Zu = function () { this.cx = 0, this.cy = 0, this.r = 0, this.startAngle = 0, this.endAngle = 2 * Math.PI, this.clockwise = !0 }, ju = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new Zu }, e.prototype.buildPath = function (t, e) { var n = e.cx, i = e.cy, r = Math.max(e.r, 0), o = e.startAngle, a = e.endAngle, s = e.clockwise, l = Math.cos(o), u = Math.sin(o); t.moveTo(l * r + n, u * r + i), t.arc(n, i, r, o, a, !s) }, e }(_s); ju.prototype.type = \"arc\"; var qu = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"compound\", e } return n(e, t), e.prototype._updatePathDirty = function () { for (var t = this.shape.paths, e = this.shapeChanged(), n = 0; n < t.length; n++)e = e || t[n].shapeChanged(); e && this.dirtyShape() }, e.prototype.beforeBrush = function () { this._updatePathDirty(); for (var t = this.shape.paths || [], e = this.getGlobalScale(), n = 0; n < t.length; n++)t[n].path || t[n].createPathProxy(), t[n].path.setScale(e[0], e[1], t[n].segmentIgnoreThreshold) }, e.prototype.buildPath = function (t, e) { for (var n = e.paths || [], i = 0; i < n.length; i++)n[i].buildPath(t, n[i].shape, !0) }, e.prototype.afterBrush = function () { for (var t = this.shape.paths || [], e = 0; e < t.length; e++)t[e].pathUpdated() }, e.prototype.getBoundingRect = function () { return this._updatePathDirty.call(this), _s.prototype.getBoundingRect.call(this) }, e }(_s), Ku = function () { function t(t) { this.colorStops = t || [] } return t.prototype.addColorStop = function (t, e) { this.colorStops.push({ offset: t, color: e }) }, t }(), $u = function (t) { function e(e, n, i, r, o, a) { var s = t.call(this, o) || this; return s.x = null == e ? 0 : e, s.y = null == n ? 0 : n, s.x2 = null == i ? 1 : i, s.y2 = null == r ? 0 : r, s.type = \"linear\", s.global = a || !1, s } return n(e, t), e }(Ku), Ju = function (t) { function e(e, n, i, r, o) { var a = t.call(this, r) || this; return a.x = null == e ? .5 : e, a.y = null == n ? .5 : n, a.r = null == i ? .5 : i, a.type = \"radial\", a.global = o || !1, a } return n(e, t), e }(Ku), Qu = [0, 0], th = [0, 0], eh = new Ie, nh = new Ie, ih = function () { function t(t, e) { this._corners = [], this._axes = [], this._origin = [0, 0]; for (var n = 0; n < 4; n++)this._corners[n] = new Ie; for (n = 0; n < 2; n++)this._axes[n] = new Ie; t && this.fromBoundingRect(t, e) } return t.prototype.fromBoundingRect = function (t, e) { var n = this._corners, i = this._axes, r = t.x, o = t.y, a = r + t.width, s = o + t.height; if (n[0].set(r, o), n[1].set(a, o), n[2].set(a, s), n[3].set(r, s), e) for (var l = 0; l < 4; l++)n[l].transform(e); Ie.sub(i[0], n[1], n[0]), Ie.sub(i[1], n[3], n[0]), i[0].normalize(), i[1].normalize(); for (l = 0; l < 2; l++)this._origin[l] = i[l].dot(n[0]) }, t.prototype.intersect = function (t, e) { var n = !0, i = !e; return eh.set(1 / 0, 1 / 0), nh.set(0, 0), !this._intersectCheckOneSide(this, t, eh, nh, i, 1) && (n = !1, i) || !this._intersectCheckOneSide(t, this, eh, nh, i, -1) && (n = !1, i) || i || Ie.copy(e, n ? eh : nh), n }, t.prototype._intersectCheckOneSide = function (t, e, n, i, r, o) { for (var a = !0, s = 0; s < 2; s++) { var l = this._axes[s]; if (this._getProjMinMaxOnAxis(s, t._corners, Qu), this._getProjMinMaxOnAxis(s, e._corners, th), Qu[1] < th[0] || Qu[0] > th[1]) { if (a = !1, r) return a; var u = Math.abs(th[0] - Qu[1]), h = Math.abs(Qu[0] - th[1]); Math.min(u, h) > i.len() && (u < h ? Ie.scale(i, l, -u * o) : Ie.scale(i, l, h * o)) } else if (n) { u = Math.abs(th[0] - Qu[1]), h = Math.abs(Qu[0] - th[1]); Math.min(u, h) < n.len() && (u < h ? Ie.scale(n, l, u * o) : Ie.scale(n, l, -h * o)) } } return a }, t.prototype._getProjMinMaxOnAxis = function (t, e, n) { for (var i = this._axes[t], r = this._origin, o = e[0].dot(i) + r[t], a = o, s = o, l = 1; l < e.length; l++) { var u = e[l].dot(i) + r[t]; a = Math.min(u, a), s = Math.max(u, s) } n[0] = a, n[1] = s }, t }(), rh = [], oh = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.notClear = !0, e.incremental = !0, e._displayables = [], e._temporaryDisplayables = [], e._cursor = 0, e } return n(e, t), e.prototype.traverse = function (t, e) { t.call(e, this) }, e.prototype.useStyle = function () { this.style = {} }, e.prototype.getCursor = function () { return this._cursor }, e.prototype.innerAfterBrush = function () { this._cursor = this._displayables.length }, e.prototype.clearDisplaybles = function () { this._displayables = [], this._temporaryDisplayables = [], this._cursor = 0, this.markRedraw(), this.notClear = !1 }, e.prototype.clearTemporalDisplayables = function () { this._temporaryDisplayables = [] }, e.prototype.addDisplayable = function (t, e) { e ? this._temporaryDisplayables.push(t) : this._displayables.push(t), this.markRedraw() }, e.prototype.addDisplayables = function (t, e) { e = e || !1; for (var n = 0; n < t.length; n++)this.addDisplayable(t[n], e) }, e.prototype.getDisplayables = function () { return this._displayables }, e.prototype.getTemporalDisplayables = function () { return this._temporaryDisplayables }, e.prototype.eachPendingDisplayable = function (t) { for (var e = this._cursor; e < this._displayables.length; e++)t && t(this._displayables[e]); for (e = 0; e < this._temporaryDisplayables.length; e++)t && t(this._temporaryDisplayables[e]) }, e.prototype.update = function () { this.updateTransform(); for (var t = this._cursor; t < this._displayables.length; t++) { (e = this._displayables[t]).parent = this, e.update(), e.parent = null } for (t = 0; t < this._temporaryDisplayables.length; t++) { var e; (e = this._temporaryDisplayables[t]).parent = this, e.update(), e.parent = null } }, e.prototype.getBoundingRect = function () { if (!this._rect) { for (var t = new Re(1 / 0, 1 / 0, -1 / 0, -1 / 0), e = 0; e < this._displayables.length; e++) { var n = this._displayables[e], i = n.getBoundingRect().clone(); n.needLocalTransform() && i.applyTransform(n.getLocalTransform(rh)), t.union(i) } this._rect = t } return this._rect }, e.prototype.contain = function (t, e) { var n = this.transformCoordToLocal(t, e); if (this.getBoundingRect().contain(n[0], n[1])) for (var i = 0; i < this._displayables.length; i++) { if (this._displayables[i].contain(t, e)) return !0 } return !1 }, e }(ma), ah = Do(); function sh(t, e, n, i, r) { var o; if (e && e.ecModel) { var a = e.ecModel.getUpdatePayload(); o = a && a.animation } var s = \"update\" === t; if (e && e.isAnimationEnabled()) { var l = void 0, u = void 0, h = void 0; return i ? (l = rt(i.duration, 200), u = rt(i.easing, \"cubicOut\"), h = 0) : (l = e.getShallow(s ? \"animationDurationUpdate\" : \"animationDuration\"), u = e.getShallow(s ? \"animationEasingUpdate\" : \"animationEasing\"), h = e.getShallow(s ? \"animationDelayUpdate\" : \"animationDelay\")), o && (null != o.duration && (l = o.duration), null != o.easing && (u = o.easing), null != o.delay && (h = o.delay)), U(h) && (h = h(n, r)), U(l) && (l = l(n)), { duration: l || 0, delay: h, easing: u } } return null } function lh(t, e, n, i, r, o, a) { var s, l = !1; U(r) ? (a = o, o = r, r = null) : q(r) && (o = r.cb, a = r.during, l = r.isFrom, s = r.removeOpt, r = r.dataIndex); var u = \"leave\" === t; u || e.stopAnimation(\"leave\"); var h = sh(t, i, r, u ? s || {} : null, i && i.getAnimationDelayParams ? i.getAnimationDelayParams(e, r) : null); if (h && h.duration > 0) { var c = { duration: h.duration, delay: h.delay || 0, easing: h.easing, done: o, force: !!o || !!a, setToFinal: !u, scope: t, during: a }; l ? e.animateFrom(n, c) : e.animateTo(n, c) } else e.stopAnimation(), !l && e.attr(n), a && a(1), o && o() } function uh(t, e, n, i, r, o) { lh(\"update\", t, e, n, i, r, o) } function hh(t, e, n, i, r, o) { lh(\"enter\", t, e, n, i, r, o) } function ch(t) { if (!t.__zr) return !0; for (var e = 0; e < t.animators.length; e++) { if (\"leave\" === t.animators[e].scope) return !0 } return !1 } function ph(t, e, n, i, r, o) { ch(t) || lh(\"leave\", t, e, n, i, r, o) } function dh(t, e, n, i) { t.removeTextContent(), t.removeTextGuideLine(), ph(t, { style: { opacity: 0 } }, e, n, i) } function fh(t, e, n) { function i() { t.parent && t.parent.remove(t) } t.isGroup ? t.traverse((function (t) { t.isGroup || dh(t, e, n, i) })) : dh(t, e, n, i) } function gh(t) { ah(t).oldStyle = t.style } var yh = Math.max, vh = Math.min, mh = {}; function xh(t) { return _s.extend(t) } var _h = function (t, e) { var i = cu(t, e); return function (t) { function e(e) { var n = t.call(this, e) || this; return n.applyTransform = i.applyTransform, n.buildPath = i.buildPath, n } return n(e, t), e }(uu) }; function bh(t, e) { return _h(t, e) } function wh(t, e) { mh[t] = e } function Sh(t) { if (mh.hasOwnProperty(t)) return mh[t] } function Mh(t, e, n, i) { var r = pu(t, e); return n && (\"center\" === i && (n = Th(n, r.getBoundingRect())), Dh(r, n)), r } function Ih(t, e, n) { var i = new Is({ style: { image: t, x: e.x, y: e.y, width: e.width, height: e.height }, onload: function (t) { if (\"center\" === n) { var r = { width: t.width, height: t.height }; i.setStyle(Th(e, r)) } } }); return i } function Th(t, e) { var n, i = e.width / e.height, r = t.height * i; return n = r <= t.width ? t.height : (r = t.width) / i, { x: t.x + t.width / 2 - r / 2, y: t.y + t.height / 2 - n / 2, width: r, height: n } } var Ch = function (t, e) { for (var n = [], i = t.length, r = 0; r < i; r++) { var o = t[r]; n.push(o.getUpdatedPathProxy(!0)) } var a = new _s(e); return a.createPathProxy(), a.buildPath = function (t) { if (hu(t)) { t.appendPath(n); var e = t.getContext(); e && t.rebuildPath(e, 1) } }, a }; function Dh(t, e) { if (t.applyTransform) { var n = t.getBoundingRect().calculateTransform(e); t.applyTransform(n) } } function Ah(t, e) { return Cs(t, t, { lineWidth: e }), t } var kh = As; function Lh(t, e) { for (var n = ye([]); t && t !== e;)me(n, t.getLocalTransform(), n), t = t.parent; return n } function Ph(t, e, n) { return e && !N(e) && (e = hr.getLocalTransform(e)), n && (e = we([], e)), Ft([], t, e) } function Oh(t, e, n) { var i = 0 === e[4] || 0 === e[5] || 0 === e[0] ? 1 : Math.abs(2 * e[4] / e[0]), r = 0 === e[4] || 0 === e[5] || 0 === e[2] ? 1 : Math.abs(2 * e[4] / e[2]), o = [\"left\" === t ? -i : \"right\" === t ? i : 0, \"top\" === t ? -r : \"bottom\" === t ? r : 0]; return o = Ph(o, e, n), Math.abs(o[0]) > Math.abs(o[1]) ? o[0] > 0 ? \"right\" : \"left\" : o[1] > 0 ? \"bottom\" : \"top\" } function Rh(t) { return !t.isGroup } function Nh(t, e, n) { if (t && e) { var i, r = (i = {}, t.traverse((function (t) { Rh(t) && t.anid && (i[t.anid] = t) })), i); e.traverse((function (t) { if (Rh(t) && t.anid) { var e = r[t.anid]; if (e) { var i = o(t); t.attr(o(e)), uh(t, i, n, js(t).dataIndex) } } })) } function o(t) { var e = { x: t.x, y: t.y, rotation: t.rotation }; return function (t) { return null != t.shape }(t) && (e.shape = A({}, t.shape)), e } } function Eh(t, e) { return z(t, (function (t) { var n = t[0]; n = yh(n, e.x), n = vh(n, e.x + e.width); var i = t[1]; return i = yh(i, e.y), [n, i = vh(i, e.y + e.height)] })) } function zh(t, e) { var n = yh(t.x, e.x), i = vh(t.x + t.width, e.x + e.width), r = yh(t.y, e.y), o = vh(t.y + t.height, e.y + e.height); if (i >= n && o >= r) return { x: n, y: r, width: i - n, height: o - r } } function Vh(t, e, n) { var i = A({ rectHover: !0 }, e), r = i.style = { strokeNoScale: !0 }; if (n = n || { x: -1, y: -1, width: 2, height: 2 }, t) return 0 === t.indexOf(\"image://\") ? (r.image = t.slice(8), k(r, n), new Is(i)) : Mh(t.replace(\"path://\", \"\"), i, n, \"center\") } function Bh(t, e, n, i, r) { for (var o = 0, a = r[r.length - 1]; o < r.length; o++) { var s = r[o]; if (Fh(t, e, n, i, s[0], s[1], a[0], a[1])) return !0; a = s } } function Fh(t, e, n, i, r, o, a, s) { var l, u = n - t, h = i - e, c = a - r, p = s - o, d = Gh(c, p, u, h); if ((l = d) <= 1e-6 && l >= -1e-6) return !1; var f = t - r, g = e - o, y = Gh(f, g, u, h) / d; if (y < 0 || y > 1) return !1; var v = Gh(f, g, c, p) / d; return !(v < 0 || v > 1) } function Gh(t, e, n, i) { return t * i - n * e } function Wh(t) { var e = t.itemTooltipOption, n = t.componentModel, i = t.itemName, r = X(e) ? { formatter: e } : e, o = n.mainType, a = n.componentIndex, s = { componentType: o, name: i, $vars: [\"name\"] }; s[o + \"Index\"] = a; var l = t.formatterParamsExtra; l && E(G(l), (function (t) { mt(s, t) || (s[t] = l[t], s.$vars.push(t)) })); var u = js(t.el); u.componentMainType = o, u.componentIndex = a, u.tooltipConfig = { name: i, option: k({ content: i, formatterParams: s }, r) } } function Hh(t, e) { var n; t.isGroup && (n = e(t)), n || t.traverse(e) } function Yh(t, e) { if (t) if (Y(t)) for (var n = 0; n < t.length; n++)Hh(t[n], e); else Hh(t, e) } wh(\"circle\", gu), wh(\"ellipse\", vu), wh(\"sector\", Pu), wh(\"ring\", Ru), wh(\"polygon\", zu), wh(\"polyline\", Bu), wh(\"rect\", Ps), wh(\"line\", Wu), wh(\"bezierCurve\", Xu), wh(\"arc\", ju); var Uh = Object.freeze({ __proto__: null, updateProps: uh, initProps: hh, removeElement: ph, removeElementWithFadeOut: fh, isElementRemoved: ch, extendShape: xh, extendPath: bh, registerShape: wh, getShapeClass: Sh, makePath: Mh, makeImage: Ih, mergePath: Ch, resizePath: Dh, subPixelOptimizeLine: Ah, subPixelOptimizeRect: function (t) { return Ds(t.shape, t.shape, t.style), t }, subPixelOptimize: kh, getTransform: Lh, applyTransform: Ph, transformDirection: Oh, groupTransition: Nh, clipPointsByRect: Eh, clipRectByRect: zh, createIcon: Vh, linePolygonIntersect: Bh, lineLineIntersect: Fh, setTooltipConfig: Wh, traverseElements: Yh, Group: Pr, Image: Is, Text: Ns, Circle: gu, Ellipse: vu, Sector: Pu, Ring: Ru, Polygon: zu, Polyline: Bu, Rect: Ps, Line: Wu, BezierCurve: Xu, Arc: ju, IncrementalDisplayable: oh, CompoundPath: qu, LinearGradient: $u, RadialGradient: Ju, BoundingRect: Re, OrientedBoundingRect: ih, Point: Ie, Path: _s }), Xh = {}; function Zh(t, e) { for (var n = 0; n < tl.length; n++) { var i = tl[n], r = e[i], o = t.ensureState(i); o.style = o.style || {}, o.style.text = r } var a = t.currentStates.slice(); t.clearStates(!0), t.setStyle({ text: e.normal }), t.useStates(a, !0) } function jh(t, e, n) { var i, r = t.labelFetcher, o = t.labelDataIndex, a = t.labelDimIndex, s = e.normal; r && (i = r.getFormattedLabel(o, \"normal\", null, a, s && s.get(\"formatter\"), null != n ? { interpolatedValue: n } : null)), null == i && (i = U(t.defaultText) ? t.defaultText(o, t, n) : t.defaultText); for (var l = { normal: i }, u = 0; u < tl.length; u++) { var h = tl[u], c = e[h]; l[h] = rt(r ? r.getFormattedLabel(o, h, null, a, c && c.get(\"formatter\")) : null, i) } return l } function qh(t, e, n, i) { n = n || Xh; for (var r = t instanceof Ns, o = !1, a = 0; a < el.length; a++) { if ((p = e[el[a]]) && p.getShallow(\"show\")) { o = !0; break } } var s = r ? t : t.getTextContent(); if (o) { r || (s || (s = new Ns, t.setTextContent(s)), t.stateProxy && (s.stateProxy = t.stateProxy)); var l = jh(n, e), u = e.normal, h = !!u.getShallow(\"show\"), c = $h(u, i && i.normal, n, !1, !r); c.text = l.normal, r || t.setTextConfig(Jh(u, n, !1)); for (a = 0; a < tl.length; a++) { var p, d = tl[a]; if (p = e[d]) { var f = s.ensureState(d), g = !!rt(p.getShallow(\"show\"), h); if (g !== h && (f.ignore = !g), f.style = $h(p, i && i[d], n, !0, !r), f.style.text = l[d], !r) t.ensureState(d).textConfig = Jh(p, n, !0) } } s.silent = !!u.getShallow(\"silent\"), null != s.style.x && (c.x = s.style.x), null != s.style.y && (c.y = s.style.y), s.ignore = !h, s.useStyle(c), s.dirty(), n.enableTextSetter && (rc(s).setLabelText = function (t) { var i = jh(n, e, t); Zh(s, i) }) } else s && (s.ignore = !0); t.dirty() } function Kh(t, e) { e = e || \"label\"; for (var n = { normal: t.getModel(e) }, i = 0; i < tl.length; i++) { var r = tl[i]; n[r] = t.getModel([r, e]) } return n } function $h(t, e, n, i, r) { var o = {}; return function (t, e, n, i, r) { n = n || Xh; var o, a = e.ecModel, s = a && a.option.textStyle, l = function (t) { var e; for (; t && t !== t.ecModel;) { var n = (t.option || Xh).rich; if (n) { e = e || {}; for (var i = G(n), r = 0; r < i.length; r++) { e[i[r]] = 1 } } t = t.parentModel } return e }(e); if (l) for (var u in o = {}, l) if (l.hasOwnProperty(u)) { var h = e.getModel([\"rich\", u]); nc(o[u] = {}, h, s, n, i, r, !1, !0) } o && (t.rich = o); var c = e.get(\"overflow\"); c && (t.overflow = c); var p = e.get(\"minMargin\"); null != p && (t.margin = p); nc(t, e, s, n, i, r, !0, !1) }(o, t, n, i, r), e && A(o, e), o } function Jh(t, e, n) { e = e || {}; var i, r = {}, o = t.getShallow(\"rotate\"), a = rt(t.getShallow(\"distance\"), n ? null : 5), s = t.getShallow(\"offset\"); return \"outside\" === (i = t.getShallow(\"position\") || (n ? null : \"inside\")) && (i = e.defaultOutsidePosition || \"top\"), null != i && (r.position = i), null != s && (r.offset = s), null != o && (o *= Math.PI / 180, r.rotation = o), null != a && (r.distance = a), r.outsideFill = \"inherit\" === t.get(\"color\") ? e.inheritColor || null : \"auto\", r } var Qh = [\"fontStyle\", \"fontWeight\", \"fontSize\", \"fontFamily\", \"textShadowColor\", \"textShadowBlur\", \"textShadowOffsetX\", \"textShadowOffsetY\"], tc = [\"align\", \"lineHeight\", \"width\", \"height\", \"tag\", \"verticalAlign\"], ec = [\"padding\", \"borderWidth\", \"borderRadius\", \"borderDashOffset\", \"backgroundColor\", \"borderColor\", \"shadowColor\", \"shadowBlur\", \"shadowOffsetX\", \"shadowOffsetY\"]; function nc(t, e, n, i, r, o, a, s) { n = !r && n || Xh; var l = i && i.inheritColor, u = e.getShallow(\"color\"), h = e.getShallow(\"textBorderColor\"), c = rt(e.getShallow(\"opacity\"), n.opacity); \"inherit\" !== u && \"auto\" !== u || (u = l || null), \"inherit\" !== h && \"auto\" !== h || (h = l || null), o || (u = u || n.color, h = h || n.textBorderColor), null != u && (t.fill = u), null != h && (t.stroke = h); var p = rt(e.getShallow(\"textBorderWidth\"), n.textBorderWidth); null != p && (t.lineWidth = p); var d = rt(e.getShallow(\"textBorderType\"), n.textBorderType); null != d && (t.lineDash = d); var f = rt(e.getShallow(\"textBorderDashOffset\"), n.textBorderDashOffset); null != f && (t.lineDashOffset = f), r || null != c || s || (c = i && i.defaultOpacity), null != c && (t.opacity = c), r || o || null == t.fill && i.inheritColor && (t.fill = i.inheritColor); for (var g = 0; g < Qh.length; g++) { var y = Qh[g]; null != (m = rt(e.getShallow(y), n[y])) && (t[y] = m) } for (g = 0; g < tc.length; g++) { y = tc[g]; null != (m = e.getShallow(y)) && (t[y] = m) } if (null == t.verticalAlign) { var v = e.getShallow(\"baseline\"); null != v && (t.verticalAlign = v) } if (!a || !i.disableBox) { for (g = 0; g < ec.length; g++) { var m; y = ec[g]; null != (m = e.getShallow(y)) && (t[y] = m) } var x = e.getShallow(\"borderType\"); null != x && (t.borderDash = x), \"auto\" !== t.backgroundColor && \"inherit\" !== t.backgroundColor || !l || (t.backgroundColor = l), \"auto\" !== t.borderColor && \"inherit\" !== t.borderColor || !l || (t.borderColor = l) } } function ic(t, e) { var n = e && e.getModel(\"textStyle\"); return ut([t.fontStyle || n && n.getShallow(\"fontStyle\") || \"\", t.fontWeight || n && n.getShallow(\"fontWeight\") || \"\", (t.fontSize || n && n.getShallow(\"fontSize\") || 12) + \"px\", t.fontFamily || n && n.getShallow(\"fontFamily\") || \"sans-serif\"].join(\" \")) } var rc = Do(); function oc(t, e, n, i) { if (t) { var r = rc(t); r.prevValue = r.value, r.value = n; var o = e.normal; r.valueAnimation = o.get(\"valueAnimation\"), r.valueAnimation && (r.precision = o.get(\"precision\"), r.defaultInterpolatedText = i, r.statesModels = e) } } function ac(t, e, n, i, r) { var o = rc(t); if (o.valueAnimation && o.prevValue !== o.value) { var a = o.defaultInterpolatedText, s = rt(o.interpolatedValue, o.prevValue), l = o.value; t.percent = 0, (null == o.prevValue ? hh : uh)(t, { percent: 1 }, i, e, null, (function (i) { var u = zo(n, o.precision, s, l, i); o.interpolatedValue = 1 === i ? null : u; var h = jh({ labelDataIndex: e, labelFetcher: r, defaultText: a ? a(u) : u + \"\" }, o.statesModels, u); Zh(t, h) })) } } var sc, lc, uc = [\"textStyle\", \"color\"], hc = [\"fontStyle\", \"fontWeight\", \"fontSize\", \"fontFamily\", \"padding\", \"lineHeight\", \"rich\", \"width\", \"height\", \"overflow\"], cc = new Ns, pc = function () { function t() { } return t.prototype.getTextColor = function (t) { var e = this.ecModel; return this.getShallow(\"color\") || (!t && e ? e.get(uc) : null) }, t.prototype.getFont = function () { return ic({ fontStyle: this.getShallow(\"fontStyle\"), fontWeight: this.getShallow(\"fontWeight\"), fontSize: this.getShallow(\"fontSize\"), fontFamily: this.getShallow(\"fontFamily\") }, this.ecModel) }, t.prototype.getTextRect = function (t) { for (var e = { text: t, verticalAlign: this.getShallow(\"verticalAlign\") || this.getShallow(\"baseline\") }, n = 0; n < hc.length; n++)e[hc[n]] = this.getShallow(hc[n]); return cc.useStyle(e), cc.update(), cc.getBoundingRect() }, t }(), dc = [[\"lineWidth\", \"width\"], [\"stroke\", \"color\"], [\"opacity\"], [\"shadowBlur\"], [\"shadowOffsetX\"], [\"shadowOffsetY\"], [\"shadowColor\"], [\"lineDash\", \"type\"], [\"lineDashOffset\", \"dashOffset\"], [\"lineCap\", \"cap\"], [\"lineJoin\", \"join\"], [\"miterLimit\"]], fc = Zo(dc), gc = function () { function t() { } return t.prototype.getLineStyle = function (t) { return fc(this, t) }, t }(), yc = [[\"fill\", \"color\"], [\"stroke\", \"borderColor\"], [\"lineWidth\", \"borderWidth\"], [\"opacity\"], [\"shadowBlur\"], [\"shadowOffsetX\"], [\"shadowOffsetY\"], [\"shadowColor\"], [\"lineDash\", \"borderType\"], [\"lineDashOffset\", \"borderDashOffset\"], [\"lineCap\", \"borderCap\"], [\"lineJoin\", \"borderJoin\"], [\"miterLimit\", \"borderMiterLimit\"]], vc = Zo(yc), mc = function () { function t() { } return t.prototype.getItemStyle = function (t, e) { return vc(this, t, e) }, t }(), xc = function () { function t(t, e, n) { this.parentModel = e, this.ecModel = n, this.option = t } return t.prototype.init = function (t, e, n) { for (var i = [], r = 3; r < arguments.length; r++)i[r - 3] = arguments[r] }, t.prototype.mergeOption = function (t, e) { C(this.option, t, !0) }, t.prototype.get = function (t, e) { return null == t ? this.option : this._doGet(this.parsePath(t), !e && this.parentModel) }, t.prototype.getShallow = function (t, e) { var n = this.option, i = null == n ? n : n[t]; if (null == i && !e) { var r = this.parentModel; r && (i = r.getShallow(t)) } return i }, t.prototype.getModel = function (e, n) { var i = null != e, r = i ? this.parsePath(e) : null; return new t(i ? this._doGet(r) : this.option, n = n || this.parentModel && this.parentModel.getModel(this.resolveParentPath(r)), this.ecModel) }, t.prototype.isEmpty = function () { return null == this.option }, t.prototype.restoreData = function () { }, t.prototype.clone = function () { return new (0, this.constructor)(T(this.option)) }, t.prototype.parsePath = function (t) { return \"string\" == typeof t ? t.split(\".\") : t }, t.prototype.resolveParentPath = function (t) { return t }, t.prototype.isAnimationEnabled = function () { if (!r.node && this.option) { if (null != this.option.animation) return !!this.option.animation; if (this.parentModel) return this.parentModel.isAnimationEnabled() } }, t.prototype._doGet = function (t, e) { var n = this.option; if (!t) return n; for (var i = 0; i < t.length && (!t[i] || null != (n = n && \"object\" == typeof n ? n[t[i]] : null)); i++); return null == n && e && (n = e._doGet(this.resolveParentPath(t), e.parentModel)), n }, t }(); Go(xc), sc = xc, lc = [\"__\\0is_clz\", Ho++].join(\"_\"), sc.prototype[lc] = !0, sc.isInstance = function (t) { return !(!t || !t[lc]) }, R(xc, gc), R(xc, mc), R(xc, qo), R(xc, pc); var _c = Math.round(10 * Math.random()); function bc(t) { return [t || \"\", _c++].join(\"_\") } function wc(t, e) { return C(C({}, t, !0), e, !0) } var Sc = \"ZH\", Mc = \"EN\", Ic = Mc, Tc = {}, Cc = {}, Dc = r.domSupported && (document.documentElement.lang || navigator.language || navigator.browserLanguage).toUpperCase().indexOf(Sc) > -1 ? Sc : Ic; function Ac(t, e) { t = t.toUpperCase(), Cc[t] = new xc(e), Tc[t] = e } function kc(t) { return Cc[t] } Ac(Mc, { time: { month: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"], monthAbbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], dayOfWeek: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], dayOfWeekAbbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"] }, legend: { selector: { all: \"All\", inverse: \"Inv\" } }, toolbox: { brush: { title: { rect: \"Box Select\", polygon: \"Lasso Select\", lineX: \"Horizontally Select\", lineY: \"Vertically Select\", keep: \"Keep Selections\", clear: \"Clear Selections\" } }, dataView: { title: \"Data View\", lang: [\"Data View\", \"Close\", \"Refresh\"] }, dataZoom: { title: { zoom: \"Zoom\", back: \"Zoom Reset\" } }, magicType: { title: { line: \"Switch to Line Chart\", bar: \"Switch to Bar Chart\", stack: \"Stack\", tiled: \"Tile\" } }, restore: { title: \"Restore\" }, saveAsImage: { title: \"Save as Image\", lang: [\"Right Click to Save Image\"] } }, series: { typeNames: { pie: \"Pie chart\", bar: \"Bar chart\", line: \"Line chart\", scatter: \"Scatter plot\", effectScatter: \"Ripple scatter plot\", radar: \"Radar chart\", tree: \"Tree\", treemap: \"Treemap\", boxplot: \"Boxplot\", candlestick: \"Candlestick\", k: \"K line chart\", heatmap: \"Heat map\", map: \"Map\", parallel: \"Parallel coordinate map\", lines: \"Line graph\", graph: \"Relationship graph\", sankey: \"Sankey diagram\", funnel: \"Funnel chart\", gauge: \"Gauge\", pictorialBar: \"Pictorial bar\", themeRiver: \"Theme River Map\", sunburst: \"Sunburst\" } }, aria: { general: { withTitle: 'This is a chart about \"{title}\"', withoutTitle: \"This is a chart\" }, series: { single: { prefix: \"\", withName: \" with type {seriesType} named {seriesName}.\", withoutName: \" with type {seriesType}.\" }, multiple: { prefix: \". It consists of {seriesCount} series count.\", withName: \" The {seriesId} series is a {seriesType} representing {seriesName}.\", withoutName: \" The {seriesId} series is a {seriesType}.\", separator: { middle: \"\", end: \"\" } } }, data: { allData: \"The data is as follows: \", partialData: \"The first {displayCnt} items are: \", withName: \"the data for {name} is {value}\", withoutName: \"{value}\", separator: { middle: \", \", end: \". \" } } } }), Ac(Sc, { time: { month: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"], monthAbbr: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"], dayOfWeek: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"], dayOfWeekAbbr: [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"] }, legend: { selector: { all: \"全选\", inverse: \"反选\" } }, toolbox: { brush: { title: { rect: \"矩形选择\", polygon: \"圈选\", lineX: \"横向选择\", lineY: \"纵向选择\", keep: \"保持选择\", clear: \"清除选择\" } }, dataView: { title: \"数据视图\", lang: [\"数据视图\", \"关闭\", \"刷新\"] }, dataZoom: { title: { zoom: \"区域缩放\", back: \"区域缩放还原\" } }, magicType: { title: { line: \"切换为折线图\", bar: \"切换为柱状图\", stack: \"切换为堆叠\", tiled: \"切换为平铺\" } }, restore: { title: \"还原\" }, saveAsImage: { title: \"保存为图片\", lang: [\"右键另存为图片\"] } }, series: { typeNames: { pie: \"饼图\", bar: \"柱状图\", line: \"折线图\", scatter: \"散点图\", effectScatter: \"涟漪散点图\", radar: \"雷达图\", tree: \"树图\", treemap: \"矩形树图\", boxplot: \"箱型图\", candlestick: \"K线图\", k: \"K线图\", heatmap: \"热力图\", map: \"地图\", parallel: \"平行坐标图\", lines: \"线图\", graph: \"关系图\", sankey: \"桑基图\", funnel: \"漏斗图\", gauge: \"仪表盘图\", pictorialBar: \"象形柱图\", themeRiver: \"主题河流图\", sunburst: \"旭日图\" } }, aria: { general: { withTitle: \"这是一个关于“{title}”的图表。\", withoutTitle: \"这是一个图表，\" }, series: { single: { prefix: \"\", withName: \"图表类型是{seriesType}，表示{seriesName}。\", withoutName: \"图表类型是{seriesType}。\" }, multiple: { prefix: \"它由{seriesCount}个图表系列组成。\", withName: \"第{seriesId}个系列是一个表示{seriesName}的{seriesType}，\", withoutName: \"第{seriesId}个系列是一个{seriesType}，\", separator: { middle: \"；\", end: \"。\" } } }, data: { allData: \"其数据是——\", partialData: \"其中，前{displayCnt}项是——\", withName: \"{name}的数据是{value}\", withoutName: \"{value}\", separator: { middle: \"，\", end: \"\" } } } }); var Lc = 1e3, Pc = 6e4, Oc = 36e5, Rc = 864e5, Nc = 31536e6, Ec = { year: \"{yyyy}\", month: \"{MMM}\", day: \"{d}\", hour: \"{HH}:{mm}\", minute: \"{HH}:{mm}\", second: \"{HH}:{mm}:{ss}\", millisecond: \"{HH}:{mm}:{ss} {SSS}\", none: \"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}\" }, zc = \"{yyyy}-{MM}-{dd}\", Vc = { year: \"{yyyy}\", month: \"{yyyy}-{MM}\", day: zc, hour: \"{yyyy}-{MM}-{dd} \" + Ec.hour, minute: \"{yyyy}-{MM}-{dd} \" + Ec.minute, second: \"{yyyy}-{MM}-{dd} \" + Ec.second, millisecond: Ec.none }, Bc = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"], Fc = [\"year\", \"half-year\", \"quarter\", \"month\", \"week\", \"half-week\", \"day\", \"half-day\", \"quarter-day\", \"hour\", \"minute\", \"second\", \"millisecond\"]; function Gc(t, e) { return \"0000\".substr(0, e - (t += \"\").length) + t } function Wc(t) { switch (t) { case \"half-year\": case \"quarter\": return \"month\"; case \"week\": case \"half-week\": return \"day\"; case \"half-day\": case \"quarter-day\": return \"hour\"; default: return t } } function Hc(t) { return t === Wc(t) } function Yc(t, e, n, i) { var r = Qr(t), o = r[Zc(n)](), a = r[jc(n)]() + 1, s = Math.floor((a - 1) / 3) + 1, l = r[qc(n)](), u = r[\"get\" + (n ? \"UTC\" : \"\") + \"Day\"](), h = r[Kc(n)](), c = (h - 1) % 12 + 1, p = r[$c(n)](), d = r[Jc(n)](), f = r[Qc(n)](), g = (i instanceof xc ? i : kc(i || Dc) || Cc.EN).getModel(\"time\"), y = g.get(\"month\"), v = g.get(\"monthAbbr\"), m = g.get(\"dayOfWeek\"), x = g.get(\"dayOfWeekAbbr\"); return (e || \"\").replace(/{yyyy}/g, o + \"\").replace(/{yy}/g, o % 100 + \"\").replace(/{Q}/g, s + \"\").replace(/{MMMM}/g, y[a - 1]).replace(/{MMM}/g, v[a - 1]).replace(/{MM}/g, Gc(a, 2)).replace(/{M}/g, a + \"\").replace(/{dd}/g, Gc(l, 2)).replace(/{d}/g, l + \"\").replace(/{eeee}/g, m[u]).replace(/{ee}/g, x[u]).replace(/{e}/g, u + \"\").replace(/{HH}/g, Gc(h, 2)).replace(/{H}/g, h + \"\").replace(/{hh}/g, Gc(c + \"\", 2)).replace(/{h}/g, c + \"\").replace(/{mm}/g, Gc(p, 2)).replace(/{m}/g, p + \"\").replace(/{ss}/g, Gc(d, 2)).replace(/{s}/g, d + \"\").replace(/{SSS}/g, Gc(f, 3)).replace(/{S}/g, f + \"\") } function Uc(t, e) { var n = Qr(t), i = n[jc(e)]() + 1, r = n[qc(e)](), o = n[Kc(e)](), a = n[$c(e)](), s = n[Jc(e)](), l = 0 === n[Qc(e)](), u = l && 0 === s, h = u && 0 === a, c = h && 0 === o, p = c && 1 === r; return p && 1 === i ? \"year\" : p ? \"month\" : c ? \"day\" : h ? \"hour\" : u ? \"minute\" : l ? \"second\" : \"millisecond\" } function Xc(t, e, n) { var i = j(t) ? Qr(t) : t; switch (e = e || Uc(t, n)) { case \"year\": return i[Zc(n)](); case \"half-year\": return i[jc(n)]() >= 6 ? 1 : 0; case \"quarter\": return Math.floor((i[jc(n)]() + 1) / 4); case \"month\": return i[jc(n)](); case \"day\": return i[qc(n)](); case \"half-day\": return i[Kc(n)]() / 24; case \"hour\": return i[Kc(n)](); case \"minute\": return i[$c(n)](); case \"second\": return i[Jc(n)](); case \"millisecond\": return i[Qc(n)]() } } function Zc(t) { return t ? \"getUTCFullYear\" : \"getFullYear\" } function jc(t) { return t ? \"getUTCMonth\" : \"getMonth\" } function qc(t) { return t ? \"getUTCDate\" : \"getDate\" } function Kc(t) { return t ? \"getUTCHours\" : \"getHours\" } function $c(t) { return t ? \"getUTCMinutes\" : \"getMinutes\" } function Jc(t) { return t ? \"getUTCSeconds\" : \"getSeconds\" } function Qc(t) { return t ? \"getUTCMilliseconds\" : \"getMilliseconds\" } function tp(t) { return t ? \"setUTCFullYear\" : \"setFullYear\" } function ep(t) { return t ? \"setUTCMonth\" : \"setMonth\" } function np(t) { return t ? \"setUTCDate\" : \"setDate\" } function ip(t) { return t ? \"setUTCHours\" : \"setHours\" } function rp(t) { return t ? \"setUTCMinutes\" : \"setMinutes\" } function op(t) { return t ? \"setUTCSeconds\" : \"setSeconds\" } function ap(t) { return t ? \"setUTCMilliseconds\" : \"setMilliseconds\" } function sp(t) { if (!ao(t)) return X(t) ? t : \"-\"; var e = (t + \"\").split(\".\"); return e[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g, \"$1,\") + (e.length > 1 ? \".\" + e[1] : \"\") } function lp(t, e) { return t = (t || \"\").toLowerCase().replace(/-(.)/g, (function (t, e) { return e.toUpperCase() })), e && t && (t = t.charAt(0).toUpperCase() + t.slice(1)), t } var up = st; function hp(t, e, n) { function i(t) { return t && ut(t) ? t : \"-\" } function r(t) { return !(null == t || isNaN(t) || !isFinite(t)) } var o = \"time\" === e, a = t instanceof Date; if (o || a) { var s = o ? Qr(t) : t; if (!isNaN(+s)) return Yc(s, \"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}\", n); if (a) return \"-\" } if (\"ordinal\" === e) return Z(t) ? i(t) : j(t) && r(t) ? t + \"\" : \"-\"; var l = oo(t); return r(l) ? sp(l) : Z(t) ? i(t) : \"boolean\" == typeof t ? t + \"\" : \"-\" } var cp = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\"], pp = function (t, e) { return \"{\" + t + (null == e ? \"\" : e) + \"}\" }; function dp(t, e, n) { Y(e) || (e = [e]); var i = e.length; if (!i) return \"\"; for (var r = e[0].$vars || [], o = 0; o < r.length; o++) { var a = cp[o]; t = t.replace(pp(a), pp(a, 0)) } for (var s = 0; s < i; s++)for (var l = 0; l < r.length; l++) { var u = e[s][r[l]]; t = t.replace(pp(cp[l], s), n ? ee(u) : u) } return t } function fp(t, e) { var n = X(t) ? { color: t, extraCssText: e } : t || {}, i = n.color, r = n.type; e = n.extraCssText; var o = n.renderMode || \"html\"; return i ? \"html\" === o ? \"subItem\" === r ? '<span style=\"display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:' + ee(i) + \";\" + (e || \"\") + '\"></span>' : '<span style=\"display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:' + ee(i) + \";\" + (e || \"\") + '\"></span>' : { renderMode: o, content: \"{\" + (n.markerId || \"markerX\") + \"|}  \", style: \"subItem\" === r ? { width: 4, height: 4, borderRadius: 2, backgroundColor: i } : { width: 10, height: 10, borderRadius: 5, backgroundColor: i } } : \"\" } function gp(t, e) { return e = e || \"transparent\", X(t) ? t : q(t) && t.colorStops && (t.colorStops[0] || {}).color || e } function yp(t, e) { if (\"_blank\" === e || \"blank\" === e) { var n = window.open(); n.opener = null, n.location.href = t } else window.open(t, e) } var vp = E, mp = [\"left\", \"right\", \"top\", \"bottom\", \"width\", \"height\"], xp = [[\"width\", \"left\", \"right\"], [\"height\", \"top\", \"bottom\"]]; function _p(t, e, n, i, r) { var o = 0, a = 0; null == i && (i = 1 / 0), null == r && (r = 1 / 0); var s = 0; e.eachChild((function (l, u) { var h, c, p = l.getBoundingRect(), d = e.childAt(u + 1), f = d && d.getBoundingRect(); if (\"horizontal\" === t) { var g = p.width + (f ? -f.x + p.x : 0); (h = o + g) > i || l.newline ? (o = 0, h = g, a += s + n, s = p.height) : s = Math.max(s, p.height) } else { var y = p.height + (f ? -f.y + p.y : 0); (c = a + y) > r || l.newline ? (o += s + n, a = 0, c = y, s = p.width) : s = Math.max(s, p.width) } l.newline || (l.x = o, l.y = a, l.markRedraw(), \"horizontal\" === t ? o = h + n : a = c + n) })) } var bp = _p; H(_p, \"vertical\"), H(_p, \"horizontal\"); function wp(t, e, n) { n = up(n || 0); var i = e.width, r = e.height, o = Gr(t.left, i), a = Gr(t.top, r), s = Gr(t.right, i), l = Gr(t.bottom, r), u = Gr(t.width, i), h = Gr(t.height, r), c = n[2] + n[0], p = n[1] + n[3], d = t.aspect; switch (isNaN(u) && (u = i - s - p - o), isNaN(h) && (h = r - l - c - a), null != d && (isNaN(u) && isNaN(h) && (d > i / r ? u = .8 * i : h = .8 * r), isNaN(u) && (u = d * h), isNaN(h) && (h = u / d)), isNaN(o) && (o = i - s - u - p), isNaN(a) && (a = r - l - h - c), t.left || t.right) { case \"center\": o = i / 2 - u / 2 - n[3]; break; case \"right\": o = i - u - p }switch (t.top || t.bottom) { case \"middle\": case \"center\": a = r / 2 - h / 2 - n[0]; break; case \"bottom\": a = r - h - c }o = o || 0, a = a || 0, isNaN(u) && (u = i - p - o - (s || 0)), isNaN(h) && (h = r - c - a - (l || 0)); var f = new Re(o + n[3], a + n[0], u, h); return f.margin = n, f } function Sp(t, e, n, i, r, o) { var a, s = !r || !r.hv || r.hv[0], l = !r || !r.hv || r.hv[1], u = r && r.boundingMode || \"all\"; if ((o = o || t).x = t.x, o.y = t.y, !s && !l) return !1; if (\"raw\" === u) a = \"group\" === t.type ? new Re(0, 0, +e.width || 0, +e.height || 0) : t.getBoundingRect(); else if (a = t.getBoundingRect(), t.needLocalTransform()) { var h = t.getLocalTransform(); (a = a.clone()).applyTransform(h) } var c = wp(k({ width: a.width, height: a.height }, e), n, i), p = s ? c.x - a.x : 0, d = l ? c.y - a.y : 0; return \"raw\" === u ? (o.x = p, o.y = d) : (o.x += p, o.y += d), o === t && t.markRedraw(), !0 } function Mp(t) { var e = t.layoutMode || t.constructor.layoutMode; return q(e) ? e : e ? { type: e } : null } function Ip(t, e, n) { var i = n && n.ignoreSize; !Y(i) && (i = [i, i]); var r = a(xp[0], 0), o = a(xp[1], 1); function a(n, r) { var o = {}, a = 0, u = {}, h = 0; if (vp(n, (function (e) { u[e] = t[e] })), vp(n, (function (t) { s(e, t) && (o[t] = u[t] = e[t]), l(o, t) && a++, l(u, t) && h++ })), i[r]) return l(e, n[1]) ? u[n[2]] = null : l(e, n[2]) && (u[n[1]] = null), u; if (2 !== h && a) { if (a >= 2) return o; for (var c = 0; c < n.length; c++) { var p = n[c]; if (!s(o, p) && s(t, p)) { o[p] = t[p]; break } } return o } return u } function s(t, e) { return t.hasOwnProperty(e) } function l(t, e) { return null != t[e] && \"auto\" !== t[e] } function u(t, e, n) { vp(t, (function (t) { e[t] = n[t] })) } u(xp[0], t, r), u(xp[1], t, o) } function Tp(t) { return Cp({}, t) } function Cp(t, e) { return e && t && vp(mp, (function (n) { e.hasOwnProperty(n) && (t[n] = e[n]) })), t } var Dp = Do(), Ap = function (t) { function e(e, n, i) { var r = t.call(this, e, n, i) || this; return r.uid = bc(\"ec_cpt_model\"), r } return n(e, t), e.prototype.init = function (t, e, n) { this.mergeDefaultAndTheme(t, n) }, e.prototype.mergeDefaultAndTheme = function (t, e) { var n = Mp(this), i = n ? Tp(t) : {}; C(t, e.getTheme().get(this.mainType)), C(t, this.getDefaultOption()), n && Ip(t, i, n) }, e.prototype.mergeOption = function (t, e) { C(this.option, t, !0); var n = Mp(this); n && Ip(this.option, t, n) }, e.prototype.optionUpdated = function (t, e) { }, e.prototype.getDefaultOption = function () { var t = this.constructor; if (!function (t) { return !(!t || !t[Bo]) }(t)) return t.defaultOption; var e = Dp(this); if (!e.defaultOption) { for (var n = [], i = t; i;) { var r = i.prototype.defaultOption; r && n.push(r), i = i.superClass } for (var o = {}, a = n.length - 1; a >= 0; a--)o = C(o, n[a], !0); e.defaultOption = o } return e.defaultOption }, e.prototype.getReferringComponents = function (t, e) { var n = t + \"Index\", i = t + \"Id\"; return Ro(this.ecModel, t, { index: this.get(n, !0), id: this.get(i, !0) }, e) }, e.prototype.getBoxLayoutParams = function () { var t = this; return { left: t.get(\"left\"), top: t.get(\"top\"), right: t.get(\"right\"), bottom: t.get(\"bottom\"), width: t.get(\"width\"), height: t.get(\"height\") } }, e.prototype.getZLevelKey = function () { return \"\" }, e.prototype.setZLevel = function (t) { this.option.zlevel = t }, e.protoInitialize = function () { var t = e.prototype; t.type = \"component\", t.id = \"\", t.name = \"\", t.mainType = \"\", t.subType = \"\", t.componentIndex = 0 }(), e }(xc); Wo(Ap, xc), Xo(Ap), function (t) { var e = {}; t.registerSubTypeDefaulter = function (t, n) { var i = Fo(t); e[i.main] = n }, t.determineSubType = function (n, i) { var r = i.type; if (!r) { var o = Fo(n).main; t.hasSubTypes(n) && e[o] && (r = e[o](i)) } return r } }(Ap), function (t, e) { function n(t, e) { return t[e] || (t[e] = { predecessor: [], successor: [] }), t[e] } t.topologicalTravel = function (t, i, r, o) { if (t.length) { var a = function (t) { var i = {}, r = []; return E(t, (function (o) { var a = n(i, o), s = function (t, e) { var n = []; return E(t, (function (t) { P(e, t) >= 0 && n.push(t) })), n }(a.originalDeps = e(o), t); a.entryCount = s.length, 0 === a.entryCount && r.push(o), E(s, (function (t) { P(a.predecessor, t) < 0 && a.predecessor.push(t); var e = n(i, t); P(e.successor, t) < 0 && e.successor.push(o) })) })), { graph: i, noEntryList: r } }(i), s = a.graph, l = a.noEntryList, u = {}; for (E(t, (function (t) { u[t] = !0 })); l.length;) { var h = l.pop(), c = s[h], p = !!u[h]; p && (r.call(o, h, c.originalDeps.slice()), delete u[h]), E(c.successor, p ? f : d) } E(u, (function () { var t = \"\"; throw new Error(t) })) } function d(t) { s[t].entryCount--, 0 === s[t].entryCount && l.push(t) } function f(t) { u[t] = !0, d(t) } } }(Ap, (function (t) { var e = []; E(Ap.getClassesByMainType(t), (function (t) { e = e.concat(t.dependencies || t.prototype.dependencies || []) })), e = z(e, (function (t) { return Fo(t).main })), \"dataset\" !== t && P(e, \"dataset\") <= 0 && e.unshift(\"dataset\"); return e })); var kp = \"\"; \"undefined\" != typeof navigator && (kp = navigator.platform || \"\"); var Lp = \"rgba(0, 0, 0, 0.2)\", Pp = { darkMode: \"auto\", colorBy: \"series\", color: [\"#5470c6\", \"#91cc75\", \"#fac858\", \"#ee6666\", \"#73c0de\", \"#3ba272\", \"#fc8452\", \"#9a60b4\", \"#ea7ccc\"], gradientColor: [\"#f6efa6\", \"#d88273\", \"#bf444c\"], aria: { decal: { decals: [{ color: Lp, dashArrayX: [1, 0], dashArrayY: [2, 5], symbolSize: 1, rotation: Math.PI / 6 }, { color: Lp, symbol: \"circle\", dashArrayX: [[8, 8], [0, 8, 8, 0]], dashArrayY: [6, 0], symbolSize: .8 }, { color: Lp, dashArrayX: [1, 0], dashArrayY: [4, 3], rotation: -Math.PI / 4 }, { color: Lp, dashArrayX: [[6, 6], [0, 6, 6, 0]], dashArrayY: [6, 0] }, { color: Lp, dashArrayX: [[1, 0], [1, 6]], dashArrayY: [1, 0, 6, 0], rotation: Math.PI / 4 }, { color: Lp, symbol: \"triangle\", dashArrayX: [[9, 9], [0, 9, 9, 0]], dashArrayY: [7, 2], symbolSize: .75 }] } }, textStyle: { fontFamily: kp.match(/^Win/) ? \"Microsoft YaHei\" : \"sans-serif\", fontSize: 12, fontStyle: \"normal\", fontWeight: \"normal\" }, blendMode: null, stateAnimation: { duration: 300, easing: \"cubicOut\" }, animation: \"auto\", animationDuration: 1e3, animationDurationUpdate: 500, animationEasing: \"cubicInOut\", animationEasingUpdate: \"cubicInOut\", animationThreshold: 2e3, progressiveThreshold: 3e3, progressive: 400, hoverLayerThreshold: 3e3, useUTC: !1 }, Op = ft([\"tooltip\", \"label\", \"itemName\", \"itemId\", \"itemGroupId\", \"seriesName\"]), Rp = \"original\", Np = \"arrayRows\", Ep = \"objectRows\", zp = \"keyedColumns\", Vp = \"typedArray\", Bp = \"unknown\", Fp = \"column\", Gp = \"row\", Wp = 1, Hp = 2, Yp = 3, Up = Do(); function Xp(t, e, n) { var i = {}, r = jp(e); if (!r || !t) return i; var o, a, s = [], l = [], u = e.ecModel, h = Up(u).datasetMap, c = r.uid + \"_\" + n.seriesLayoutBy; E(t = t.slice(), (function (e, n) { var r = q(e) ? e : t[n] = { name: e }; \"ordinal\" === r.type && null == o && (o = n, a = f(r)), i[r.name] = [] })); var p = h.get(c) || h.set(c, { categoryWayDim: a, valueWayDim: 0 }); function d(t, e, n) { for (var i = 0; i < n; i++)t.push(e + i) } function f(t) { var e = t.dimsDef; return e ? e.length : 1 } return E(t, (function (t, e) { var n = t.name, r = f(t); if (null == o) { var a = p.valueWayDim; d(i[n], a, r), d(l, a, r), p.valueWayDim += r } else if (o === e) d(i[n], 0, r), d(s, 0, r); else { a = p.categoryWayDim; d(i[n], a, r), d(l, a, r), p.categoryWayDim += r } })), s.length && (i.itemName = s), l.length && (i.seriesName = l), i } function Zp(t, e, n) { var i = {}; if (!jp(t)) return i; var r, o = e.sourceFormat, a = e.dimensionsDefine; o !== Ep && o !== zp || E(a, (function (t, e) { \"name\" === (q(t) ? t.name : t) && (r = e) })); var s = function () { for (var t = {}, i = {}, s = [], l = 0, u = Math.min(5, n); l < u; l++) { var h = Kp(e.data, o, e.seriesLayoutBy, a, e.startIndex, l); s.push(h); var c = h === Yp; if (c && null == t.v && l !== r && (t.v = l), (null == t.n || t.n === t.v || !c && s[t.n] === Yp) && (t.n = l), p(t) && s[t.n] !== Yp) return t; c || (h === Hp && null == i.v && l !== r && (i.v = l), null != i.n && i.n !== i.v || (i.n = l)) } function p(t) { return null != t.v && null != t.n } return p(t) ? t : p(i) ? i : null }(); if (s) { i.value = [s.v]; var l = null != r ? r : s.n; i.itemName = [l], i.seriesName = [l] } return i } function jp(t) { if (!t.get(\"data\", !0)) return Ro(t.ecModel, \"dataset\", { index: t.get(\"datasetIndex\", !0), id: t.get(\"datasetId\", !0) }, Po).models[0] } function qp(t, e) { return Kp(t.data, t.sourceFormat, t.seriesLayoutBy, t.dimensionsDefine, t.startIndex, e) } function Kp(t, e, n, i, r, o) { var a, s, l; if ($(t)) return Yp; if (i) { var u = i[o]; q(u) ? (s = u.name, l = u.type) : X(u) && (s = u) } if (null != l) return \"ordinal\" === l ? Wp : Yp; if (e === Np) { var h = t; if (n === Gp) { for (var c = h[o], p = 0; p < (c || []).length && p < 5; p++)if (null != (a = m(c[r + p]))) return a } else for (p = 0; p < h.length && p < 5; p++) { var d = h[r + p]; if (d && null != (a = m(d[o]))) return a } } else if (e === Ep) { var f = t; if (!s) return Yp; for (p = 0; p < f.length && p < 5; p++) { if ((y = f[p]) && null != (a = m(y[s]))) return a } } else if (e === zp) { if (!s) return Yp; if (!(c = t[s]) || $(c)) return Yp; for (p = 0; p < c.length && p < 5; p++)if (null != (a = m(c[p]))) return a } else if (e === Rp) { var g = t; for (p = 0; p < g.length && p < 5; p++) { var y, v = xo(y = g[p]); if (!Y(v)) return Yp; if (null != (a = m(v[o]))) return a } } function m(t) { var e = X(t); return null != t && isFinite(t) && \"\" !== t ? e ? Hp : Yp : e && \"-\" !== t ? Wp : void 0 } return Yp } var $p = ft(); var Jp, Qp, td, ed = Do(), nd = Do(), id = function () { function t() { } return t.prototype.getColorFromPalette = function (t, e, n) { var i = yo(this.get(\"color\", !0)), r = this.get(\"colorLayer\", !0); return od(this, ed, i, r, t, e, n) }, t.prototype.clearColorPalette = function () { !function (t, e) { e(t).paletteIdx = 0, e(t).paletteNameMap = {} }(this, ed) }, t }(); function rd(t, e, n, i) { var r = yo(t.get([\"aria\", \"decal\", \"decals\"])); return od(t, nd, r, null, e, n, i) } function od(t, e, n, i, r, o, a) { var s = e(o = o || t), l = s.paletteIdx || 0, u = s.paletteNameMap = s.paletteNameMap || {}; if (u.hasOwnProperty(r)) return u[r]; var h = null != a && i ? function (t, e) { for (var n = t.length, i = 0; i < n; i++)if (t[i].length > e) return t[i]; return t[n - 1] }(i, a) : n; if ((h = h || n) && h.length) { var c = h[l]; return r && (u[r] = c), s.paletteIdx = (l + 1) % h.length, c } } var ad = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.init = function (t, e, n, i, r, o) { i = i || {}, this.option = null, this._theme = new xc(i), this._locale = new xc(r), this._optionManager = o }, e.prototype.setOption = function (t, e, n) { var i = ud(e); this._optionManager.setOption(t, n, i), this._resetOption(null, i) }, e.prototype.resetOption = function (t, e) { return this._resetOption(t, ud(e)) }, e.prototype._resetOption = function (t, e) { var n = !1, i = this._optionManager; if (!t || \"recreate\" === t) { var r = i.mountOption(\"recreate\" === t); 0, this.option && \"recreate\" !== t ? (this.restoreData(), this._mergeOption(r, e)) : td(this, r), n = !0 } if (\"timeline\" !== t && \"media\" !== t || this.restoreData(), !t || \"recreate\" === t || \"timeline\" === t) { var o = i.getTimelineOption(this); o && (n = !0, this._mergeOption(o, e)) } if (!t || \"recreate\" === t || \"media\" === t) { var a = i.getMediaOption(this); a.length && E(a, (function (t) { n = !0, this._mergeOption(t, e) }), this) } return n }, e.prototype.mergeOption = function (t) { this._mergeOption(t, null) }, e.prototype._mergeOption = function (t, e) { var n = this.option, i = this._componentsMap, r = this._componentsCount, o = [], a = ft(), s = e && e.replaceMergeMainTypeMap; Up(this).datasetMap = ft(), E(t, (function (t, e) { null != t && (Ap.hasClass(e) ? e && (o.push(e), a.set(e, !0)) : n[e] = null == n[e] ? T(t) : C(n[e], t, !0)) })), s && s.each((function (t, e) { Ap.hasClass(e) && !a.get(e) && (o.push(e), a.set(e, !0)) })), Ap.topologicalTravel(o, Ap.getAllClassMainTypes(), (function (e) { var o = function (t, e, n) { var i = $p.get(e); if (!i) return n; var r = i(t); return r ? n.concat(r) : n }(this, e, yo(t[e])), a = i.get(e), l = a ? s && s.get(e) ? \"replaceMerge\" : \"normalMerge\" : \"replaceAll\", u = bo(a, o, l); (function (t, e, n) { E(t, (function (t) { var i = t.newOption; q(i) && (t.keyInfo.mainType = e, t.keyInfo.subType = function (t, e, n, i) { return e.type ? e.type : n ? n.subType : i.determineSubType(t, e) }(e, i, t.existing, n)) })) })(u, e, Ap), n[e] = null, i.set(e, null), r.set(e, 0); var h, c = [], p = [], d = 0; E(u, (function (t, n) { var i = t.existing, r = t.newOption; if (r) { var o = \"series\" === e, a = Ap.getClass(e, t.keyInfo.subType, !o); if (!a) return; if (\"tooltip\" === e) { if (h) return void 0; h = !0 } if (i && i.constructor === a) i.name = t.keyInfo.name, i.mergeOption(r, this), i.optionUpdated(r, !1); else { var s = A({ componentIndex: n }, t.keyInfo); A(i = new a(r, this, this, s), s), t.brandNew && (i.__requireNewView = !0), i.init(r, this, this), i.optionUpdated(null, !0) } } else i && (i.mergeOption({}, this), i.optionUpdated({}, !1)); i ? (c.push(i.option), p.push(i), d++) : (c.push(void 0), p.push(void 0)) }), this), n[e] = c, i.set(e, p), r.set(e, d), \"series\" === e && Jp(this) }), this), this._seriesIndices || Jp(this) }, e.prototype.getOption = function () { var t = T(this.option); return E(t, (function (e, n) { if (Ap.hasClass(n)) { for (var i = yo(e), r = i.length, o = !1, a = r - 1; a >= 0; a--)i[a] && !To(i[a]) ? o = !0 : (i[a] = null, !o && r--); i.length = r, t[n] = i } })), delete t[\"\\0_ec_inner\"], t }, e.prototype.getTheme = function () { return this._theme }, e.prototype.getLocaleModel = function () { return this._locale }, e.prototype.setUpdatePayload = function (t) { this._payload = t }, e.prototype.getUpdatePayload = function () { return this._payload }, e.prototype.getComponent = function (t, e) { var n = this._componentsMap.get(t); if (n) { var i = n[e || 0]; if (i) return i; if (null == e) for (var r = 0; r < n.length; r++)if (n[r]) return n[r] } }, e.prototype.queryComponents = function (t) { var e = t.mainType; if (!e) return []; var n, i = t.index, r = t.id, o = t.name, a = this._componentsMap.get(e); return a && a.length ? (null != i ? (n = [], E(yo(i), (function (t) { a[t] && n.push(a[t]) }))) : n = null != r ? sd(\"id\", r, a) : null != o ? sd(\"name\", o, a) : B(a, (function (t) { return !!t })), ld(n, t)) : [] }, e.prototype.findComponents = function (t) { var e, n, i, r, o, a = t.query, s = t.mainType, l = (n = s + \"Index\", i = s + \"Id\", r = s + \"Name\", !(e = a) || null == e[n] && null == e[i] && null == e[r] ? null : { mainType: s, index: e[n], id: e[i], name: e[r] }), u = l ? this.queryComponents(l) : B(this._componentsMap.get(s), (function (t) { return !!t })); return o = ld(u, t), t.filter ? B(o, t.filter) : o }, e.prototype.eachComponent = function (t, e, n) { var i = this._componentsMap; if (U(t)) { var r = e, o = t; i.each((function (t, e) { for (var n = 0; t && n < t.length; n++) { var i = t[n]; i && o.call(r, e, i, i.componentIndex) } })) } else for (var a = X(t) ? i.get(t) : q(t) ? this.findComponents(t) : null, s = 0; a && s < a.length; s++) { var l = a[s]; l && e.call(n, l, l.componentIndex) } }, e.prototype.getSeriesByName = function (t) { var e = Mo(t, null); return B(this._componentsMap.get(\"series\"), (function (t) { return !!t && null != e && t.name === e })) }, e.prototype.getSeriesByIndex = function (t) { return this._componentsMap.get(\"series\")[t] }, e.prototype.getSeriesByType = function (t) { return B(this._componentsMap.get(\"series\"), (function (e) { return !!e && e.subType === t })) }, e.prototype.getSeries = function () { return B(this._componentsMap.get(\"series\"), (function (t) { return !!t })) }, e.prototype.getSeriesCount = function () { return this._componentsCount.get(\"series\") }, e.prototype.eachSeries = function (t, e) { Qp(this), E(this._seriesIndices, (function (n) { var i = this._componentsMap.get(\"series\")[n]; t.call(e, i, n) }), this) }, e.prototype.eachRawSeries = function (t, e) { E(this._componentsMap.get(\"series\"), (function (n) { n && t.call(e, n, n.componentIndex) })) }, e.prototype.eachSeriesByType = function (t, e, n) { Qp(this), E(this._seriesIndices, (function (i) { var r = this._componentsMap.get(\"series\")[i]; r.subType === t && e.call(n, r, i) }), this) }, e.prototype.eachRawSeriesByType = function (t, e, n) { return E(this.getSeriesByType(t), e, n) }, e.prototype.isSeriesFiltered = function (t) { return Qp(this), null == this._seriesIndicesMap.get(t.componentIndex) }, e.prototype.getCurrentSeriesIndices = function () { return (this._seriesIndices || []).slice() }, e.prototype.filterSeries = function (t, e) { Qp(this); var n = []; E(this._seriesIndices, (function (i) { var r = this._componentsMap.get(\"series\")[i]; t.call(e, r, i) && n.push(i) }), this), this._seriesIndices = n, this._seriesIndicesMap = ft(n) }, e.prototype.restoreData = function (t) { Jp(this); var e = this._componentsMap, n = []; e.each((function (t, e) { Ap.hasClass(e) && n.push(e) })), Ap.topologicalTravel(n, Ap.getAllClassMainTypes(), (function (n) { E(e.get(n), (function (e) { !e || \"series\" === n && function (t, e) { if (e) { var n = e.seriesIndex, i = e.seriesId, r = e.seriesName; return null != n && t.componentIndex !== n || null != i && t.id !== i || null != r && t.name !== r } }(e, t) || e.restoreData() })) })) }, e.internalField = (Jp = function (t) { var e = t._seriesIndices = []; E(t._componentsMap.get(\"series\"), (function (t) { t && e.push(t.componentIndex) })), t._seriesIndicesMap = ft(e) }, Qp = function (t) { }, void (td = function (t, e) { t.option = {}, t.option[\"\\0_ec_inner\"] = 1, t._componentsMap = ft({ series: [] }), t._componentsCount = ft(); var n = e.aria; q(n) && null == n.enabled && (n.enabled = !0), function (t, e) { var n = t.color && !t.colorLayer; E(e, (function (e, i) { \"colorLayer\" === i && n || Ap.hasClass(i) || (\"object\" == typeof e ? t[i] = t[i] ? C(t[i], e, !1) : T(e) : null == t[i] && (t[i] = e)) })) }(e, t._theme.option), C(e, Pp, !1), t._mergeOption(e, null) })), e }(xc); function sd(t, e, n) { if (Y(e)) { var i = ft(); return E(e, (function (t) { null != t && (null != Mo(t, null) && i.set(t, !0)) })), B(n, (function (e) { return e && i.get(e[t]) })) } var r = Mo(e, null); return B(n, (function (e) { return e && null != r && e[t] === r })) } function ld(t, e) { return e.hasOwnProperty(\"subType\") ? B(t, (function (t) { return t && t.subType === e.subType })) : t } function ud(t) { var e = ft(); return t && E(yo(t.replaceMerge), (function (t) { e.set(t, !0) })), { replaceMergeMainTypeMap: e } } R(ad, id); var hd = [\"getDom\", \"getZr\", \"getWidth\", \"getHeight\", \"getDevicePixelRatio\", \"dispatchAction\", \"isSSR\", \"isDisposed\", \"on\", \"off\", \"getDataURL\", \"getConnectedDataURL\", \"getOption\", \"getId\", \"updateLabelLayout\"], cd = function (t) { E(hd, (function (e) { this[e] = W(t[e], t) }), this) }, pd = {}, dd = function () { function t() { this._coordinateSystems = [] } return t.prototype.create = function (t, e) { var n = []; E(pd, (function (i, r) { var o = i.create(t, e); n = n.concat(o || []) })), this._coordinateSystems = n }, t.prototype.update = function (t, e) { E(this._coordinateSystems, (function (n) { n.update && n.update(t, e) })) }, t.prototype.getCoordinateSystems = function () { return this._coordinateSystems.slice() }, t.register = function (t, e) { pd[t] = e }, t.get = function (t) { return pd[t] }, t }(), fd = /^(min|max)?(.+)$/, gd = function () { function t(t) { this._timelineOptions = [], this._mediaList = [], this._currentMediaIndices = [], this._api = t } return t.prototype.setOption = function (t, e, n) { t && (E(yo(t.series), (function (t) { t && t.data && $(t.data) && ct(t.data) })), E(yo(t.dataset), (function (t) { t && t.source && $(t.source) && ct(t.source) }))), t = T(t); var i = this._optionBackup, r = function (t, e, n) { var i, r, o = [], a = t.baseOption, s = t.timeline, l = t.options, u = t.media, h = !!t.media, c = !!(l || s || a && a.timeline); a ? (r = a).timeline || (r.timeline = s) : ((c || h) && (t.options = t.media = null), r = t); h && Y(u) && E(u, (function (t) { t && t.option && (t.query ? o.push(t) : i || (i = t)) })); function p(t) { E(e, (function (e) { e(t, n) })) } return p(r), E(l, (function (t) { return p(t) })), E(o, (function (t) { return p(t.option) })), { baseOption: r, timelineOptions: l || [], mediaDefault: i, mediaList: o } }(t, e, !i); this._newBaseOption = r.baseOption, i ? (r.timelineOptions.length && (i.timelineOptions = r.timelineOptions), r.mediaList.length && (i.mediaList = r.mediaList), r.mediaDefault && (i.mediaDefault = r.mediaDefault)) : this._optionBackup = r }, t.prototype.mountOption = function (t) { var e = this._optionBackup; return this._timelineOptions = e.timelineOptions, this._mediaList = e.mediaList, this._mediaDefault = e.mediaDefault, this._currentMediaIndices = [], T(t ? e.baseOption : this._newBaseOption) }, t.prototype.getTimelineOption = function (t) { var e, n = this._timelineOptions; if (n.length) { var i = t.getComponent(\"timeline\"); i && (e = T(n[i.getCurrentIndex()])) } return e }, t.prototype.getMediaOption = function (t) { var e, n, i = this._api.getWidth(), r = this._api.getHeight(), o = this._mediaList, a = this._mediaDefault, s = [], l = []; if (!o.length && !a) return l; for (var u = 0, h = o.length; u < h; u++)yd(o[u].query, i, r) && s.push(u); return !s.length && a && (s = [-1]), s.length && (e = s, n = this._currentMediaIndices, e.join(\",\") !== n.join(\",\")) && (l = z(s, (function (t) { return T(-1 === t ? a.option : o[t].option) }))), this._currentMediaIndices = s, l }, t }(); function yd(t, e, n) { var i = { width: e, height: n, aspectratio: e / n }, r = !0; return E(t, (function (t, e) { var n = e.match(fd); if (n && n[1] && n[2]) { var o = n[1], a = n[2].toLowerCase(); (function (t, e, n) { return \"min\" === n ? t >= e : \"max\" === n ? t <= e : t === e })(i[a], t, o) || (r = !1) } })), r } var vd = E, md = q, xd = [\"areaStyle\", \"lineStyle\", \"nodeStyle\", \"linkStyle\", \"chordStyle\", \"label\", \"labelLine\"]; function _d(t) { var e = t && t.itemStyle; if (e) for (var n = 0, i = xd.length; n < i; n++) { var r = xd[n], o = e.normal, a = e.emphasis; o && o[r] && (t[r] = t[r] || {}, t[r].normal ? C(t[r].normal, o[r]) : t[r].normal = o[r], o[r] = null), a && a[r] && (t[r] = t[r] || {}, t[r].emphasis ? C(t[r].emphasis, a[r]) : t[r].emphasis = a[r], a[r] = null) } } function bd(t, e, n) { if (t && t[e] && (t[e].normal || t[e].emphasis)) { var i = t[e].normal, r = t[e].emphasis; i && (n ? (t[e].normal = t[e].emphasis = null, k(t[e], i)) : t[e] = i), r && (t.emphasis = t.emphasis || {}, t.emphasis[e] = r, r.focus && (t.emphasis.focus = r.focus), r.blurScope && (t.emphasis.blurScope = r.blurScope)) } } function wd(t) { bd(t, \"itemStyle\"), bd(t, \"lineStyle\"), bd(t, \"areaStyle\"), bd(t, \"label\"), bd(t, \"labelLine\"), bd(t, \"upperLabel\"), bd(t, \"edgeLabel\") } function Sd(t, e) { var n = md(t) && t[e], i = md(n) && n.textStyle; if (i) { 0; for (var r = 0, o = mo.length; r < o; r++) { var a = mo[r]; i.hasOwnProperty(a) && (n[a] = i[a]) } } } function Md(t) { t && (wd(t), Sd(t, \"label\"), t.emphasis && Sd(t.emphasis, \"label\")) } function Id(t) { return Y(t) ? t : t ? [t] : [] } function Td(t) { return (Y(t) ? t[0] : t) || {} } function Cd(t, e) { vd(Id(t.series), (function (t) { md(t) && function (t) { if (md(t)) { _d(t), wd(t), Sd(t, \"label\"), Sd(t, \"upperLabel\"), Sd(t, \"edgeLabel\"), t.emphasis && (Sd(t.emphasis, \"label\"), Sd(t.emphasis, \"upperLabel\"), Sd(t.emphasis, \"edgeLabel\")); var e = t.markPoint; e && (_d(e), Md(e)); var n = t.markLine; n && (_d(n), Md(n)); var i = t.markArea; i && Md(i); var r = t.data; if (\"graph\" === t.type) { r = r || t.nodes; var o = t.links || t.edges; if (o && !$(o)) for (var a = 0; a < o.length; a++)Md(o[a]); E(t.categories, (function (t) { wd(t) })) } if (r && !$(r)) for (a = 0; a < r.length; a++)Md(r[a]); if ((e = t.markPoint) && e.data) { var s = e.data; for (a = 0; a < s.length; a++)Md(s[a]) } if ((n = t.markLine) && n.data) { var l = n.data; for (a = 0; a < l.length; a++)Y(l[a]) ? (Md(l[a][0]), Md(l[a][1])) : Md(l[a]) } \"gauge\" === t.type ? (Sd(t, \"axisLabel\"), Sd(t, \"title\"), Sd(t, \"detail\")) : \"treemap\" === t.type ? (bd(t.breadcrumb, \"itemStyle\"), E(t.levels, (function (t) { wd(t) }))) : \"tree\" === t.type && wd(t.leaves) } }(t) })); var n = [\"xAxis\", \"yAxis\", \"radiusAxis\", \"angleAxis\", \"singleAxis\", \"parallelAxis\", \"radar\"]; e && n.push(\"valueAxis\", \"categoryAxis\", \"logAxis\", \"timeAxis\"), vd(n, (function (e) { vd(Id(t[e]), (function (t) { t && (Sd(t, \"axisLabel\"), Sd(t.axisPointer, \"label\")) })) })), vd(Id(t.parallel), (function (t) { var e = t && t.parallelAxisDefault; Sd(e, \"axisLabel\"), Sd(e && e.axisPointer, \"label\") })), vd(Id(t.calendar), (function (t) { bd(t, \"itemStyle\"), Sd(t, \"dayLabel\"), Sd(t, \"monthLabel\"), Sd(t, \"yearLabel\") })), vd(Id(t.radar), (function (t) { Sd(t, \"name\"), t.name && null == t.axisName && (t.axisName = t.name, delete t.name), null != t.nameGap && null == t.axisNameGap && (t.axisNameGap = t.nameGap, delete t.nameGap) })), vd(Id(t.geo), (function (t) { md(t) && (Md(t), vd(Id(t.regions), (function (t) { Md(t) }))) })), vd(Id(t.timeline), (function (t) { Md(t), bd(t, \"label\"), bd(t, \"itemStyle\"), bd(t, \"controlStyle\", !0); var e = t.data; Y(e) && E(e, (function (t) { q(t) && (bd(t, \"label\"), bd(t, \"itemStyle\")) })) })), vd(Id(t.toolbox), (function (t) { bd(t, \"iconStyle\"), vd(t.feature, (function (t) { bd(t, \"iconStyle\") })) })), Sd(Td(t.axisPointer), \"label\"), Sd(Td(t.tooltip).axisPointer, \"label\") } function Dd(t) { t && E(Ad, (function (e) { e[0] in t && !(e[1] in t) && (t[e[1]] = t[e[0]]) })) } var Ad = [[\"x\", \"left\"], [\"y\", \"top\"], [\"x2\", \"right\"], [\"y2\", \"bottom\"]], kd = [\"grid\", \"geo\", \"parallel\", \"legend\", \"toolbox\", \"title\", \"visualMap\", \"dataZoom\", \"timeline\"], Ld = [[\"borderRadius\", \"barBorderRadius\"], [\"borderColor\", \"barBorderColor\"], [\"borderWidth\", \"barBorderWidth\"]]; function Pd(t) { var e = t && t.itemStyle; if (e) for (var n = 0; n < Ld.length; n++) { var i = Ld[n][1], r = Ld[n][0]; null != e[i] && (e[r] = e[i]) } } function Od(t) { t && \"edge\" === t.alignTo && null != t.margin && null == t.edgeDistance && (t.edgeDistance = t.margin) } function Rd(t) { t && t.downplay && !t.blur && (t.blur = t.downplay) } function Nd(t, e) { if (t) for (var n = 0; n < t.length; n++)e(t[n]), t[n] && Nd(t[n].children, e) } function Ed(t, e) { Cd(t, e), t.series = yo(t.series), E(t.series, (function (t) { if (q(t)) { var e = t.type; if (\"line\" === e) null != t.clipOverflow && (t.clip = t.clipOverflow); else if (\"pie\" === e || \"gauge\" === e) { if (null != t.clockWise && (t.clockwise = t.clockWise), Od(t.label), (r = t.data) && !$(r)) for (var n = 0; n < r.length; n++)Od(r[n]); null != t.hoverOffset && (t.emphasis = t.emphasis || {}, (t.emphasis.scaleSize = null) && (t.emphasis.scaleSize = t.hoverOffset)) } else if (\"gauge\" === e) { var i = function (t, e) { for (var n = e.split(\",\"), i = t, r = 0; r < n.length && null != (i = i && i[n[r]]); r++); return i }(t, \"pointer.color\"); null != i && function (t, e, n, i) { for (var r, o = e.split(\",\"), a = t, s = 0; s < o.length - 1; s++)null == a[r = o[s]] && (a[r] = {}), a = a[r]; (i || null == a[o[s]]) && (a[o[s]] = n) }(t, \"itemStyle.color\", i) } else if (\"bar\" === e) { var r; if (Pd(t), Pd(t.backgroundStyle), Pd(t.emphasis), (r = t.data) && !$(r)) for (n = 0; n < r.length; n++)\"object\" == typeof r[n] && (Pd(r[n]), Pd(r[n] && r[n].emphasis)) } else if (\"sunburst\" === e) { var o = t.highlightPolicy; o && (t.emphasis = t.emphasis || {}, t.emphasis.focus || (t.emphasis.focus = o)), Rd(t), Nd(t.data, Rd) } else \"graph\" === e || \"sankey\" === e ? function (t) { t && null != t.focusNodeAdjacency && (t.emphasis = t.emphasis || {}, null == t.emphasis.focus && (t.emphasis.focus = \"adjacency\")) }(t) : \"map\" === e && (t.mapType && !t.map && (t.map = t.mapType), t.mapLocation && k(t, t.mapLocation)); null != t.hoverAnimation && (t.emphasis = t.emphasis || {}, t.emphasis && null == t.emphasis.scale && (t.emphasis.scale = t.hoverAnimation)), Dd(t) } })), t.dataRange && (t.visualMap = t.dataRange), E(kd, (function (e) { var n = t[e]; n && (Y(n) || (n = [n]), E(n, (function (t) { Dd(t) }))) })) } function zd(t) { E(t, (function (e, n) { var i = [], r = [NaN, NaN], o = [e.stackResultDimension, e.stackedOverDimension], a = e.data, s = e.isStackedByIndex, l = e.seriesModel.get(\"stackStrategy\") || \"samesign\"; a.modify(o, (function (o, u, h) { var c, p, d = a.get(e.stackedDimension, h); if (isNaN(d)) return r; s ? p = a.getRawIndex(h) : c = a.get(e.stackedByDimension, h); for (var f = NaN, g = n - 1; g >= 0; g--) { var y = t[g]; if (s || (p = y.data.rawIndexOf(y.stackedByDimension, c)), p >= 0) { var v = y.data.getByRawIndex(y.stackResultDimension, p); if (\"all\" === l || \"positive\" === l && v > 0 || \"negative\" === l && v < 0 || \"samesign\" === l && d >= 0 && v > 0 || \"samesign\" === l && d <= 0 && v < 0) { d = jr(d, v), f = v; break } } } return i[0] = d, i[1] = f, i })) })) } var Vd, Bd, Fd, Gd, Wd, Hd = function (t) { this.data = t.data || (t.sourceFormat === zp ? {} : []), this.sourceFormat = t.sourceFormat || Bp, this.seriesLayoutBy = t.seriesLayoutBy || Fp, this.startIndex = t.startIndex || 0, this.dimensionsDetectedCount = t.dimensionsDetectedCount, this.metaRawOption = t.metaRawOption; var e = this.dimensionsDefine = t.dimensionsDefine; if (e) for (var n = 0; n < e.length; n++) { var i = e[n]; null == i.type && qp(this, n) === Wp && (i.type = \"ordinal\") } }; function Yd(t) { return t instanceof Hd } function Ud(t, e, n) { n = n || Zd(t); var i = e.seriesLayoutBy, r = function (t, e, n, i, r) { var o, a; if (!t) return { dimensionsDefine: jd(r), startIndex: a, dimensionsDetectedCount: o }; if (e === Np) { var s = t; \"auto\" === i || null == i ? qd((function (t) { null != t && \"-\" !== t && (X(t) ? null == a && (a = 1) : a = 0) }), n, s, 10) : a = j(i) ? i : i ? 1 : 0, r || 1 !== a || (r = [], qd((function (t, e) { r[e] = null != t ? t + \"\" : \"\" }), n, s, 1 / 0)), o = r ? r.length : n === Gp ? s.length : s[0] ? s[0].length : null } else if (e === Ep) r || (r = function (t) { var e, n = 0; for (; n < t.length && !(e = t[n++]);); if (e) { var i = []; return E(e, (function (t, e) { i.push(e) })), i } }(t)); else if (e === zp) r || (r = [], E(t, (function (t, e) { r.push(e) }))); else if (e === Rp) { var l = xo(t[0]); o = Y(l) && l.length || 1 } return { startIndex: a, dimensionsDefine: jd(r), dimensionsDetectedCount: o } }(t, n, i, e.sourceHeader, e.dimensions); return new Hd({ data: t, sourceFormat: n, seriesLayoutBy: i, dimensionsDefine: r.dimensionsDefine, startIndex: r.startIndex, dimensionsDetectedCount: r.dimensionsDetectedCount, metaRawOption: T(e) }) } function Xd(t) { return new Hd({ data: t, sourceFormat: $(t) ? Vp : Rp }) } function Zd(t) { var e = Bp; if ($(t)) e = Vp; else if (Y(t)) { 0 === t.length && (e = Np); for (var n = 0, i = t.length; n < i; n++) { var r = t[n]; if (null != r) { if (Y(r)) { e = Np; break } if (q(r)) { e = Ep; break } } } } else if (q(t)) for (var o in t) if (mt(t, o) && N(t[o])) { e = zp; break } return e } function jd(t) { if (t) { var e = ft(); return z(t, (function (t, n) { var i = { name: (t = q(t) ? t : { name: t }).name, displayName: t.displayName, type: t.type }; if (null == i.name) return i; i.name += \"\", null == i.displayName && (i.displayName = i.name); var r = e.get(i.name); return r ? i.name += \"-\" + r.count++ : e.set(i.name, { count: 1 }), i })) } } function qd(t, e, n, i) { if (e === Gp) for (var r = 0; r < n.length && r < i; r++)t(n[r] ? n[r][0] : null, r); else { var o = n[0] || []; for (r = 0; r < o.length && r < i; r++)t(o[r], r) } } function Kd(t) { var e = t.sourceFormat; return e === Ep || e === zp } var $d = function () { function t(t, e) { var n = Yd(t) ? t : Xd(t); this._source = n; var i = this._data = n.data; n.sourceFormat === Vp && (this._offset = 0, this._dimSize = e, this._data = i), Wd(this, i, n) } return t.prototype.getSource = function () { return this._source }, t.prototype.count = function () { return 0 }, t.prototype.getItem = function (t, e) { }, t.prototype.appendData = function (t) { }, t.prototype.clean = function () { }, t.protoInitialize = function () { var e = t.prototype; e.pure = !1, e.persistent = !0 }(), t.internalField = function () { var t; Wd = function (t, r, o) { var a = o.sourceFormat, s = o.seriesLayoutBy, l = o.startIndex, u = o.dimensionsDefine, h = Gd[lf(a, s)]; if (A(t, h), a === Vp) t.getItem = e, t.count = i, t.fillStorage = n; else { var c = tf(a, s); t.getItem = W(c, null, r, l, u); var p = rf(a, s); t.count = W(p, null, r, l, u) } }; var e = function (t, e) { t -= this._offset, e = e || []; for (var n = this._data, i = this._dimSize, r = i * t, o = 0; o < i; o++)e[o] = n[r + o]; return e }, n = function (t, e, n, i) { for (var r = this._data, o = this._dimSize, a = 0; a < o; a++) { for (var s = i[a], l = null == s[0] ? 1 / 0 : s[0], u = null == s[1] ? -1 / 0 : s[1], h = e - t, c = n[a], p = 0; p < h; p++) { var d = r[p * o + a]; c[t + p] = d, d < l && (l = d), d > u && (u = d) } s[0] = l, s[1] = u } }, i = function () { return this._data ? this._data.length / this._dimSize : 0 }; function r(t) { for (var e = 0; e < t.length; e++)this._data.push(t[e]) } (t = {}).arrayRows_column = { pure: !0, appendData: r }, t.arrayRows_row = { pure: !0, appendData: function () { throw new Error('Do not support appendData when set seriesLayoutBy: \"row\".') } }, t.objectRows = { pure: !0, appendData: r }, t.keyedColumns = { pure: !0, appendData: function (t) { var e = this._data; E(t, (function (t, n) { for (var i = e[n] || (e[n] = []), r = 0; r < (t || []).length; r++)i.push(t[r]) })) } }, t.original = { appendData: r }, t.typedArray = { persistent: !1, pure: !0, appendData: function (t) { this._data = t }, clean: function () { this._offset += this.count(), this._data = null } }, Gd = t }(), t }(), Jd = function (t, e, n, i) { return t[i] }, Qd = ((Vd = {}).arrayRows_column = function (t, e, n, i) { return t[i + e] }, Vd.arrayRows_row = function (t, e, n, i, r) { i += e; for (var o = r || [], a = t, s = 0; s < a.length; s++) { var l = a[s]; o[s] = l ? l[i] : null } return o }, Vd.objectRows = Jd, Vd.keyedColumns = function (t, e, n, i, r) { for (var o = r || [], a = 0; a < n.length; a++) { var s = n[a].name; 0; var l = t[s]; o[a] = l ? l[i] : null } return o }, Vd.original = Jd, Vd); function tf(t, e) { var n = Qd[lf(t, e)]; return n } var ef = function (t, e, n) { return t.length }, nf = ((Bd = {}).arrayRows_column = function (t, e, n) { return Math.max(0, t.length - e) }, Bd.arrayRows_row = function (t, e, n) { var i = t[0]; return i ? Math.max(0, i.length - e) : 0 }, Bd.objectRows = ef, Bd.keyedColumns = function (t, e, n) { var i = n[0].name; var r = t[i]; return r ? r.length : 0 }, Bd.original = ef, Bd); function rf(t, e) { var n = nf[lf(t, e)]; return n } var of = function (t, e, n) { return t[e] }, af = ((Fd = {}).arrayRows = of, Fd.objectRows = function (t, e, n) { return t[n] }, Fd.keyedColumns = of, Fd.original = function (t, e, n) { var i = xo(t); return i instanceof Array ? i[e] : i }, Fd.typedArray = of, Fd); function sf(t) { var e = af[t]; return e } function lf(t, e) { return t === Np ? t + \"_\" + e : t } function uf(t, e, n) { if (t) { var i = t.getRawDataItem(e); if (null != i) { var r = t.getStore(), o = r.getSource().sourceFormat; if (null != n) { var a = t.getDimensionIndex(n), s = r.getDimensionProperty(a); return sf(o)(i, a, s) } var l = i; return o === Rp && (l = xo(i)), l } } } var hf = /\\{@(.+?)\\}/g, cf = function () { function t() { } return t.prototype.getDataParams = function (t, e) { var n = this.getData(e), i = this.getRawValue(t, e), r = n.getRawIndex(t), o = n.getName(t), a = n.getRawDataItem(t), s = n.getItemVisual(t, \"style\"), l = s && s[n.getItemVisual(t, \"drawType\") || \"fill\"], u = s && s.stroke, h = this.mainType, c = \"series\" === h, p = n.userOutput && n.userOutput.get(); return { componentType: h, componentSubType: this.subType, componentIndex: this.componentIndex, seriesType: c ? this.subType : null, seriesIndex: this.seriesIndex, seriesId: c ? this.id : null, seriesName: c ? this.name : null, name: o, dataIndex: r, data: a, dataType: e, value: i, color: l, borderColor: u, dimensionNames: p ? p.fullDimensions : null, encode: p ? p.encode : null, $vars: [\"seriesName\", \"name\", \"value\"] } }, t.prototype.getFormattedLabel = function (t, e, n, i, r, o) { e = e || \"normal\"; var a = this.getData(n), s = this.getDataParams(t, n); (o && (s.value = o.interpolatedValue), null != i && Y(s.value) && (s.value = s.value[i]), r) || (r = a.getItemModel(t).get(\"normal\" === e ? [\"label\", \"formatter\"] : [e, \"label\", \"formatter\"])); return U(r) ? (s.status = e, s.dimensionIndex = i, r(s)) : X(r) ? dp(r, s).replace(hf, (function (e, n) { var i = n.length, r = n; \"[\" === r.charAt(0) && \"]\" === r.charAt(i - 1) && (r = +r.slice(1, i - 1)); var s = uf(a, t, r); if (o && Y(o.interpolatedValue)) { var l = a.getDimensionIndex(r); l >= 0 && (s = o.interpolatedValue[l]) } return null != s ? s + \"\" : \"\" })) : void 0 }, t.prototype.getRawValue = function (t, e) { return uf(this.getData(e), t) }, t.prototype.formatTooltip = function (t, e, n) { }, t }(); function pf(t) { var e, n; return q(t) ? t.type && (n = t) : e = t, { text: e, frag: n } } function df(t) { return new ff(t) } var ff = function () { function t(t) { t = t || {}, this._reset = t.reset, this._plan = t.plan, this._count = t.count, this._onDirty = t.onDirty, this._dirty = !0 } return t.prototype.perform = function (t) { var e, n = this._upstream, i = t && t.skip; if (this._dirty && n) { var r = this.context; r.data = r.outputData = n.context.outputData } this.__pipeline && (this.__pipeline.currentTask = this), this._plan && !i && (e = this._plan(this.context)); var o, a = h(this._modBy), s = this._modDataCount || 0, l = h(t && t.modBy), u = t && t.modDataCount || 0; function h(t) { return !(t >= 1) && (t = 1), t } a === l && s === u || (e = \"reset\"), (this._dirty || \"reset\" === e) && (this._dirty = !1, o = this._doReset(i)), this._modBy = l, this._modDataCount = u; var c = t && t.step; if (this._dueEnd = n ? n._outputDueEnd : this._count ? this._count(this.context) : 1 / 0, this._progress) { var p = this._dueIndex, d = Math.min(null != c ? this._dueIndex + c : 1 / 0, this._dueEnd); if (!i && (o || p < d)) { var f = this._progress; if (Y(f)) for (var g = 0; g < f.length; g++)this._doProgress(f[g], p, d, l, u); else this._doProgress(f, p, d, l, u) } this._dueIndex = d; var y = null != this._settedOutputEnd ? this._settedOutputEnd : d; 0, this._outputDueEnd = y } else this._dueIndex = this._outputDueEnd = null != this._settedOutputEnd ? this._settedOutputEnd : this._dueEnd; return this.unfinished() }, t.prototype.dirty = function () { this._dirty = !0, this._onDirty && this._onDirty(this.context) }, t.prototype._doProgress = function (t, e, n, i, r) { gf.reset(e, n, i, r), this._callingProgress = t, this._callingProgress({ start: e, end: n, count: n - e, next: gf.next }, this.context) }, t.prototype._doReset = function (t) { var e, n; this._dueIndex = this._outputDueEnd = this._dueEnd = 0, this._settedOutputEnd = null, !t && this._reset && ((e = this._reset(this.context)) && e.progress && (n = e.forceFirstProgress, e = e.progress), Y(e) && !e.length && (e = null)), this._progress = e, this._modBy = this._modDataCount = null; var i = this._downstream; return i && i.dirty(), n }, t.prototype.unfinished = function () { return this._progress && this._dueIndex < this._dueEnd }, t.prototype.pipe = function (t) { (this._downstream !== t || this._dirty) && (this._downstream = t, t._upstream = this, t.dirty()) }, t.prototype.dispose = function () { this._disposed || (this._upstream && (this._upstream._downstream = null), this._downstream && (this._downstream._upstream = null), this._dirty = !1, this._disposed = !0) }, t.prototype.getUpstream = function () { return this._upstream }, t.prototype.getDownstream = function () { return this._downstream }, t.prototype.setOutputEnd = function (t) { this._outputDueEnd = this._settedOutputEnd = t }, t }(), gf = function () { var t, e, n, i, r, o = { reset: function (l, u, h, c) { e = l, t = u, n = h, i = c, r = Math.ceil(i / n), o.next = n > 1 && i > 0 ? s : a } }; return o; function a() { return e < t ? e++ : null } function s() { var o = e % r * n + Math.ceil(e / r), a = e >= t ? null : o < i ? o : e; return e++, a } }(); function yf(t, e) { var n = e && e.type; return \"ordinal\" === n ? t : (\"time\" !== n || j(t) || null == t || \"-\" === t || (t = +Qr(t)), null == t || \"\" === t ? NaN : +t) } var vf = ft({ number: function (t) { return parseFloat(t) }, time: function (t) { return +Qr(t) }, trim: function (t) { return X(t) ? ut(t) : t } }); function mf(t) { return vf.get(t) } var xf = { lt: function (t, e) { return t < e }, lte: function (t, e) { return t <= e }, gt: function (t, e) { return t > e }, gte: function (t, e) { return t >= e } }, _f = function () { function t(t, e) { if (!j(e)) { var n = \"\"; 0, co(n) } this._opFn = xf[t], this._rvalFloat = oo(e) } return t.prototype.evaluate = function (t) { return j(t) ? this._opFn(t, this._rvalFloat) : this._opFn(oo(t), this._rvalFloat) }, t }(), bf = function () { function t(t, e) { var n = \"desc\" === t; this._resultLT = n ? 1 : -1, null == e && (e = n ? \"min\" : \"max\"), this._incomparable = \"min\" === e ? -1 / 0 : 1 / 0 } return t.prototype.evaluate = function (t, e) { var n = j(t) ? t : oo(t), i = j(e) ? e : oo(e), r = isNaN(n), o = isNaN(i); if (r && (n = this._incomparable), o && (i = this._incomparable), r && o) { var a = X(t), s = X(e); a && (n = s ? t : 0), s && (i = a ? e : 0) } return n < i ? this._resultLT : n > i ? -this._resultLT : 0 }, t }(), wf = function () { function t(t, e) { this._rval = e, this._isEQ = t, this._rvalTypeof = typeof e, this._rvalFloat = oo(e) } return t.prototype.evaluate = function (t) { var e = t === this._rval; if (!e) { var n = typeof t; n === this._rvalTypeof || \"number\" !== n && \"number\" !== this._rvalTypeof || (e = oo(t) === this._rvalFloat) } return this._isEQ ? e : !e }, t }(); function Sf(t, e) { return \"eq\" === t || \"ne\" === t ? new wf(\"eq\" === t, e) : mt(xf, t) ? new _f(t, e) : null } var Mf = function () { function t() { } return t.prototype.getRawData = function () { throw new Error(\"not supported\") }, t.prototype.getRawDataItem = function (t) { throw new Error(\"not supported\") }, t.prototype.cloneRawData = function () { }, t.prototype.getDimensionInfo = function (t) { }, t.prototype.cloneAllDimensionInfo = function () { }, t.prototype.count = function () { }, t.prototype.retrieveValue = function (t, e) { }, t.prototype.retrieveValueFromItem = function (t, e) { }, t.prototype.convertValue = function (t, e) { return yf(t, e) }, t }(); function If(t) { var e = t.sourceFormat; if (!Lf(e)) { var n = \"\"; 0, co(n) } return t.data } function Tf(t) { var e = t.sourceFormat, n = t.data; if (!Lf(e)) { var i = \"\"; 0, co(i) } if (e === Np) { for (var r = [], o = 0, a = n.length; o < a; o++)r.push(n[o].slice()); return r } if (e === Ep) { for (r = [], o = 0, a = n.length; o < a; o++)r.push(A({}, n[o])); return r } } function Cf(t, e, n) { if (null != n) return j(n) || !isNaN(n) && !mt(e, n) ? t[n] : mt(e, n) ? e[n] : void 0 } function Df(t) { return T(t) } var Af = ft(); function kf(t, e, n, i) { var r = \"\"; e.length || co(r), q(t) || co(r); var o = t.type, a = Af.get(o); a || co(r); var s = z(e, (function (t) { return function (t, e) { var n = new Mf, i = t.data, r = n.sourceFormat = t.sourceFormat, o = t.startIndex, a = \"\"; t.seriesLayoutBy !== Fp && co(a); var s = [], l = {}, u = t.dimensionsDefine; if (u) E(u, (function (t, e) { var n = t.name, i = { index: e, name: n, displayName: t.displayName }; if (s.push(i), null != n) { var r = \"\"; mt(l, n) && co(r), l[n] = i } })); else for (var h = 0; h < t.dimensionsDetectedCount; h++)s.push({ index: h }); var c = tf(r, Fp); e.__isBuiltIn && (n.getRawDataItem = function (t) { return c(i, o, s, t) }, n.getRawData = W(If, null, t)), n.cloneRawData = W(Tf, null, t); var p = rf(r, Fp); n.count = W(p, null, i, o, s); var d = sf(r); n.retrieveValue = function (t, e) { var n = c(i, o, s, t); return f(n, e) }; var f = n.retrieveValueFromItem = function (t, e) { if (null != t) { var n = s[e]; return n ? d(t, e, n.name) : void 0 } }; return n.getDimensionInfo = W(Cf, null, s, l), n.cloneAllDimensionInfo = W(Df, null, s), n }(t, a) })), l = yo(a.transform({ upstream: s[0], upstreamList: s, config: T(t.config) })); return z(l, (function (t, n) { var i, r = \"\"; q(t) || co(r), t.data || co(r), Lf(Zd(t.data)) || co(r); var o = e[0]; if (o && 0 === n && !t.dimensions) { var a = o.startIndex; a && (t.data = o.data.slice(0, a).concat(t.data)), i = { seriesLayoutBy: Fp, sourceHeader: a, dimensions: o.metaRawOption.dimensions } } else i = { seriesLayoutBy: Fp, sourceHeader: 0, dimensions: t.dimensions }; return Ud(t.data, i, null) })) } function Lf(t) { return t === Np || t === Ep } var Pf, Of = \"undefined\", Rf = typeof Uint32Array === Of ? Array : Uint32Array, Nf = typeof Uint16Array === Of ? Array : Uint16Array, Ef = typeof Int32Array === Of ? Array : Int32Array, zf = typeof Float64Array === Of ? Array : Float64Array, Vf = { float: zf, int: Ef, ordinal: Array, number: Array, time: zf }; function Bf(t) { return t > 65535 ? Rf : Nf } function Ff(t, e, n, i, r) { var o = Vf[n || \"float\"]; if (r) { var a = t[e], s = a && a.length; if (s !== i) { for (var l = new o(i), u = 0; u < s; u++)l[u] = a[u]; t[e] = l } } else t[e] = new o(i) } var Gf = function () { function t() { this._chunks = [], this._rawExtent = [], this._extent = [], this._count = 0, this._rawCount = 0, this._calcDimNameToIdx = ft() } return t.prototype.initData = function (t, e, n) { this._provider = t, this._chunks = [], this._indices = null, this.getRawIndex = this._getRawIdxIdentity; var i = t.getSource(), r = this.defaultDimValueGetter = Pf[i.sourceFormat]; this._dimValueGetter = n || r, this._rawExtent = []; Kd(i); this._dimensions = z(e, (function (t) { return { type: t.type, property: t.property } })), this._initDataFromProvider(0, t.count()) }, t.prototype.getProvider = function () { return this._provider }, t.prototype.getSource = function () { return this._provider.getSource() }, t.prototype.ensureCalculationDimension = function (t, e) { var n = this._calcDimNameToIdx, i = this._dimensions, r = n.get(t); if (null != r) { if (i[r].type === e) return r } else r = i.length; return i[r] = { type: e }, n.set(t, r), this._chunks[r] = new Vf[e || \"float\"](this._rawCount), this._rawExtent[r] = [1 / 0, -1 / 0], r }, t.prototype.collectOrdinalMeta = function (t, e) { var n = this._chunks[t], i = this._dimensions[t], r = this._rawExtent, o = i.ordinalOffset || 0, a = n.length; 0 === o && (r[t] = [1 / 0, -1 / 0]); for (var s = r[t], l = o; l < a; l++) { var u = n[l] = e.parseAndCollect(n[l]); isNaN(u) || (s[0] = Math.min(u, s[0]), s[1] = Math.max(u, s[1])) } i.ordinalMeta = e, i.ordinalOffset = a, i.type = \"ordinal\" }, t.prototype.getOrdinalMeta = function (t) { return this._dimensions[t].ordinalMeta }, t.prototype.getDimensionProperty = function (t) { var e = this._dimensions[t]; return e && e.property }, t.prototype.appendData = function (t) { var e = this._provider, n = this.count(); e.appendData(t); var i = e.count(); return e.persistent || (i += n), n < i && this._initDataFromProvider(n, i, !0), [n, i] }, t.prototype.appendValues = function (t, e) { for (var n = this._chunks, i = this._dimensions, r = i.length, o = this._rawExtent, a = this.count(), s = a + Math.max(t.length, e || 0), l = 0; l < r; l++) { Ff(n, l, (d = i[l]).type, s, !0) } for (var u = [], h = a; h < s; h++)for (var c = h - a, p = 0; p < r; p++) { var d = i[p], f = Pf.arrayRows.call(this, t[c] || u, d.property, c, p); n[p][h] = f; var g = o[p]; f < g[0] && (g[0] = f), f > g[1] && (g[1] = f) } return this._rawCount = this._count = s, { start: a, end: s } }, t.prototype._initDataFromProvider = function (t, e, n) { for (var i = this._provider, r = this._chunks, o = this._dimensions, a = o.length, s = this._rawExtent, l = z(o, (function (t) { return t.property })), u = 0; u < a; u++) { var h = o[u]; s[u] || (s[u] = [1 / 0, -1 / 0]), Ff(r, u, h.type, e, n) } if (i.fillStorage) i.fillStorage(t, e, r, s); else for (var c = [], p = t; p < e; p++) { c = i.getItem(p, c); for (var d = 0; d < a; d++) { var f = r[d], g = this._dimValueGetter(c, l[d], p, d); f[p] = g; var y = s[d]; g < y[0] && (y[0] = g), g > y[1] && (y[1] = g) } } !i.persistent && i.clean && i.clean(), this._rawCount = this._count = e, this._extent = [] }, t.prototype.count = function () { return this._count }, t.prototype.get = function (t, e) { if (!(e >= 0 && e < this._count)) return NaN; var n = this._chunks[t]; return n ? n[this.getRawIndex(e)] : NaN }, t.prototype.getValues = function (t, e) { var n = [], i = []; if (null == e) { e = t, t = []; for (var r = 0; r < this._dimensions.length; r++)i.push(r) } else i = t; r = 0; for (var o = i.length; r < o; r++)n.push(this.get(i[r], e)); return n }, t.prototype.getByRawIndex = function (t, e) { if (!(e >= 0 && e < this._rawCount)) return NaN; var n = this._chunks[t]; return n ? n[e] : NaN }, t.prototype.getSum = function (t) { var e = 0; if (this._chunks[t]) for (var n = 0, i = this.count(); n < i; n++) { var r = this.get(t, n); isNaN(r) || (e += r) } return e }, t.prototype.getMedian = function (t) { var e = []; this.each([t], (function (t) { isNaN(t) || e.push(t) })); var n = e.sort((function (t, e) { return t - e })), i = this.count(); return 0 === i ? 0 : i % 2 == 1 ? n[(i - 1) / 2] : (n[i / 2] + n[i / 2 - 1]) / 2 }, t.prototype.indexOfRawIndex = function (t) { if (t >= this._rawCount || t < 0) return -1; if (!this._indices) return t; var e = this._indices, n = e[t]; if (null != n && n < this._count && n === t) return t; for (var i = 0, r = this._count - 1; i <= r;) { var o = (i + r) / 2 | 0; if (e[o] < t) i = o + 1; else { if (!(e[o] > t)) return o; r = o - 1 } } return -1 }, t.prototype.indicesOfNearest = function (t, e, n) { var i = this._chunks[t], r = []; if (!i) return r; null == n && (n = 1 / 0); for (var o = 1 / 0, a = -1, s = 0, l = 0, u = this.count(); l < u; l++) { var h = e - i[this.getRawIndex(l)], c = Math.abs(h); c <= n && ((c < o || c === o && h >= 0 && a < 0) && (o = c, a = h, s = 0), h === a && (r[s++] = l)) } return r.length = s, r }, t.prototype.getIndices = function () { var t, e = this._indices; if (e) { var n = e.constructor, i = this._count; if (n === Array) { t = new n(i); for (var r = 0; r < i; r++)t[r] = e[r] } else t = new n(e.buffer, 0, i) } else { t = new (n = Bf(this._rawCount))(this.count()); for (r = 0; r < t.length; r++)t[r] = r } return t }, t.prototype.filter = function (t, e) { if (!this._count) return this; for (var n = this.clone(), i = n.count(), r = new (Bf(n._rawCount))(i), o = [], a = t.length, s = 0, l = t[0], u = n._chunks, h = 0; h < i; h++) { var c = void 0, p = n.getRawIndex(h); if (0 === a) c = e(h); else if (1 === a) { c = e(u[l][p], h) } else { for (var d = 0; d < a; d++)o[d] = u[t[d]][p]; o[d] = h, c = e.apply(null, o) } c && (r[s++] = p) } return s < i && (n._indices = r), n._count = s, n._extent = [], n._updateGetRawIdx(), n }, t.prototype.selectRange = function (t) { var e = this.clone(), n = e._count; if (!n) return this; var i = G(t), r = i.length; if (!r) return this; var o = e.count(), a = new (Bf(e._rawCount))(o), s = 0, l = i[0], u = t[l][0], h = t[l][1], c = e._chunks, p = !1; if (!e._indices) { var d = 0; if (1 === r) { for (var f = c[i[0]], g = 0; g < n; g++) { ((x = f[g]) >= u && x <= h || isNaN(x)) && (a[s++] = d), d++ } p = !0 } else if (2 === r) { f = c[i[0]]; var y = c[i[1]], v = t[i[1]][0], m = t[i[1]][1]; for (g = 0; g < n; g++) { var x = f[g], _ = y[g]; (x >= u && x <= h || isNaN(x)) && (_ >= v && _ <= m || isNaN(_)) && (a[s++] = d), d++ } p = !0 } } if (!p) if (1 === r) for (g = 0; g < o; g++) { var b = e.getRawIndex(g); ((x = c[i[0]][b]) >= u && x <= h || isNaN(x)) && (a[s++] = b) } else for (g = 0; g < o; g++) { for (var w = !0, S = (b = e.getRawIndex(g), 0); S < r; S++) { var M = i[S]; ((x = c[M][b]) < t[M][0] || x > t[M][1]) && (w = !1) } w && (a[s++] = e.getRawIndex(g)) } return s < o && (e._indices = a), e._count = s, e._extent = [], e._updateGetRawIdx(), e }, t.prototype.map = function (t, e) { var n = this.clone(t); return this._updateDims(n, t, e), n }, t.prototype.modify = function (t, e) { this._updateDims(this, t, e) }, t.prototype._updateDims = function (t, e, n) { for (var i = t._chunks, r = [], o = e.length, a = t.count(), s = [], l = t._rawExtent, u = 0; u < e.length; u++)l[e[u]] = [1 / 0, -1 / 0]; for (var h = 0; h < a; h++) { for (var c = t.getRawIndex(h), p = 0; p < o; p++)s[p] = i[e[p]][c]; s[o] = h; var d = n && n.apply(null, s); if (null != d) { \"object\" != typeof d && (r[0] = d, d = r); for (u = 0; u < d.length; u++) { var f = e[u], g = d[u], y = l[f], v = i[f]; v && (v[c] = g), g < y[0] && (y[0] = g), g > y[1] && (y[1] = g) } } } }, t.prototype.lttbDownSample = function (t, e) { var n, i, r, o = this.clone([t], !0), a = o._chunks[t], s = this.count(), l = 0, u = Math.floor(1 / e), h = this.getRawIndex(0), c = new (Bf(this._rawCount))(Math.min(2 * (Math.ceil(s / u) + 2), s)); c[l++] = h; for (var p = 1; p < s - 1; p += u) { for (var d = Math.min(p + u, s - 1), f = Math.min(p + 2 * u, s), g = (f + d) / 2, y = 0, v = d; v < f; v++) { var m = a[I = this.getRawIndex(v)]; isNaN(m) || (y += m) } y /= f - d; var x = p, _ = Math.min(p + u, s), b = p - 1, w = a[h]; n = -1, r = x; var S = -1, M = 0; for (v = x; v < _; v++) { var I; m = a[I = this.getRawIndex(v)]; isNaN(m) ? (M++, S < 0 && (S = I)) : (i = Math.abs((b - g) * (m - w) - (b - v) * (y - w))) > n && (n = i, r = I) } M > 0 && M < _ - x && (c[l++] = Math.min(S, r), r = Math.max(S, r)), c[l++] = r, h = r } return c[l++] = this.getRawIndex(s - 1), o._count = l, o._indices = c, o.getRawIndex = this._getRawIdx, o }, t.prototype.downSample = function (t, e, n, i) { for (var r = this.clone([t], !0), o = r._chunks, a = [], s = Math.floor(1 / e), l = o[t], u = this.count(), h = r._rawExtent[t] = [1 / 0, -1 / 0], c = new (Bf(this._rawCount))(Math.ceil(u / s)), p = 0, d = 0; d < u; d += s) { s > u - d && (s = u - d, a.length = s); for (var f = 0; f < s; f++) { var g = this.getRawIndex(d + f); a[f] = l[g] } var y = n(a), v = this.getRawIndex(Math.min(d + i(a, y) || 0, u - 1)); l[v] = y, y < h[0] && (h[0] = y), y > h[1] && (h[1] = y), c[p++] = v } return r._count = p, r._indices = c, r._updateGetRawIdx(), r }, t.prototype.each = function (t, e) { if (this._count) for (var n = t.length, i = this._chunks, r = 0, o = this.count(); r < o; r++) { var a = this.getRawIndex(r); switch (n) { case 0: e(r); break; case 1: e(i[t[0]][a], r); break; case 2: e(i[t[0]][a], i[t[1]][a], r); break; default: for (var s = 0, l = []; s < n; s++)l[s] = i[t[s]][a]; l[s] = r, e.apply(null, l) } } }, t.prototype.getDataExtent = function (t) { var e = this._chunks[t], n = [1 / 0, -1 / 0]; if (!e) return n; var i, r = this.count(); if (!this._indices) return this._rawExtent[t].slice(); if (i = this._extent[t]) return i.slice(); for (var o = (i = n)[0], a = i[1], s = 0; s < r; s++) { var l = e[this.getRawIndex(s)]; l < o && (o = l), l > a && (a = l) } return i = [o, a], this._extent[t] = i, i }, t.prototype.getRawDataItem = function (t) { var e = this.getRawIndex(t); if (this._provider.persistent) return this._provider.getItem(e); for (var n = [], i = this._chunks, r = 0; r < i.length; r++)n.push(i[r][e]); return n }, t.prototype.clone = function (e, n) { var i, r, o = new t, a = this._chunks, s = e && V(e, (function (t, e) { return t[e] = !0, t }), {}); if (s) for (var l = 0; l < a.length; l++)o._chunks[l] = s[l] ? (i = a[l], r = void 0, (r = i.constructor) === Array ? i.slice() : new r(i)) : a[l]; else o._chunks = a; return this._copyCommonProps(o), n || (o._indices = this._cloneIndices()), o._updateGetRawIdx(), o }, t.prototype._copyCommonProps = function (t) { t._count = this._count, t._rawCount = this._rawCount, t._provider = this._provider, t._dimensions = this._dimensions, t._extent = T(this._extent), t._rawExtent = T(this._rawExtent) }, t.prototype._cloneIndices = function () { if (this._indices) { var t = this._indices.constructor, e = void 0; if (t === Array) { var n = this._indices.length; e = new t(n); for (var i = 0; i < n; i++)e[i] = this._indices[i] } else e = new t(this._indices); return e } return null }, t.prototype._getRawIdxIdentity = function (t) { return t }, t.prototype._getRawIdx = function (t) { return t < this._count && t >= 0 ? this._indices[t] : -1 }, t.prototype._updateGetRawIdx = function () { this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity }, t.internalField = function () { function t(t, e, n, i) { return yf(t[i], this._dimensions[i]) } Pf = { arrayRows: t, objectRows: function (t, e, n, i) { return yf(t[e], this._dimensions[i]) }, keyedColumns: t, original: function (t, e, n, i) { var r = t && (null == t.value ? t : t.value); return yf(r instanceof Array ? r[i] : r, this._dimensions[i]) }, typedArray: function (t, e, n, i) { return t[i] } } }(), t }(), Wf = function () { function t(t) { this._sourceList = [], this._storeList = [], this._upstreamSignList = [], this._versionSignBase = 0, this._dirty = !0, this._sourceHost = t } return t.prototype.dirty = function () { this._setLocalSource([], []), this._storeList = [], this._dirty = !0 }, t.prototype._setLocalSource = function (t, e) { this._sourceList = t, this._upstreamSignList = e, this._versionSignBase++, this._versionSignBase > 9e10 && (this._versionSignBase = 0) }, t.prototype._getVersionSign = function () { return this._sourceHost.uid + \"_\" + this._versionSignBase }, t.prototype.prepareSource = function () { this._isDirty() && (this._createSource(), this._dirty = !1) }, t.prototype._createSource = function () { this._setLocalSource([], []); var t, e, n = this._sourceHost, i = this._getUpstreamSourceManagers(), r = !!i.length; if (Yf(n)) { var o = n, a = void 0, s = void 0, l = void 0; if (r) { var u = i[0]; u.prepareSource(), a = (l = u.getSource()).data, s = l.sourceFormat, e = [u._getVersionSign()] } else s = $(a = o.get(\"data\", !0)) ? Vp : Rp, e = []; var h = this._getSourceMetaRawOption() || {}, c = l && l.metaRawOption || {}, p = rt(h.seriesLayoutBy, c.seriesLayoutBy) || null, d = rt(h.sourceHeader, c.sourceHeader), f = rt(h.dimensions, c.dimensions); t = p !== c.seriesLayoutBy || !!d != !!c.sourceHeader || f ? [Ud(a, { seriesLayoutBy: p, sourceHeader: d, dimensions: f }, s)] : [] } else { var g = n; if (r) { var y = this._applyTransform(i); t = y.sourceList, e = y.upstreamSignList } else { t = [Ud(g.get(\"source\", !0), this._getSourceMetaRawOption(), null)], e = [] } } this._setLocalSource(t, e) }, t.prototype._applyTransform = function (t) { var e, n = this._sourceHost, i = n.get(\"transform\", !0), r = n.get(\"fromTransformResult\", !0); if (null != r) { var o = \"\"; 1 !== t.length && Uf(o) } var a, s = [], l = []; return E(t, (function (t) { t.prepareSource(); var e = t.getSource(r || 0), n = \"\"; null == r || e || Uf(n), s.push(e), l.push(t._getVersionSign()) })), i ? e = function (t, e, n) { var i = yo(t), r = i.length, o = \"\"; r || co(o); for (var a = 0, s = r; a < s; a++)e = kf(i[a], e), a !== s - 1 && (e.length = Math.max(e.length, 1)); return e }(i, s, n.componentIndex) : null != r && (e = [(a = s[0], new Hd({ data: a.data, sourceFormat: a.sourceFormat, seriesLayoutBy: a.seriesLayoutBy, dimensionsDefine: T(a.dimensionsDefine), startIndex: a.startIndex, dimensionsDetectedCount: a.dimensionsDetectedCount }))]), { sourceList: e, upstreamSignList: l } }, t.prototype._isDirty = function () { if (this._dirty) return !0; for (var t = this._getUpstreamSourceManagers(), e = 0; e < t.length; e++) { var n = t[e]; if (n._isDirty() || this._upstreamSignList[e] !== n._getVersionSign()) return !0 } }, t.prototype.getSource = function (t) { t = t || 0; var e = this._sourceList[t]; if (!e) { var n = this._getUpstreamSourceManagers(); return n[0] && n[0].getSource(t) } return e }, t.prototype.getSharedDataStore = function (t) { var e = t.makeStoreSchema(); return this._innerGetDataStore(e.dimensions, t.source, e.hash) }, t.prototype._innerGetDataStore = function (t, e, n) { var i = this._storeList, r = i[0]; r || (r = i[0] = {}); var o = r[n]; if (!o) { var a = this._getUpstreamSourceManagers()[0]; Yf(this._sourceHost) && a ? o = a._innerGetDataStore(t, e, n) : (o = new Gf).initData(new $d(e, t.length), t), r[n] = o } return o }, t.prototype._getUpstreamSourceManagers = function () { var t = this._sourceHost; if (Yf(t)) { var e = jp(t); return e ? [e.getSourceManager()] : [] } return z(function (t) { return t.get(\"transform\", !0) || t.get(\"fromTransformResult\", !0) ? Ro(t.ecModel, \"dataset\", { index: t.get(\"fromDatasetIndex\", !0), id: t.get(\"fromDatasetId\", !0) }, Po).models : [] }(t), (function (t) { return t.getSourceManager() })) }, t.prototype._getSourceMetaRawOption = function () { var t, e, n, i = this._sourceHost; if (Yf(i)) t = i.get(\"seriesLayoutBy\", !0), e = i.get(\"sourceHeader\", !0), n = i.get(\"dimensions\", !0); else if (!this._getUpstreamSourceManagers().length) { var r = i; t = r.get(\"seriesLayoutBy\", !0), e = r.get(\"sourceHeader\", !0), n = r.get(\"dimensions\", !0) } return { seriesLayoutBy: t, sourceHeader: e, dimensions: n } }, t }(); function Hf(t) { t.option.transform && ct(t.option.transform) } function Yf(t) { return \"series\" === t.mainType } function Uf(t) { throw new Error(t) } function Xf(t, e) { var n = t.color || \"#6e7079\", i = t.fontSize || 12, r = t.fontWeight || \"400\", o = t.color || \"#464646\", a = t.fontSize || 14, s = t.fontWeight || \"900\"; return \"html\" === e ? { nameStyle: \"font-size:\" + ee(i + \"\") + \"px;color:\" + ee(n) + \";font-weight:\" + ee(r + \"\"), valueStyle: \"font-size:\" + ee(a + \"\") + \"px;color:\" + ee(o) + \";font-weight:\" + ee(s + \"\") } : { nameStyle: { fontSize: i, fill: n, fontWeight: r }, valueStyle: { fontSize: a, fill: o, fontWeight: s } } } var Zf = [0, 10, 20, 30], jf = [\"\", \"\\n\", \"\\n\\n\", \"\\n\\n\\n\"]; function qf(t, e) { return e.type = t, e } function Kf(t) { return \"section\" === t.type } function $f(t) { return Kf(t) ? Qf : tg } function Jf(t) { if (Kf(t)) { var e = 0, n = t.blocks.length, i = n > 1 || n > 0 && !t.noHeader; return E(t.blocks, (function (t) { var n = Jf(t); n >= e && (e = n + +(i && (!n || Kf(t) && !t.noHeader))) })), e } return 0 } function Qf(t, e, n, i) { var r, o = e.noHeader, a = (r = Jf(e), { html: Zf[r], richText: jf[r] }), s = [], l = e.blocks || []; lt(!l || Y(l)), l = l || []; var u = t.orderMode; if (e.sortBlocks && u) { l = l.slice(); var h = { valueAsc: \"asc\", valueDesc: \"desc\" }; if (mt(h, u)) { var c = new bf(h[u], null); l.sort((function (t, e) { return c.evaluate(t.sortParam, e.sortParam) })) } else \"seriesDesc\" === u && l.reverse() } E(l, (function (n, r) { var o = e.valueFormatter, l = $f(n)(o ? A(A({}, t), { valueFormatter: o }) : t, n, r > 0 ? a.html : 0, i); null != l && s.push(l) })); var p = \"richText\" === t.renderMode ? s.join(a.richText) : ng(s.join(\"\"), o ? n : a.html); if (o) return p; var d = hp(e.header, \"ordinal\", t.useUTC), f = Xf(i, t.renderMode).nameStyle; return \"richText\" === t.renderMode ? ig(t, d, f) + a.richText + p : ng('<div style=\"' + f + \";\" + 'line-height:1;\">' + ee(d) + \"</div>\" + p, n) } function tg(t, e, n, i) { var r = t.renderMode, o = e.noName, a = e.noValue, s = !e.markerType, l = e.name, u = t.useUTC, h = e.valueFormatter || t.valueFormatter || function (t) { return z(t = Y(t) ? t : [t], (function (t, e) { return hp(t, Y(d) ? d[e] : d, u) })) }; if (!o || !a) { var c = s ? \"\" : t.markupStyleCreator.makeTooltipMarker(e.markerType, e.markerColor || \"#333\", r), p = o ? \"\" : hp(l, \"ordinal\", u), d = e.valueType, f = a ? [] : h(e.value), g = !s || !o, y = !s && o, v = Xf(i, r), m = v.nameStyle, x = v.valueStyle; return \"richText\" === r ? (s ? \"\" : c) + (o ? \"\" : ig(t, p, m)) + (a ? \"\" : function (t, e, n, i, r) { var o = [r], a = i ? 10 : 20; return n && o.push({ padding: [0, 0, 0, a], align: \"right\" }), t.markupStyleCreator.wrapRichTextStyle(Y(e) ? e.join(\"  \") : e, o) }(t, f, g, y, x)) : ng((s ? \"\" : c) + (o ? \"\" : function (t, e, n) { return '<span style=\"' + n + \";\" + (e ? \"margin-left:2px\" : \"\") + '\">' + ee(t) + \"</span>\" }(p, !s, m)) + (a ? \"\" : function (t, e, n, i) { var r = n ? \"10px\" : \"20px\", o = e ? \"float:right;margin-left:\" + r : \"\"; return t = Y(t) ? t : [t], '<span style=\"' + o + \";\" + i + '\">' + z(t, (function (t) { return ee(t) })).join(\"&nbsp;&nbsp;\") + \"</span>\" }(f, g, y, x)), n) } } function eg(t, e, n, i, r, o) { if (t) return $f(t)({ useUTC: r, renderMode: n, orderMode: i, markupStyleCreator: e, valueFormatter: t.valueFormatter }, t, 0, o) } function ng(t, e) { return '<div style=\"' + (\"margin: \" + e + \"px 0 0\") + \";\" + 'line-height:1;\">' + t + '<div style=\"clear:both\"></div></div>' } function ig(t, e, n) { return t.markupStyleCreator.wrapRichTextStyle(e, n) } function rg(t, e) { return gp(t.getData().getItemVisual(e, \"style\")[t.visualDrawType]) } function og(t, e) { var n = t.get(\"padding\"); return null != n ? n : \"richText\" === e ? [8, 10] : 10 } var ag = function () { function t() { this.richTextStyles = {}, this._nextStyleNameId = so() } return t.prototype._generateStyleName = function () { return \"__EC_aUTo_\" + this._nextStyleNameId++ }, t.prototype.makeTooltipMarker = function (t, e, n) { var i = \"richText\" === n ? this._generateStyleName() : null, r = fp({ color: e, type: t, renderMode: n, markerId: i }); return X(r) ? r : (this.richTextStyles[i] = r.style, r.content) }, t.prototype.wrapRichTextStyle = function (t, e) { var n = {}; Y(e) ? E(e, (function (t) { return A(n, t) })) : A(n, e); var i = this._generateStyleName(); return this.richTextStyles[i] = n, \"{\" + i + \"|\" + t + \"}\" }, t }(); function sg(t) { var e, n, i, r, o = t.series, a = t.dataIndex, s = t.multipleSeries, l = o.getData(), u = l.mapDimensionsAll(\"defaultedTooltip\"), h = u.length, c = o.getRawValue(a), p = Y(c), d = rg(o, a); if (h > 1 || p && !h) { var f = function (t, e, n, i, r) { var o = e.getData(), a = V(t, (function (t, e, n) { var i = o.getDimensionInfo(n); return t || i && !1 !== i.tooltip && null != i.displayName }), !1), s = [], l = [], u = []; function h(t, e) { var n = o.getDimensionInfo(e); n && !1 !== n.otherDims.tooltip && (a ? u.push(qf(\"nameValue\", { markerType: \"subItem\", markerColor: r, name: n.displayName, value: t, valueType: n.type })) : (s.push(t), l.push(n.type))) } return i.length ? E(i, (function (t) { h(uf(o, n, t), t) })) : E(t, h), { inlineValues: s, inlineValueTypes: l, blocks: u } }(c, o, a, u, d); e = f.inlineValues, n = f.inlineValueTypes, i = f.blocks, r = f.inlineValues[0] } else if (h) { var g = l.getDimensionInfo(u[0]); r = e = uf(l, a, u[0]), n = g.type } else r = e = p ? c[0] : c; var y = Io(o), v = y && o.name || \"\", m = l.getName(a), x = s ? v : m; return qf(\"section\", { header: v, noHeader: s || !y, sortParam: r, blocks: [qf(\"nameValue\", { markerType: \"item\", markerColor: d, name: x, noName: !ut(x), value: e, valueType: n })].concat(i || []) }) } var lg = Do(); function ug(t, e) { return t.getName(e) || t.getId(e) } var hg = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e._selectedDataIndicesMap = {}, e } return n(e, t), e.prototype.init = function (t, e, n) { this.seriesIndex = this.componentIndex, this.dataTask = df({ count: pg, reset: dg }), this.dataTask.context = { model: this }, this.mergeDefaultAndTheme(t, n), (lg(this).sourceManager = new Wf(this)).prepareSource(); var i = this.getInitialData(t, n); gg(i, this), this.dataTask.context.data = i, lg(this).dataBeforeProcessed = i, cg(this), this._initSelectedMapFromData(i) }, e.prototype.mergeDefaultAndTheme = function (t, e) { var n = Mp(this), i = n ? Tp(t) : {}, r = this.subType; Ap.hasClass(r) && (r += \"Series\"), C(t, e.getTheme().get(this.subType)), C(t, this.getDefaultOption()), vo(t, \"label\", [\"show\"]), this.fillDataTextStyle(t.data), n && Ip(t, i, n) }, e.prototype.mergeOption = function (t, e) { t = C(this.option, t, !0), this.fillDataTextStyle(t.data); var n = Mp(this); n && Ip(this.option, t, n); var i = lg(this).sourceManager; i.dirty(), i.prepareSource(); var r = this.getInitialData(t, e); gg(r, this), this.dataTask.dirty(), this.dataTask.context.data = r, lg(this).dataBeforeProcessed = r, cg(this), this._initSelectedMapFromData(r) }, e.prototype.fillDataTextStyle = function (t) { if (t && !$(t)) for (var e = [\"show\"], n = 0; n < t.length; n++)t[n] && t[n].label && vo(t[n], \"label\", e) }, e.prototype.getInitialData = function (t, e) { }, e.prototype.appendData = function (t) { this.getRawData().appendData(t.data) }, e.prototype.getData = function (t) { var e = vg(this); if (e) { var n = e.context.data; return null == t ? n : n.getLinkedData(t) } return lg(this).data }, e.prototype.getAllData = function () { var t = this.getData(); return t && t.getLinkedDataAll ? t.getLinkedDataAll() : [{ data: t }] }, e.prototype.setData = function (t) { var e = vg(this); if (e) { var n = e.context; n.outputData = t, e !== this.dataTask && (n.data = t) } lg(this).data = t }, e.prototype.getEncode = function () { var t = this.get(\"encode\", !0); if (t) return ft(t) }, e.prototype.getSourceManager = function () { return lg(this).sourceManager }, e.prototype.getSource = function () { return this.getSourceManager().getSource() }, e.prototype.getRawData = function () { return lg(this).dataBeforeProcessed }, e.prototype.getColorBy = function () { return this.get(\"colorBy\") || \"series\" }, e.prototype.isColorBySeries = function () { return \"series\" === this.getColorBy() }, e.prototype.getBaseAxis = function () { var t = this.coordinateSystem; return t && t.getBaseAxis && t.getBaseAxis() }, e.prototype.formatTooltip = function (t, e, n) { return sg({ series: this, dataIndex: t, multipleSeries: e }) }, e.prototype.isAnimationEnabled = function () { var t = this.ecModel; if (r.node && (!t || !t.ssr)) return !1; var e = this.getShallow(\"animation\"); return e && this.getData().count() > this.getShallow(\"animationThreshold\") && (e = !1), !!e }, e.prototype.restoreData = function () { this.dataTask.dirty() }, e.prototype.getColorFromPalette = function (t, e, n) { var i = this.ecModel, r = id.prototype.getColorFromPalette.call(this, t, e, n); return r || (r = i.getColorFromPalette(t, e, n)), r }, e.prototype.coordDimToDataDim = function (t) { return this.getRawData().mapDimensionsAll(t) }, e.prototype.getProgressive = function () { return this.get(\"progressive\") }, e.prototype.getProgressiveThreshold = function () { return this.get(\"progressiveThreshold\") }, e.prototype.select = function (t, e) { this._innerSelect(this.getData(e), t) }, e.prototype.unselect = function (t, e) { var n = this.option.selectedMap; if (n) { var i = this.option.selectedMode, r = this.getData(e); if (\"series\" === i || \"all\" === n) return this.option.selectedMap = {}, void (this._selectedDataIndicesMap = {}); for (var o = 0; o < t.length; o++) { var a = ug(r, t[o]); n[a] = !1, this._selectedDataIndicesMap[a] = -1 } } }, e.prototype.toggleSelect = function (t, e) { for (var n = [], i = 0; i < t.length; i++)n[0] = t[i], this.isSelected(t[i], e) ? this.unselect(n, e) : this.select(n, e) }, e.prototype.getSelectedDataIndices = function () { if (\"all\" === this.option.selectedMap) return [].slice.call(this.getData().getIndices()); for (var t = this._selectedDataIndicesMap, e = G(t), n = [], i = 0; i < e.length; i++) { var r = t[e[i]]; r >= 0 && n.push(r) } return n }, e.prototype.isSelected = function (t, e) { var n = this.option.selectedMap; if (!n) return !1; var i = this.getData(e); return (\"all\" === n || n[ug(i, t)]) && !i.getItemModel(t).get([\"select\", \"disabled\"]) }, e.prototype.isUniversalTransitionEnabled = function () { if (this.__universalTransitionEnabled) return !0; var t = this.option.universalTransition; return !!t && (!0 === t || t && t.enabled) }, e.prototype._innerSelect = function (t, e) { var n, i, r = this.option, o = r.selectedMode, a = e.length; if (o && a) if (\"series\" === o) r.selectedMap = \"all\"; else if (\"multiple\" === o) { q(r.selectedMap) || (r.selectedMap = {}); for (var s = r.selectedMap, l = 0; l < a; l++) { var u = e[l]; s[c = ug(t, u)] = !0, this._selectedDataIndicesMap[c] = t.getRawIndex(u) } } else if (\"single\" === o || !0 === o) { var h = e[a - 1], c = ug(t, h); r.selectedMap = ((n = {})[c] = !0, n), this._selectedDataIndicesMap = ((i = {})[c] = t.getRawIndex(h), i) } }, e.prototype._initSelectedMapFromData = function (t) { if (!this.option.selectedMap) { var e = []; t.hasItemOption && t.each((function (n) { var i = t.getRawDataItem(n); i && i.selected && e.push(n) })), e.length > 0 && this._innerSelect(t, e) } }, e.registerClass = function (t) { return Ap.registerClass(t) }, e.protoInitialize = function () { var t = e.prototype; t.type = \"series.__base__\", t.seriesIndex = 0, t.ignoreStyleOnData = !1, t.hasSymbolVisual = !1, t.defaultSymbol = \"circle\", t.visualStyleAccessPath = \"itemStyle\", t.visualDrawType = \"fill\" }(), e }(Ap); function cg(t) { var e = t.name; Io(t) || (t.name = function (t) { var e = t.getRawData(), n = e.mapDimensionsAll(\"seriesName\"), i = []; return E(n, (function (t) { var n = e.getDimensionInfo(t); n.displayName && i.push(n.displayName) })), i.join(\" \") }(t) || e) } function pg(t) { return t.model.getRawData().count() } function dg(t) { var e = t.model; return e.setData(e.getRawData().cloneShallow()), fg } function fg(t, e) { e.outputData && t.end > e.outputData.count() && e.model.getRawData().cloneShallow(e.outputData) } function gg(t, e) { E(gt(t.CHANGABLE_METHODS, t.DOWNSAMPLE_METHODS), (function (n) { t.wrapMethod(n, H(yg, e)) })) } function yg(t, e) { var n = vg(t); return n && n.setOutputEnd((e || this).count()), e } function vg(t) { var e = (t.ecModel || {}).scheduler, n = e && e.getPipeline(t.uid); if (n) { var i = n.currentTask; if (i) { var r = i.agentStubMap; r && (i = r.get(t.uid)) } return i } } R(hg, cf), R(hg, id), Wo(hg, Ap); var mg = function () { function t() { this.group = new Pr, this.uid = bc(\"viewComponent\") } return t.prototype.init = function (t, e) { }, t.prototype.render = function (t, e, n, i) { }, t.prototype.dispose = function (t, e) { }, t.prototype.updateView = function (t, e, n, i) { }, t.prototype.updateLayout = function (t, e, n, i) { }, t.prototype.updateVisual = function (t, e, n, i) { }, t.prototype.toggleBlurSeries = function (t, e, n) { }, t.prototype.eachRendered = function (t) { var e = this.group; e && e.traverse(t) }, t }(); function xg() { var t = Do(); return function (e) { var n = t(e), i = e.pipelineContext, r = !!n.large, o = !!n.progressiveRender, a = n.large = !(!i || !i.large), s = n.progressiveRender = !(!i || !i.progressiveRender); return !(r === a && o === s) && \"reset\" } } Go(mg), Xo(mg); var _g = Do(), bg = xg(), wg = function () { function t() { this.group = new Pr, this.uid = bc(\"viewChart\"), this.renderTask = df({ plan: Ig, reset: Tg }), this.renderTask.context = { view: this } } return t.prototype.init = function (t, e) { }, t.prototype.render = function (t, e, n, i) { 0 }, t.prototype.highlight = function (t, e, n, i) { var r = t.getData(i && i.dataType); r && Mg(r, i, \"emphasis\") }, t.prototype.downplay = function (t, e, n, i) { var r = t.getData(i && i.dataType); r && Mg(r, i, \"normal\") }, t.prototype.remove = function (t, e) { this.group.removeAll() }, t.prototype.dispose = function (t, e) { }, t.prototype.updateView = function (t, e, n, i) { this.render(t, e, n, i) }, t.prototype.updateLayout = function (t, e, n, i) { this.render(t, e, n, i) }, t.prototype.updateVisual = function (t, e, n, i) { this.render(t, e, n, i) }, t.prototype.eachRendered = function (t) { Yh(this.group, t) }, t.markUpdateMethod = function (t, e) { _g(t).updateMethod = e }, t.protoInitialize = void (t.prototype.type = \"chart\"), t }(); function Sg(t, e, n) { t && Ul(t) && (\"emphasis\" === e ? Il : Tl)(t, n) } function Mg(t, e, n) { var i = Co(t, e), r = e && null != e.highlightKey ? function (t) { var e = $s[t]; return null == e && Ks <= 32 && (e = $s[t] = Ks++), e }(e.highlightKey) : null; null != i ? E(yo(i), (function (e) { Sg(t.getItemGraphicEl(e), n, r) })) : t.eachItemGraphicEl((function (t) { Sg(t, n, r) })) } function Ig(t) { return bg(t.model) } function Tg(t) { var e = t.model, n = t.ecModel, i = t.api, r = t.payload, o = e.pipelineContext.progressiveRender, a = t.view, s = r && _g(r).updateMethod, l = o ? \"incrementalPrepareRender\" : s && a[s] ? s : \"render\"; return \"render\" !== l && a[l](e, n, i, r), Cg[l] } Go(wg), Xo(wg); var Cg = { incrementalPrepareRender: { progress: function (t, e) { e.view.incrementalRender(t, e.model, e.ecModel, e.api, e.payload) } }, render: { forceFirstProgress: !0, progress: function (t, e) { e.view.render(e.model, e.ecModel, e.api, e.payload) } } }, Dg = \"\\0__throttleOriginMethod\", Ag = \"\\0__throttleRate\", kg = \"\\0__throttleType\"; function Lg(t, e, n) { var i, r, o, a, s, l = 0, u = 0, h = null; function c() { u = (new Date).getTime(), h = null, t.apply(o, a || []) } e = e || 0; var p = function () { for (var t = [], p = 0; p < arguments.length; p++)t[p] = arguments[p]; i = (new Date).getTime(), o = this, a = t; var d = s || e, f = s || n; s = null, r = i - (f ? l : u) - d, clearTimeout(h), f ? h = setTimeout(c, d) : r >= 0 ? c() : h = setTimeout(c, -r), l = i }; return p.clear = function () { h && (clearTimeout(h), h = null) }, p.debounceNextCall = function (t) { s = t }, p } function Pg(t, e, n, i) { var r = t[e]; if (r) { var o = r[Dg] || r, a = r[kg]; if (r[Ag] !== n || a !== i) { if (null == n || !i) return t[e] = o; (r = t[e] = Lg(o, n, \"debounce\" === i))[Dg] = o, r[kg] = i, r[Ag] = n } return r } } function Og(t, e) { var n = t[e]; n && n[Dg] && (n.clear && n.clear(), t[e] = n[Dg]) } var Rg = Do(), Ng = { itemStyle: Zo(yc, !0), lineStyle: Zo(dc, !0) }, Eg = { lineStyle: \"stroke\", itemStyle: \"fill\" }; function zg(t, e) { var n = t.visualStyleMapper || Ng[e]; return n || (console.warn(\"Unkown style type '\" + e + \"'.\"), Ng.itemStyle) } function Vg(t, e) { var n = t.visualDrawType || Eg[e]; return n || (console.warn(\"Unkown style type '\" + e + \"'.\"), \"fill\") } var Bg = { createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { var n = t.getData(), i = t.visualStyleAccessPath || \"itemStyle\", r = t.getModel(i), o = zg(t, i)(r), a = r.getShallow(\"decal\"); a && (n.setVisual(\"decal\", a), a.dirty = !0); var s = Vg(t, i), l = o[s], u = U(l) ? l : null, h = \"auto\" === o.fill || \"auto\" === o.stroke; if (!o[s] || u || h) { var c = t.getColorFromPalette(t.name, null, e.getSeriesCount()); o[s] || (o[s] = c, n.setVisual(\"colorFromPalette\", !0)), o.fill = \"auto\" === o.fill || U(o.fill) ? c : o.fill, o.stroke = \"auto\" === o.stroke || U(o.stroke) ? c : o.stroke } if (n.setVisual(\"style\", o), n.setVisual(\"drawType\", s), !e.isSeriesFiltered(t) && u) return n.setVisual(\"colorFromPalette\", !1), { dataEach: function (e, n) { var i = t.getDataParams(n), r = A({}, o); r[s] = u(i), e.setItemVisual(n, \"style\", r) } } } }, Fg = new xc, Gg = { createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { if (!t.ignoreStyleOnData && !e.isSeriesFiltered(t)) { var n = t.getData(), i = t.visualStyleAccessPath || \"itemStyle\", r = zg(t, i), o = n.getVisual(\"drawType\"); return { dataEach: n.hasItemOption ? function (t, e) { var n = t.getRawDataItem(e); if (n && n[i]) { Fg.option = n[i]; var a = r(Fg); A(t.ensureUniqueItemVisual(e, \"style\"), a), Fg.option.decal && (t.setItemVisual(e, \"decal\", Fg.option.decal), Fg.option.decal.dirty = !0), o in a && t.setItemVisual(e, \"colorFromPalette\", !1) } } : null } } } }, Wg = { performRawSeries: !0, overallReset: function (t) { var e = ft(); t.eachSeries((function (t) { var n = t.getColorBy(); if (!t.isColorBySeries()) { var i = t.type + \"-\" + n, r = e.get(i); r || (r = {}, e.set(i, r)), Rg(t).scope = r } })), t.eachSeries((function (e) { if (!e.isColorBySeries() && !t.isSeriesFiltered(e)) { var n = e.getRawData(), i = {}, r = e.getData(), o = Rg(e).scope, a = e.visualStyleAccessPath || \"itemStyle\", s = Vg(e, a); r.each((function (t) { var e = r.getRawIndex(t); i[e] = t })), n.each((function (t) { var a = i[t]; if (r.getItemVisual(a, \"colorFromPalette\")) { var l = r.ensureUniqueItemVisual(a, \"style\"), u = n.getName(t) || t + \"\", h = n.count(); l[s] = e.getColorFromPalette(u, o, h) } })) } })) } }, Hg = Math.PI; var Yg = function () { function t(t, e, n, i) { this._stageTaskMap = ft(), this.ecInstance = t, this.api = e, n = this._dataProcessorHandlers = n.slice(), i = this._visualHandlers = i.slice(), this._allHandlers = n.concat(i) } return t.prototype.restoreData = function (t, e) { t.restoreData(e), this._stageTaskMap.each((function (t) { var e = t.overallTask; e && e.dirty() })) }, t.prototype.getPerformArgs = function (t, e) { if (t.__pipeline) { var n = this._pipelineMap.get(t.__pipeline.id), i = n.context, r = !e && n.progressiveEnabled && (!i || i.progressiveRender) && t.__idxInPipeline > n.blockIndex ? n.step : null, o = i && i.modDataCount; return { step: r, modBy: null != o ? Math.ceil(o / r) : null, modDataCount: o } } }, t.prototype.getPipeline = function (t) { return this._pipelineMap.get(t) }, t.prototype.updateStreamModes = function (t, e) { var n = this._pipelineMap.get(t.uid), i = t.getData().count(), r = n.progressiveEnabled && e.incrementalPrepareRender && i >= n.threshold, o = t.get(\"large\") && i >= t.get(\"largeThreshold\"), a = \"mod\" === t.get(\"progressiveChunkMode\") ? i : null; t.pipelineContext = n.context = { progressiveRender: r, modDataCount: a, large: o } }, t.prototype.restorePipelines = function (t) { var e = this, n = e._pipelineMap = ft(); t.eachSeries((function (t) { var i = t.getProgressive(), r = t.uid; n.set(r, { id: r, head: null, tail: null, threshold: t.getProgressiveThreshold(), progressiveEnabled: i && !(t.preventIncremental && t.preventIncremental()), blockIndex: -1, step: Math.round(i || 700), count: 0 }), e._pipe(t, t.dataTask) })) }, t.prototype.prepareStageTasks = function () { var t = this._stageTaskMap, e = this.api.getModel(), n = this.api; E(this._allHandlers, (function (i) { var r = t.get(i.uid) || t.set(i.uid, {}), o = \"\"; lt(!(i.reset && i.overallReset), o), i.reset && this._createSeriesStageTask(i, r, e, n), i.overallReset && this._createOverallStageTask(i, r, e, n) }), this) }, t.prototype.prepareView = function (t, e, n, i) { var r = t.renderTask, o = r.context; o.model = e, o.ecModel = n, o.api = i, r.__block = !t.incrementalPrepareRender, this._pipe(e, r) }, t.prototype.performDataProcessorTasks = function (t, e) { this._performStageTasks(this._dataProcessorHandlers, t, e, { block: !0 }) }, t.prototype.performVisualTasks = function (t, e, n) { this._performStageTasks(this._visualHandlers, t, e, n) }, t.prototype._performStageTasks = function (t, e, n, i) { i = i || {}; var r = !1, o = this; function a(t, e) { return t.setDirty && (!t.dirtyMap || t.dirtyMap.get(e.__pipeline.id)) } E(t, (function (t, s) { if (!i.visualType || i.visualType === t.visualType) { var l = o._stageTaskMap.get(t.uid), u = l.seriesTaskMap, h = l.overallTask; if (h) { var c, p = h.agentStubMap; p.each((function (t) { a(i, t) && (t.dirty(), c = !0) })), c && h.dirty(), o.updatePayload(h, n); var d = o.getPerformArgs(h, i.block); p.each((function (t) { t.perform(d) })), h.perform(d) && (r = !0) } else u && u.each((function (s, l) { a(i, s) && s.dirty(); var u = o.getPerformArgs(s, i.block); u.skip = !t.performRawSeries && e.isSeriesFiltered(s.context.model), o.updatePayload(s, n), s.perform(u) && (r = !0) })) } })), this.unfinished = r || this.unfinished }, t.prototype.performSeriesTasks = function (t) { var e; t.eachSeries((function (t) { e = t.dataTask.perform() || e })), this.unfinished = e || this.unfinished }, t.prototype.plan = function () { this._pipelineMap.each((function (t) { var e = t.tail; do { if (e.__block) { t.blockIndex = e.__idxInPipeline; break } e = e.getUpstream() } while (e) })) }, t.prototype.updatePayload = function (t, e) { \"remain\" !== e && (t.context.payload = e) }, t.prototype._createSeriesStageTask = function (t, e, n, i) { var r = this, o = e.seriesTaskMap, a = e.seriesTaskMap = ft(), s = t.seriesType, l = t.getTargetSeries; function u(e) { var s = e.uid, l = a.set(s, o && o.get(s) || df({ plan: qg, reset: Kg, count: Qg })); l.context = { model: e, ecModel: n, api: i, useClearVisual: t.isVisual && !t.isLayout, plan: t.plan, reset: t.reset, scheduler: r }, r._pipe(e, l) } t.createOnAllSeries ? n.eachRawSeries(u) : s ? n.eachRawSeriesByType(s, u) : l && l(n, i).each(u) }, t.prototype._createOverallStageTask = function (t, e, n, i) { var r = this, o = e.overallTask = e.overallTask || df({ reset: Ug }); o.context = { ecModel: n, api: i, overallReset: t.overallReset, scheduler: r }; var a = o.agentStubMap, s = o.agentStubMap = ft(), l = t.seriesType, u = t.getTargetSeries, h = !0, c = !1, p = \"\"; function d(t) { var e = t.uid, n = s.set(e, a && a.get(e) || (c = !0, df({ reset: Xg, onDirty: jg }))); n.context = { model: t, overallProgress: h }, n.agent = o, n.__block = h, r._pipe(t, n) } lt(!t.createOnAllSeries, p), l ? n.eachRawSeriesByType(l, d) : u ? u(n, i).each(d) : (h = !1, E(n.getSeries(), d)), c && o.dirty() }, t.prototype._pipe = function (t, e) { var n = t.uid, i = this._pipelineMap.get(n); !i.head && (i.head = e), i.tail && i.tail.pipe(e), i.tail = e, e.__idxInPipeline = i.count++, e.__pipeline = i }, t.wrapStageHandler = function (t, e) { return U(t) && (t = { overallReset: t, seriesType: ty(t) }), t.uid = bc(\"stageHandler\"), e && (t.visualType = e), t }, t }(); function Ug(t) { t.overallReset(t.ecModel, t.api, t.payload) } function Xg(t) { return t.overallProgress && Zg } function Zg() { this.agent.dirty(), this.getDownstream().dirty() } function jg() { this.agent && this.agent.dirty() } function qg(t) { return t.plan ? t.plan(t.model, t.ecModel, t.api, t.payload) : null } function Kg(t) { t.useClearVisual && t.data.clearAllVisual(); var e = t.resetDefines = yo(t.reset(t.model, t.ecModel, t.api, t.payload)); return e.length > 1 ? z(e, (function (t, e) { return Jg(e) })) : $g } var $g = Jg(0); function Jg(t) { return function (e, n) { var i = n.data, r = n.resetDefines[t]; if (r && r.dataEach) for (var o = e.start; o < e.end; o++)r.dataEach(i, o); else r && r.progress && r.progress(e, i) } } function Qg(t) { return t.data.count() } function ty(t) { ey = null; try { t(ny, iy) } catch (t) { } return ey } var ey, ny = {}, iy = {}; function ry(t, e) { for (var n in e.prototype) t[n] = xt } ry(ny, ad), ry(iy, cd), ny.eachSeriesByType = ny.eachRawSeriesByType = function (t) { ey = t }, ny.eachComponent = function (t) { \"series\" === t.mainType && t.subType && (ey = t.subType) }; var oy = [\"#37A2DA\", \"#32C5E9\", \"#67E0E3\", \"#9FE6B8\", \"#FFDB5C\", \"#ff9f7f\", \"#fb7293\", \"#E062AE\", \"#E690D1\", \"#e7bcf3\", \"#9d96f5\", \"#8378EA\", \"#96BFFF\"], ay = { color: oy, colorLayer: [[\"#37A2DA\", \"#ffd85c\", \"#fd7b5f\"], [\"#37A2DA\", \"#67E0E3\", \"#FFDB5C\", \"#ff9f7f\", \"#E062AE\", \"#9d96f5\"], [\"#37A2DA\", \"#32C5E9\", \"#9FE6B8\", \"#FFDB5C\", \"#ff9f7f\", \"#fb7293\", \"#e7bcf3\", \"#8378EA\", \"#96BFFF\"], oy] }, sy = \"#B9B8CE\", ly = \"#100C2A\", uy = function () { return { axisLine: { lineStyle: { color: sy } }, splitLine: { lineStyle: { color: \"#484753\" } }, splitArea: { areaStyle: { color: [\"rgba(255,255,255,0.02)\", \"rgba(255,255,255,0.05)\"] } }, minorSplitLine: { lineStyle: { color: \"#20203B\" } } } }, hy = [\"#4992ff\", \"#7cffb2\", \"#fddd60\", \"#ff6e76\", \"#58d9f9\", \"#05c091\", \"#ff8a45\", \"#8d48e3\", \"#dd79ff\"], cy = { darkMode: !0, color: hy, backgroundColor: ly, axisPointer: { lineStyle: { color: \"#817f91\" }, crossStyle: { color: \"#817f91\" }, label: { color: \"#fff\" } }, legend: { textStyle: { color: sy } }, textStyle: { color: sy }, title: { textStyle: { color: \"#EEF1FA\" }, subtextStyle: { color: \"#B9B8CE\" } }, toolbox: { iconStyle: { borderColor: sy } }, dataZoom: { borderColor: \"#71708A\", textStyle: { color: sy }, brushStyle: { color: \"rgba(135,163,206,0.3)\" }, handleStyle: { color: \"#353450\", borderColor: \"#C5CBE3\" }, moveHandleStyle: { color: \"#B0B6C3\", opacity: .3 }, fillerColor: \"rgba(135,163,206,0.2)\", emphasis: { handleStyle: { borderColor: \"#91B7F2\", color: \"#4D587D\" }, moveHandleStyle: { color: \"#636D9A\", opacity: .7 } }, dataBackground: { lineStyle: { color: \"#71708A\", width: 1 }, areaStyle: { color: \"#71708A\" } }, selectedDataBackground: { lineStyle: { color: \"#87A3CE\" }, areaStyle: { color: \"#87A3CE\" } } }, visualMap: { textStyle: { color: sy } }, timeline: { lineStyle: { color: sy }, label: { color: sy }, controlStyle: { color: sy, borderColor: sy } }, calendar: { itemStyle: { color: ly }, dayLabel: { color: sy }, monthLabel: { color: sy }, yearLabel: { color: sy } }, timeAxis: uy(), logAxis: uy(), valueAxis: uy(), categoryAxis: uy(), line: { symbol: \"circle\" }, graph: { color: hy }, gauge: { title: { color: sy }, axisLine: { lineStyle: { color: [[1, \"rgba(207,212,219,0.2)\"]] } }, axisLabel: { color: sy }, detail: { color: \"#EEF1FA\" } }, candlestick: { itemStyle: { color: \"#f64e56\", color0: \"#54ea92\", borderColor: \"#f64e56\", borderColor0: \"#54ea92\" } } }; cy.categoryAxis.splitLine.show = !1; var py = function () { function t() { } return t.prototype.normalizeQuery = function (t) { var e = {}, n = {}, i = {}; if (X(t)) { var r = Fo(t); e.mainType = r.main || null, e.subType = r.sub || null } else { var o = [\"Index\", \"Name\", \"Id\"], a = { name: 1, dataIndex: 1, dataType: 1 }; E(t, (function (t, r) { for (var s = !1, l = 0; l < o.length; l++) { var u = o[l], h = r.lastIndexOf(u); if (h > 0 && h === r.length - u.length) { var c = r.slice(0, h); \"data\" !== c && (e.mainType = c, e[u.toLowerCase()] = t, s = !0) } } a.hasOwnProperty(r) && (n[r] = t, s = !0), s || (i[r] = t) })) } return { cptQuery: e, dataQuery: n, otherQuery: i } }, t.prototype.filter = function (t, e) { var n = this.eventInfo; if (!n) return !0; var i = n.targetEl, r = n.packedEvent, o = n.model, a = n.view; if (!o || !a) return !0; var s = e.cptQuery, l = e.dataQuery; return u(s, o, \"mainType\") && u(s, o, \"subType\") && u(s, o, \"index\", \"componentIndex\") && u(s, o, \"name\") && u(s, o, \"id\") && u(l, r, \"name\") && u(l, r, \"dataIndex\") && u(l, r, \"dataType\") && (!a.filterForExposedEvent || a.filterForExposedEvent(t, e.otherQuery, i, r)); function u(t, e, n, i) { return null == t[n] || e[i || n] === t[n] } }, t.prototype.afterTrigger = function () { this.eventInfo = null }, t }(), dy = [\"symbol\", \"symbolSize\", \"symbolRotate\", \"symbolOffset\"], fy = dy.concat([\"symbolKeepAspect\"]), gy = { createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { var n = t.getData(); if (t.legendIcon && n.setVisual(\"legendIcon\", t.legendIcon), t.hasSymbolVisual) { for (var i = {}, r = {}, o = !1, a = 0; a < dy.length; a++) { var s = dy[a], l = t.get(s); U(l) ? (o = !0, r[s] = l) : i[s] = l } if (i.symbol = i.symbol || t.defaultSymbol, n.setVisual(A({ legendIcon: t.legendIcon || i.symbol, symbolKeepAspect: t.get(\"symbolKeepAspect\") }, i)), !e.isSeriesFiltered(t)) { var u = G(r); return { dataEach: o ? function (e, n) { for (var i = t.getRawValue(n), o = t.getDataParams(n), a = 0; a < u.length; a++) { var s = u[a]; e.setItemVisual(n, s, r[s](i, o)) } } : null } } } } }, yy = { createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { if (t.hasSymbolVisual && !e.isSeriesFiltered(t)) return { dataEach: t.getData().hasItemOption ? function (t, e) { for (var n = t.getItemModel(e), i = 0; i < fy.length; i++) { var r = fy[i], o = n.getShallow(r, !0); null != o && t.setItemVisual(e, r, o) } } : null } } }; function vy(t, e, n) { switch (n) { case \"color\": return t.getItemVisual(e, \"style\")[t.getVisual(\"drawType\")]; case \"opacity\": return t.getItemVisual(e, \"style\").opacity; case \"symbol\": case \"symbolSize\": case \"liftZ\": return t.getItemVisual(e, n) } } function my(t, e) { switch (e) { case \"color\": return t.getVisual(\"style\")[t.getVisual(\"drawType\")]; case \"opacity\": return t.getVisual(\"style\").opacity; case \"symbol\": case \"symbolSize\": case \"liftZ\": return t.getVisual(e) } } function xy(t, e, n, i) { switch (n) { case \"color\": t.ensureUniqueItemVisual(e, \"style\")[t.getVisual(\"drawType\")] = i, t.setItemVisual(e, \"colorFromPalette\", !1); break; case \"opacity\": t.ensureUniqueItemVisual(e, \"style\").opacity = i; break; case \"symbol\": case \"symbolSize\": case \"liftZ\": t.setItemVisual(e, n, i) } } function _y(t, e) { function n(e, n) { var i = []; return e.eachComponent({ mainType: \"series\", subType: t, query: n }, (function (t) { i.push(t.seriesIndex) })), i } E([[t + \"ToggleSelect\", \"toggleSelect\"], [t + \"Select\", \"select\"], [t + \"UnSelect\", \"unselect\"]], (function (t) { e(t[0], (function (e, i, r) { e = A({}, e), r.dispatchAction(A(e, { type: t[1], seriesIndex: n(i, e) })) })) })) } function by(t, e, n, i, r) { var o = t + e; n.isSilent(o) || i.eachComponent({ mainType: \"series\", subType: \"pie\" }, (function (t) { for (var e = t.seriesIndex, i = t.option.selectedMap, a = r.selected, s = 0; s < a.length; s++)if (a[s].seriesIndex === e) { var l = t.getData(), u = Co(l, r.fromActionPayload); n.trigger(o, { type: o, seriesId: t.id, name: Y(u) ? l.getName(u[0]) : l.getName(u), selected: X(i) ? i : A({}, i) }) } })) } function wy(t, e, n) { for (var i; t && (!e(t) || (i = t, !n));)t = t.__hostTarget || t.parent; return i } var Sy = Math.round(9 * Math.random()), My = \"function\" == typeof Object.defineProperty, Iy = function () { function t() { this._id = \"__ec_inner_\" + Sy++ } return t.prototype.get = function (t) { return this._guard(t)[this._id] }, t.prototype.set = function (t, e) { var n = this._guard(t); return My ? Object.defineProperty(n, this._id, { value: e, enumerable: !1, configurable: !0 }) : n[this._id] = e, this }, t.prototype.delete = function (t) { return !!this.has(t) && (delete this._guard(t)[this._id], !0) }, t.prototype.has = function (t) { return !!this._guard(t)[this._id] }, t.prototype._guard = function (t) { if (t !== Object(t)) throw TypeError(\"Value of WeakMap is not a non-null object.\"); return t }, t }(), Ty = _s.extend({ type: \"triangle\", shape: { cx: 0, cy: 0, width: 0, height: 0 }, buildPath: function (t, e) { var n = e.cx, i = e.cy, r = e.width / 2, o = e.height / 2; t.moveTo(n, i - o), t.lineTo(n + r, i + o), t.lineTo(n - r, i + o), t.closePath() } }), Cy = _s.extend({ type: \"diamond\", shape: { cx: 0, cy: 0, width: 0, height: 0 }, buildPath: function (t, e) { var n = e.cx, i = e.cy, r = e.width / 2, o = e.height / 2; t.moveTo(n, i - o), t.lineTo(n + r, i), t.lineTo(n, i + o), t.lineTo(n - r, i), t.closePath() } }), Dy = _s.extend({ type: \"pin\", shape: { x: 0, y: 0, width: 0, height: 0 }, buildPath: function (t, e) { var n = e.x, i = e.y, r = e.width / 5 * 3, o = Math.max(r, e.height), a = r / 2, s = a * a / (o - a), l = i - o + a + s, u = Math.asin(s / a), h = Math.cos(u) * a, c = Math.sin(u), p = Math.cos(u), d = .6 * a, f = .7 * a; t.moveTo(n - h, l + s), t.arc(n, l, a, Math.PI - u, 2 * Math.PI + u), t.bezierCurveTo(n + h - c * d, l + s + p * d, n, i - f, n, i), t.bezierCurveTo(n, i - f, n - h + c * d, l + s + p * d, n - h, l + s), t.closePath() } }), Ay = _s.extend({ type: \"arrow\", shape: { x: 0, y: 0, width: 0, height: 0 }, buildPath: function (t, e) { var n = e.height, i = e.width, r = e.x, o = e.y, a = i / 3 * 2; t.moveTo(r, o), t.lineTo(r + a, o + n), t.lineTo(r, o + n / 4 * 3), t.lineTo(r - a, o + n), t.lineTo(r, o), t.closePath() } }), ky = { line: function (t, e, n, i, r) { r.x1 = t, r.y1 = e + i / 2, r.x2 = t + n, r.y2 = e + i / 2 }, rect: function (t, e, n, i, r) { r.x = t, r.y = e, r.width = n, r.height = i }, roundRect: function (t, e, n, i, r) { r.x = t, r.y = e, r.width = n, r.height = i, r.r = Math.min(n, i) / 4 }, square: function (t, e, n, i, r) { var o = Math.min(n, i); r.x = t, r.y = e, r.width = o, r.height = o }, circle: function (t, e, n, i, r) { r.cx = t + n / 2, r.cy = e + i / 2, r.r = Math.min(n, i) / 2 }, diamond: function (t, e, n, i, r) { r.cx = t + n / 2, r.cy = e + i / 2, r.width = n, r.height = i }, pin: function (t, e, n, i, r) { r.x = t + n / 2, r.y = e + i / 2, r.width = n, r.height = i }, arrow: function (t, e, n, i, r) { r.x = t + n / 2, r.y = e + i / 2, r.width = n, r.height = i }, triangle: function (t, e, n, i, r) { r.cx = t + n / 2, r.cy = e + i / 2, r.width = n, r.height = i } }, Ly = {}; E({ line: Wu, rect: Ps, roundRect: Ps, square: Ps, circle: gu, diamond: Cy, pin: Dy, arrow: Ay, triangle: Ty }, (function (t, e) { Ly[e] = new t })); var Py = _s.extend({ type: \"symbol\", shape: { symbolType: \"\", x: 0, y: 0, width: 0, height: 0 }, calculateTextPosition: function (t, e, n) { var i = br(t, e, n), r = this.shape; return r && \"pin\" === r.symbolType && \"inside\" === e.position && (i.y = n.y + .4 * n.height), i }, buildPath: function (t, e, n) { var i = e.symbolType; if (\"none\" !== i) { var r = Ly[i]; r || (r = Ly[i = \"rect\"]), ky[i](e.x, e.y, e.width, e.height, r.shape), r.buildPath(t, r.shape, n) } } }); function Oy(t, e) { if (\"image\" !== this.type) { var n = this.style; this.__isEmptyBrush ? (n.stroke = t, n.fill = e || \"#fff\", n.lineWidth = 2) : \"line\" === this.shape.symbolType ? n.stroke = t : n.fill = t, this.markRedraw() } } function Ry(t, e, n, i, r, o, a) { var s, l = 0 === t.indexOf(\"empty\"); return l && (t = t.substr(5, 1).toLowerCase() + t.substr(6)), (s = 0 === t.indexOf(\"image://\") ? Ih(t.slice(8), new Re(e, n, i, r), a ? \"center\" : \"cover\") : 0 === t.indexOf(\"path://\") ? Mh(t.slice(7), {}, new Re(e, n, i, r), a ? \"center\" : \"cover\") : new Py({ shape: { symbolType: t, x: e, y: n, width: i, height: r } })).__isEmptyBrush = l, s.setColor = Oy, o && s.setColor(o), s } function Ny(t) { return Y(t) || (t = [+t, +t]), [t[0] || 0, t[1] || 0] } function Ey(t, e) { if (null != t) return Y(t) || (t = [t, t]), [Gr(t[0], e[0]) || 0, Gr(rt(t[1], t[0]), e[1]) || 0] } function zy(t) { return isFinite(t) } function Vy(t, e, n) { for (var i = \"radial\" === e.type ? function (t, e, n) { var i = n.width, r = n.height, o = Math.min(i, r), a = null == e.x ? .5 : e.x, s = null == e.y ? .5 : e.y, l = null == e.r ? .5 : e.r; return e.global || (a = a * i + n.x, s = s * r + n.y, l *= o), a = zy(a) ? a : .5, s = zy(s) ? s : .5, l = l >= 0 && zy(l) ? l : .5, t.createRadialGradient(a, s, 0, a, s, l) }(t, e, n) : function (t, e, n) { var i = null == e.x ? 0 : e.x, r = null == e.x2 ? 1 : e.x2, o = null == e.y ? 0 : e.y, a = null == e.y2 ? 0 : e.y2; return e.global || (i = i * n.width + n.x, r = r * n.width + n.x, o = o * n.height + n.y, a = a * n.height + n.y), i = zy(i) ? i : 0, r = zy(r) ? r : 1, o = zy(o) ? o : 0, a = zy(a) ? a : 0, t.createLinearGradient(i, o, r, a) }(t, e, n), r = e.colorStops, o = 0; o < r.length; o++)i.addColorStop(r[o].offset, r[o].color); return i } function By(t) { return parseInt(t, 10) } function Fy(t, e, n) { var i = [\"width\", \"height\"][e], r = [\"clientWidth\", \"clientHeight\"][e], o = [\"paddingLeft\", \"paddingTop\"][e], a = [\"paddingRight\", \"paddingBottom\"][e]; if (null != n[i] && \"auto\" !== n[i]) return parseFloat(n[i]); var s = document.defaultView.getComputedStyle(t); return (t[r] || By(s[i]) || By(t.style[i])) - (By(s[o]) || 0) - (By(s[a]) || 0) | 0 } function Gy(t) { var e, n, i = t.style, r = i.lineDash && i.lineWidth > 0 && (e = i.lineDash, n = i.lineWidth, e && \"solid\" !== e && n > 0 ? \"dashed\" === e ? [4 * n, 2 * n] : \"dotted\" === e ? [n] : j(e) ? [e] : Y(e) ? e : null : null), o = i.lineDashOffset; if (r) { var a = i.strokeNoScale && t.getLineScale ? t.getLineScale() : 1; a && 1 !== a && (r = z(r, (function (t) { return t / a })), o /= a) } return [r, o] } var Wy = new ts(!0); function Hy(t) { var e = t.stroke; return !(null == e || \"none\" === e || !(t.lineWidth > 0)) } function Yy(t) { return \"string\" == typeof t && \"none\" !== t } function Uy(t) { var e = t.fill; return null != e && \"none\" !== e } function Xy(t, e) { if (null != e.fillOpacity && 1 !== e.fillOpacity) { var n = t.globalAlpha; t.globalAlpha = e.fillOpacity * e.opacity, t.fill(), t.globalAlpha = n } else t.fill() } function Zy(t, e) { if (null != e.strokeOpacity && 1 !== e.strokeOpacity) { var n = t.globalAlpha; t.globalAlpha = e.strokeOpacity * e.opacity, t.stroke(), t.globalAlpha = n } else t.stroke() } function jy(t, e, n) { var i = Jo(e.image, e.__image, n); if (ta(i)) { var r = t.createPattern(i, e.repeat || \"repeat\"); if (\"function\" == typeof DOMMatrix && r && r.setTransform) { var o = new DOMMatrix; o.translateSelf(e.x || 0, e.y || 0), o.rotateSelf(0, 0, (e.rotation || 0) * _t), o.scaleSelf(e.scaleX || 1, e.scaleY || 1), r.setTransform(o) } return r } } var qy = [\"shadowBlur\", \"shadowOffsetX\", \"shadowOffsetY\"], Ky = [[\"lineCap\", \"butt\"], [\"lineJoin\", \"miter\"], [\"miterLimit\", 10]]; function $y(t, e, n, i, r) { var o = !1; if (!i && e === (n = n || {})) return !1; if (i || e.opacity !== n.opacity) { tv(t, r), o = !0; var a = Math.max(Math.min(e.opacity, 1), 0); t.globalAlpha = isNaN(a) ? fa.opacity : a } (i || e.blend !== n.blend) && (o || (tv(t, r), o = !0), t.globalCompositeOperation = e.blend || fa.blend); for (var s = 0; s < qy.length; s++) { var l = qy[s]; (i || e[l] !== n[l]) && (o || (tv(t, r), o = !0), t[l] = t.dpr * (e[l] || 0)) } return (i || e.shadowColor !== n.shadowColor) && (o || (tv(t, r), o = !0), t.shadowColor = e.shadowColor || fa.shadowColor), o } function Jy(t, e, n, i, r) { var o = ev(e, r.inHover), a = i ? null : n && ev(n, r.inHover) || {}; if (o === a) return !1; var s = $y(t, o, a, i, r); if ((i || o.fill !== a.fill) && (s || (tv(t, r), s = !0), Yy(o.fill) && (t.fillStyle = o.fill)), (i || o.stroke !== a.stroke) && (s || (tv(t, r), s = !0), Yy(o.stroke) && (t.strokeStyle = o.stroke)), (i || o.opacity !== a.opacity) && (s || (tv(t, r), s = !0), t.globalAlpha = null == o.opacity ? 1 : o.opacity), e.hasStroke()) { var l = o.lineWidth / (o.strokeNoScale && e.getLineScale ? e.getLineScale() : 1); t.lineWidth !== l && (s || (tv(t, r), s = !0), t.lineWidth = l) } for (var u = 0; u < Ky.length; u++) { var h = Ky[u], c = h[0]; (i || o[c] !== a[c]) && (s || (tv(t, r), s = !0), t[c] = o[c] || h[1]) } return s } function Qy(t, e) { var n = e.transform, i = t.dpr || 1; n ? t.setTransform(i * n[0], i * n[1], i * n[2], i * n[3], i * n[4], i * n[5]) : t.setTransform(i, 0, 0, i, 0, 0) } function tv(t, e) { e.batchFill && t.fill(), e.batchStroke && t.stroke(), e.batchFill = \"\", e.batchStroke = \"\" } function ev(t, e) { return e && t.__hoverStyle || t.style } function nv(t, e) { iv(t, e, { inHover: !1, viewWidth: 0, viewHeight: 0 }, !0) } function iv(t, e, n, i) { var r = e.transform; if (!e.shouldBePainted(n.viewWidth, n.viewHeight, !1, !1)) return e.__dirty &= -2, void (e.__isRendered = !1); var o = e.__clipPaths, s = n.prevElClipPaths, l = !1, u = !1; if (s && !function (t, e) { if (t === e || !t && !e) return !1; if (!t || !e || t.length !== e.length) return !0; for (var n = 0; n < t.length; n++)if (t[n] !== e[n]) return !0; return !1 }(o, s) || (s && s.length && (tv(t, n), t.restore(), u = l = !0, n.prevElClipPaths = null, n.allClipped = !1, n.prevEl = null), o && o.length && (tv(t, n), t.save(), function (t, e, n) { for (var i = !1, r = 0; r < t.length; r++) { var o = t[r]; i = i || o.isZeroArea(), Qy(e, o), e.beginPath(), o.buildPath(e, o.shape), e.clip() } n.allClipped = i }(o, t, n), l = !0), n.prevElClipPaths = o), n.allClipped) e.__isRendered = !1; else { e.beforeBrush && e.beforeBrush(), e.innerBeforeBrush(); var h = n.prevEl; h || (u = l = !0); var c, p, d = e instanceof _s && e.autoBatch && function (t) { var e = Uy(t), n = Hy(t); return !(t.lineDash || !(+e ^ +n) || e && \"string\" != typeof t.fill || n && \"string\" != typeof t.stroke || t.strokePercent < 1 || t.strokeOpacity < 1 || t.fillOpacity < 1) }(e.style); l || (c = r, p = h.transform, c && p ? c[0] !== p[0] || c[1] !== p[1] || c[2] !== p[2] || c[3] !== p[3] || c[4] !== p[4] || c[5] !== p[5] : c || p) ? (tv(t, n), Qy(t, e)) : d || tv(t, n); var f = ev(e, n.inHover); e instanceof _s ? (1 !== n.lastDrawType && (u = !0, n.lastDrawType = 1), Jy(t, e, h, u, n), d && (n.batchFill || n.batchStroke) || t.beginPath(), function (t, e, n, i) { var r, o = Hy(n), a = Uy(n), s = n.strokePercent, l = s < 1, u = !e.path; e.silent && !l || !u || e.createPathProxy(); var h = e.path || Wy, c = e.__dirty; if (!i) { var p = n.fill, d = n.stroke, f = a && !!p.colorStops, g = o && !!d.colorStops, y = a && !!p.image, v = o && !!d.image, m = void 0, x = void 0, _ = void 0, b = void 0, w = void 0; (f || g) && (w = e.getBoundingRect()), f && (m = c ? Vy(t, p, w) : e.__canvasFillGradient, e.__canvasFillGradient = m), g && (x = c ? Vy(t, d, w) : e.__canvasStrokeGradient, e.__canvasStrokeGradient = x), y && (_ = c || !e.__canvasFillPattern ? jy(t, p, e) : e.__canvasFillPattern, e.__canvasFillPattern = _), v && (b = c || !e.__canvasStrokePattern ? jy(t, d, e) : e.__canvasStrokePattern, e.__canvasStrokePattern = _), f ? t.fillStyle = m : y && (_ ? t.fillStyle = _ : a = !1), g ? t.strokeStyle = x : v && (b ? t.strokeStyle = b : o = !1) } var S, M, I = e.getGlobalScale(); h.setScale(I[0], I[1], e.segmentIgnoreThreshold), t.setLineDash && n.lineDash && (S = (r = Gy(e))[0], M = r[1]); var T = !0; (u || 4 & c) && (h.setDPR(t.dpr), l ? h.setContext(null) : (h.setContext(t), T = !1), h.reset(), e.buildPath(h, e.shape, i), h.toStatic(), e.pathUpdated()), T && h.rebuildPath(t, l ? s : 1), S && (t.setLineDash(S), t.lineDashOffset = M), i || (n.strokeFirst ? (o && Zy(t, n), a && Xy(t, n)) : (a && Xy(t, n), o && Zy(t, n))), S && t.setLineDash([]) }(t, e, f, d), d && (n.batchFill = f.fill || \"\", n.batchStroke = f.stroke || \"\")) : e instanceof ws ? (3 !== n.lastDrawType && (u = !0, n.lastDrawType = 3), Jy(t, e, h, u, n), function (t, e, n) { var i, r = n.text; if (null != r && (r += \"\"), r) { t.font = n.font || a, t.textAlign = n.textAlign, t.textBaseline = n.textBaseline; var o = void 0, s = void 0; t.setLineDash && n.lineDash && (o = (i = Gy(e))[0], s = i[1]), o && (t.setLineDash(o), t.lineDashOffset = s), n.strokeFirst ? (Hy(n) && t.strokeText(r, n.x, n.y), Uy(n) && t.fillText(r, n.x, n.y)) : (Uy(n) && t.fillText(r, n.x, n.y), Hy(n) && t.strokeText(r, n.x, n.y)), o && t.setLineDash([]) } }(t, e, f)) : e instanceof Is ? (2 !== n.lastDrawType && (u = !0, n.lastDrawType = 2), function (t, e, n, i, r) { $y(t, ev(e, r.inHover), n && ev(n, r.inHover), i, r) }(t, e, h, u, n), function (t, e, n) { var i = e.__image = Jo(n.image, e.__image, e, e.onload); if (i && ta(i)) { var r = n.x || 0, o = n.y || 0, a = e.getWidth(), s = e.getHeight(), l = i.width / i.height; if (null == a && null != s ? a = s * l : null == s && null != a ? s = a / l : null == a && null == s && (a = i.width, s = i.height), n.sWidth && n.sHeight) { var u = n.sx || 0, h = n.sy || 0; t.drawImage(i, u, h, n.sWidth, n.sHeight, r, o, a, s) } else if (n.sx && n.sy) { var c = a - (u = n.sx), p = s - (h = n.sy); t.drawImage(i, u, h, c, p, r, o, a, s) } else t.drawImage(i, r, o, a, s) } }(t, e, f)) : e.getTemporalDisplayables && (4 !== n.lastDrawType && (u = !0, n.lastDrawType = 4), function (t, e, n) { var i = e.getDisplayables(), r = e.getTemporalDisplayables(); t.save(); var o, a, s = { prevElClipPaths: null, prevEl: null, allClipped: !1, viewWidth: n.viewWidth, viewHeight: n.viewHeight, inHover: n.inHover }; for (o = e.getCursor(), a = i.length; o < a; o++) { (h = i[o]).beforeBrush && h.beforeBrush(), h.innerBeforeBrush(), iv(t, h, s, o === a - 1), h.innerAfterBrush(), h.afterBrush && h.afterBrush(), s.prevEl = h } for (var l = 0, u = r.length; l < u; l++) { var h; (h = r[l]).beforeBrush && h.beforeBrush(), h.innerBeforeBrush(), iv(t, h, s, l === u - 1), h.innerAfterBrush(), h.afterBrush && h.afterBrush(), s.prevEl = h } e.clearTemporalDisplayables(), e.notClear = !0, t.restore() }(t, e, n)), d && i && tv(t, n), e.innerAfterBrush(), e.afterBrush && e.afterBrush(), n.prevEl = e, e.__dirty = 0, e.__isRendered = !0 } } var rv = new Iy, ov = new On(100), av = [\"symbol\", \"symbolSize\", \"symbolKeepAspect\", \"color\", \"backgroundColor\", \"dashArrayX\", \"dashArrayY\", \"maxTileWidth\", \"maxTileHeight\"]; function sv(t, e) { if (\"none\" === t) return null; var n = e.getDevicePixelRatio(), i = e.getZr(), r = \"svg\" === i.painter.type; t.dirty && rv.delete(t); var o = rv.get(t); if (o) return o; var a = k(t, { symbol: \"rect\", symbolSize: 1, symbolKeepAspect: !0, color: \"rgba(0, 0, 0, 0.2)\", backgroundColor: null, dashArrayX: 5, dashArrayY: 5, rotation: 0, maxTileWidth: 512, maxTileHeight: 512 }); \"none\" === a.backgroundColor && (a.backgroundColor = null); var s = { repeat: \"repeat\" }; return function (t) { for (var e, o = [n], s = !0, l = 0; l < av.length; ++l) { var u = a[av[l]]; if (null != u && !Y(u) && !X(u) && !j(u) && \"boolean\" != typeof u) { s = !1; break } o.push(u) } if (s) { e = o.join(\",\") + (r ? \"-svg\" : \"\"); var c = ov.get(e); c && (r ? t.svgElement = c : t.image = c) } var p, d = uv(a.dashArrayX), f = function (t) { if (!t || \"object\" == typeof t && 0 === t.length) return [0, 0]; if (j(t)) { var e = Math.ceil(t); return [e, e] } var n = z(t, (function (t) { return Math.ceil(t) })); return t.length % 2 ? n.concat(n) : n }(a.dashArrayY), g = lv(a.symbol), y = (b = d, z(b, (function (t) { return hv(t) }))), v = hv(f), m = !r && h.createCanvas(), x = r && { tag: \"g\", attrs: {}, key: \"dcl\", children: [] }, _ = function () { for (var t = 1, e = 0, n = y.length; e < n; ++e)t = uo(t, y[e]); var i = 1; for (e = 0, n = g.length; e < n; ++e)i = uo(i, g[e].length); t *= i; var r = v * y.length * g.length; return { width: Math.max(1, Math.min(t, a.maxTileWidth)), height: Math.max(1, Math.min(r, a.maxTileHeight)) } }(); var b; m && (m.width = _.width * n, m.height = _.height * n, p = m.getContext(\"2d\")); (function () { p && (p.clearRect(0, 0, m.width, m.height), a.backgroundColor && (p.fillStyle = a.backgroundColor, p.fillRect(0, 0, m.width, m.height))); for (var t = 0, e = 0; e < f.length; ++e)t += f[e]; if (t <= 0) return; var o = -v, s = 0, l = 0, u = 0; for (; o < _.height;) { if (s % 2 == 0) { for (var h = l / 2 % g.length, c = 0, y = 0, b = 0; c < 2 * _.width;) { var w = 0; for (e = 0; e < d[u].length; ++e)w += d[u][e]; if (w <= 0) break; if (y % 2 == 0) { var S = .5 * (1 - a.symbolSize), M = c + d[u][y] * S, I = o + f[s] * S, T = d[u][y] * a.symbolSize, C = f[s] * a.symbolSize, D = b / 2 % g[h].length; A(M, I, T, C, g[h][D]) } c += d[u][y], ++b, ++y === d[u].length && (y = 0) } ++u === d.length && (u = 0) } o += f[s], ++l, ++s === f.length && (s = 0) } function A(t, e, o, s, l) { var u = r ? 1 : n, h = Ry(l, t * u, e * u, o * u, s * u, a.color, a.symbolKeepAspect); if (r) { var c = i.painter.renderOneToVNode(h); c && x.children.push(c) } else nv(p, h) } })(), s && ov.put(e, m || x); t.image = m, t.svgElement = x, t.svgWidth = _.width, t.svgHeight = _.height }(s), s.rotation = a.rotation, s.scaleX = s.scaleY = r ? 1 : 1 / n, rv.set(t, s), t.dirty = !1, s } function lv(t) { if (!t || 0 === t.length) return [[\"rect\"]]; if (X(t)) return [[t]]; for (var e = !0, n = 0; n < t.length; ++n)if (!X(t[n])) { e = !1; break } if (e) return lv([t]); var i = []; for (n = 0; n < t.length; ++n)X(t[n]) ? i.push([t[n]]) : i.push(t[n]); return i } function uv(t) { if (!t || 0 === t.length) return [[0, 0]]; if (j(t)) return [[r = Math.ceil(t), r]]; for (var e = !0, n = 0; n < t.length; ++n)if (!j(t[n])) { e = !1; break } if (e) return uv([t]); var i = []; for (n = 0; n < t.length; ++n)if (j(t[n])) { var r = Math.ceil(t[n]); i.push([r, r]) } else { (r = z(t[n], (function (t) { return Math.ceil(t) }))).length % 2 == 1 ? i.push(r.concat(r)) : i.push(r) } return i } function hv(t) { for (var e = 0, n = 0; n < t.length; ++n)e += t[n]; return t.length % 2 == 1 ? 2 * e : e } var cv = new Xt, pv = {}; function dv(t) { return pv[t] } var fv = \"undefined\" != typeof window, gv = 2e3, yv = 4500, vv = { PROCESSOR: { FILTER: 1e3, SERIES_FILTER: 800, STATISTIC: 5e3 }, VISUAL: { LAYOUT: 1e3, PROGRESSIVE_LAYOUT: 1100, GLOBAL: gv, CHART: 3e3, POST_CHART_LAYOUT: 4600, COMPONENT: 4e3, BRUSH: 5e3, CHART_ITEM: yv, ARIA: 6e3, DECAL: 7e3 } }, mv = /^[a-zA-Z0-9_]+$/, xv = \"__connectUpdateStatus\"; function _v(t) { return function () { for (var e = [], n = 0; n < arguments.length; n++)e[n] = arguments[n]; if (!this.isDisposed()) return wv(this, t, e); Xv(this.id) } } function bv(t) { return function () { for (var e = [], n = 0; n < arguments.length; n++)e[n] = arguments[n]; return wv(this, t, e) } } function wv(t, e, n) { return n[0] = n[0] && n[0].toLowerCase(), Xt.prototype[e].apply(t, n) } var Sv, Mv, Iv, Tv, Cv, Dv, Av, kv, Lv, Pv, Ov, Rv, Nv, Ev, zv, Vv, Bv, Fv, Gv = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e }(Xt), Wv = Gv.prototype; Wv.on = bv(\"on\"), Wv.off = bv(\"off\"); var Hv = function (t) { function e(e, n, i) { var r = t.call(this, new py) || this; r._chartsViews = [], r._chartsMap = {}, r._componentsViews = [], r._componentsMap = {}, r._pendingActions = [], i = i || {}, X(n) && (n = Jv[n]), r._dom = e; var o = \"canvas\", a = \"auto\", s = !1, l = r._zr = Er(e, { renderer: i.renderer || o, devicePixelRatio: i.devicePixelRatio, width: i.width, height: i.height, ssr: i.ssr, useDirtyRect: rt(i.useDirtyRect, s), useCoarsePointer: rt(i.useCoarsePointer, a), pointerSize: i.pointerSize }); r._ssr = i.ssr, r._throttledZrFlush = Lg(W(l.flush, l), 17), (n = T(n)) && Ed(n, !0), r._theme = n, r._locale = function (t) { if (X(t)) { var e = Tc[t.toUpperCase()] || {}; return t === Sc || t === Mc ? T(e) : C(T(e), T(Tc.EN), !1) } return C(T(t), T(Tc.EN), !1) }(i.locale || Dc), r._coordSysMgr = new dd; var u = r._api = zv(r); function h(t, e) { return t.__prio - e.__prio } return Ke($v, h), Ke(qv, h), r._scheduler = new Yg(r, u, qv, $v), r._messageCenter = new Gv, r._initEvents(), r.resize = W(r.resize, r), l.animation.on(\"frame\", r._onframe, r), Pv(l, r), Ov(l, r), ct(r), r } return n(e, t), e.prototype._onframe = function () { if (!this._disposed) { Fv(this); var t = this._scheduler; if (this.__pendingUpdate) { var e = this.__pendingUpdate.silent; this.__flagInMainProcess = !0; try { Sv(this), Tv.update.call(this, null, this.__pendingUpdate.updateParams) } catch (t) { throw this.__flagInMainProcess = !1, this.__pendingUpdate = null, t } this._zr.flush(), this.__flagInMainProcess = !1, this.__pendingUpdate = null, kv.call(this, e), Lv.call(this, e) } else if (t.unfinished) { var n = 1, i = this._model, r = this._api; t.unfinished = !1; do { var o = +new Date; t.performSeriesTasks(i), t.performDataProcessorTasks(i), Dv(this, i), t.performVisualTasks(i), Ev(this, this._model, r, \"remain\", {}), n -= +new Date - o } while (n > 0 && t.unfinished); t.unfinished || this._zr.flush() } } }, e.prototype.getDom = function () { return this._dom }, e.prototype.getId = function () { return this.id }, e.prototype.getZr = function () { return this._zr }, e.prototype.isSSR = function () { return this._ssr }, e.prototype.setOption = function (t, e, n) { if (!this.__flagInMainProcess) if (this._disposed) Xv(this.id); else { var i, r, o; if (q(e) && (n = e.lazyUpdate, i = e.silent, r = e.replaceMerge, o = e.transition, e = e.notMerge), this.__flagInMainProcess = !0, !this._model || e) { var a = new gd(this._api), s = this._theme, l = this._model = new ad; l.scheduler = this._scheduler, l.ssr = this._ssr, l.init(null, null, null, s, this._locale, a) } this._model.setOption(t, { replaceMerge: r }, Kv); var u = { seriesTransition: o, optionChanged: !0 }; if (n) this.__pendingUpdate = { silent: i, updateParams: u }, this.__flagInMainProcess = !1, this.getZr().wakeUp(); else { try { Sv(this), Tv.update.call(this, null, u) } catch (t) { throw this.__pendingUpdate = null, this.__flagInMainProcess = !1, t } this._ssr || this._zr.flush(), this.__pendingUpdate = null, this.__flagInMainProcess = !1, kv.call(this, i), Lv.call(this, i) } } }, e.prototype.setTheme = function () { ho() }, e.prototype.getModel = function () { return this._model }, e.prototype.getOption = function () { return this._model && this._model.getOption() }, e.prototype.getWidth = function () { return this._zr.getWidth() }, e.prototype.getHeight = function () { return this._zr.getHeight() }, e.prototype.getDevicePixelRatio = function () { return this._zr.painter.dpr || fv && window.devicePixelRatio || 1 }, e.prototype.getRenderedCanvas = function (t) { return this.renderToCanvas(t) }, e.prototype.renderToCanvas = function (t) { t = t || {}; var e = this._zr.painter; return e.getRenderedCanvas({ backgroundColor: t.backgroundColor || this._model.get(\"backgroundColor\"), pixelRatio: t.pixelRatio || this.getDevicePixelRatio() }) }, e.prototype.renderToSVGString = function (t) { t = t || {}; var e = this._zr.painter; return e.renderToString({ useViewBox: t.useViewBox }) }, e.prototype.getSvgDataURL = function () { if (r.svgSupported) { var t = this._zr; return E(t.storage.getDisplayList(), (function (t) { t.stopAnimation(null, !0) })), t.painter.toDataURL() } }, e.prototype.getDataURL = function (t) { if (!this._disposed) { var e = (t = t || {}).excludeComponents, n = this._model, i = [], r = this; E(e, (function (t) { n.eachComponent({ mainType: t }, (function (t) { var e = r._componentsMap[t.__viewId]; e.group.ignore || (i.push(e), e.group.ignore = !0) })) })); var o = \"svg\" === this._zr.painter.getType() ? this.getSvgDataURL() : this.renderToCanvas(t).toDataURL(\"image/\" + (t && t.type || \"png\")); return E(i, (function (t) { t.group.ignore = !1 })), o } Xv(this.id) }, e.prototype.getConnectedDataURL = function (t) { if (!this._disposed) { var e = \"svg\" === t.type, n = this.group, i = Math.min, r = Math.max, o = 1 / 0; if (em[n]) { var a = o, s = o, l = -1 / 0, u = -1 / 0, c = [], p = t && t.pixelRatio || this.getDevicePixelRatio(); E(tm, (function (o, h) { if (o.group === n) { var p = e ? o.getZr().painter.getSvgDom().innerHTML : o.renderToCanvas(T(t)), d = o.getDom().getBoundingClientRect(); a = i(d.left, a), s = i(d.top, s), l = r(d.right, l), u = r(d.bottom, u), c.push({ dom: p, left: d.left, top: d.top }) } })); var d = (l *= p) - (a *= p), f = (u *= p) - (s *= p), g = h.createCanvas(), y = Er(g, { renderer: e ? \"svg\" : \"canvas\" }); if (y.resize({ width: d, height: f }), e) { var v = \"\"; return E(c, (function (t) { var e = t.left - a, n = t.top - s; v += '<g transform=\"translate(' + e + \",\" + n + ')\">' + t.dom + \"</g>\" })), y.painter.getSvgRoot().innerHTML = v, t.connectedBackgroundColor && y.painter.setBackgroundColor(t.connectedBackgroundColor), y.refreshImmediately(), y.painter.toDataURL() } return t.connectedBackgroundColor && y.add(new Ps({ shape: { x: 0, y: 0, width: d, height: f }, style: { fill: t.connectedBackgroundColor } })), E(c, (function (t) { var e = new Is({ style: { x: t.left * p - a, y: t.top * p - s, image: t.dom } }); y.add(e) })), y.refreshImmediately(), g.toDataURL(\"image/\" + (t && t.type || \"png\")) } return this.getDataURL(t) } Xv(this.id) }, e.prototype.convertToPixel = function (t, e) { return Cv(this, \"convertToPixel\", t, e) }, e.prototype.convertFromPixel = function (t, e) { return Cv(this, \"convertFromPixel\", t, e) }, e.prototype.containPixel = function (t, e) { var n; if (!this._disposed) return E(ko(this._model, t), (function (t, i) { i.indexOf(\"Models\") >= 0 && E(t, (function (t) { var r = t.coordinateSystem; if (r && r.containPoint) n = n || !!r.containPoint(e); else if (\"seriesModels\" === i) { var o = this._chartsMap[t.__viewId]; o && o.containPoint && (n = n || o.containPoint(e, t)) } else 0 }), this) }), this), !!n; Xv(this.id) }, e.prototype.getVisual = function (t, e) { var n = ko(this._model, t, { defaultMainType: \"series\" }), i = n.seriesModel; var r = i.getData(), o = n.hasOwnProperty(\"dataIndexInside\") ? n.dataIndexInside : n.hasOwnProperty(\"dataIndex\") ? r.indexOfRawIndex(n.dataIndex) : null; return null != o ? vy(r, o, e) : my(r, e) }, e.prototype.getViewOfComponentModel = function (t) { return this._componentsMap[t.__viewId] }, e.prototype.getViewOfSeriesModel = function (t) { return this._chartsMap[t.__viewId] }, e.prototype._initEvents = function () { var t, e, n, i = this; E(Uv, (function (t) { var e = function (e) { var n, r = i.getModel(), o = e.target, a = \"globalout\" === t; if (a ? n = {} : o && wy(o, (function (t) { var e = js(t); if (e && null != e.dataIndex) { var i = e.dataModel || r.getSeriesByIndex(e.seriesIndex); return n = i && i.getDataParams(e.dataIndex, e.dataType) || {}, !0 } if (e.eventData) return n = A({}, e.eventData), !0 }), !0), n) { var s = n.componentType, l = n.componentIndex; \"markLine\" !== s && \"markPoint\" !== s && \"markArea\" !== s || (s = \"series\", l = n.seriesIndex); var u = s && null != l && r.getComponent(s, l), h = u && i[\"series\" === u.mainType ? \"_chartsMap\" : \"_componentsMap\"][u.__viewId]; 0, n.event = e, n.type = t, i._$eventProcessor.eventInfo = { targetEl: o, packedEvent: n, model: u, view: h }, i.trigger(t, n) } }; e.zrEventfulCallAtLast = !0, i._zr.on(t, e, i) })), E(jv, (function (t, e) { i._messageCenter.on(e, (function (t) { this.trigger(e, t) }), i) })), E([\"selectchanged\"], (function (t) { i._messageCenter.on(t, (function (e) { this.trigger(t, e) }), i) })), t = this._messageCenter, e = this, n = this._api, t.on(\"selectchanged\", (function (t) { var i = n.getModel(); t.isFromClick ? (by(\"map\", \"selectchanged\", e, i, t), by(\"pie\", \"selectchanged\", e, i, t)) : \"select\" === t.fromAction ? (by(\"map\", \"selected\", e, i, t), by(\"pie\", \"selected\", e, i, t)) : \"unselect\" === t.fromAction && (by(\"map\", \"unselected\", e, i, t), by(\"pie\", \"unselected\", e, i, t)) })) }, e.prototype.isDisposed = function () { return this._disposed }, e.prototype.clear = function () { this._disposed ? Xv(this.id) : this.setOption({ series: [] }, !0) }, e.prototype.dispose = function () { if (this._disposed) Xv(this.id); else { this._disposed = !0, this.getDom() && No(this.getDom(), rm, \"\"); var t = this, e = t._api, n = t._model; E(t._componentsViews, (function (t) { t.dispose(n, e) })), E(t._chartsViews, (function (t) { t.dispose(n, e) })), t._zr.dispose(), t._dom = t._model = t._chartsMap = t._componentsMap = t._chartsViews = t._componentsViews = t._scheduler = t._api = t._zr = t._throttledZrFlush = t._theme = t._coordSysMgr = t._messageCenter = null, delete tm[t.id] } }, e.prototype.resize = function (t) { if (!this.__flagInMainProcess) if (this._disposed) Xv(this.id); else { this._zr.resize(t); var e = this._model; if (this._loadingFX && this._loadingFX.resize(), e) { var n = e.resetOption(\"media\"), i = t && t.silent; this.__pendingUpdate && (null == i && (i = this.__pendingUpdate.silent), n = !0, this.__pendingUpdate = null), this.__flagInMainProcess = !0; try { n && Sv(this), Tv.update.call(this, { type: \"resize\", animation: A({ duration: 0 }, t && t.animation) }) } catch (t) { throw this.__flagInMainProcess = !1, t } this.__flagInMainProcess = !1, kv.call(this, i), Lv.call(this, i) } } }, e.prototype.showLoading = function (t, e) { if (this._disposed) Xv(this.id); else if (q(t) && (e = t, t = \"\"), t = t || \"default\", this.hideLoading(), Qv[t]) { var n = Qv[t](this._api, e), i = this._zr; this._loadingFX = n, i.add(n) } }, e.prototype.hideLoading = function () { this._disposed ? Xv(this.id) : (this._loadingFX && this._zr.remove(this._loadingFX), this._loadingFX = null) }, e.prototype.makeActionFromEvent = function (t) { var e = A({}, t); return e.type = jv[t.type], e }, e.prototype.dispatchAction = function (t, e) { if (this._disposed) Xv(this.id); else if (q(e) || (e = { silent: !!e }), Zv[t.type] && this._model) if (this.__flagInMainProcess) this._pendingActions.push(t); else { var n = e.silent; Av.call(this, t, n); var i = e.flush; i ? this._zr.flush() : !1 !== i && r.browser.weChat && this._throttledZrFlush(), kv.call(this, n), Lv.call(this, n) } }, e.prototype.updateLabelLayout = function () { cv.trigger(\"series:layoutlabels\", this._model, this._api, { updatedSeries: [] }) }, e.prototype.appendData = function (t) { if (this._disposed) Xv(this.id); else { var e = t.seriesIndex, n = this.getModel().getSeriesByIndex(e); 0, n.appendData(t), this._scheduler.unfinished = !0, this.getZr().wakeUp() } }, e.internalField = function () { function t(t) { t.clearColorPalette(), t.eachSeries((function (t) { t.clearColorPalette() })) } function e(t) { for (var e = [], n = t.currentStates, i = 0; i < n.length; i++) { var r = n[i]; \"emphasis\" !== r && \"blur\" !== r && \"select\" !== r && e.push(r) } t.selected && t.states.select && e.push(\"select\"), 2 === t.hoverState && t.states.emphasis ? e.push(\"emphasis\") : 1 === t.hoverState && t.states.blur && e.push(\"blur\"), t.useStates(e) } function i(t, e) { if (!t.preventAutoZ) { var n = t.get(\"z\") || 0, i = t.get(\"zlevel\") || 0; e.eachRendered((function (t) { return o(t, n, i, -1 / 0), !0 })) } } function o(t, e, n, i) { var r = t.getTextContent(), a = t.getTextGuideLine(); if (t.isGroup) for (var s = t.childrenRef(), l = 0; l < s.length; l++)i = Math.max(o(s[l], e, n, i), i); else t.z = e, t.zlevel = n, i = Math.max(t.z2, i); if (r && (r.z = e, r.zlevel = n, isFinite(i) && (r.z2 = i + 2)), a) { var u = t.textGuideLineConfig; a.z = e, a.zlevel = n, isFinite(i) && (a.z2 = i + (u && u.showAbove ? 1 : -1)) } return i } function a(t, e) { e.eachRendered((function (t) { if (!ch(t)) { var e = t.getTextContent(), n = t.getTextGuideLine(); t.stateTransition && (t.stateTransition = null), e && e.stateTransition && (e.stateTransition = null), n && n.stateTransition && (n.stateTransition = null), t.hasState() ? (t.prevStates = t.currentStates, t.clearStates()) : t.prevStates && (t.prevStates = null) } })) } function s(t, n) { var i = t.getModel(\"stateAnimation\"), r = t.isAnimationEnabled(), o = i.get(\"duration\"), a = o > 0 ? { duration: o, delay: i.get(\"delay\"), easing: i.get(\"easing\") } : null; n.eachRendered((function (t) { if (t.states && t.states.emphasis) { if (ch(t)) return; if (t instanceof _s && function (t) { var e = Js(t); e.normalFill = t.style.fill, e.normalStroke = t.style.stroke; var n = t.states.select || {}; e.selectFill = n.style && n.style.fill || null, e.selectStroke = n.style && n.style.stroke || null }(t), t.__dirty) { var n = t.prevStates; n && t.useStates(n) } if (r) { t.stateTransition = a; var i = t.getTextContent(), o = t.getTextGuideLine(); i && (i.stateTransition = a), o && (o.stateTransition = a) } t.__dirty && e(t) } })) } Sv = function (t) { var e = t._scheduler; e.restorePipelines(t._model), e.prepareStageTasks(), Mv(t, !0), Mv(t, !1), e.plan() }, Mv = function (t, e) { for (var n = t._model, i = t._scheduler, r = e ? t._componentsViews : t._chartsViews, o = e ? t._componentsMap : t._chartsMap, a = t._zr, s = t._api, l = 0; l < r.length; l++)r[l].__alive = !1; function u(t) { var l = t.__requireNewView; t.__requireNewView = !1; var u = \"_ec_\" + t.id + \"_\" + t.type, h = !l && o[u]; if (!h) { var c = Fo(t.type), p = e ? mg.getClass(c.main, c.sub) : wg.getClass(c.sub); 0, (h = new p).init(n, s), o[u] = h, r.push(h), a.add(h.group) } t.__viewId = h.__id = u, h.__alive = !0, h.__model = t, h.group.__ecComponentInfo = { mainType: t.mainType, index: t.componentIndex }, !e && i.prepareView(h, t, n, s) } e ? n.eachComponent((function (t, e) { \"series\" !== t && u(e) })) : n.eachSeries(u); for (l = 0; l < r.length;) { var h = r[l]; h.__alive ? l++ : (!e && h.renderTask.dispose(), a.remove(h.group), h.dispose(n, s), r.splice(l, 1), o[h.__id] === h && delete o[h.__id], h.__id = h.group.__ecComponentInfo = null) } }, Iv = function (t, e, n, i, r) { var o = t._model; if (o.setUpdatePayload(n), i) { var a = {}; a[i + \"Id\"] = n[i + \"Id\"], a[i + \"Index\"] = n[i + \"Index\"], a[i + \"Name\"] = n[i + \"Name\"]; var s = { mainType: i, query: a }; r && (s.subType = r); var l, u = n.excludeSeriesId; null != u && (l = ft(), E(yo(u), (function (t) { var e = Mo(t, null); null != e && l.set(e, !0) }))), o && o.eachComponent(s, (function (e) { if (!(l && null !== l.get(e.id))) if (Zl(n)) if (e instanceof hg) n.type !== il || n.notBlur || e.get([\"emphasis\", \"disabled\"]) || function (t, e, n) { var i = t.seriesIndex, r = t.getData(e.dataType); if (r) { var o = Co(r, e); o = (Y(o) ? o[0] : o) || 0; var a = r.getItemGraphicEl(o); if (!a) for (var s = r.count(), l = 0; !a && l < s;)a = r.getItemGraphicEl(l++); if (a) { var u = js(a); Ol(i, u.focus, u.blurScope, n) } else { var h = t.get([\"emphasis\", \"focus\"]), c = t.get([\"emphasis\", \"blurScope\"]); null != h && Ol(i, h, c, n) } } }(e, n, t._api); else { var i = Nl(e.mainType, e.componentIndex, n.name, t._api), r = i.focusSelf, o = i.dispatchers; n.type === il && r && !n.notBlur && Rl(e.mainType, e.componentIndex, t._api), o && E(o, (function (t) { n.type === il ? Il(t) : Tl(t) })) } else Xl(n) && e instanceof hg && (!function (t, e, n) { if (Xl(e)) { var i = e.dataType, r = Co(t.getData(i), e); Y(r) || (r = [r]), t[e.type === sl ? \"toggleSelect\" : e.type === ol ? \"select\" : \"unselect\"](r, i) } }(e, n, t._api), El(e), Bv(t)) }), t), o && o.eachComponent(s, (function (e) { l && null !== l.get(e.id) || h(t[\"series\" === i ? \"_chartsMap\" : \"_componentsMap\"][e.__viewId]) }), t) } else E([].concat(t._componentsViews).concat(t._chartsViews), h); function h(i) { i && i.__alive && i[e] && i[e](i.__model, o, t._api, n) } }, Tv = { prepareAndUpdate: function (t) { Sv(this), Tv.update.call(this, t, { optionChanged: null != t.newOption }) }, update: function (e, n) { var i = this._model, r = this._api, o = this._zr, a = this._coordSysMgr, s = this._scheduler; if (i) { i.setUpdatePayload(e), s.restoreData(i, e), s.performSeriesTasks(i), a.create(i, r), s.performDataProcessorTasks(i, e), Dv(this, i), a.update(i, r), t(i), s.performVisualTasks(i, e), Rv(this, i, r, e, n); var l = i.get(\"backgroundColor\") || \"transparent\", u = i.get(\"darkMode\"); o.setBackgroundColor(l), null != u && \"auto\" !== u && o.setDarkMode(u), cv.trigger(\"afterupdate\", i, r) } }, updateTransform: function (e) { var n = this, i = this._model, r = this._api; if (i) { i.setUpdatePayload(e); var o = []; i.eachComponent((function (t, a) { if (\"series\" !== t) { var s = n.getViewOfComponentModel(a); if (s && s.__alive) if (s.updateTransform) { var l = s.updateTransform(a, i, r, e); l && l.update && o.push(s) } else o.push(s) } })); var a = ft(); i.eachSeries((function (t) { var o = n._chartsMap[t.__viewId]; if (o.updateTransform) { var s = o.updateTransform(t, i, r, e); s && s.update && a.set(t.uid, 1) } else a.set(t.uid, 1) })), t(i), this._scheduler.performVisualTasks(i, e, { setDirty: !0, dirtyMap: a }), Ev(this, i, r, e, {}, a), cv.trigger(\"afterupdate\", i, r) } }, updateView: function (e) { var n = this._model; n && (n.setUpdatePayload(e), wg.markUpdateMethod(e, \"updateView\"), t(n), this._scheduler.performVisualTasks(n, e, { setDirty: !0 }), Rv(this, n, this._api, e, {}), cv.trigger(\"afterupdate\", n, this._api)) }, updateVisual: function (e) { var n = this, i = this._model; i && (i.setUpdatePayload(e), i.eachSeries((function (t) { t.getData().clearAllVisual() })), wg.markUpdateMethod(e, \"updateVisual\"), t(i), this._scheduler.performVisualTasks(i, e, { visualType: \"visual\", setDirty: !0 }), i.eachComponent((function (t, r) { if (\"series\" !== t) { var o = n.getViewOfComponentModel(r); o && o.__alive && o.updateVisual(r, i, n._api, e) } })), i.eachSeries((function (t) { n._chartsMap[t.__viewId].updateVisual(t, i, n._api, e) })), cv.trigger(\"afterupdate\", i, this._api)) }, updateLayout: function (t) { Tv.update.call(this, t) } }, Cv = function (t, e, n, i) { if (t._disposed) Xv(t.id); else { for (var r, o = t._model, a = t._coordSysMgr.getCoordinateSystems(), s = ko(o, n), l = 0; l < a.length; l++) { var u = a[l]; if (u[e] && null != (r = u[e](o, s, i))) return r } 0 } }, Dv = function (t, e) { var n = t._chartsMap, i = t._scheduler; e.eachSeries((function (t) { i.updateStreamModes(t, n[t.__viewId]) })) }, Av = function (t, e) { var n = this, i = this.getModel(), r = t.type, o = t.escapeConnect, a = Zv[r], s = a.actionInfo, l = (s.update || \"update\").split(\":\"), u = l.pop(), h = null != l[0] && Fo(l[0]); this.__flagInMainProcess = !0; var c = [t], p = !1; t.batch && (p = !0, c = z(t.batch, (function (e) { return (e = k(A({}, e), t)).batch = null, e }))); var d, f = [], g = Xl(t), y = Zl(t); if (y && Pl(this._api), E(c, (function (e) { if ((d = (d = a.action(e, n._model, n._api)) || A({}, e)).type = s.event || d.type, f.push(d), y) { var i = Lo(t), r = i.queryOptionMap, o = i.mainTypeSpecified ? r.keys()[0] : \"series\"; Iv(n, u, e, o), Bv(n) } else g ? (Iv(n, u, e, \"series\"), Bv(n)) : h && Iv(n, u, e, h.main, h.sub) })), \"none\" !== u && !y && !g && !h) try { this.__pendingUpdate ? (Sv(this), Tv.update.call(this, t), this.__pendingUpdate = null) : Tv[u].call(this, t) } catch (t) { throw this.__flagInMainProcess = !1, t } if (d = p ? { type: s.event || r, escapeConnect: o, batch: f } : f[0], this.__flagInMainProcess = !1, !e) { var v = this._messageCenter; if (v.trigger(d.type, d), g) { var m = { type: \"selectchanged\", escapeConnect: o, selected: zl(i), isFromClick: t.isFromClick || !1, fromAction: t.type, fromActionPayload: t }; v.trigger(m.type, m) } } }, kv = function (t) { for (var e = this._pendingActions; e.length;) { var n = e.shift(); Av.call(this, n, t) } }, Lv = function (t) { !t && this.trigger(\"updated\") }, Pv = function (t, e) { t.on(\"rendered\", (function (n) { e.trigger(\"rendered\", n), !t.animation.isFinished() || e.__pendingUpdate || e._scheduler.unfinished || e._pendingActions.length || e.trigger(\"finished\") })) }, Ov = function (t, e) { t.on(\"mouseover\", (function (t) { var n = wy(t.target, Ul); n && (!function (t, e, n) { var i = js(t), r = Nl(i.componentMainType, i.componentIndex, i.componentHighDownName, n), o = r.dispatchers, a = r.focusSelf; o ? (a && Rl(i.componentMainType, i.componentIndex, n), E(o, (function (t) { return Sl(t, e) }))) : (Ol(i.seriesIndex, i.focus, i.blurScope, n), \"self\" === i.focus && Rl(i.componentMainType, i.componentIndex, n), Sl(t, e)) }(n, t, e._api), Bv(e)) })).on(\"mouseout\", (function (t) { var n = wy(t.target, Ul); n && (!function (t, e, n) { Pl(n); var i = js(t), r = Nl(i.componentMainType, i.componentIndex, i.componentHighDownName, n).dispatchers; r ? E(r, (function (t) { return Ml(t, e) })) : Ml(t, e) }(n, t, e._api), Bv(e)) })).on(\"click\", (function (t) { var n = wy(t.target, (function (t) { return null != js(t).dataIndex }), !0); if (n) { var i = n.selected ? \"unselect\" : \"select\", r = js(n); e._api.dispatchAction({ type: i, dataType: r.dataType, dataIndexInside: r.dataIndex, seriesIndex: r.seriesIndex, isFromClick: !0 }) } })) }, Rv = function (t, e, n, i, r) { !function (t) { var e = [], n = [], i = !1; if (t.eachComponent((function (t, r) { var o = r.get(\"zlevel\") || 0, a = r.get(\"z\") || 0, s = r.getZLevelKey(); i = i || !!s, (\"series\" === t ? n : e).push({ zlevel: o, z: a, idx: r.componentIndex, type: t, key: s }) })), i) { var r, o, a = e.concat(n); Ke(a, (function (t, e) { return t.zlevel === e.zlevel ? t.z - e.z : t.zlevel - e.zlevel })), E(a, (function (e) { var n = t.getComponent(e.type, e.idx), i = e.zlevel, a = e.key; null != r && (i = Math.max(r, i)), a ? (i === r && a !== o && i++, o = a) : o && (i === r && i++, o = \"\"), r = i, n.setZLevel(i) })) } }(e), Nv(t, e, n, i, r), E(t._chartsViews, (function (t) { t.__alive = !1 })), Ev(t, e, n, i, r), E(t._chartsViews, (function (t) { t.__alive || t.remove(e, n) })) }, Nv = function (t, e, n, r, o, l) { E(l || t._componentsViews, (function (t) { var o = t.__model; a(o, t), t.render(o, e, n, r), i(o, t), s(o, t) })) }, Ev = function (t, e, n, o, l, u) { var h = t._scheduler; l = A(l || {}, { updatedSeries: e.getSeries() }), cv.trigger(\"series:beforeupdate\", e, n, l); var c = !1; e.eachSeries((function (e) { var n = t._chartsMap[e.__viewId]; n.__alive = !0; var i = n.renderTask; h.updatePayload(i, o), a(e, n), u && u.get(e.uid) && i.dirty(), i.perform(h.getPerformArgs(i)) && (c = !0), n.group.silent = !!e.get(\"silent\"), function (t, e) { var n = t.get(\"blendMode\") || null; e.eachRendered((function (t) { t.isGroup || (t.style.blend = n) })) }(e, n), El(e) })), h.unfinished = c || h.unfinished, cv.trigger(\"series:layoutlabels\", e, n, l), cv.trigger(\"series:transition\", e, n, l), e.eachSeries((function (e) { var n = t._chartsMap[e.__viewId]; i(e, n), s(e, n) })), function (t, e) { var n = t._zr.storage, i = 0; n.traverse((function (t) { t.isGroup || i++ })), i > e.get(\"hoverLayerThreshold\") && !r.node && !r.worker && e.eachSeries((function (e) { if (!e.preventUsingHoverLayer) { var n = t._chartsMap[e.__viewId]; n.__alive && n.eachRendered((function (t) { t.states.emphasis && (t.states.emphasis.hoverLayer = !0) })) } })) }(t, e), cv.trigger(\"series:afterupdate\", e, n, l) }, Bv = function (t) { t.__needsUpdateStatus = !0, t.getZr().wakeUp() }, Fv = function (t) { t.__needsUpdateStatus && (t.getZr().storage.traverse((function (t) { ch(t) || e(t) })), t.__needsUpdateStatus = !1) }, zv = function (t) { return new (function (e) { function i() { return null !== e && e.apply(this, arguments) || this } return n(i, e), i.prototype.getCoordinateSystems = function () { return t._coordSysMgr.getCoordinateSystems() }, i.prototype.getComponentByElement = function (e) { for (; e;) { var n = e.__ecComponentInfo; if (null != n) return t._model.getComponent(n.mainType, n.index); e = e.parent } }, i.prototype.enterEmphasis = function (e, n) { Il(e, n), Bv(t) }, i.prototype.leaveEmphasis = function (e, n) { Tl(e, n), Bv(t) }, i.prototype.enterBlur = function (e) { Cl(e), Bv(t) }, i.prototype.leaveBlur = function (e) { Dl(e), Bv(t) }, i.prototype.enterSelect = function (e) { Al(e), Bv(t) }, i.prototype.leaveSelect = function (e) { kl(e), Bv(t) }, i.prototype.getModel = function () { return t.getModel() }, i.prototype.getViewOfComponentModel = function (e) { return t.getViewOfComponentModel(e) }, i.prototype.getViewOfSeriesModel = function (e) { return t.getViewOfSeriesModel(e) }, i }(cd))(t) }, Vv = function (t) { function e(t, e) { for (var n = 0; n < t.length; n++) { t[n][xv] = e } } E(jv, (function (n, i) { t._messageCenter.on(i, (function (n) { if (em[t.group] && 0 !== t[xv]) { if (n && n.escapeConnect) return; var i = t.makeActionFromEvent(n), r = []; E(tm, (function (e) { e !== t && e.group === t.group && r.push(e) })), e(r, 0), E(r, (function (t) { 1 !== t[xv] && t.dispatchAction(i) })), e(r, 2) } })) })) } }(), e }(Xt), Yv = Hv.prototype; Yv.on = _v(\"on\"), Yv.off = _v(\"off\"), Yv.one = function (t, e, n) { var i = this; ho(), this.on.call(this, t, (function n() { for (var r = [], o = 0; o < arguments.length; o++)r[o] = arguments[o]; e && e.apply && e.apply(this, r), i.off(t, n) }), n) }; var Uv = [\"click\", \"dblclick\", \"mouseover\", \"mouseout\", \"mousemove\", \"mousedown\", \"mouseup\", \"globalout\", \"contextmenu\"]; function Xv(t) { 0 } var Zv = {}, jv = {}, qv = [], Kv = [], $v = [], Jv = {}, Qv = {}, tm = {}, em = {}, nm = +new Date - 0, im = +new Date - 0, rm = \"_echarts_instance_\"; function om(t) { em[t] = !1 } var am = om; function sm(t) { return tm[function (t, e) { return t.getAttribute ? t.getAttribute(e) : t[e] }(t, rm)] } function lm(t, e) { Jv[t] = e } function um(t) { P(Kv, t) < 0 && Kv.push(t) } function hm(t, e) { xm(qv, t, e, 2e3) } function cm(t) { dm(\"afterinit\", t) } function pm(t) { dm(\"afterupdate\", t) } function dm(t, e) { cv.on(t, e) } function fm(t, e, n) { U(e) && (n = e, e = \"\"); var i = q(t) ? t.type : [t, t = { event: e }][0]; t.event = (t.event || i).toLowerCase(), e = t.event, jv[e] || (lt(mv.test(i) && mv.test(e)), Zv[i] || (Zv[i] = { action: n, actionInfo: t }), jv[e] = i) } function gm(t, e) { dd.register(t, e) } function ym(t, e) { xm($v, t, e, 1e3, \"layout\") } function vm(t, e) { xm($v, t, e, 3e3, \"visual\") } var mm = []; function xm(t, e, n, i, r) { if ((U(e) || q(e)) && (n = e, e = i), !(P(mm, n) >= 0)) { mm.push(n); var o = Yg.wrapStageHandler(n, r); o.__prio = e, o.__raw = n, t.push(o) } } function _m(t, e) { Qv[t] = e } function bm(t, e, n) { var i = dv(\"registerMap\"); i && i(t, e, n) } var wm = function (t) { var e = (t = T(t)).type, n = \"\"; e || co(n); var i = e.split(\":\"); 2 !== i.length && co(n); var r = !1; \"echarts\" === i[0] && (e = i[1], r = !0), t.__isBuiltIn = r, Af.set(e, t) }; vm(gv, Bg), vm(yv, Gg), vm(yv, Wg), vm(gv, gy), vm(yv, yy), vm(7e3, (function (t, e) { t.eachRawSeries((function (n) { if (!t.isSeriesFiltered(n)) { var i = n.getData(); i.hasItemVisual() && i.each((function (t) { var n = i.getItemVisual(t, \"decal\"); n && (i.ensureUniqueItemVisual(t, \"style\").decal = sv(n, e)) })); var r = i.getVisual(\"decal\"); if (r) i.getVisual(\"style\").decal = sv(r, e) } })) })), um(Ed), hm(900, (function (t) { var e = ft(); t.eachSeries((function (t) { var n = t.get(\"stack\"); if (n) { var i = e.get(n) || e.set(n, []), r = t.getData(), o = { stackResultDimension: r.getCalculationInfo(\"stackResultDimension\"), stackedOverDimension: r.getCalculationInfo(\"stackedOverDimension\"), stackedDimension: r.getCalculationInfo(\"stackedDimension\"), stackedByDimension: r.getCalculationInfo(\"stackedByDimension\"), isStackedByIndex: r.getCalculationInfo(\"isStackedByIndex\"), data: r, seriesModel: t }; if (!o.stackedDimension || !o.isStackedByIndex && !o.stackedByDimension) return; i.length && r.setCalculationInfo(\"stackedOnSeries\", i[i.length - 1].seriesModel), i.push(o) } })), e.each(zd) })), _m(\"default\", (function (t, e) { k(e = e || {}, { text: \"loading\", textColor: \"#000\", fontSize: 12, fontWeight: \"normal\", fontStyle: \"normal\", fontFamily: \"sans-serif\", maskColor: \"rgba(255, 255, 255, 0.8)\", showSpinner: !0, color: \"#5470c6\", spinnerRadius: 10, lineWidth: 5, zlevel: 0 }); var n = new Pr, i = new Ps({ style: { fill: e.maskColor }, zlevel: e.zlevel, z: 1e4 }); n.add(i); var r, o = new Ns({ style: { text: e.text, fill: e.textColor, fontSize: e.fontSize, fontWeight: e.fontWeight, fontStyle: e.fontStyle, fontFamily: e.fontFamily }, zlevel: e.zlevel, z: 10001 }), a = new Ps({ style: { fill: \"none\" }, textContent: o, textConfig: { position: \"right\", distance: 10 }, zlevel: e.zlevel, z: 10001 }); return n.add(a), e.showSpinner && ((r = new ju({ shape: { startAngle: -Hg / 2, endAngle: -Hg / 2 + .1, r: e.spinnerRadius }, style: { stroke: e.color, lineCap: \"round\", lineWidth: e.lineWidth }, zlevel: e.zlevel, z: 10001 })).animateShape(!0).when(1e3, { endAngle: 3 * Hg / 2 }).start(\"circularInOut\"), r.animateShape(!0).when(1e3, { startAngle: 3 * Hg / 2 }).delay(300).start(\"circularInOut\"), n.add(r)), n.resize = function () { var n = o.getBoundingRect().width, s = e.showSpinner ? e.spinnerRadius : 0, l = (t.getWidth() - 2 * s - (e.showSpinner && n ? 10 : 0) - n) / 2 - (e.showSpinner && n ? 0 : 5 + n / 2) + (e.showSpinner ? 0 : n / 2) + (n ? 0 : s), u = t.getHeight() / 2; e.showSpinner && r.setShape({ cx: l, cy: u }), a.setShape({ x: l - s, y: u - s, width: 2 * s, height: 2 * s }), i.setShape({ x: 0, y: 0, width: t.getWidth(), height: t.getHeight() }) }, n.resize(), n })), fm({ type: il, event: il, update: il }, xt), fm({ type: rl, event: rl, update: rl }, xt), fm({ type: ol, event: ol, update: ol }, xt), fm({ type: al, event: al, update: al }, xt), fm({ type: sl, event: sl, update: sl }, xt), lm(\"light\", ay), lm(\"dark\", cy); var Sm = [], Mm = { registerPreprocessor: um, registerProcessor: hm, registerPostInit: cm, registerPostUpdate: pm, registerUpdateLifecycle: dm, registerAction: fm, registerCoordinateSystem: gm, registerLayout: ym, registerVisual: vm, registerTransform: wm, registerLoading: _m, registerMap: bm, registerImpl: function (t, e) { pv[t] = e }, PRIORITY: vv, ComponentModel: Ap, ComponentView: mg, SeriesModel: hg, ChartView: wg, registerComponentModel: function (t) { Ap.registerClass(t) }, registerComponentView: function (t) { mg.registerClass(t) }, registerSeriesModel: function (t) { hg.registerClass(t) }, registerChartView: function (t) { wg.registerClass(t) }, registerSubTypeDefaulter: function (t, e) { Ap.registerSubTypeDefaulter(t, e) }, registerPainter: function (t, e) { zr(t, e) } }; function Im(t) { Y(t) ? E(t, (function (t) { Im(t) })) : P(Sm, t) >= 0 || (Sm.push(t), U(t) && (t = { install: t }), t.install(Mm)) } function Tm(t) { return null == t ? 0 : t.length || 1 } function Cm(t) { return t } var Dm = function () { function t(t, e, n, i, r, o) { this._old = t, this._new = e, this._oldKeyGetter = n || Cm, this._newKeyGetter = i || Cm, this.context = r, this._diffModeMultiple = \"multiple\" === o } return t.prototype.add = function (t) { return this._add = t, this }, t.prototype.update = function (t) { return this._update = t, this }, t.prototype.updateManyToOne = function (t) { return this._updateManyToOne = t, this }, t.prototype.updateOneToMany = function (t) { return this._updateOneToMany = t, this }, t.prototype.updateManyToMany = function (t) { return this._updateManyToMany = t, this }, t.prototype.remove = function (t) { return this._remove = t, this }, t.prototype.execute = function () { this[this._diffModeMultiple ? \"_executeMultiple\" : \"_executeOneToOne\"]() }, t.prototype._executeOneToOne = function () { var t = this._old, e = this._new, n = {}, i = new Array(t.length), r = new Array(e.length); this._initIndexMap(t, null, i, \"_oldKeyGetter\"), this._initIndexMap(e, n, r, \"_newKeyGetter\"); for (var o = 0; o < t.length; o++) { var a = i[o], s = n[a], l = Tm(s); if (l > 1) { var u = s.shift(); 1 === s.length && (n[a] = s[0]), this._update && this._update(u, o) } else 1 === l ? (n[a] = null, this._update && this._update(s, o)) : this._remove && this._remove(o) } this._performRestAdd(r, n) }, t.prototype._executeMultiple = function () { var t = this._old, e = this._new, n = {}, i = {}, r = [], o = []; this._initIndexMap(t, n, r, \"_oldKeyGetter\"), this._initIndexMap(e, i, o, \"_newKeyGetter\"); for (var a = 0; a < r.length; a++) { var s = r[a], l = n[s], u = i[s], h = Tm(l), c = Tm(u); if (h > 1 && 1 === c) this._updateManyToOne && this._updateManyToOne(u, l), i[s] = null; else if (1 === h && c > 1) this._updateOneToMany && this._updateOneToMany(u, l), i[s] = null; else if (1 === h && 1 === c) this._update && this._update(u, l), i[s] = null; else if (h > 1 && c > 1) this._updateManyToMany && this._updateManyToMany(u, l), i[s] = null; else if (h > 1) for (var p = 0; p < h; p++)this._remove && this._remove(l[p]); else this._remove && this._remove(l) } this._performRestAdd(o, i) }, t.prototype._performRestAdd = function (t, e) { for (var n = 0; n < t.length; n++) { var i = t[n], r = e[i], o = Tm(r); if (o > 1) for (var a = 0; a < o; a++)this._add && this._add(r[a]); else 1 === o && this._add && this._add(r); e[i] = null } }, t.prototype._initIndexMap = function (t, e, n, i) { for (var r = this._diffModeMultiple, o = 0; o < t.length; o++) { var a = \"_ec_\" + this[i](t[o], o); if (r || (n[o] = a), e) { var s = e[a], l = Tm(s); 0 === l ? (e[a] = o, r && n.push(a)) : 1 === l ? e[a] = [s, o] : s.push(o) } } }, t }(), Am = function () { function t(t, e) { this._encode = t, this._schema = e } return t.prototype.get = function () { return { fullDimensions: this._getFullDimensionNames(), encode: this._encode } }, t.prototype._getFullDimensionNames = function () { return this._cachedDimNames || (this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : []), this._cachedDimNames }, t }(); function km(t, e) { return t.hasOwnProperty(e) || (t[e] = []), t[e] } function Lm(t) { return \"category\" === t ? \"ordinal\" : \"time\" === t ? \"time\" : \"float\" } var Pm = function (t) { this.otherDims = {}, null != t && A(this, t) }, Om = Do(), Rm = { float: \"f\", int: \"i\", ordinal: \"o\", number: \"n\", time: \"t\" }, Nm = function () { function t(t) { this.dimensions = t.dimensions, this._dimOmitted = t.dimensionOmitted, this.source = t.source, this._fullDimCount = t.fullDimensionCount, this._updateDimOmitted(t.dimensionOmitted) } return t.prototype.isDimensionOmitted = function () { return this._dimOmitted }, t.prototype._updateDimOmitted = function (t) { this._dimOmitted = t, t && (this._dimNameMap || (this._dimNameMap = Vm(this.source))) }, t.prototype.getSourceDimensionIndex = function (t) { return rt(this._dimNameMap.get(t), -1) }, t.prototype.getSourceDimension = function (t) { var e = this.source.dimensionsDefine; if (e) return e[t] }, t.prototype.makeStoreSchema = function () { for (var t = this._fullDimCount, e = Kd(this.source), n = !Bm(t), i = \"\", r = [], o = 0, a = 0; o < t; o++) { var s = void 0, l = void 0, u = void 0, h = this.dimensions[a]; if (h && h.storeDimIndex === o) s = e ? h.name : null, l = h.type, u = h.ordinalMeta, a++; else { var c = this.getSourceDimension(o); c && (s = e ? c.name : null, l = c.type) } r.push({ property: s, type: l, ordinalMeta: u }), !e || null == s || h && h.isCalculationCoord || (i += n ? s.replace(/\\`/g, \"`1\").replace(/\\$/g, \"`2\") : s), i += \"$\", i += Rm[l] || \"f\", u && (i += u.uid), i += \"$\" } var p = this.source; return { dimensions: r, hash: [p.seriesLayoutBy, p.startIndex, i].join(\"$$\") } }, t.prototype.makeOutputDimensionNames = function () { for (var t = [], e = 0, n = 0; e < this._fullDimCount; e++) { var i = void 0, r = this.dimensions[n]; if (r && r.storeDimIndex === e) r.isCalculationCoord || (i = r.name), n++; else { var o = this.getSourceDimension(e); o && (i = o.name) } t.push(i) } return t }, t.prototype.appendCalculationDimension = function (t) { this.dimensions.push(t), t.isCalculationCoord = !0, this._fullDimCount++, this._updateDimOmitted(!0) }, t }(); function Em(t) { return t instanceof Nm } function zm(t) { for (var e = ft(), n = 0; n < (t || []).length; n++) { var i = t[n], r = q(i) ? i.name : i; null != r && null == e.get(r) && e.set(r, n) } return e } function Vm(t) { var e = Om(t); return e.dimNameMap || (e.dimNameMap = zm(t.dimensionsDefine)) } function Bm(t) { return t > 30 } var Fm, Gm, Wm, Hm, Ym, Um, Xm, Zm = q, jm = z, qm = \"undefined\" == typeof Int32Array ? Array : Int32Array, Km = [\"hasItemOption\", \"_nameList\", \"_idList\", \"_invertedIndicesMap\", \"_dimSummary\", \"userOutput\", \"_rawData\", \"_dimValueGetter\", \"_nameDimIdx\", \"_idDimIdx\", \"_nameRepeatCount\"], $m = [\"_approximateExtent\"], Jm = function () { function t(t, e) { var n; this.type = \"list\", this._dimOmitted = !1, this._nameList = [], this._idList = [], this._visual = {}, this._layout = {}, this._itemVisuals = [], this._itemLayouts = [], this._graphicEls = [], this._approximateExtent = {}, this._calculationInfo = {}, this.hasItemOption = !1, this.TRANSFERABLE_METHODS = [\"cloneShallow\", \"downSample\", \"lttbDownSample\", \"map\"], this.CHANGABLE_METHODS = [\"filterSelf\", \"selectRange\"], this.DOWNSAMPLE_METHODS = [\"downSample\", \"lttbDownSample\"]; var i = !1; Em(t) ? (n = t.dimensions, this._dimOmitted = t.isDimensionOmitted(), this._schema = t) : (i = !0, n = t), n = n || [\"x\", \"y\"]; for (var r = {}, o = [], a = {}, s = !1, l = {}, u = 0; u < n.length; u++) { var h = n[u], c = X(h) ? new Pm({ name: h }) : h instanceof Pm ? h : new Pm(h), p = c.name; c.type = c.type || \"float\", c.coordDim || (c.coordDim = p, c.coordDimIndex = 0); var d = c.otherDims = c.otherDims || {}; o.push(p), r[p] = c, null != l[p] && (s = !0), c.createInvertedIndices && (a[p] = []), 0 === d.itemName && (this._nameDimIdx = u), 0 === d.itemId && (this._idDimIdx = u), i && (c.storeDimIndex = u) } if (this.dimensions = o, this._dimInfos = r, this._initGetDimensionInfo(s), this.hostModel = e, this._invertedIndicesMap = a, this._dimOmitted) { var f = this._dimIdxToName = ft(); E(o, (function (t) { f.set(r[t].storeDimIndex, t) })) } } return t.prototype.getDimension = function (t) { var e = this._recognizeDimIndex(t); if (null == e) return t; if (e = t, !this._dimOmitted) return this.dimensions[e]; var n = this._dimIdxToName.get(e); if (null != n) return n; var i = this._schema.getSourceDimension(e); return i ? i.name : void 0 }, t.prototype.getDimensionIndex = function (t) { var e = this._recognizeDimIndex(t); if (null != e) return e; if (null == t) return -1; var n = this._getDimInfo(t); return n ? n.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(t) : -1 }, t.prototype._recognizeDimIndex = function (t) { if (j(t) || null != t && !isNaN(t) && !this._getDimInfo(t) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(t) < 0)) return +t }, t.prototype._getStoreDimIndex = function (t) { var e = this.getDimensionIndex(t); return e }, t.prototype.getDimensionInfo = function (t) { return this._getDimInfo(this.getDimension(t)) }, t.prototype._initGetDimensionInfo = function (t) { var e = this._dimInfos; this._getDimInfo = t ? function (t) { return e.hasOwnProperty(t) ? e[t] : void 0 } : function (t) { return e[t] } }, t.prototype.getDimensionsOnCoord = function () { return this._dimSummary.dataDimsOnCoord.slice() }, t.prototype.mapDimension = function (t, e) { var n = this._dimSummary; if (null == e) return n.encodeFirstDimNotExtra[t]; var i = n.encode[t]; return i ? i[e] : null }, t.prototype.mapDimensionsAll = function (t) { return (this._dimSummary.encode[t] || []).slice() }, t.prototype.getStore = function () { return this._store }, t.prototype.initData = function (t, e, n) { var i, r = this; if (t instanceof Gf && (i = t), !i) { var o = this.dimensions, a = Yd(t) || N(t) ? new $d(t, o.length) : t; i = new Gf; var s = jm(o, (function (t) { return { type: r._dimInfos[t].type, property: t } })); i.initData(a, s, n) } this._store = i, this._nameList = (e || []).slice(), this._idList = [], this._nameRepeatCount = {}, this._doInit(0, i.count()), this._dimSummary = function (t, e) { var n = {}, i = n.encode = {}, r = ft(), o = [], a = [], s = {}; E(t.dimensions, (function (e) { var n, l = t.getDimensionInfo(e), u = l.coordDim; if (u) { var h = l.coordDimIndex; km(i, u)[h] = e, l.isExtraCoord || (r.set(u, 1), \"ordinal\" !== (n = l.type) && \"time\" !== n && (o[0] = e), km(s, u)[h] = t.getDimensionIndex(l.name)), l.defaultTooltip && a.push(e) } Op.each((function (t, e) { var n = km(i, e), r = l.otherDims[e]; null != r && !1 !== r && (n[r] = l.name) })) })); var l = [], u = {}; r.each((function (t, e) { var n = i[e]; u[e] = n[0], l = l.concat(n) })), n.dataDimsOnCoord = l, n.dataDimIndicesOnCoord = z(l, (function (e) { return t.getDimensionInfo(e).storeDimIndex })), n.encodeFirstDimNotExtra = u; var h = i.label; h && h.length && (o = h.slice()); var c = i.tooltip; return c && c.length ? a = c.slice() : a.length || (a = o.slice()), i.defaultedLabel = o, i.defaultedTooltip = a, n.userOutput = new Am(s, e), n }(this, this._schema), this.userOutput = this._dimSummary.userOutput }, t.prototype.appendData = function (t) { var e = this._store.appendData(t); this._doInit(e[0], e[1]) }, t.prototype.appendValues = function (t, e) { var n = this._store.appendValues(t, e.length), i = n.start, r = n.end, o = this._shouldMakeIdFromName(); if (this._updateOrdinalMeta(), e) for (var a = i; a < r; a++) { var s = a - i; this._nameList[a] = e[s], o && Xm(this, a) } }, t.prototype._updateOrdinalMeta = function () { for (var t = this._store, e = this.dimensions, n = 0; n < e.length; n++) { var i = this._dimInfos[e[n]]; i.ordinalMeta && t.collectOrdinalMeta(i.storeDimIndex, i.ordinalMeta) } }, t.prototype._shouldMakeIdFromName = function () { var t = this._store.getProvider(); return null == this._idDimIdx && t.getSource().sourceFormat !== Vp && !t.fillStorage }, t.prototype._doInit = function (t, e) { if (!(t >= e)) { var n = this._store.getProvider(); this._updateOrdinalMeta(); var i = this._nameList, r = this._idList; if (n.getSource().sourceFormat === Rp && !n.pure) for (var o = [], a = t; a < e; a++) { var s = n.getItem(a, o); if (!this.hasItemOption && _o(s) && (this.hasItemOption = !0), s) { var l = s.name; null == i[a] && null != l && (i[a] = Mo(l, null)); var u = s.id; null == r[a] && null != u && (r[a] = Mo(u, null)) } } if (this._shouldMakeIdFromName()) for (a = t; a < e; a++)Xm(this, a); Fm(this) } }, t.prototype.getApproximateExtent = function (t) { return this._approximateExtent[t] || this._store.getDataExtent(this._getStoreDimIndex(t)) }, t.prototype.setApproximateExtent = function (t, e) { e = this.getDimension(e), this._approximateExtent[e] = t.slice() }, t.prototype.getCalculationInfo = function (t) { return this._calculationInfo[t] }, t.prototype.setCalculationInfo = function (t, e) { Zm(t) ? A(this._calculationInfo, t) : this._calculationInfo[t] = e }, t.prototype.getName = function (t) { var e = this.getRawIndex(t), n = this._nameList[e]; return null == n && null != this._nameDimIdx && (n = Wm(this, this._nameDimIdx, e)), null == n && (n = \"\"), n }, t.prototype._getCategory = function (t, e) { var n = this._store.get(t, e), i = this._store.getOrdinalMeta(t); return i ? i.categories[n] : n }, t.prototype.getId = function (t) { return Gm(this, this.getRawIndex(t)) }, t.prototype.count = function () { return this._store.count() }, t.prototype.get = function (t, e) { var n = this._store, i = this._dimInfos[t]; if (i) return n.get(i.storeDimIndex, e) }, t.prototype.getByRawIndex = function (t, e) { var n = this._store, i = this._dimInfos[t]; if (i) return n.getByRawIndex(i.storeDimIndex, e) }, t.prototype.getIndices = function () { return this._store.getIndices() }, t.prototype.getDataExtent = function (t) { return this._store.getDataExtent(this._getStoreDimIndex(t)) }, t.prototype.getSum = function (t) { return this._store.getSum(this._getStoreDimIndex(t)) }, t.prototype.getMedian = function (t) { return this._store.getMedian(this._getStoreDimIndex(t)) }, t.prototype.getValues = function (t, e) { var n = this, i = this._store; return Y(t) ? i.getValues(jm(t, (function (t) { return n._getStoreDimIndex(t) })), e) : i.getValues(t) }, t.prototype.hasValue = function (t) { for (var e = this._dimSummary.dataDimIndicesOnCoord, n = 0, i = e.length; n < i; n++)if (isNaN(this._store.get(e[n], t))) return !1; return !0 }, t.prototype.indexOfName = function (t) { for (var e = 0, n = this._store.count(); e < n; e++)if (this.getName(e) === t) return e; return -1 }, t.prototype.getRawIndex = function (t) { return this._store.getRawIndex(t) }, t.prototype.indexOfRawIndex = function (t) { return this._store.indexOfRawIndex(t) }, t.prototype.rawIndexOf = function (t, e) { var n = t && this._invertedIndicesMap[t]; var i = n[e]; return null == i || isNaN(i) ? -1 : i }, t.prototype.indicesOfNearest = function (t, e, n) { return this._store.indicesOfNearest(this._getStoreDimIndex(t), e, n) }, t.prototype.each = function (t, e, n) { U(t) && (n = e, e = t, t = []); var i = n || this, r = jm(Hm(t), this._getStoreDimIndex, this); this._store.each(r, i ? W(e, i) : e) }, t.prototype.filterSelf = function (t, e, n) { U(t) && (n = e, e = t, t = []); var i = n || this, r = jm(Hm(t), this._getStoreDimIndex, this); return this._store = this._store.filter(r, i ? W(e, i) : e), this }, t.prototype.selectRange = function (t) { var e = this, n = {}; return E(G(t), (function (i) { var r = e._getStoreDimIndex(i); n[r] = t[i] })), this._store = this._store.selectRange(n), this }, t.prototype.mapArray = function (t, e, n) { U(t) && (n = e, e = t, t = []), n = n || this; var i = []; return this.each(t, (function () { i.push(e && e.apply(this, arguments)) }), n), i }, t.prototype.map = function (t, e, n, i) { var r = n || i || this, o = jm(Hm(t), this._getStoreDimIndex, this), a = Um(this); return a._store = this._store.map(o, r ? W(e, r) : e), a }, t.prototype.modify = function (t, e, n, i) { var r = n || i || this; var o = jm(Hm(t), this._getStoreDimIndex, this); this._store.modify(o, r ? W(e, r) : e) }, t.prototype.downSample = function (t, e, n, i) { var r = Um(this); return r._store = this._store.downSample(this._getStoreDimIndex(t), e, n, i), r }, t.prototype.lttbDownSample = function (t, e) { var n = Um(this); return n._store = this._store.lttbDownSample(this._getStoreDimIndex(t), e), n }, t.prototype.getRawDataItem = function (t) { return this._store.getRawDataItem(t) }, t.prototype.getItemModel = function (t) { var e = this.hostModel, n = this.getRawDataItem(t); return new xc(n, e, e && e.ecModel) }, t.prototype.diff = function (t) { var e = this; return new Dm(t ? t.getStore().getIndices() : [], this.getStore().getIndices(), (function (e) { return Gm(t, e) }), (function (t) { return Gm(e, t) })) }, t.prototype.getVisual = function (t) { var e = this._visual; return e && e[t] }, t.prototype.setVisual = function (t, e) { this._visual = this._visual || {}, Zm(t) ? A(this._visual, t) : this._visual[t] = e }, t.prototype.getItemVisual = function (t, e) { var n = this._itemVisuals[t], i = n && n[e]; return null == i ? this.getVisual(e) : i }, t.prototype.hasItemVisual = function () { return this._itemVisuals.length > 0 }, t.prototype.ensureUniqueItemVisual = function (t, e) { var n = this._itemVisuals, i = n[t]; i || (i = n[t] = {}); var r = i[e]; return null == r && (Y(r = this.getVisual(e)) ? r = r.slice() : Zm(r) && (r = A({}, r)), i[e] = r), r }, t.prototype.setItemVisual = function (t, e, n) { var i = this._itemVisuals[t] || {}; this._itemVisuals[t] = i, Zm(e) ? A(i, e) : i[e] = n }, t.prototype.clearAllVisual = function () { this._visual = {}, this._itemVisuals = [] }, t.prototype.setLayout = function (t, e) { Zm(t) ? A(this._layout, t) : this._layout[t] = e }, t.prototype.getLayout = function (t) { return this._layout[t] }, t.prototype.getItemLayout = function (t) { return this._itemLayouts[t] }, t.prototype.setItemLayout = function (t, e, n) { this._itemLayouts[t] = n ? A(this._itemLayouts[t] || {}, e) : e }, t.prototype.clearItemLayouts = function () { this._itemLayouts.length = 0 }, t.prototype.setItemGraphicEl = function (t, e) { var n = this.hostModel && this.hostModel.seriesIndex; qs(n, this.dataType, t, e), this._graphicEls[t] = e }, t.prototype.getItemGraphicEl = function (t) { return this._graphicEls[t] }, t.prototype.eachItemGraphicEl = function (t, e) { E(this._graphicEls, (function (n, i) { n && t && t.call(e, n, i) })) }, t.prototype.cloneShallow = function (e) { return e || (e = new t(this._schema ? this._schema : jm(this.dimensions, this._getDimInfo, this), this.hostModel)), Ym(e, this), e._store = this._store, e }, t.prototype.wrapMethod = function (t, e) { var n = this[t]; U(n) && (this.__wrappedMethods = this.__wrappedMethods || [], this.__wrappedMethods.push(t), this[t] = function () { var t = n.apply(this, arguments); return e.apply(this, [t].concat(at(arguments))) }) }, t.internalField = (Fm = function (t) { var e = t._invertedIndicesMap; E(e, (function (n, i) { var r = t._dimInfos[i], o = r.ordinalMeta, a = t._store; if (o) { n = e[i] = new qm(o.categories.length); for (var s = 0; s < n.length; s++)n[s] = -1; for (s = 0; s < a.count(); s++)n[a.get(r.storeDimIndex, s)] = s } })) }, Wm = function (t, e, n) { return Mo(t._getCategory(e, n), null) }, Gm = function (t, e) { var n = t._idList[e]; return null == n && null != t._idDimIdx && (n = Wm(t, t._idDimIdx, e)), null == n && (n = \"e\\0\\0\" + e), n }, Hm = function (t) { return Y(t) || (t = null != t ? [t] : []), t }, Um = function (e) { var n = new t(e._schema ? e._schema : jm(e.dimensions, e._getDimInfo, e), e.hostModel); return Ym(n, e), n }, Ym = function (t, e) { E(Km.concat(e.__wrappedMethods || []), (function (n) { e.hasOwnProperty(n) && (t[n] = e[n]) })), t.__wrappedMethods = e.__wrappedMethods, E($m, (function (n) { t[n] = T(e[n]) })), t._calculationInfo = A({}, e._calculationInfo) }, void (Xm = function (t, e) { var n = t._nameList, i = t._idList, r = t._nameDimIdx, o = t._idDimIdx, a = n[e], s = i[e]; if (null == a && null != r && (n[e] = a = Wm(t, r, e)), null == s && null != o && (i[e] = s = Wm(t, o, e)), null == s && null != a) { var l = t._nameRepeatCount, u = l[a] = (l[a] || 0) + 1; s = a, u > 1 && (s += \"__ec__\" + u), i[e] = s } })), t }(); function Qm(t, e) { Yd(t) || (t = Xd(t)); var n = (e = e || {}).coordDimensions || [], i = e.dimensionsDefine || t.dimensionsDefine || [], r = ft(), o = [], a = function (t, e, n, i) { var r = Math.max(t.dimensionsDetectedCount || 1, e.length, n.length, i || 0); return E(e, (function (t) { var e; q(t) && (e = t.dimsDef) && (r = Math.max(r, e.length)) })), r }(t, n, i, e.dimensionsCount), s = e.canOmitUnusedDimensions && Bm(a), l = i === t.dimensionsDefine, u = l ? Vm(t) : zm(i), h = e.encodeDefine; !h && e.encodeDefaulter && (h = e.encodeDefaulter(t, a)); for (var c = ft(h), p = new Ef(a), d = 0; d < p.length; d++)p[d] = -1; function f(t) { var e = p[t]; if (e < 0) { var n = i[t], r = q(n) ? n : { name: n }, a = new Pm, s = r.name; null != s && null != u.get(s) && (a.name = a.displayName = s), null != r.type && (a.type = r.type), null != r.displayName && (a.displayName = r.displayName); var l = o.length; return p[t] = l, a.storeDimIndex = t, o.push(a), a } return o[e] } if (!s) for (d = 0; d < a; d++)f(d); c.each((function (t, e) { var n = yo(t).slice(); if (1 === n.length && !X(n[0]) && n[0] < 0) c.set(e, !1); else { var i = c.set(e, []); E(n, (function (t, n) { var r = X(t) ? u.get(t) : t; null != r && r < a && (i[n] = r, y(f(r), e, n)) })) } })); var g = 0; function y(t, e, n) { null != Op.get(e) ? t.otherDims[e] = n : (t.coordDim = e, t.coordDimIndex = n, r.set(e, !0)) } E(n, (function (t) { var e, n, i, r; if (X(t)) e = t, r = {}; else { e = (r = t).name; var o = r.ordinalMeta; r.ordinalMeta = null, (r = A({}, r)).ordinalMeta = o, n = r.dimsDef, i = r.otherDims, r.name = r.coordDim = r.coordDimIndex = r.dimsDef = r.otherDims = null } var s = c.get(e); if (!1 !== s) { if (!(s = yo(s)).length) for (var u = 0; u < (n && n.length || 1); u++) { for (; g < a && null != f(g).coordDim;)g++; g < a && s.push(g++) } E(s, (function (t, o) { var a = f(t); if (l && null != r.type && (a.type = r.type), y(k(a, r), e, o), null == a.name && n) { var s = n[o]; !q(s) && (s = { name: s }), a.name = a.displayName = s.name, a.defaultTooltip = s.defaultTooltip } i && k(a.otherDims, i) })) } })); var v = e.generateCoord, m = e.generateCoordCount, x = null != m; m = v ? m || 1 : 0; var _ = v || \"value\"; function b(t) { null == t.name && (t.name = t.coordDim) } if (s) E(o, (function (t) { b(t) })), o.sort((function (t, e) { return t.storeDimIndex - e.storeDimIndex })); else for (var w = 0; w < a; w++) { var S = f(w); null == S.coordDim && (S.coordDim = tx(_, r, x), S.coordDimIndex = 0, (!v || m <= 0) && (S.isExtraCoord = !0), m--), b(S), null != S.type || qp(t, w) !== Wp && (!S.isExtraCoord || null == S.otherDims.itemName && null == S.otherDims.seriesName) || (S.type = \"ordinal\") } return function (t) { for (var e = ft(), n = 0; n < t.length; n++) { var i = t[n], r = i.name, o = e.get(r) || 0; o > 0 && (i.name = r + (o - 1)), o++, e.set(r, o) } }(o), new Nm({ source: t, dimensions: o, fullDimensionCount: a, dimensionOmitted: s }) } function tx(t, e, n) { var i = e.data; if (n || i.hasOwnProperty(t)) { for (var r = 0; i.hasOwnProperty(t + r);)r++; t += r } return e.set(t, !0), t } var ex = function (t) { this.coordSysDims = [], this.axisMap = ft(), this.categoryAxisMap = ft(), this.coordSysName = t }; var nx = { cartesian2d: function (t, e, n, i) { var r = t.getReferringComponents(\"xAxis\", Po).models[0], o = t.getReferringComponents(\"yAxis\", Po).models[0]; e.coordSysDims = [\"x\", \"y\"], n.set(\"x\", r), n.set(\"y\", o), ix(r) && (i.set(\"x\", r), e.firstCategoryDimIndex = 0), ix(o) && (i.set(\"y\", o), null == e.firstCategoryDimIndex && (e.firstCategoryDimIndex = 1)) }, singleAxis: function (t, e, n, i) { var r = t.getReferringComponents(\"singleAxis\", Po).models[0]; e.coordSysDims = [\"single\"], n.set(\"single\", r), ix(r) && (i.set(\"single\", r), e.firstCategoryDimIndex = 0) }, polar: function (t, e, n, i) { var r = t.getReferringComponents(\"polar\", Po).models[0], o = r.findAxisModel(\"radiusAxis\"), a = r.findAxisModel(\"angleAxis\"); e.coordSysDims = [\"radius\", \"angle\"], n.set(\"radius\", o), n.set(\"angle\", a), ix(o) && (i.set(\"radius\", o), e.firstCategoryDimIndex = 0), ix(a) && (i.set(\"angle\", a), null == e.firstCategoryDimIndex && (e.firstCategoryDimIndex = 1)) }, geo: function (t, e, n, i) { e.coordSysDims = [\"lng\", \"lat\"] }, parallel: function (t, e, n, i) { var r = t.ecModel, o = r.getComponent(\"parallel\", t.get(\"parallelIndex\")), a = e.coordSysDims = o.dimensions.slice(); E(o.parallelAxisIndex, (function (t, o) { var s = r.getComponent(\"parallelAxis\", t), l = a[o]; n.set(l, s), ix(s) && (i.set(l, s), null == e.firstCategoryDimIndex && (e.firstCategoryDimIndex = o)) })) } }; function ix(t) { return \"category\" === t.get(\"type\") } function rx(t, e, n) { var i, r, o, a = (n = n || {}).byIndex, s = n.stackedCoordDimension; !function (t) { return !Em(t.schema) }(e) ? (r = e.schema, i = r.dimensions, o = e.store) : i = e; var l, u, h, c, p = !(!t || !t.get(\"stack\")); if (E(i, (function (t, e) { X(t) && (i[e] = t = { name: t }), p && !t.isExtraCoord && (a || l || !t.ordinalMeta || (l = t), u || \"ordinal\" === t.type || \"time\" === t.type || s && s !== t.coordDim || (u = t)) })), !u || a || l || (a = !0), u) { h = \"__\\0ecstackresult_\" + t.id, c = \"__\\0ecstackedover_\" + t.id, l && (l.createInvertedIndices = !0); var d = u.coordDim, f = u.type, g = 0; E(i, (function (t) { t.coordDim === d && g++ })); var y = { name: h, coordDim: d, coordDimIndex: g, type: f, isExtraCoord: !0, isCalculationCoord: !0, storeDimIndex: i.length }, v = { name: c, coordDim: c, coordDimIndex: g + 1, type: f, isExtraCoord: !0, isCalculationCoord: !0, storeDimIndex: i.length + 1 }; r ? (o && (y.storeDimIndex = o.ensureCalculationDimension(c, f), v.storeDimIndex = o.ensureCalculationDimension(h, f)), r.appendCalculationDimension(y), r.appendCalculationDimension(v)) : (i.push(y), i.push(v)) } return { stackedDimension: u && u.name, stackedByDimension: l && l.name, isStackedByIndex: a, stackedOverDimension: c, stackResultDimension: h } } function ox(t, e) { return !!e && e === t.getCalculationInfo(\"stackedDimension\") } function ax(t, e) { return ox(t, e) ? t.getCalculationInfo(\"stackResultDimension\") : e } function sx(t, e, n) { n = n || {}; var i, r = e.getSourceManager(), o = !1; t ? (o = !0, i = Xd(t)) : o = (i = r.getSource()).sourceFormat === Rp; var a = function (t) { var e = t.get(\"coordinateSystem\"), n = new ex(e), i = nx[e]; if (i) return i(t, n, n.axisMap, n.categoryAxisMap), n }(e), s = function (t, e) { var n, i = t.get(\"coordinateSystem\"), r = dd.get(i); return e && e.coordSysDims && (n = z(e.coordSysDims, (function (t) { var n = { name: t }, i = e.axisMap.get(t); if (i) { var r = i.get(\"type\"); n.type = Lm(r) } return n }))), n || (n = r && (r.getDimensionsInfo ? r.getDimensionsInfo() : r.dimensions.slice()) || [\"x\", \"y\"]), n }(e, a), l = n.useEncodeDefaulter, u = U(l) ? l : l ? H(Xp, s, e) : null, h = Qm(i, { coordDimensions: s, generateCoord: n.generateCoord, encodeDefine: e.getEncode(), encodeDefaulter: u, canOmitUnusedDimensions: !o }), c = function (t, e, n) { var i, r; return n && E(t, (function (t, o) { var a = t.coordDim, s = n.categoryAxisMap.get(a); s && (null == i && (i = o), t.ordinalMeta = s.getOrdinalMeta(), e && (t.createInvertedIndices = !0)), null != t.otherDims.itemName && (r = !0) })), r || null == i || (t[i].otherDims.itemName = 0), i }(h.dimensions, n.createInvertedIndices, a), p = o ? null : r.getSharedDataStore(h), d = rx(e, { schema: h, store: p }), f = new Jm(h, e); f.setCalculationInfo(d); var g = null != c && function (t) { if (t.sourceFormat === Rp) { var e = function (t) { var e = 0; for (; e < t.length && null == t[e];)e++; return t[e] }(t.data || []); return !Y(xo(e)) } }(i) ? function (t, e, n, i) { return i === c ? n : this.defaultDimValueGetter(t, e, n, i) } : null; return f.hasItemOption = !1, f.initData(o ? i : p, null, g), f } var lx = function () { function t(t) { this._setting = t || {}, this._extent = [1 / 0, -1 / 0] } return t.prototype.getSetting = function (t) { return this._setting[t] }, t.prototype.unionExtent = function (t) { var e = this._extent; t[0] < e[0] && (e[0] = t[0]), t[1] > e[1] && (e[1] = t[1]) }, t.prototype.unionExtentFromData = function (t, e) { this.unionExtent(t.getApproximateExtent(e)) }, t.prototype.getExtent = function () { return this._extent.slice() }, t.prototype.setExtent = function (t, e) { var n = this._extent; isNaN(t) || (n[0] = t), isNaN(e) || (n[1] = e) }, t.prototype.isInExtentRange = function (t) { return this._extent[0] <= t && this._extent[1] >= t }, t.prototype.isBlank = function () { return this._isBlank }, t.prototype.setBlank = function (t) { this._isBlank = t }, t }(); Xo(lx); var ux = 0, hx = function () { function t(t) { this.categories = t.categories || [], this._needCollect = t.needCollect, this._deduplication = t.deduplication, this.uid = ++ux } return t.createByAxisModel = function (e) { var n = e.option, i = n.data, r = i && z(i, cx); return new t({ categories: r, needCollect: !r, deduplication: !1 !== n.dedplication }) }, t.prototype.getOrdinal = function (t) { return this._getOrCreateMap().get(t) }, t.prototype.parseAndCollect = function (t) { var e, n = this._needCollect; if (!X(t) && !n) return t; if (n && !this._deduplication) return e = this.categories.length, this.categories[e] = t, e; var i = this._getOrCreateMap(); return null == (e = i.get(t)) && (n ? (e = this.categories.length, this.categories[e] = t, i.set(t, e)) : e = NaN), e }, t.prototype._getOrCreateMap = function () { return this._map || (this._map = ft(this.categories)) }, t }(); function cx(t) { return q(t) && null != t.value ? t.value : t + \"\" } function px(t) { return \"interval\" === t.type || \"log\" === t.type } function dx(t, e, n, i) { var r = {}, o = t[1] - t[0], a = r.interval = no(o / e, !0); null != n && a < n && (a = r.interval = n), null != i && a > i && (a = r.interval = i); var s = r.intervalPrecision = gx(a); return function (t, e) { !isFinite(t[0]) && (t[0] = e[0]), !isFinite(t[1]) && (t[1] = e[1]), yx(t, 0, e), yx(t, 1, e), t[0] > t[1] && (t[0] = t[1]) }(r.niceTickExtent = [Wr(Math.ceil(t[0] / a) * a, s), Wr(Math.floor(t[1] / a) * a, s)], t), r } function fx(t) { var e = Math.pow(10, eo(t)), n = t / e; return n ? 2 === n ? n = 3 : 3 === n ? n = 5 : n *= 2 : n = 1, Wr(n * e) } function gx(t) { return Yr(t) + 2 } function yx(t, e, n) { t[e] = Math.max(Math.min(t[e], n[1]), n[0]) } function vx(t, e) { return t >= e[0] && t <= e[1] } function mx(t, e) { return e[1] === e[0] ? .5 : (t - e[0]) / (e[1] - e[0]) } function xx(t, e) { return t * (e[1] - e[0]) + e[0] } var _x = function (t) { function e(e) { var n = t.call(this, e) || this; n.type = \"ordinal\"; var i = n.getSetting(\"ordinalMeta\"); return i || (i = new hx({})), Y(i) && (i = new hx({ categories: z(i, (function (t) { return q(t) ? t.value : t })) })), n._ordinalMeta = i, n._extent = n.getSetting(\"extent\") || [0, i.categories.length - 1], n } return n(e, t), e.prototype.parse = function (t) { return null == t ? NaN : X(t) ? this._ordinalMeta.getOrdinal(t) : Math.round(t) }, e.prototype.contain = function (t) { return vx(t = this.parse(t), this._extent) && null != this._ordinalMeta.categories[t] }, e.prototype.normalize = function (t) { return mx(t = this._getTickNumber(this.parse(t)), this._extent) }, e.prototype.scale = function (t) { return t = Math.round(xx(t, this._extent)), this.getRawOrdinalNumber(t) }, e.prototype.getTicks = function () { for (var t = [], e = this._extent, n = e[0]; n <= e[1];)t.push({ value: n }), n++; return t }, e.prototype.getMinorTicks = function (t) { }, e.prototype.setSortInfo = function (t) { if (null != t) { for (var e = t.ordinalNumbers, n = this._ordinalNumbersByTick = [], i = this._ticksByOrdinalNumber = [], r = 0, o = this._ordinalMeta.categories.length, a = Math.min(o, e.length); r < a; ++r) { var s = e[r]; n[r] = s, i[s] = r } for (var l = 0; r < o; ++r) { for (; null != i[l];)l++; n.push(l), i[l] = r } } else this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null }, e.prototype._getTickNumber = function (t) { var e = this._ticksByOrdinalNumber; return e && t >= 0 && t < e.length ? e[t] : t }, e.prototype.getRawOrdinalNumber = function (t) { var e = this._ordinalNumbersByTick; return e && t >= 0 && t < e.length ? e[t] : t }, e.prototype.getLabel = function (t) { if (!this.isBlank()) { var e = this.getRawOrdinalNumber(t.value), n = this._ordinalMeta.categories[e]; return null == n ? \"\" : n + \"\" } }, e.prototype.count = function () { return this._extent[1] - this._extent[0] + 1 }, e.prototype.unionExtentFromData = function (t, e) { this.unionExtent(t.getApproximateExtent(e)) }, e.prototype.isInExtentRange = function (t) { return t = this._getTickNumber(t), this._extent[0] <= t && this._extent[1] >= t }, e.prototype.getOrdinalMeta = function () { return this._ordinalMeta }, e.prototype.calcNiceTicks = function () { }, e.prototype.calcNiceExtent = function () { }, e.type = \"ordinal\", e }(lx); lx.registerClass(_x); var bx = Wr, Sx = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"interval\", e._interval = 0, e._intervalPrecision = 2, e } return n(e, t), e.prototype.parse = function (t) { return t }, e.prototype.contain = function (t) { return vx(t, this._extent) }, e.prototype.normalize = function (t) { return mx(t, this._extent) }, e.prototype.scale = function (t) { return xx(t, this._extent) }, e.prototype.setExtent = function (t, e) { var n = this._extent; isNaN(t) || (n[0] = parseFloat(t)), isNaN(e) || (n[1] = parseFloat(e)) }, e.prototype.unionExtent = function (t) { var e = this._extent; t[0] < e[0] && (e[0] = t[0]), t[1] > e[1] && (e[1] = t[1]), this.setExtent(e[0], e[1]) }, e.prototype.getInterval = function () { return this._interval }, e.prototype.setInterval = function (t) { this._interval = t, this._niceExtent = this._extent.slice(), this._intervalPrecision = gx(t) }, e.prototype.getTicks = function (t) { var e = this._interval, n = this._extent, i = this._niceExtent, r = this._intervalPrecision, o = []; if (!e) return o; n[0] < i[0] && (t ? o.push({ value: bx(i[0] - e, r) }) : o.push({ value: n[0] })); for (var a = i[0]; a <= i[1] && (o.push({ value: a }), (a = bx(a + e, r)) !== o[o.length - 1].value);)if (o.length > 1e4) return []; var s = o.length ? o[o.length - 1].value : i[1]; return n[1] > s && (t ? o.push({ value: bx(s + e, r) }) : o.push({ value: n[1] })), o }, e.prototype.getMinorTicks = function (t) { for (var e = this.getTicks(!0), n = [], i = this.getExtent(), r = 1; r < e.length; r++) { for (var o = e[r], a = e[r - 1], s = 0, l = [], u = (o.value - a.value) / t; s < t - 1;) { var h = bx(a.value + (s + 1) * u); h > i[0] && h < i[1] && l.push(h), s++ } n.push(l) } return n }, e.prototype.getLabel = function (t, e) { if (null == t) return \"\"; var n = e && e.precision; return null == n ? n = Yr(t.value) || 0 : \"auto\" === n && (n = this._intervalPrecision), sp(bx(t.value, n, !0)) }, e.prototype.calcNiceTicks = function (t, e, n) { t = t || 5; var i = this._extent, r = i[1] - i[0]; if (isFinite(r)) { r < 0 && (r = -r, i.reverse()); var o = dx(i, t, e, n); this._intervalPrecision = o.intervalPrecision, this._interval = o.interval, this._niceExtent = o.niceTickExtent } }, e.prototype.calcNiceExtent = function (t) { var e = this._extent; if (e[0] === e[1]) if (0 !== e[0]) { var n = Math.abs(e[0]); t.fixMax || (e[1] += n / 2), e[0] -= n / 2 } else e[1] = 1; var i = e[1] - e[0]; isFinite(i) || (e[0] = 0, e[1] = 1), this.calcNiceTicks(t.splitNumber, t.minInterval, t.maxInterval); var r = this._interval; t.fixMin || (e[0] = bx(Math.floor(e[0] / r) * r)), t.fixMax || (e[1] = bx(Math.ceil(e[1] / r) * r)) }, e.prototype.setNiceExtent = function (t, e) { this._niceExtent = [t, e] }, e.type = \"interval\", e }(lx); lx.registerClass(Sx); var Mx = \"undefined\" != typeof Float32Array, Ix = Mx ? Float32Array : Array; function Tx(t) { return Y(t) ? Mx ? new Float32Array(t) : t : new Ix(t) } var Cx = \"__ec_stack_\"; function Dx(t) { return t.get(\"stack\") || Cx + t.seriesIndex } function Ax(t) { return t.dim + t.index } function kx(t, e) { var n = []; return e.eachSeriesByType(t, (function (t) { Nx(t) && n.push(t) })), n } function Lx(t) { var e = function (t) { var e = {}; E(t, (function (t) { var n = t.coordinateSystem.getBaseAxis(); if (\"time\" === n.type || \"value\" === n.type) for (var i = t.getData(), r = n.dim + \"_\" + n.index, o = i.getDimensionIndex(i.mapDimension(n.dim)), a = i.getStore(), s = 0, l = a.count(); s < l; ++s) { var u = a.get(o, s); e[r] ? e[r].push(u) : e[r] = [u] } })); var n = {}; for (var i in e) if (e.hasOwnProperty(i)) { var r = e[i]; if (r) { r.sort((function (t, e) { return t - e })); for (var o = null, a = 1; a < r.length; ++a) { var s = r[a] - r[a - 1]; s > 0 && (o = null === o ? s : Math.min(o, s)) } n[i] = o } } return n }(t), n = []; return E(t, (function (t) { var i, r = t.coordinateSystem.getBaseAxis(), o = r.getExtent(); if (\"category\" === r.type) i = r.getBandWidth(); else if (\"value\" === r.type || \"time\" === r.type) { var a = r.dim + \"_\" + r.index, s = e[a], l = Math.abs(o[1] - o[0]), u = r.scale.getExtent(), h = Math.abs(u[1] - u[0]); i = s ? l / h * s : l } else { var c = t.getData(); i = Math.abs(o[1] - o[0]) / c.count() } var p = Gr(t.get(\"barWidth\"), i), d = Gr(t.get(\"barMaxWidth\"), i), f = Gr(t.get(\"barMinWidth\") || (Ex(t) ? .5 : 1), i), g = t.get(\"barGap\"), y = t.get(\"barCategoryGap\"); n.push({ bandWidth: i, barWidth: p, barMaxWidth: d, barMinWidth: f, barGap: g, barCategoryGap: y, axisKey: Ax(r), stackId: Dx(t) }) })), Px(n) } function Px(t) { var e = {}; E(t, (function (t, n) { var i = t.axisKey, r = t.bandWidth, o = e[i] || { bandWidth: r, remainedWidth: r, autoWidthCount: 0, categoryGap: null, gap: \"20%\", stacks: {} }, a = o.stacks; e[i] = o; var s = t.stackId; a[s] || o.autoWidthCount++, a[s] = a[s] || { width: 0, maxWidth: 0 }; var l = t.barWidth; l && !a[s].width && (a[s].width = l, l = Math.min(o.remainedWidth, l), o.remainedWidth -= l); var u = t.barMaxWidth; u && (a[s].maxWidth = u); var h = t.barMinWidth; h && (a[s].minWidth = h); var c = t.barGap; null != c && (o.gap = c); var p = t.barCategoryGap; null != p && (o.categoryGap = p) })); var n = {}; return E(e, (function (t, e) { n[e] = {}; var i = t.stacks, r = t.bandWidth, o = t.categoryGap; if (null == o) { var a = G(i).length; o = Math.max(35 - 4 * a, 15) + \"%\" } var s = Gr(o, r), l = Gr(t.gap, 1), u = t.remainedWidth, h = t.autoWidthCount, c = (u - s) / (h + (h - 1) * l); c = Math.max(c, 0), E(i, (function (t) { var e = t.maxWidth, n = t.minWidth; if (t.width) { i = t.width; e && (i = Math.min(i, e)), n && (i = Math.max(i, n)), t.width = i, u -= i + l * i, h-- } else { var i = c; e && e < i && (i = Math.min(e, u)), n && n > i && (i = n), i !== c && (t.width = i, u -= i + l * i, h--) } })), c = (u - s) / (h + (h - 1) * l), c = Math.max(c, 0); var p, d = 0; E(i, (function (t, e) { t.width || (t.width = c), p = t, d += t.width * (1 + l) })), p && (d -= p.width * l); var f = -d / 2; E(i, (function (t, i) { n[e][i] = n[e][i] || { bandWidth: r, offset: f, width: t.width }, f += t.width * (1 + l) })) })), n } function Ox(t, e) { var n = kx(t, e), i = Lx(n); E(n, (function (t) { var e = t.getData(), n = t.coordinateSystem.getBaseAxis(), r = Dx(t), o = i[Ax(n)][r], a = o.offset, s = o.width; e.setLayout({ bandWidth: o.bandWidth, offset: a, size: s }) })) } function Rx(t) { return { seriesType: t, plan: xg(), reset: function (t) { if (Nx(t)) { var e = t.getData(), n = t.coordinateSystem, i = n.getBaseAxis(), r = n.getOtherAxis(i), o = e.getDimensionIndex(e.mapDimension(r.dim)), a = e.getDimensionIndex(e.mapDimension(i.dim)), s = t.get(\"showBackground\", !0), l = e.mapDimension(r.dim), u = e.getCalculationInfo(\"stackResultDimension\"), h = ox(e, l) && !!e.getCalculationInfo(\"stackedOnSeries\"), c = r.isHorizontal(), p = function (t, e) { return e.toGlobalCoord(e.dataToCoord(\"log\" === e.type ? 1 : 0)) }(0, r), d = Ex(t), f = t.get(\"barMinHeight\") || 0, g = u && e.getDimensionIndex(u), y = e.getLayout(\"size\"), v = e.getLayout(\"offset\"); return { progress: function (t, e) { for (var i, r = t.count, l = d && Tx(3 * r), u = d && s && Tx(3 * r), m = d && Tx(r), x = n.master.getRect(), _ = c ? x.width : x.height, b = e.getStore(), w = 0; null != (i = t.next());) { var S = b.get(h ? g : o, i), M = b.get(a, i), I = p, T = void 0; h && (T = +S - b.get(o, i)); var C = void 0, D = void 0, A = void 0, k = void 0; if (c) { var L = n.dataToPoint([S, M]); if (h) I = n.dataToPoint([T, M])[0]; C = I, D = L[1] + v, A = L[0] - I, k = y, Math.abs(A) < f && (A = (A < 0 ? -1 : 1) * f) } else { L = n.dataToPoint([M, S]); if (h) I = n.dataToPoint([M, T])[1]; C = L[0] + v, D = I, A = y, k = L[1] - I, Math.abs(k) < f && (k = (k <= 0 ? -1 : 1) * f) } d ? (l[w] = C, l[w + 1] = D, l[w + 2] = c ? A : k, u && (u[w] = c ? x.x : C, u[w + 1] = c ? D : x.y, u[w + 2] = _), m[i] = i) : e.setItemLayout(i, { x: C, y: D, width: A, height: k }), w += 3 } d && e.setLayout({ largePoints: l, largeDataIndices: m, largeBackgroundPoints: u, valueAxisHorizontal: c }) } } } } } } function Nx(t) { return t.coordinateSystem && \"cartesian2d\" === t.coordinateSystem.type } function Ex(t) { return t.pipelineContext && t.pipelineContext.large } var zx = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"time\", n } return n(e, t), e.prototype.getLabel = function (t) { var e = this.getSetting(\"useUTC\"); return Yc(t.value, Vc[function (t) { switch (t) { case \"year\": case \"month\": return \"day\"; case \"millisecond\": return \"millisecond\"; default: return \"second\" } }(Wc(this._minLevelUnit))] || Vc.second, e, this.getSetting(\"locale\")) }, e.prototype.getFormattedLabel = function (t, e, n) { var i = this.getSetting(\"useUTC\"); return function (t, e, n, i, r) { var o = null; if (X(n)) o = n; else if (U(n)) o = n(t.value, e, { level: t.level }); else { var a = A({}, Ec); if (t.level > 0) for (var s = 0; s < Bc.length; ++s)a[Bc[s]] = \"{primary|\" + a[Bc[s]] + \"}\"; var l = n ? !1 === n.inherit ? n : k(n, a) : a, u = Uc(t.value, r); if (l[u]) o = l[u]; else if (l.inherit) { for (s = Fc.indexOf(u) - 1; s >= 0; --s)if (l[u]) { o = l[u]; break } o = o || a.none } if (Y(o)) { var h = null == t.level ? 0 : t.level >= 0 ? t.level : o.length + t.level; o = o[h = Math.min(h, o.length - 1)] } } return Yc(new Date(t.value), o, r, i) }(t, e, n, this.getSetting(\"locale\"), i) }, e.prototype.getTicks = function () { var t = this._interval, e = this._extent, n = []; if (!t) return n; n.push({ value: e[0], level: 0 }); var i = this.getSetting(\"useUTC\"), r = function (t, e, n, i) { var r = 1e4, o = Fc, a = 0; function s(t, e, n, r, o, a, s) { for (var l = new Date(e), u = e, h = l[r](); u < n && u <= i[1];)s.push({ value: u }), h += t, l[o](h), u = l.getTime(); s.push({ value: u, notAdd: !0 }) } function l(t, r, o) { var a = [], l = !r.length; if (!function (t, e, n, i) { var r = Qr(e), o = Qr(n), a = function (t) { return Xc(r, t, i) === Xc(o, t, i) }, s = function () { return a(\"year\") }, l = function () { return s() && a(\"month\") }, u = function () { return l() && a(\"day\") }, h = function () { return u() && a(\"hour\") }, c = function () { return h() && a(\"minute\") }, p = function () { return c() && a(\"second\") }, d = function () { return p() && a(\"millisecond\") }; switch (t) { case \"year\": return s(); case \"month\": return l(); case \"day\": return u(); case \"hour\": return h(); case \"minute\": return c(); case \"second\": return p(); case \"millisecond\": return d() } }(Wc(t), i[0], i[1], n)) { l && (r = [{ value: Yx(new Date(i[0]), t, n) }, { value: i[1] }]); for (var u = 0; u < r.length - 1; u++) { var h = r[u].value, c = r[u + 1].value; if (h !== c) { var p = void 0, d = void 0, f = void 0, g = !1; switch (t) { case \"year\": p = Math.max(1, Math.round(e / Rc / 365)), d = Zc(n), f = tp(n); break; case \"half-year\": case \"quarter\": case \"month\": p = Fx(e), d = jc(n), f = ep(n); break; case \"week\": case \"half-week\": case \"day\": p = Bx(e), d = qc(n), f = np(n), g = !0; break; case \"half-day\": case \"quarter-day\": case \"hour\": p = Gx(e), d = Kc(n), f = ip(n); break; case \"minute\": p = Wx(e, !0), d = $c(n), f = rp(n); break; case \"second\": p = Wx(e, !1), d = Jc(n), f = op(n); break; case \"millisecond\": p = Hx(e), d = Qc(n), f = ap(n) }s(p, h, c, d, f, g, a), \"year\" === t && o.length > 1 && 0 === u && o.unshift({ value: o[0].value - p }) } } for (u = 0; u < a.length; u++)o.push(a[u]); return a } } for (var u = [], h = [], c = 0, p = 0, d = 0; d < o.length && a++ < r; ++d) { var f = Wc(o[d]); if (Hc(o[d])) if (l(o[d], u[u.length - 1] || [], h), f !== (o[d + 1] ? Wc(o[d + 1]) : null)) { if (h.length) { p = c, h.sort((function (t, e) { return t.value - e.value })); for (var g = [], y = 0; y < h.length; ++y) { var v = h[y].value; 0 !== y && h[y - 1].value === v || (g.push(h[y]), v >= i[0] && v <= i[1] && c++) } var m = (i[1] - i[0]) / e; if (c > 1.5 * m && p > m / 1.5) break; if (u.push(g), c > m || t === o[d]) break } h = [] } } 0; var x = B(z(u, (function (t) { return B(t, (function (t) { return t.value >= i[0] && t.value <= i[1] && !t.notAdd })) })), (function (t) { return t.length > 0 })), _ = [], b = x.length - 1; for (d = 0; d < x.length; ++d)for (var w = x[d], S = 0; S < w.length; ++S)_.push({ value: w[S].value, level: b - d }); _.sort((function (t, e) { return t.value - e.value })); var M = []; for (d = 0; d < _.length; ++d)0 !== d && _[d].value === _[d - 1].value || M.push(_[d]); return M }(this._minLevelUnit, this._approxInterval, i, e); return (n = n.concat(r)).push({ value: e[1], level: 0 }), n }, e.prototype.calcNiceExtent = function (t) { var e = this._extent; if (e[0] === e[1] && (e[0] -= Rc, e[1] += Rc), e[1] === -1 / 0 && e[0] === 1 / 0) { var n = new Date; e[1] = +new Date(n.getFullYear(), n.getMonth(), n.getDate()), e[0] = e[1] - Rc } this.calcNiceTicks(t.splitNumber, t.minInterval, t.maxInterval) }, e.prototype.calcNiceTicks = function (t, e, n) { t = t || 10; var i = this._extent, r = i[1] - i[0]; this._approxInterval = r / t, null != e && this._approxInterval < e && (this._approxInterval = e), null != n && this._approxInterval > n && (this._approxInterval = n); var o = Vx.length, a = Math.min(function (t, e, n, i) { for (; n < i;) { var r = n + i >>> 1; t[r][1] < e ? n = r + 1 : i = r } return n }(Vx, this._approxInterval, 0, o), o - 1); this._interval = Vx[a][1], this._minLevelUnit = Vx[Math.max(a - 1, 0)][0] }, e.prototype.parse = function (t) { return j(t) ? t : +Qr(t) }, e.prototype.contain = function (t) { return vx(this.parse(t), this._extent) }, e.prototype.normalize = function (t) { return mx(this.parse(t), this._extent) }, e.prototype.scale = function (t) { return xx(t, this._extent) }, e.type = \"time\", e }(Sx), Vx = [[\"second\", Lc], [\"minute\", Pc], [\"hour\", Oc], [\"quarter-day\", 216e5], [\"half-day\", 432e5], [\"day\", 10368e4], [\"half-week\", 3024e5], [\"week\", 6048e5], [\"month\", 26784e5], [\"quarter\", 8208e6], [\"half-year\", Nc / 2], [\"year\", Nc]]; function Bx(t, e) { return (t /= Rc) > 16 ? 16 : t > 7.5 ? 7 : t > 3.5 ? 4 : t > 1.5 ? 2 : 1 } function Fx(t) { return (t /= 2592e6) > 6 ? 6 : t > 3 ? 3 : t > 2 ? 2 : 1 } function Gx(t) { return (t /= Oc) > 12 ? 12 : t > 6 ? 6 : t > 3.5 ? 4 : t > 2 ? 2 : 1 } function Wx(t, e) { return (t /= e ? Pc : Lc) > 30 ? 30 : t > 20 ? 20 : t > 15 ? 15 : t > 10 ? 10 : t > 5 ? 5 : t > 2 ? 2 : 1 } function Hx(t) { return no(t, !0) } function Yx(t, e, n) { var i = new Date(t); switch (Wc(e)) { case \"year\": case \"month\": i[ep(n)](0); case \"day\": i[np(n)](1); case \"hour\": i[ip(n)](0); case \"minute\": i[rp(n)](0); case \"second\": i[op(n)](0), i[ap(n)](0) }return i.getTime() } lx.registerClass(zx); var Ux = lx.prototype, Xx = Sx.prototype, Zx = Wr, jx = Math.floor, qx = Math.ceil, Kx = Math.pow, $x = Math.log, Jx = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"log\", e.base = 10, e._originalScale = new Sx, e._interval = 0, e } return n(e, t), e.prototype.getTicks = function (t) { var e = this._originalScale, n = this._extent, i = e.getExtent(); return z(Xx.getTicks.call(this, t), (function (t) { var e = t.value, r = Wr(Kx(this.base, e)); return r = e === n[0] && this._fixMin ? t_(r, i[0]) : r, { value: r = e === n[1] && this._fixMax ? t_(r, i[1]) : r } }), this) }, e.prototype.setExtent = function (t, e) { var n = $x(this.base); t = $x(Math.max(0, t)) / n, e = $x(Math.max(0, e)) / n, Xx.setExtent.call(this, t, e) }, e.prototype.getExtent = function () { var t = this.base, e = Ux.getExtent.call(this); e[0] = Kx(t, e[0]), e[1] = Kx(t, e[1]); var n = this._originalScale.getExtent(); return this._fixMin && (e[0] = t_(e[0], n[0])), this._fixMax && (e[1] = t_(e[1], n[1])), e }, e.prototype.unionExtent = function (t) { this._originalScale.unionExtent(t); var e = this.base; t[0] = $x(t[0]) / $x(e), t[1] = $x(t[1]) / $x(e), Ux.unionExtent.call(this, t) }, e.prototype.unionExtentFromData = function (t, e) { this.unionExtent(t.getApproximateExtent(e)) }, e.prototype.calcNiceTicks = function (t) { t = t || 10; var e = this._extent, n = e[1] - e[0]; if (!(n === 1 / 0 || n <= 0)) { var i = to(n); for (t / n * i <= .5 && (i *= 10); !isNaN(i) && Math.abs(i) < 1 && Math.abs(i) > 0;)i *= 10; var r = [Wr(qx(e[0] / i) * i), Wr(jx(e[1] / i) * i)]; this._interval = i, this._niceExtent = r } }, e.prototype.calcNiceExtent = function (t) { Xx.calcNiceExtent.call(this, t), this._fixMin = t.fixMin, this._fixMax = t.fixMax }, e.prototype.parse = function (t) { return t }, e.prototype.contain = function (t) { return vx(t = $x(t) / $x(this.base), this._extent) }, e.prototype.normalize = function (t) { return mx(t = $x(t) / $x(this.base), this._extent) }, e.prototype.scale = function (t) { return t = xx(t, this._extent), Kx(this.base, t) }, e.type = \"log\", e }(lx), Qx = Jx.prototype; function t_(t, e) { return Zx(t, Yr(e)) } Qx.getMinorTicks = Xx.getMinorTicks, Qx.getLabel = Xx.getLabel, lx.registerClass(Jx); var e_ = function () { function t(t, e, n) { this._prepareParams(t, e, n) } return t.prototype._prepareParams = function (t, e, n) { n[1] < n[0] && (n = [NaN, NaN]), this._dataMin = n[0], this._dataMax = n[1]; var i = this._isOrdinal = \"ordinal\" === t.type; this._needCrossZero = \"interval\" === t.type && e.getNeedCrossZero && e.getNeedCrossZero(); var r = this._modelMinRaw = e.get(\"min\", !0); U(r) ? this._modelMinNum = o_(t, r({ min: n[0], max: n[1] })) : \"dataMin\" !== r && (this._modelMinNum = o_(t, r)); var o = this._modelMaxRaw = e.get(\"max\", !0); if (U(o) ? this._modelMaxNum = o_(t, o({ min: n[0], max: n[1] })) : \"dataMax\" !== o && (this._modelMaxNum = o_(t, o)), i) this._axisDataLen = e.getCategories().length; else { var a = e.get(\"boundaryGap\"), s = Y(a) ? a : [a || 0, a || 0]; \"boolean\" == typeof s[0] || \"boolean\" == typeof s[1] ? this._boundaryGapInner = [0, 0] : this._boundaryGapInner = [_r(s[0], 1), _r(s[1], 1)] } }, t.prototype.calculate = function () { var t = this._isOrdinal, e = this._dataMin, n = this._dataMax, i = this._axisDataLen, r = this._boundaryGapInner, o = t ? null : n - e || Math.abs(e), a = \"dataMin\" === this._modelMinRaw ? e : this._modelMinNum, s = \"dataMax\" === this._modelMaxRaw ? n : this._modelMaxNum, l = null != a, u = null != s; null == a && (a = t ? i ? 0 : NaN : e - r[0] * o), null == s && (s = t ? i ? i - 1 : NaN : n + r[1] * o), (null == a || !isFinite(a)) && (a = NaN), (null == s || !isFinite(s)) && (s = NaN); var h = nt(a) || nt(s) || t && !i; this._needCrossZero && (a > 0 && s > 0 && !l && (a = 0), a < 0 && s < 0 && !u && (s = 0)); var c = this._determinedMin, p = this._determinedMax; return null != c && (a = c, l = !0), null != p && (s = p, u = !0), { min: a, max: s, minFixed: l, maxFixed: u, isBlank: h } }, t.prototype.modifyDataMinMax = function (t, e) { this[i_[t]] = e }, t.prototype.setDeterminedMinMax = function (t, e) { var n = n_[t]; this[n] = e }, t.prototype.freeze = function () { this.frozen = !0 }, t }(), n_ = { min: \"_determinedMin\", max: \"_determinedMax\" }, i_ = { min: \"_dataMin\", max: \"_dataMax\" }; function r_(t, e, n) { var i = t.rawExtentInfo; return i || (i = new e_(t, e, n), t.rawExtentInfo = i, i) } function o_(t, e) { return null == e ? null : nt(e) ? NaN : t.parse(e) } function a_(t, e) { var n = t.type, i = r_(t, e, t.getExtent()).calculate(); t.setBlank(i.isBlank); var r = i.min, o = i.max, a = e.ecModel; if (a && \"time\" === n) { var s = kx(\"bar\", a), l = !1; if (E(s, (function (t) { l = l || t.getBaseAxis() === e.axis })), l) { var u = Lx(s), h = function (t, e, n, i) { var r = n.axis.getExtent(), o = r[1] - r[0], a = function (t, e, n) { if (t && e) { var i = t[Ax(e)]; return null != i && null != n ? i[Dx(n)] : i } }(i, n.axis); if (void 0 === a) return { min: t, max: e }; var s = 1 / 0; E(a, (function (t) { s = Math.min(t.offset, s) })); var l = -1 / 0; E(a, (function (t) { l = Math.max(t.offset + t.width, l) })), s = Math.abs(s), l = Math.abs(l); var u = s + l, h = e - t, c = h / (1 - (s + l) / o) - h; return { min: t -= c * (s / u), max: e += c * (l / u) } }(r, o, e, u); r = h.min, o = h.max } } return { extent: [r, o], fixMin: i.minFixed, fixMax: i.maxFixed } } function s_(t, e) { var n = e, i = a_(t, n), r = i.extent, o = n.get(\"splitNumber\"); t instanceof Jx && (t.base = n.get(\"logBase\")); var a = t.type, s = n.get(\"interval\"), l = \"interval\" === a || \"time\" === a; t.setExtent(r[0], r[1]), t.calcNiceExtent({ splitNumber: o, fixMin: i.fixMin, fixMax: i.fixMax, minInterval: l ? n.get(\"minInterval\") : null, maxInterval: l ? n.get(\"maxInterval\") : null }), null != s && t.setInterval && t.setInterval(s) } function l_(t, e) { if (e = e || t.get(\"type\")) switch (e) { case \"category\": return new _x({ ordinalMeta: t.getOrdinalMeta ? t.getOrdinalMeta() : t.getCategories(), extent: [1 / 0, -1 / 0] }); case \"time\": return new zx({ locale: t.ecModel.getLocaleModel(), useUTC: t.ecModel.get(\"useUTC\") }); default: return new (lx.getClass(e) || Sx) } } function u_(t) { var e, n, i = t.getLabelModel().get(\"formatter\"), r = \"category\" === t.type ? t.scale.getExtent()[0] : null; return \"time\" === t.scale.type ? (n = i, function (e, i) { return t.scale.getFormattedLabel(e, i, n) }) : X(i) ? function (e) { return function (n) { var i = t.scale.getLabel(n); return e.replace(\"{value}\", null != i ? i : \"\") } }(i) : U(i) ? (e = i, function (n, i) { return null != r && (i = n.value - r), e(h_(t, n), i, null != n.level ? { level: n.level } : null) }) : function (e) { return t.scale.getLabel(e) } } function h_(t, e) { return \"category\" === t.type ? t.scale.getLabel(e) : e.value } function c_(t, e) { var n = e * Math.PI / 180, i = t.width, r = t.height, o = i * Math.abs(Math.cos(n)) + Math.abs(r * Math.sin(n)), a = i * Math.abs(Math.sin(n)) + Math.abs(r * Math.cos(n)); return new Re(t.x, t.y, o, a) } function p_(t) { var e = t.get(\"interval\"); return null == e ? \"auto\" : e } function d_(t) { return \"category\" === t.type && 0 === p_(t.getLabelModel()) } function f_(t, e) { var n = {}; return E(t.mapDimensionsAll(e), (function (e) { n[ax(t, e)] = !0 })), G(n) } var g_ = function () { function t() { } return t.prototype.getNeedCrossZero = function () { return !this.option.scale }, t.prototype.getCoordSysModel = function () { }, t }(); var y_ = { isDimensionStacked: ox, enableDataStack: rx, getStackedDimension: ax }; var v_ = Object.freeze({ __proto__: null, createList: function (t) { return sx(null, t) }, getLayoutRect: wp, dataStack: y_, createScale: function (t, e) { var n = e; e instanceof xc || (n = new xc(e)); var i = l_(n); return i.setExtent(t[0], t[1]), s_(i, n), i }, mixinAxisModelCommonMethods: function (t) { R(t, g_) }, getECData: js, createTextStyle: function (t, e) { return $h(t, null, null, \"normal\" !== (e = e || {}).state) }, createDimensions: function (t, e) { return Qm(t, e).dimensions }, createSymbol: Ry, enableHoverEmphasis: Vl }); function m_(t, e) { return Math.abs(t - e) < 1e-8 } function x_(t, e, n) { var i = 0, r = t[0]; if (!r) return !1; for (var o = 1; o < t.length; o++) { var a = t[o]; i += ls(r[0], r[1], a[0], a[1], e, n), r = a } var s = t[0]; return m_(r[0], s[0]) && m_(r[1], s[1]) || (i += ls(r[0], r[1], s[0], s[1], e, n)), 0 !== i } var __ = []; function b_(t, e) { for (var n = 0; n < t.length; n++)Ft(t[n], t[n], e) } function w_(t, e, n, i) { for (var r = 0; r < t.length; r++) { var o = t[r]; i && (o = i.project(o)), o && isFinite(o[0]) && isFinite(o[1]) && (Gt(e, e, o), Wt(n, n, o)) } } var S_ = function () { function t(t) { this.name = t } return t.prototype.setCenter = function (t) { this._center = t }, t.prototype.getCenter = function () { var t = this._center; return t || (t = this._center = this.calcCenter()), t }, t }(), M_ = function (t, e) { this.type = \"polygon\", this.exterior = t, this.interiors = e }, I_ = function (t) { this.type = \"linestring\", this.points = t }, T_ = function (t) { function e(e, n, i) { var r = t.call(this, e) || this; return r.type = \"geoJSON\", r.geometries = n, r._center = i && [i[0], i[1]], r } return n(e, t), e.prototype.calcCenter = function () { for (var t, e = this.geometries, n = 0, i = 0; i < e.length; i++) { var r = e[i], o = r.exterior, a = o && o.length; a > n && (t = r, n = a) } if (t) return function (t) { for (var e = 0, n = 0, i = 0, r = t.length, o = t[r - 1][0], a = t[r - 1][1], s = 0; s < r; s++) { var l = t[s][0], u = t[s][1], h = o * u - l * a; e += h, n += (o + l) * h, i += (a + u) * h, o = l, a = u } return e ? [n / e / 3, i / e / 3, e] : [t[0][0] || 0, t[0][1] || 0] }(t.exterior); var s = this.getBoundingRect(); return [s.x + s.width / 2, s.y + s.height / 2] }, e.prototype.getBoundingRect = function (t) { var e = this._rect; if (e && !t) return e; var n = [1 / 0, 1 / 0], i = [-1 / 0, -1 / 0]; return E(this.geometries, (function (e) { \"polygon\" === e.type ? w_(e.exterior, n, i, t) : E(e.points, (function (e) { w_(e, n, i, t) })) })), isFinite(n[0]) && isFinite(n[1]) && isFinite(i[0]) && isFinite(i[1]) || (n[0] = n[1] = i[0] = i[1] = 0), e = new Re(n[0], n[1], i[0] - n[0], i[1] - n[1]), t || (this._rect = e), e }, e.prototype.contain = function (t) { var e = this.getBoundingRect(), n = this.geometries; if (!e.contain(t[0], t[1])) return !1; t: for (var i = 0, r = n.length; i < r; i++) { var o = n[i]; if (\"polygon\" === o.type) { var a = o.exterior, s = o.interiors; if (x_(a, t[0], t[1])) { for (var l = 0; l < (s ? s.length : 0); l++)if (x_(s[l], t[0], t[1])) continue t; return !0 } } } return !1 }, e.prototype.transformTo = function (t, e, n, i) { var r = this.getBoundingRect(), o = r.width / r.height; n ? i || (i = n / o) : n = o * i; for (var a = new Re(t, e, n, i), s = r.calculateTransform(a), l = this.geometries, u = 0; u < l.length; u++) { var h = l[u]; \"polygon\" === h.type ? (b_(h.exterior, s), E(h.interiors, (function (t) { b_(t, s) }))) : E(h.points, (function (t) { b_(t, s) })) } (r = this._rect).copy(a), this._center = [r.x + r.width / 2, r.y + r.height / 2] }, e.prototype.cloneShallow = function (t) { null == t && (t = this.name); var n = new e(t, this.geometries, this._center); return n._rect = this._rect, n.transformTo = null, n }, e }(S_), C_ = function (t) { function e(e, n) { var i = t.call(this, e) || this; return i.type = \"geoSVG\", i._elOnlyForCalculate = n, i } return n(e, t), e.prototype.calcCenter = function () { for (var t = this._elOnlyForCalculate, e = t.getBoundingRect(), n = [e.x + e.width / 2, e.y + e.height / 2], i = ye(__), r = t; r && !r.isGeoSVGGraphicRoot;)me(i, r.getLocalTransform(), i), r = r.parent; return we(i, i), Ft(n, n, i), n }, e }(S_); function D_(t, e, n) { for (var i = 0; i < t.length; i++)t[i] = A_(t[i], e[i], n) } function A_(t, e, n) { for (var i = [], r = e[0], o = e[1], a = 0; a < t.length; a += 2) { var s = t.charCodeAt(a) - 64, l = t.charCodeAt(a + 1) - 64; s = s >> 1 ^ -(1 & s), l = l >> 1 ^ -(1 & l), r = s += r, o = l += o, i.push([s / n, l / n]) } return i } function k_(t, e) { return z(B((t = function (t) { if (!t.UTF8Encoding) return t; var e = t, n = e.UTF8Scale; return null == n && (n = 1024), E(e.features, (function (t) { var e = t.geometry, i = e.encodeOffsets, r = e.coordinates; if (i) switch (e.type) { case \"LineString\": e.coordinates = A_(r, i, n); break; case \"Polygon\": case \"MultiLineString\": D_(r, i, n); break; case \"MultiPolygon\": E(r, (function (t, e) { return D_(t, i[e], n) })) } })), e.UTF8Encoding = !1, e }(t)).features, (function (t) { return t.geometry && t.properties && t.geometry.coordinates.length > 0 })), (function (t) { var n = t.properties, i = t.geometry, r = []; switch (i.type) { case \"Polygon\": var o = i.coordinates; r.push(new M_(o[0], o.slice(1))); break; case \"MultiPolygon\": E(i.coordinates, (function (t) { t[0] && r.push(new M_(t[0], t.slice(1))) })); break; case \"LineString\": r.push(new I_([i.coordinates])); break; case \"MultiLineString\": r.push(new I_(i.coordinates)) }var a = new T_(n[e || \"name\"], r, n.cp); return a.properties = n, a })) } var L_ = Object.freeze({ __proto__: null, linearMap: Fr, round: Wr, asc: Hr, getPrecision: Yr, getPrecisionSafe: Ur, getPixelPrecision: Xr, getPercentWithPrecision: function (t, e, n) { return t[e] && Zr(t, n)[e] || 0 }, MAX_SAFE_INTEGER: qr, remRadian: Kr, isRadianAroundZero: $r, parseDate: Qr, quantity: to, quantityExponent: eo, nice: no, quantile: io, reformIntervals: ro, isNumeric: ao, numericToNumber: oo }), P_ = Object.freeze({ __proto__: null, parse: Qr, format: Yc }), O_ = Object.freeze({ __proto__: null, extendShape: xh, extendPath: bh, makePath: Mh, makeImage: Ih, mergePath: Ch, resizePath: Dh, createIcon: Vh, updateProps: uh, initProps: hh, getTransform: Lh, clipPointsByRect: Eh, clipRectByRect: zh, registerShape: wh, getShapeClass: Sh, Group: Pr, Image: Is, Text: Ns, Circle: gu, Ellipse: vu, Sector: Pu, Ring: Ru, Polygon: zu, Polyline: Bu, Rect: Ps, Line: Wu, BezierCurve: Xu, Arc: ju, IncrementalDisplayable: oh, CompoundPath: qu, LinearGradient: $u, RadialGradient: Ju, BoundingRect: Re }), R_ = Object.freeze({ __proto__: null, addCommas: sp, toCamelCase: lp, normalizeCssArray: up, encodeHTML: ee, formatTpl: dp, getTooltipMarker: fp, formatTime: function (t, e, n) { \"week\" !== t && \"month\" !== t && \"quarter\" !== t && \"half-year\" !== t && \"year\" !== t || (t = \"MM-dd\\nyyyy\"); var i = Qr(e), r = n ? \"getUTC\" : \"get\", o = i[r + \"FullYear\"](), a = i[r + \"Month\"]() + 1, s = i[r + \"Date\"](), l = i[r + \"Hours\"](), u = i[r + \"Minutes\"](), h = i[r + \"Seconds\"](), c = i[r + \"Milliseconds\"](); return t = t.replace(\"MM\", Gc(a, 2)).replace(\"M\", a).replace(\"yyyy\", o).replace(\"yy\", Gc(o % 100 + \"\", 2)).replace(\"dd\", Gc(s, 2)).replace(\"d\", s).replace(\"hh\", Gc(l, 2)).replace(\"h\", l).replace(\"mm\", Gc(u, 2)).replace(\"m\", u).replace(\"ss\", Gc(h, 2)).replace(\"s\", h).replace(\"SSS\", Gc(c, 3)) }, capitalFirst: function (t) { return t ? t.charAt(0).toUpperCase() + t.substr(1) : t }, truncateText: na, getTextRect: function (t, e, n, i, r, o, a, s) { return new Ns({ style: { text: t, font: e, align: n, verticalAlign: i, padding: r, rich: o, overflow: a ? \"truncate\" : null, lineHeight: s } }).getBoundingRect() } }), N_ = Object.freeze({ __proto__: null, map: z, each: E, indexOf: P, inherits: O, reduce: V, filter: B, bind: W, curry: H, isArray: Y, isString: X, isObject: q, isFunction: U, extend: A, defaults: k, clone: T, merge: C }), E_ = Do(); function z_(t) { return \"category\" === t.type ? function (t) { var e = t.getLabelModel(), n = B_(t, e); return !e.get(\"show\") || t.scale.isBlank() ? { labels: [], labelCategoryInterval: n.labelCategoryInterval } : n }(t) : function (t) { var e = t.scale.getTicks(), n = u_(t); return { labels: z(e, (function (e, i) { return { level: e.level, formattedLabel: n(e, i), rawLabel: t.scale.getLabel(e), tickValue: e.value } })) } }(t) } function V_(t, e) { return \"category\" === t.type ? function (t, e) { var n, i, r = F_(t, \"ticks\"), o = p_(e), a = G_(r, o); if (a) return a; e.get(\"show\") && !t.scale.isBlank() || (n = []); if (U(o)) n = Y_(t, o, !0); else if (\"auto\" === o) { var s = B_(t, t.getLabelModel()); i = s.labelCategoryInterval, n = z(s.labels, (function (t) { return t.tickValue })) } else n = H_(t, i = o, !0); return W_(r, o, { ticks: n, tickCategoryInterval: i }) }(t, e) : { ticks: z(t.scale.getTicks(), (function (t) { return t.value })) } } function B_(t, e) { var n, i, r = F_(t, \"labels\"), o = p_(e), a = G_(r, o); return a || (U(o) ? n = Y_(t, o) : (i = \"auto\" === o ? function (t) { var e = E_(t).autoInterval; return null != e ? e : E_(t).autoInterval = t.calculateCategoryInterval() }(t) : o, n = H_(t, i)), W_(r, o, { labels: n, labelCategoryInterval: i })) } function F_(t, e) { return E_(t)[e] || (E_(t)[e] = []) } function G_(t, e) { for (var n = 0; n < t.length; n++)if (t[n].key === e) return t[n].value } function W_(t, e, n) { return t.push({ key: e, value: n }), n } function H_(t, e, n) { var i = u_(t), r = t.scale, o = r.getExtent(), a = t.getLabelModel(), s = [], l = Math.max((e || 0) + 1, 1), u = o[0], h = r.count(); 0 !== u && l > 1 && h / l > 2 && (u = Math.round(Math.ceil(u / l) * l)); var c = d_(t), p = a.get(\"showMinLabel\") || c, d = a.get(\"showMaxLabel\") || c; p && u !== o[0] && g(o[0]); for (var f = u; f <= o[1]; f += l)g(f); function g(t) { var e = { value: t }; s.push(n ? t : { formattedLabel: i(e), rawLabel: r.getLabel(e), tickValue: t }) } return d && f - l !== o[1] && g(o[1]), s } function Y_(t, e, n) { var i = t.scale, r = u_(t), o = []; return E(i.getTicks(), (function (t) { var a = i.getLabel(t), s = t.value; e(t.value, a) && o.push(n ? s : { formattedLabel: r(t), rawLabel: a, tickValue: s }) })), o } var U_ = [0, 1], X_ = function () { function t(t, e, n) { this.onBand = !1, this.inverse = !1, this.dim = t, this.scale = e, this._extent = n || [0, 0] } return t.prototype.contain = function (t) { var e = this._extent, n = Math.min(e[0], e[1]), i = Math.max(e[0], e[1]); return t >= n && t <= i }, t.prototype.containData = function (t) { return this.scale.contain(t) }, t.prototype.getExtent = function () { return this._extent.slice() }, t.prototype.getPixelPrecision = function (t) { return Xr(t || this.scale.getExtent(), this._extent) }, t.prototype.setExtent = function (t, e) { var n = this._extent; n[0] = t, n[1] = e }, t.prototype.dataToCoord = function (t, e) { var n = this._extent, i = this.scale; return t = i.normalize(t), this.onBand && \"ordinal\" === i.type && Z_(n = n.slice(), i.count()), Fr(t, U_, n, e) }, t.prototype.coordToData = function (t, e) { var n = this._extent, i = this.scale; this.onBand && \"ordinal\" === i.type && Z_(n = n.slice(), i.count()); var r = Fr(t, n, U_, e); return this.scale.scale(r) }, t.prototype.pointToData = function (t, e) { }, t.prototype.getTicksCoords = function (t) { var e = (t = t || {}).tickModel || this.getTickModel(), n = z(V_(this, e).ticks, (function (t) { return { coord: this.dataToCoord(\"ordinal\" === this.scale.type ? this.scale.getRawOrdinalNumber(t) : t), tickValue: t } }), this); return function (t, e, n, i) { var r = e.length; if (!t.onBand || n || !r) return; var o, a, s = t.getExtent(); if (1 === r) e[0].coord = s[0], o = e[1] = { coord: s[0] }; else { var l = e[r - 1].tickValue - e[0].tickValue, u = (e[r - 1].coord - e[0].coord) / l; E(e, (function (t) { t.coord -= u / 2 })), a = 1 + t.scale.getExtent()[1] - e[r - 1].tickValue, o = { coord: e[r - 1].coord + u * a }, e.push(o) } var h = s[0] > s[1]; c(e[0].coord, s[0]) && (i ? e[0].coord = s[0] : e.shift()); i && c(s[0], e[0].coord) && e.unshift({ coord: s[0] }); c(s[1], o.coord) && (i ? o.coord = s[1] : e.pop()); i && c(o.coord, s[1]) && e.push({ coord: s[1] }); function c(t, e) { return t = Wr(t), e = Wr(e), h ? t > e : t < e } }(this, n, e.get(\"alignWithLabel\"), t.clamp), n }, t.prototype.getMinorTicksCoords = function () { if (\"ordinal\" === this.scale.type) return []; var t = this.model.getModel(\"minorTick\").get(\"splitNumber\"); return t > 0 && t < 100 || (t = 5), z(this.scale.getMinorTicks(t), (function (t) { return z(t, (function (t) { return { coord: this.dataToCoord(t), tickValue: t } }), this) }), this) }, t.prototype.getViewLabels = function () { return z_(this).labels }, t.prototype.getLabelModel = function () { return this.model.getModel(\"axisLabel\") }, t.prototype.getTickModel = function () { return this.model.getModel(\"axisTick\") }, t.prototype.getBandWidth = function () { var t = this._extent, e = this.scale.getExtent(), n = e[1] - e[0] + (this.onBand ? 1 : 0); 0 === n && (n = 1); var i = Math.abs(t[1] - t[0]); return Math.abs(i) / n }, t.prototype.calculateCategoryInterval = function () { return function (t) { var e = function (t) { var e = t.getLabelModel(); return { axisRotate: t.getRotate ? t.getRotate() : t.isHorizontal && !t.isHorizontal() ? 90 : 0, labelRotate: e.get(\"rotate\") || 0, font: e.getFont() } }(t), n = u_(t), i = (e.axisRotate - e.labelRotate) / 180 * Math.PI, r = t.scale, o = r.getExtent(), a = r.count(); if (o[1] - o[0] < 1) return 0; var s = 1; a > 40 && (s = Math.max(1, Math.floor(a / 40))); for (var l = o[0], u = t.dataToCoord(l + 1) - t.dataToCoord(l), h = Math.abs(u * Math.cos(i)), c = Math.abs(u * Math.sin(i)), p = 0, d = 0; l <= o[1]; l += s) { var f, g, y = yr(n({ value: l }), e.font, \"center\", \"top\"); f = 1.3 * y.width, g = 1.3 * y.height, p = Math.max(p, f, 7), d = Math.max(d, g, 7) } var v = p / h, m = d / c; isNaN(v) && (v = 1 / 0), isNaN(m) && (m = 1 / 0); var x = Math.max(0, Math.floor(Math.min(v, m))), _ = E_(t.model), b = t.getExtent(), w = _.lastAutoInterval, S = _.lastTickCount; return null != w && null != S && Math.abs(w - x) <= 1 && Math.abs(S - a) <= 1 && w > x && _.axisExtent0 === b[0] && _.axisExtent1 === b[1] ? x = w : (_.lastTickCount = a, _.lastAutoInterval = x, _.axisExtent0 = b[0], _.axisExtent1 = b[1]), x }(this) }, t }(); function Z_(t, e) { var n = (t[1] - t[0]) / e / 2; t[0] += n, t[1] -= n } var j_ = 2 * Math.PI, q_ = ts.CMD, K_ = [\"top\", \"right\", \"bottom\", \"left\"]; function $_(t, e, n, i, r) { var o = n.width, a = n.height; switch (t) { case \"top\": i.set(n.x + o / 2, n.y - e), r.set(0, -1); break; case \"bottom\": i.set(n.x + o / 2, n.y + a + e), r.set(0, 1); break; case \"left\": i.set(n.x - e, n.y + a / 2), r.set(-1, 0); break; case \"right\": i.set(n.x + o + e, n.y + a / 2), r.set(1, 0) } } function J_(t, e, n, i, r, o, a, s, l) { a -= t, s -= e; var u = Math.sqrt(a * a + s * s), h = (a /= u) * n + t, c = (s /= u) * n + e; if (Math.abs(i - r) % j_ < 1e-4) return l[0] = h, l[1] = c, u - n; if (o) { var p = i; i = os(r), r = os(p) } else i = os(i), r = os(r); i > r && (r += j_); var d = Math.atan2(s, a); if (d < 0 && (d += j_), d >= i && d <= r || d + j_ >= i && d + j_ <= r) return l[0] = h, l[1] = c, u - n; var f = n * Math.cos(i) + t, g = n * Math.sin(i) + e, y = n * Math.cos(r) + t, v = n * Math.sin(r) + e, m = (f - a) * (f - a) + (g - s) * (g - s), x = (y - a) * (y - a) + (v - s) * (v - s); return m < x ? (l[0] = f, l[1] = g, Math.sqrt(m)) : (l[0] = y, l[1] = v, Math.sqrt(x)) } function Q_(t, e, n, i, r, o, a, s) { var l = r - t, u = o - e, h = n - t, c = i - e, p = Math.sqrt(h * h + c * c), d = (l * (h /= p) + u * (c /= p)) / p; s && (d = Math.min(Math.max(d, 0), 1)), d *= p; var f = a[0] = t + d * h, g = a[1] = e + d * c; return Math.sqrt((f - r) * (f - r) + (g - o) * (g - o)) } function tb(t, e, n, i, r, o, a) { n < 0 && (t += n, n = -n), i < 0 && (e += i, i = -i); var s = t + n, l = e + i, u = a[0] = Math.min(Math.max(r, t), s), h = a[1] = Math.min(Math.max(o, e), l); return Math.sqrt((u - r) * (u - r) + (h - o) * (h - o)) } var eb = []; function nb(t, e, n) { var i = tb(e.x, e.y, e.width, e.height, t.x, t.y, eb); return n.set(eb[0], eb[1]), i } function ib(t, e, n) { for (var i, r, o = 0, a = 0, s = 0, l = 0, u = 1 / 0, h = e.data, c = t.x, p = t.y, d = 0; d < h.length;) { var f = h[d++]; 1 === d && (s = o = h[d], l = a = h[d + 1]); var g = u; switch (f) { case q_.M: o = s = h[d++], a = l = h[d++]; break; case q_.L: g = Q_(o, a, h[d], h[d + 1], c, p, eb, !0), o = h[d++], a = h[d++]; break; case q_.C: g = _n(o, a, h[d++], h[d++], h[d++], h[d++], h[d], h[d + 1], c, p, eb), o = h[d++], a = h[d++]; break; case q_.Q: g = Tn(o, a, h[d++], h[d++], h[d], h[d + 1], c, p, eb), o = h[d++], a = h[d++]; break; case q_.A: var y = h[d++], v = h[d++], m = h[d++], x = h[d++], _ = h[d++], b = h[d++]; d += 1; var w = !!(1 - h[d++]); i = Math.cos(_) * m + y, r = Math.sin(_) * x + v, d <= 1 && (s = i, l = r), g = J_(y, v, x, _, _ + b, w, (c - y) * x / m + y, p, eb), o = Math.cos(_ + b) * m + y, a = Math.sin(_ + b) * x + v; break; case q_.R: g = tb(s = o = h[d++], l = a = h[d++], h[d++], h[d++], c, p, eb); break; case q_.Z: g = Q_(o, a, s, l, c, p, eb, !0), o = s, a = l }g < u && (u = g, n.set(eb[0], eb[1])) } return u } var rb = new Ie, ob = new Ie, ab = new Ie, sb = new Ie, lb = new Ie; function ub(t, e) { if (t) { var n = t.getTextGuideLine(), i = t.getTextContent(); if (i && n) { var r = t.textGuideLineConfig || {}, o = [[0, 0], [0, 0], [0, 0]], a = r.candidates || K_, s = i.getBoundingRect().clone(); s.applyTransform(i.getComputedTransform()); var l = 1 / 0, u = r.anchor, h = t.getComputedTransform(), c = h && we([], h), p = e.get(\"length2\") || 0; u && ab.copy(u); for (var d = 0; d < a.length; d++) { $_(a[d], 0, s, rb, sb), Ie.scaleAndAdd(ob, rb, sb, p), ob.transform(c); var f = t.getBoundingRect(), g = u ? u.distance(ob) : t instanceof _s ? ib(ob, t.path, ab) : nb(ob, f, ab); g < l && (l = g, ob.transform(h), ab.transform(h), ab.toArray(o[0]), ob.toArray(o[1]), rb.toArray(o[2])) } pb(o, e.get(\"minTurnAngle\")), n.setShape({ points: o }) } } } var hb = [], cb = new Ie; function pb(t, e) { if (e <= 180 && e > 0) { e = e / 180 * Math.PI, rb.fromArray(t[0]), ob.fromArray(t[1]), ab.fromArray(t[2]), Ie.sub(sb, rb, ob), Ie.sub(lb, ab, ob); var n = sb.len(), i = lb.len(); if (!(n < .001 || i < .001)) { sb.scale(1 / n), lb.scale(1 / i); var r = sb.dot(lb); if (Math.cos(e) < r) { var o = Q_(ob.x, ob.y, ab.x, ab.y, rb.x, rb.y, hb, !1); cb.fromArray(hb), cb.scaleAndAdd(lb, o / Math.tan(Math.PI - e)); var a = ab.x !== ob.x ? (cb.x - ob.x) / (ab.x - ob.x) : (cb.y - ob.y) / (ab.y - ob.y); if (isNaN(a)) return; a < 0 ? Ie.copy(cb, ob) : a > 1 && Ie.copy(cb, ab), cb.toArray(t[1]) } } } } function db(t, e, n) { if (n <= 180 && n > 0) { n = n / 180 * Math.PI, rb.fromArray(t[0]), ob.fromArray(t[1]), ab.fromArray(t[2]), Ie.sub(sb, ob, rb), Ie.sub(lb, ab, ob); var i = sb.len(), r = lb.len(); if (!(i < .001 || r < .001)) if (sb.scale(1 / i), lb.scale(1 / r), sb.dot(e) < Math.cos(n)) { var o = Q_(ob.x, ob.y, ab.x, ab.y, rb.x, rb.y, hb, !1); cb.fromArray(hb); var a = Math.PI / 2, s = a + Math.acos(lb.dot(e)) - n; if (s >= a) Ie.copy(cb, ab); else { cb.scaleAndAdd(lb, o / Math.tan(Math.PI / 2 - s)); var l = ab.x !== ob.x ? (cb.x - ob.x) / (ab.x - ob.x) : (cb.y - ob.y) / (ab.y - ob.y); if (isNaN(l)) return; l < 0 ? Ie.copy(cb, ob) : l > 1 && Ie.copy(cb, ab) } cb.toArray(t[1]) } } } function fb(t, e, n, i) { var r = \"normal\" === n, o = r ? t : t.ensureState(n); o.ignore = e; var a = i.get(\"smooth\"); a && !0 === a && (a = .3), o.shape = o.shape || {}, a > 0 && (o.shape.smooth = a); var s = i.getModel(\"lineStyle\").getLineStyle(); r ? t.useStyle(s) : o.style = s } function gb(t, e) { var n = e.smooth, i = e.points; if (i) if (t.moveTo(i[0][0], i[0][1]), n > 0 && i.length >= 3) { var r = Et(i[0], i[1]), o = Et(i[1], i[2]); if (!r || !o) return t.lineTo(i[1][0], i[1][1]), void t.lineTo(i[2][0], i[2][1]); var a = Math.min(r, o) * n, s = Bt([], i[1], i[0], a / r), l = Bt([], i[1], i[2], a / o), u = Bt([], s, l, .5); t.bezierCurveTo(s[0], s[1], s[0], s[1], u[0], u[1]), t.bezierCurveTo(l[0], l[1], l[0], l[1], i[2][0], i[2][1]) } else for (var h = 1; h < i.length; h++)t.lineTo(i[h][0], i[h][1]) } function yb(t, e, n) { var i = t.getTextGuideLine(), r = t.getTextContent(); if (r) { for (var o = e.normal, a = o.get(\"show\"), s = r.ignore, l = 0; l < el.length; l++) { var u = el[l], h = e[u], c = \"normal\" === u; if (h) { var p = h.get(\"show\"); if ((c ? s : rt(r.states[u] && r.states[u].ignore, s)) || !rt(p, a)) { var d = c ? i : i && i.states[u]; d && (d.ignore = !0); continue } i || (i = new Bu, t.setTextGuideLine(i), c || !s && a || fb(i, !0, \"normal\", e.normal), t.stateProxy && (i.stateProxy = t.stateProxy)), fb(i, !1, u, h) } } if (i) { k(i.style, n), i.style.fill = null; var f = o.get(\"showAbove\"); (t.textGuideLineConfig = t.textGuideLineConfig || {}).showAbove = f || !1, i.buildPath = gb } } else i && t.removeTextGuideLine() } function vb(t, e) { e = e || \"labelLine\"; for (var n = { normal: t.getModel(e) }, i = 0; i < tl.length; i++) { var r = tl[i]; n[r] = t.getModel([r, e]) } return n } function mb(t) { for (var e = [], n = 0; n < t.length; n++) { var i = t[n]; if (!i.defaultAttr.ignore) { var r = i.label, o = r.getComputedTransform(), a = r.getBoundingRect(), s = !o || o[1] < 1e-5 && o[2] < 1e-5, l = r.style.margin || 0, u = a.clone(); u.applyTransform(o), u.x -= l / 2, u.y -= l / 2, u.width += l, u.height += l; var h = s ? new ih(a, o) : null; e.push({ label: r, labelLine: i.labelLine, rect: u, localRect: a, obb: h, priority: i.priority, defaultAttr: i.defaultAttr, layoutOption: i.computedLayoutOption, axisAligned: s, transform: o }) } } return e } function xb(t, e, n, i, r, o) { var a = t.length; if (!(a < 2)) { t.sort((function (t, n) { return t.rect[e] - n.rect[e] })); for (var s, l = 0, u = !1, h = 0, c = 0; c < a; c++) { var p = t[c], d = p.rect; (s = d[e] - l) < 0 && (d[e] -= s, p.label[e] -= s, u = !0), h += Math.max(-s, 0), l = d[e] + d[n] } h > 0 && o && _(-h / a, 0, a); var f, g, y = t[0], v = t[a - 1]; return m(), f < 0 && b(-f, .8), g < 0 && b(g, .8), m(), x(f, g, 1), x(g, f, -1), m(), f < 0 && w(-f), g < 0 && w(g), u } function m() { f = y.rect[e] - i, g = r - v.rect[e] - v.rect[n] } function x(t, e, n) { if (t < 0) { var i = Math.min(e, -t); if (i > 0) { _(i * n, 0, a); var r = i + t; r < 0 && b(-r * n, 1) } else b(-t * n, 1) } } function _(n, i, r) { 0 !== n && (u = !0); for (var o = i; o < r; o++) { var a = t[o]; a.rect[e] += n, a.label[e] += n } } function b(i, r) { for (var o = [], s = 0, l = 1; l < a; l++) { var u = t[l - 1].rect, h = Math.max(t[l].rect[e] - u[e] - u[n], 0); o.push(h), s += h } if (s) { var c = Math.min(Math.abs(i) / s, r); if (i > 0) for (l = 0; l < a - 1; l++) { _(o[l] * c, 0, l + 1) } else for (l = a - 1; l > 0; l--) { _(-(o[l - 1] * c), l, a) } } } function w(t) { var e = t < 0 ? -1 : 1; t = Math.abs(t); for (var n = Math.ceil(t / (a - 1)), i = 0; i < a - 1; i++)if (e > 0 ? _(n, 0, i + 1) : _(-n, a - i - 1, a), (t -= n) <= 0) return } } function _b(t, e, n, i) { return xb(t, \"y\", \"height\", e, n, i) } function bb(t) { var e = []; t.sort((function (t, e) { return e.priority - t.priority })); var n = new Re(0, 0, 0, 0); function i(t) { if (!t.ignore) { var e = t.ensureState(\"emphasis\"); null == e.ignore && (e.ignore = !1) } t.ignore = !0 } for (var r = 0; r < t.length; r++) { var o = t[r], a = o.axisAligned, s = o.localRect, l = o.transform, u = o.label, h = o.labelLine; n.copy(o.rect), n.width -= .1, n.height -= .1, n.x += .05, n.y += .05; for (var c = o.obb, p = !1, d = 0; d < e.length; d++) { var f = e[d]; if (n.intersect(f.rect)) { if (a && f.axisAligned) { p = !0; break } if (f.obb || (f.obb = new ih(f.localRect, f.transform)), c || (c = new ih(s, l)), c.intersect(f.obb)) { p = !0; break } } } p ? (i(u), h && i(h)) : (u.attr(\"ignore\", o.defaultAttr.ignore), h && h.attr(\"ignore\", o.defaultAttr.labelGuideIgnore), e.push(o)) } } function wb(t) { if (t) { for (var e = [], n = 0; n < t.length; n++)e.push(t[n].slice()); return e } } function Sb(t, e) { var n = t.label, i = e && e.getTextGuideLine(); return { dataIndex: t.dataIndex, dataType: t.dataType, seriesIndex: t.seriesModel.seriesIndex, text: t.label.style.text, rect: t.hostRect, labelRect: t.rect, align: n.style.align, verticalAlign: n.style.verticalAlign, labelLinePoints: wb(i && i.shape.points) } } var Mb = [\"align\", \"verticalAlign\", \"width\", \"height\", \"fontSize\"], Ib = new hr, Tb = Do(), Cb = Do(); function Db(t, e, n) { for (var i = 0; i < n.length; i++) { var r = n[i]; null != e[r] && (t[r] = e[r]) } } var Ab = [\"x\", \"y\", \"rotation\"], kb = function () { function t() { this._labelList = [], this._chartViewList = [] } return t.prototype.clearLabels = function () { this._labelList = [], this._chartViewList = [] }, t.prototype._addLabel = function (t, e, n, i, r) { var o = i.style, a = i.__hostTarget.textConfig || {}, s = i.getComputedTransform(), l = i.getBoundingRect().plain(); Re.applyTransform(l, l, s), s ? Ib.setLocalTransform(s) : (Ib.x = Ib.y = Ib.rotation = Ib.originX = Ib.originY = 0, Ib.scaleX = Ib.scaleY = 1); var u, h = i.__hostTarget; if (h) { u = h.getBoundingRect().plain(); var c = h.getComputedTransform(); Re.applyTransform(u, u, c) } var p = u && h.getTextGuideLine(); this._labelList.push({ label: i, labelLine: p, seriesModel: n, dataIndex: t, dataType: e, layoutOption: r, computedLayoutOption: null, rect: l, hostRect: u, priority: u ? u.width * u.height : 0, defaultAttr: { ignore: i.ignore, labelGuideIgnore: p && p.ignore, x: Ib.x, y: Ib.y, scaleX: Ib.scaleX, scaleY: Ib.scaleY, rotation: Ib.rotation, style: { x: o.x, y: o.y, align: o.align, verticalAlign: o.verticalAlign, width: o.width, height: o.height, fontSize: o.fontSize }, cursor: i.cursor, attachedPos: a.position, attachedRot: a.rotation } }) }, t.prototype.addLabelsOfSeries = function (t) { var e = this; this._chartViewList.push(t); var n = t.__model, i = n.get(\"labelLayout\"); (U(i) || G(i).length) && t.group.traverse((function (t) { if (t.ignore) return !0; var r = t.getTextContent(), o = js(t); r && !r.disableLabelLayout && e._addLabel(o.dataIndex, o.dataType, n, r, i) })) }, t.prototype.updateLayoutConfig = function (t) { var e = t.getWidth(), n = t.getHeight(); function i(t, e) { return function () { ub(t, e) } } for (var r = 0; r < this._labelList.length; r++) { var o = this._labelList[r], a = o.label, s = a.__hostTarget, l = o.defaultAttr, u = void 0; u = (u = U(o.layoutOption) ? o.layoutOption(Sb(o, s)) : o.layoutOption) || {}, o.computedLayoutOption = u; var h = Math.PI / 180; s && s.setTextConfig({ local: !1, position: null != u.x || null != u.y ? null : l.attachedPos, rotation: null != u.rotate ? u.rotate * h : l.attachedRot, offset: [u.dx || 0, u.dy || 0] }); var c = !1; if (null != u.x ? (a.x = Gr(u.x, e), a.setStyle(\"x\", 0), c = !0) : (a.x = l.x, a.setStyle(\"x\", l.style.x)), null != u.y ? (a.y = Gr(u.y, n), a.setStyle(\"y\", 0), c = !0) : (a.y = l.y, a.setStyle(\"y\", l.style.y)), u.labelLinePoints) { var p = s.getTextGuideLine(); p && (p.setShape({ points: u.labelLinePoints }), c = !1) } Tb(a).needsUpdateLabelLine = c, a.rotation = null != u.rotate ? u.rotate * h : l.rotation, a.scaleX = l.scaleX, a.scaleY = l.scaleY; for (var d = 0; d < Mb.length; d++) { var f = Mb[d]; a.setStyle(f, null != u[f] ? u[f] : l.style[f]) } if (u.draggable) { if (a.draggable = !0, a.cursor = \"move\", s) { var g = o.seriesModel; if (null != o.dataIndex) g = o.seriesModel.getData(o.dataType).getItemModel(o.dataIndex); a.on(\"drag\", i(s, g.getModel(\"labelLine\"))) } } else a.off(\"drag\"), a.cursor = l.cursor } }, t.prototype.layout = function (t) { var e, n = t.getWidth(), i = t.getHeight(), r = mb(this._labelList), o = B(r, (function (t) { return \"shiftX\" === t.layoutOption.moveOverlap })), a = B(r, (function (t) { return \"shiftY\" === t.layoutOption.moveOverlap })); xb(o, \"x\", \"width\", 0, n, e), _b(a, 0, i), bb(B(r, (function (t) { return t.layoutOption.hideOverlap }))) }, t.prototype.processLabelsOverall = function () { var t = this; E(this._chartViewList, (function (e) { var n = e.__model, i = e.ignoreLabelLineUpdate, r = n.isAnimationEnabled(); e.group.traverse((function (e) { if (e.ignore && !e.forceLabelAnimation) return !0; var o = !i, a = e.getTextContent(); !o && a && (o = Tb(a).needsUpdateLabelLine), o && t._updateLabelLine(e, n), r && t._animateLabels(e, n) })) })) }, t.prototype._updateLabelLine = function (t, e) { var n = t.getTextContent(), i = js(t), r = i.dataIndex; if (n && null != r) { var o = e.getData(i.dataType), a = o.getItemModel(r), s = {}, l = o.getItemVisual(r, \"style\"), u = o.getVisual(\"drawType\"); s.stroke = l[u]; var h = a.getModel(\"labelLine\"); yb(t, vb(a), s), ub(t, h) } }, t.prototype._animateLabels = function (t, e) { var n = t.getTextContent(), i = t.getTextGuideLine(); if (n && (t.forceLabelAnimation || !n.ignore && !n.invisible && !t.disableLabelAnimation && !ch(t))) { var r = (d = Tb(n)).oldLayout, o = js(t), a = o.dataIndex, s = { x: n.x, y: n.y, rotation: n.rotation }, l = e.getData(o.dataType); if (r) { n.attr(r); var u = t.prevStates; u && (P(u, \"select\") >= 0 && n.attr(d.oldLayoutSelect), P(u, \"emphasis\") >= 0 && n.attr(d.oldLayoutEmphasis)), uh(n, s, e, a) } else if (n.attr(s), !rc(n).valueAnimation) { var h = rt(n.style.opacity, 1); n.style.opacity = 0, hh(n, { style: { opacity: h } }, e, a) } if (d.oldLayout = s, n.states.select) { var c = d.oldLayoutSelect = {}; Db(c, s, Ab), Db(c, n.states.select, Ab) } if (n.states.emphasis) { var p = d.oldLayoutEmphasis = {}; Db(p, s, Ab), Db(p, n.states.emphasis, Ab) } ac(n, a, l, e, e) } if (i && !i.ignore && !i.invisible) { r = (d = Cb(i)).oldLayout; var d, f = { points: i.shape.points }; r ? (i.attr({ shape: r }), uh(i, { shape: f }, e)) : (i.setShape(f), i.style.strokePercent = 0, hh(i, { style: { strokePercent: 1 } }, e)), d.oldLayout = f } }, t }(), Lb = Do(); var Pb = Math.sin, Ob = Math.cos, Rb = Math.PI, Nb = 2 * Math.PI, Eb = 180 / Rb, zb = function () { function t() { } return t.prototype.reset = function (t) { this._start = !0, this._d = [], this._str = \"\", this._p = Math.pow(10, t || 4) }, t.prototype.moveTo = function (t, e) { this._add(\"M\", t, e) }, t.prototype.lineTo = function (t, e) { this._add(\"L\", t, e) }, t.prototype.bezierCurveTo = function (t, e, n, i, r, o) { this._add(\"C\", t, e, n, i, r, o) }, t.prototype.quadraticCurveTo = function (t, e, n, i) { this._add(\"Q\", t, e, n, i) }, t.prototype.arc = function (t, e, n, i, r, o) { this.ellipse(t, e, n, n, 0, i, r, o) }, t.prototype.ellipse = function (t, e, n, i, r, o, a, s) { var l = a - o, u = !s, h = Math.abs(l), c = si(h - Nb) || (u ? l >= Nb : -l >= Nb), p = l > 0 ? l % Nb : l % Nb + Nb, d = !1; d = !!c || !si(h) && p >= Rb == !!u; var f = t + n * Ob(o), g = e + i * Pb(o); this._start && this._add(\"M\", f, g); var y = Math.round(r * Eb); if (c) { var v = 1 / this._p, m = (u ? 1 : -1) * (Nb - v); this._add(\"A\", n, i, y, 1, +u, t + n * Ob(o + m), e + i * Pb(o + m)), v > .01 && this._add(\"A\", n, i, y, 0, +u, f, g) } else { var x = t + n * Ob(a), _ = e + i * Pb(a); this._add(\"A\", n, i, y, +d, +u, x, _) } }, t.prototype.rect = function (t, e, n, i) { this._add(\"M\", t, e), this._add(\"l\", n, 0), this._add(\"l\", 0, i), this._add(\"l\", -n, 0), this._add(\"Z\") }, t.prototype.closePath = function () { this._d.length > 0 && this._add(\"Z\") }, t.prototype._add = function (t, e, n, i, r, o, a, s, l) { for (var u = [], h = this._p, c = 1; c < arguments.length; c++) { var p = arguments[c]; if (isNaN(p)) return void (this._invalid = !0); u.push(Math.round(p * h) / h) } this._d.push(t + u.join(\" \")), this._start = \"Z\" === t }, t.prototype.generateStr = function () { this._str = this._invalid ? \"\" : this._d.join(\"\"), this._d = [] }, t.prototype.getStr = function () { return this._str }, t }(), Vb = \"none\", Bb = Math.round; var Fb = [\"lineCap\", \"miterLimit\", \"lineJoin\"], Gb = z(Fb, (function (t) { return \"stroke-\" + t.toLowerCase() })); function Wb(t, e, n, i) { var r = null == e.opacity ? 1 : e.opacity; if (n instanceof Is) t(\"opacity\", r); else { if (function (t) { var e = t.fill; return null != e && e !== Vb }(e)) { var o = oi(e.fill); t(\"fill\", o.color); var a = null != e.fillOpacity ? e.fillOpacity * o.opacity * r : o.opacity * r; (i || a < 1) && t(\"fill-opacity\", a) } else t(\"fill\", Vb); if (function (t) { var e = t.stroke; return null != e && e !== Vb }(e)) { var s = oi(e.stroke); t(\"stroke\", s.color); var l = e.strokeNoScale ? n.getLineScale() : 1, u = l ? (e.lineWidth || 0) / l : 0, h = null != e.strokeOpacity ? e.strokeOpacity * s.opacity * r : s.opacity * r, c = e.strokeFirst; if ((i || 1 !== u) && t(\"stroke-width\", u), (i || c) && t(\"paint-order\", c ? \"stroke\" : \"fill\"), (i || h < 1) && t(\"stroke-opacity\", h), e.lineDash) { var p = Gy(n), d = p[0], f = p[1]; d && (f = Bb(f || 0), t(\"stroke-dasharray\", d.join(\",\")), (f || i) && t(\"stroke-dashoffset\", f)) } else i && t(\"stroke-dasharray\", Vb); for (var g = 0; g < Fb.length; g++) { var y = Fb[g]; if (i || e[y] !== vs[y]) { var v = e[y] || vs[y]; v && t(Gb[g], v) } } } else i && t(\"stroke\", Vb) } } var Hb = \"http://www.w3.org/2000/svg\", Yb = \"http://www.w3.org/1999/xlink\"; function Ub(t) { return document.createElementNS(Hb, t) } function Xb(t, e, n, i, r) { return { tag: t, attrs: n || {}, children: i, text: r, key: e } } function Zb(t, e) { var n = (e = e || {}).newline ? \"\\n\" : \"\"; return function t(e) { var i = e.children, r = e.tag; return function (t, e) { var n = []; if (e) for (var i in e) { var r = e[i], o = i; !1 !== r && (!0 !== r && null != r && (o += '=\"' + r + '\"'), n.push(o)) } return \"<\" + t + \" \" + n.join(\" \") + \">\" }(r, e.attrs) + ee(e.text) + (i ? \"\" + n + z(i, (function (e) { return t(e) })).join(n) + n : \"\") + (\"</\" + r + \">\") }(t) } function jb(t) { return { zrId: t, shadowCache: {}, patternCache: {}, gradientCache: {}, clipPathCache: {}, defs: {}, cssNodes: {}, cssAnims: {}, cssClassIdx: 0, cssAnimIdx: 0, shadowIdx: 0, gradientIdx: 0, patternIdx: 0, clipPathIdx: 0 } } function qb(t, e, n, i) { return Xb(\"svg\", \"root\", { width: t, height: e, xmlns: Hb, \"xmlns:xlink\": Yb, version: \"1.1\", baseProfile: \"full\", viewBox: !!i && \"0 0 \" + t + \" \" + e }, n) } var Kb = { cubicIn: \"0.32,0,0.67,0\", cubicOut: \"0.33,1,0.68,1\", cubicInOut: \"0.65,0,0.35,1\", quadraticIn: \"0.11,0,0.5,0\", quadraticOut: \"0.5,1,0.89,1\", quadraticInOut: \"0.45,0,0.55,1\", quarticIn: \"0.5,0,0.75,0\", quarticOut: \"0.25,1,0.5,1\", quarticInOut: \"0.76,0,0.24,1\", quinticIn: \"0.64,0,0.78,0\", quinticOut: \"0.22,1,0.36,1\", quinticInOut: \"0.83,0,0.17,1\", sinusoidalIn: \"0.12,0,0.39,0\", sinusoidalOut: \"0.61,1,0.88,1\", sinusoidalInOut: \"0.37,0,0.63,1\", exponentialIn: \"0.7,0,0.84,0\", exponentialOut: \"0.16,1,0.3,1\", exponentialInOut: \"0.87,0,0.13,1\", circularIn: \"0.55,0,1,0.45\", circularOut: \"0,0.55,0.45,1\", circularInOut: \"0.85,0,0.15,1\" }, $b = \"transform-origin\"; function Jb(t, e, n) { var i = A({}, t.shape); A(i, e), t.buildPath(n, i); var r = new zb; return r.reset(gi(t)), n.rebuildPath(r, 1), r.generateStr(), r.getStr() } function Qb(t, e) { var n = e.originX, i = e.originY; (n || i) && (t[$b] = n + \"px \" + i + \"px\") } var tw = { fill: \"fill\", opacity: \"opacity\", lineWidth: \"stroke-width\", lineDashOffset: \"stroke-dashoffset\" }; function ew(t, e) { var n = e.zrId + \"-ani-\" + e.cssAnimIdx++; return e.cssAnims[n] = t, n } function nw(t) { return X(t) ? Kb[t] ? \"cubic-bezier(\" + Kb[t] + \")\" : An(t) ? t : \"\" : \"\" } function iw(t, e, n, i) { var r = t.animators, o = r.length, a = []; if (t instanceof qu) { var s = function (t, e, n) { var i, r, o = t.shape.paths, a = {}; if (E(o, (function (t) { var e = jb(n.zrId); e.animation = !0, iw(t, {}, e, !0); var o = e.cssAnims, s = e.cssNodes, l = G(o), u = l.length; if (u) { var h = o[r = l[u - 1]]; for (var c in h) { var p = h[c]; a[c] = a[c] || { d: \"\" }, a[c].d += p.d || \"\" } for (var d in s) { var f = s[d].animation; f.indexOf(r) >= 0 && (i = f) } } })), i) { e.d = !1; var s = ew(a, n); return i.replace(r, s) } }(t, e, n); if (s) a.push(s); else if (!o) return } else if (!o) return; for (var l = {}, u = 0; u < o; u++) { var h = r[u], c = [h.getMaxTime() / 1e3 + \"s\"], p = nw(h.getClip().easing), d = h.getDelay(); p ? c.push(p) : c.push(\"linear\"), d && c.push(d / 1e3 + \"s\"), h.getLoop() && c.push(\"infinite\"); var f = c.join(\" \"); l[f] = l[f] || [f, []], l[f][1].push(h) } function g(r) { var o, a = r[1], s = a.length, l = {}, u = {}, h = {}; function c(t, e, n) { for (var i = t.getTracks(), r = t.getMaxTime(), o = 0; o < i.length; o++) { var a = i[o]; if (a.needsAnimate()) { var s = a.keyframes, l = a.propName; if (n && (l = n(l)), l) for (var u = 0; u < s.length; u++) { var h = s[u], c = Math.round(h.time / r * 100) + \"%\", p = nw(h.easing), d = h.rawValue; (X(d) || j(d)) && (e[c] = e[c] || {}, e[c][l] = h.rawValue, p && (e[c][\"animation-timing-function\"] = p)) } } } } for (var p = 0; p < s; p++) { (w = (b = a[p]).targetName) ? \"shape\" === w && c(b, u) : !i && c(b, l) } for (var d in l) { var f = {}; pr(f, t), A(f, l[d]); var g = yi(f), y = l[d][\"animation-timing-function\"]; h[d] = g ? { transform: g } : {}, Qb(h[d], f), y && (h[d][\"animation-timing-function\"] = y) } var v = !0; for (var d in u) { h[d] = h[d] || {}; var m = !o; y = u[d][\"animation-timing-function\"]; m && (o = new ts); var x = o.len(); o.reset(), h[d].d = Jb(t, u[d], o); var _ = o.len(); if (!m && x !== _) { v = !1; break } y && (h[d][\"animation-timing-function\"] = y) } if (!v) for (var d in h) delete h[d].d; if (!i) for (p = 0; p < s; p++) { var b, w; \"style\" === (w = (b = a[p]).targetName) && c(b, h, (function (t) { return tw[t] })) } var S, M = G(h), I = !0; for (p = 1; p < M.length; p++) { var T = M[p - 1], C = M[p]; if (h[T][$b] !== h[C][$b]) { I = !1; break } S = h[T][$b] } if (I && S) { for (var d in h) h[d][$b] && delete h[d][$b]; e[$b] = S } if (B(M, (function (t) { return G(h[t]).length > 0 })).length) return ew(h, n) + \" \" + r[0] + \" both\" } for (var y in l) { (s = g(l[y])) && a.push(s) } if (a.length) { var v = n.zrId + \"-cls-\" + n.cssClassIdx++; n.cssNodes[\".\" + v] = { animation: a.join(\",\") }, e.class = v } } var rw = Math.round; function ow(t) { return t && X(t.src) } function aw(t) { return t && U(t.toDataURL) } function sw(t, e, n, i) { Wb((function (r, o) { var a = \"fill\" === r || \"stroke\" === r; a && function (t) { return t && (\"linear\" === t.type || \"radial\" === t.type) }(o) ? function (t, e, n, i) { var r, o = t[n], a = { gradientUnits: o.global ? \"userSpaceOnUse\" : \"objectBoundingBox\" }; if (pi(o)) r = \"linearGradient\", a.x1 = o.x, a.y1 = o.y, a.x2 = o.x2, a.y2 = o.y2; else { if (!di(o)) return void 0; r = \"radialGradient\", a.cx = rt(o.x, .5), a.cy = rt(o.y, .5), a.r = rt(o.r, .5) } for (var s = o.colorStops, l = [], u = 0, h = s.length; u < h; ++u) { var c = 100 * ui(s[u].offset) + \"%\", p = oi(s[u].color), d = p.color, f = p.opacity, g = { offset: c }; g[\"stop-color\"] = d, f < 1 && (g[\"stop-opacity\"] = f), l.push(Xb(\"stop\", u + \"\", g)) } var y = Zb(Xb(r, \"\", a, l)), v = i.gradientCache, m = v[y]; m || (m = i.zrId + \"-g\" + i.gradientIdx++, v[y] = m, a.id = m, i.defs[m] = Xb(r, m, a, l)); e[n] = fi(m) }(e, t, r, i) : a && function (t) { return ci(t) || function (t) { return t && !!t.svgElement }(t) }(o) ? function (t, e, n, i) { var r, o = t.style[n], a = { patternUnits: \"userSpaceOnUse\" }; if (ci(o)) { var s = o.imageWidth, l = o.imageHeight, u = void 0, h = o.image; if (X(h) ? u = h : ow(h) ? u = h.src : aw(h) && (u = h.toDataURL()), \"undefined\" == typeof Image) { var c = \"Image width/height must been given explictly in svg-ssr renderer.\"; lt(s, c), lt(l, c) } else if (null == s || null == l) { var p = function (t, e) { if (t) { var n = t.elm, i = t.attrs.width = s || e.width, r = t.attrs.height = l || e.height; n && (n.setAttribute(\"width\", i), n.setAttribute(\"height\", r)) } }, d = Jo(u, null, t, (function (t) { p(f, t), p(r, t) })); d && d.width && d.height && (s = s || d.width, l = l || d.height) } r = Xb(\"image\", \"img\", { href: u, width: s, height: l }), a.width = s, a.height = l } else o.svgElement && (r = T(o.svgElement), a.width = o.svgWidth, a.height = o.svgHeight); if (!r) return; a.patternTransform = yi(o); var f = Xb(\"pattern\", \"\", a, [r]), g = Zb(f), y = i.patternCache, v = y[g]; v || (v = i.zrId + \"-p\" + i.patternIdx++, y[g] = v, a.id = v, f = i.defs[v] = Xb(\"pattern\", v, a, [r])); e[n] = fi(v) }(n, t, r, i) : t[r] = o }), e, n, !1), function (t, e, n) { var i = t.style; if (function (t) { return t && (t.shadowBlur || t.shadowOffsetX || t.shadowOffsetY) }(i)) { var r = function (t) { var e = t.style, n = t.getGlobalScale(); return [e.shadowColor, (e.shadowBlur || 0).toFixed(2), (e.shadowOffsetX || 0).toFixed(2), (e.shadowOffsetY || 0).toFixed(2), n[0], n[1]].join(\",\") }(t), o = n.shadowCache, a = o[r]; if (!a) { var s = t.getGlobalScale(), l = s[0], u = s[1]; if (!l || !u) return; var h = i.shadowOffsetX || 0, c = i.shadowOffsetY || 0, p = i.shadowBlur, d = oi(i.shadowColor), f = d.opacity, g = d.color, y = p / 2 / l + \" \" + p / 2 / u; a = n.zrId + \"-s\" + n.shadowIdx++, n.defs[a] = Xb(\"filter\", a, { id: a, x: \"-100%\", y: \"-100%\", width: \"300%\", height: \"300%\" }, [Xb(\"feDropShadow\", \"\", { dx: h / l, dy: c / u, stdDeviation: y, \"flood-color\": g, \"flood-opacity\": f })]), o[r] = a } e.filter = fi(a) } }(n, t, i) } function lw(t) { return si(t[0] - 1) && si(t[1]) && si(t[2]) && si(t[3] - 1) } function uw(t, e, n) { if (e && (!function (t) { return si(t[4]) && si(t[5]) }(e) || !lw(e))) { var i = n ? 10 : 1e4; t.transform = lw(e) ? \"translate(\" + rw(e[4] * i) / i + \" \" + rw(e[5] * i) / i + \")\" : function (t) { return \"matrix(\" + li(t[0]) + \",\" + li(t[1]) + \",\" + li(t[2]) + \",\" + li(t[3]) + \",\" + ui(t[4]) + \",\" + ui(t[5]) + \")\" }(e) } } function hw(t, e, n) { for (var i = t.points, r = [], o = 0; o < i.length; o++)r.push(rw(i[o][0] * n) / n), r.push(rw(i[o][1] * n) / n); e.points = r.join(\" \") } function cw(t) { return !t.smooth } var pw, dw, fw = { circle: [(pw = [\"cx\", \"cy\", \"r\"], dw = z(pw, (function (t) { return \"string\" == typeof t ? [t, t] : t })), function (t, e, n) { for (var i = 0; i < dw.length; i++) { var r = dw[i], o = t[r[0]]; null != o && (e[r[1]] = rw(o * n) / n) } })], polyline: [hw, cw], polygon: [hw, cw] }; function gw(t, e) { var n = t.style, i = t.shape, r = fw[t.type], o = {}, a = e.animation, s = \"path\", l = t.style.strokePercent, u = e.compress && gi(t) || 4; if (!r || e.willUpdate || r[1] && !r[1](i) || a && function (t) { for (var e = t.animators, n = 0; n < e.length; n++)if (\"shape\" === e[n].targetName) return !0; return !1 }(t) || l < 1) { t.path || t.createPathProxy(); var h = t.path; t.shapeChanged() && (h.beginPath(), t.buildPath(h, t.shape), t.pathUpdated()); var c = h.getVersion(), p = t, d = p.__svgPathBuilder; p.__svgPathVersion === c && d && l === p.__svgPathStrokePercent || (d || (d = p.__svgPathBuilder = new zb), d.reset(u), h.rebuildPath(d, l), d.generateStr(), p.__svgPathVersion = c, p.__svgPathStrokePercent = l), o.d = d.getStr() } else { s = t.type; var f = Math.pow(10, u); r[0](i, o, f) } return uw(o, t.transform), sw(o, n, t, e), e.animation && iw(t, o, e), Xb(s, t.id + \"\", o) } function yw(t, e) { return t instanceof _s ? gw(t, e) : t instanceof Is ? function (t, e) { var n = t.style, i = n.image; if (i && !X(i) && (ow(i) ? i = i.src : aw(i) && (i = i.toDataURL())), i) { var r = n.x || 0, o = n.y || 0, a = { href: i, width: n.width, height: n.height }; return r && (a.x = r), o && (a.y = o), uw(a, t.transform), sw(a, n, t, e), e.animation && iw(t, a, e), Xb(\"image\", t.id + \"\", a) } }(t, e) : t instanceof ws ? function (t, e) { var n = t.style, i = n.text; if (null != i && (i += \"\"), i && !isNaN(n.x) && !isNaN(n.y)) { var r = n.font || a, s = n.x || 0, l = function (t, e, n) { return \"top\" === n ? t += e / 2 : \"bottom\" === n && (t -= e / 2), t }(n.y || 0, xr(r), n.textBaseline), u = { \"dominant-baseline\": \"central\", \"text-anchor\": hi[n.textAlign] || n.textAlign }; if (Gs(n)) { var h = \"\", c = n.fontStyle, p = Bs(n.fontSize); if (!parseFloat(p)) return; var d = n.fontFamily || o, f = n.fontWeight; h += \"font-size:\" + p + \";font-family:\" + d + \";\", c && \"normal\" !== c && (h += \"font-style:\" + c + \";\"), f && \"normal\" !== f && (h += \"font-weight:\" + f + \";\"), u.style = h } else u.style = \"font: \" + r; return i.match(/\\s/) && (u[\"xml:space\"] = \"preserve\"), s && (u.x = s), l && (u.y = l), uw(u, t.transform), sw(u, n, t, e), e.animation && iw(t, u, e), Xb(\"text\", t.id + \"\", u, void 0, i) } }(t, e) : void 0 } function vw(t, e, n) { var i = n.clipPathCache, r = n.defs, o = i[t.id]; if (!o) { var a = { id: o = n.zrId + \"-c\" + n.clipPathIdx++ }; i[t.id] = o, r[o] = Xb(\"clipPath\", o, a, [gw(t, n)]) } e[\"clip-path\"] = fi(o) } function mw(t) { return document.createTextNode(t) } function xw(t, e, n) { t.insertBefore(e, n) } function _w(t, e) { t.removeChild(e) } function bw(t, e) { t.appendChild(e) } function ww(t) { return t.parentNode } function Sw(t) { return t.nextSibling } function Mw(t, e) { t.textContent = e } var Iw = Xb(\"\", \"\"); function Tw(t) { return void 0 === t } function Cw(t) { return void 0 !== t } function Dw(t, e, n) { for (var i = {}, r = e; r <= n; ++r) { var o = t[r].key; void 0 !== o && (i[o] = r) } return i } function Aw(t, e) { var n = t.key === e.key; return t.tag === e.tag && n } function kw(t) { var e, n = t.children, i = t.tag; if (Cw(i)) { var r = t.elm = Ub(i); if (Ow(Iw, t), Y(n)) for (e = 0; e < n.length; ++e) { var o = n[e]; null != o && bw(r, kw(o)) } else Cw(t.text) && !q(t.text) && bw(r, mw(t.text)) } else t.elm = mw(t.text); return t.elm } function Lw(t, e, n, i, r) { for (; i <= r; ++i) { var o = n[i]; null != o && xw(t, kw(o), e) } } function Pw(t, e, n, i) { for (; n <= i; ++n) { var r = e[n]; if (null != r) if (Cw(r.tag)) _w(ww(r.elm), r.elm); else _w(t, r.elm) } } function Ow(t, e) { var n, i = e.elm, r = t && t.attrs || {}, o = e.attrs || {}; if (r !== o) { for (n in o) { var a = o[n]; r[n] !== a && (!0 === a ? i.setAttribute(n, \"\") : !1 === a ? i.removeAttribute(n) : 120 !== n.charCodeAt(0) ? i.setAttribute(n, a) : \"xmlns:xlink\" === n || \"xmlns\" === n ? i.setAttributeNS(\"http://www.w3.org/2000/xmlns/\", n, a) : 58 === n.charCodeAt(3) ? i.setAttributeNS(\"http://www.w3.org/XML/1998/namespace\", n, a) : 58 === n.charCodeAt(5) ? i.setAttributeNS(Yb, n, a) : i.setAttribute(n, a)) } for (n in r) n in o || i.removeAttribute(n) } } function Rw(t, e) { var n = e.elm = t.elm, i = t.children, r = e.children; t !== e && (Ow(t, e), Tw(e.text) ? Cw(i) && Cw(r) ? i !== r && function (t, e, n) { for (var i, r, o, a = 0, s = 0, l = e.length - 1, u = e[0], h = e[l], c = n.length - 1, p = n[0], d = n[c]; a <= l && s <= c;)null == u ? u = e[++a] : null == h ? h = e[--l] : null == p ? p = n[++s] : null == d ? d = n[--c] : Aw(u, p) ? (Rw(u, p), u = e[++a], p = n[++s]) : Aw(h, d) ? (Rw(h, d), h = e[--l], d = n[--c]) : Aw(u, d) ? (Rw(u, d), xw(t, u.elm, Sw(h.elm)), u = e[++a], d = n[--c]) : Aw(h, p) ? (Rw(h, p), xw(t, h.elm, u.elm), h = e[--l], p = n[++s]) : (Tw(i) && (i = Dw(e, a, l)), Tw(r = i[p.key]) || (o = e[r]).tag !== p.tag ? xw(t, kw(p), u.elm) : (Rw(o, p), e[r] = void 0, xw(t, o.elm, u.elm)), p = n[++s]); (a <= l || s <= c) && (a > l ? Lw(t, null == n[c + 1] ? null : n[c + 1].elm, n, s, c) : Pw(t, e, a, l)) }(n, i, r) : Cw(r) ? (Cw(t.text) && Mw(n, \"\"), Lw(n, null, r, 0, r.length - 1)) : Cw(i) ? Pw(n, i, 0, i.length - 1) : Cw(t.text) && Mw(n, \"\") : t.text !== e.text && (Cw(i) && Pw(n, i, 0, i.length - 1), Mw(n, e.text))) } var Nw = 0, Ew = function () { function t(t, e, n) { if (this.type = \"svg\", this.refreshHover = zw(\"refreshHover\"), this.configLayer = zw(\"configLayer\"), this.storage = e, this._opts = n = A({}, n), this.root = t, this._id = \"zr\" + Nw++, this._oldVNode = qb(n.width, n.height), t && !n.ssr) { var i = this._viewport = document.createElement(\"div\"); i.style.cssText = \"position:relative;overflow:hidden\"; var r = this._svgDom = this._oldVNode.elm = Ub(\"svg\"); Ow(null, this._oldVNode), i.appendChild(r), t.appendChild(i) } this.resize(n.width, n.height) } return t.prototype.getType = function () { return this.type }, t.prototype.getViewportRoot = function () { return this._viewport }, t.prototype.getViewportRootOffset = function () { var t = this.getViewportRoot(); if (t) return { offsetLeft: t.offsetLeft || 0, offsetTop: t.offsetTop || 0 } }, t.prototype.getSvgDom = function () { return this._svgDom }, t.prototype.refresh = function () { if (this.root) { var t = this.renderToVNode({ willUpdate: !0 }); t.attrs.style = \"position:absolute;left:0;top:0;user-select:none\", function (t, e) { if (Aw(t, e)) Rw(t, e); else { var n = t.elm, i = ww(n); kw(e), null !== i && (xw(i, e.elm, Sw(n)), Pw(i, [t], 0, 0)) } }(this._oldVNode, t), this._oldVNode = t } }, t.prototype.renderOneToVNode = function (t) { return yw(t, jb(this._id)) }, t.prototype.renderToVNode = function (t) { t = t || {}; var e = this.storage.getDisplayList(!0), n = this._backgroundColor, i = this._width, r = this._height, o = jb(this._id); o.animation = t.animation, o.willUpdate = t.willUpdate, o.compress = t.compress; var a = []; if (n && \"none\" !== n) { var s = oi(n), l = s.color, u = s.opacity; this._bgVNode = Xb(\"rect\", \"bg\", { width: i, height: r, x: \"0\", y: \"0\", id: \"0\", fill: l, \"fill-opacity\": u }), a.push(this._bgVNode) } else this._bgVNode = null; var h = t.compress ? null : this._mainVNode = Xb(\"g\", \"main\", {}, []); this._paintList(e, o, h ? h.children : a), h && a.push(h); var c = z(G(o.defs), (function (t) { return o.defs[t] })); if (c.length && a.push(Xb(\"defs\", \"defs\", {}, c)), t.animation) { var p = function (t, e, n) { var i = (n = n || {}).newline ? \"\\n\" : \"\", r = \" {\" + i, o = i + \"}\", a = z(G(t), (function (e) { return e + r + z(G(t[e]), (function (n) { return n + \":\" + t[e][n] + \";\" })).join(i) + o })).join(i), s = z(G(e), (function (t) { return \"@keyframes \" + t + r + z(G(e[t]), (function (n) { return n + r + z(G(e[t][n]), (function (i) { var r = e[t][n][i]; return \"d\" === i && (r = 'path(\"' + r + '\")'), i + \":\" + r + \";\" })).join(i) + o })).join(i) + o })).join(i); return a || s ? [\"<![CDATA[\", a, s, \"]]>\"].join(i) : \"\" }(o.cssNodes, o.cssAnims, { newline: !0 }); if (p) { var d = Xb(\"style\", \"stl\", {}, [], p); a.push(d) } } return qb(i, r, a, t.useViewBox) }, t.prototype.renderToString = function (t) { return t = t || {}, Zb(this.renderToVNode({ animation: rt(t.cssAnimation, !0), willUpdate: !1, compress: !0, useViewBox: rt(t.useViewBox, !0) }), { newline: !0 }) }, t.prototype.setBackgroundColor = function (t) { this._backgroundColor = t; var e = this._bgVNode; if (e && e.elm) { var n = oi(t), i = n.color, r = n.opacity; e.elm.setAttribute(\"fill\", i), r < 1 && e.elm.setAttribute(\"fill-opacity\", r) } }, t.prototype.getSvgRoot = function () { return this._mainVNode && this._mainVNode.elm }, t.prototype._paintList = function (t, e, n) { for (var i, r, o = t.length, a = [], s = 0, l = 0, u = 0; u < o; u++) { var h = t[u]; if (!h.invisible) { var c = h.__clipPaths, p = c && c.length || 0, d = r && r.length || 0, f = void 0; for (f = Math.max(p - 1, d - 1); f >= 0 && (!c || !r || c[f] !== r[f]); f--); for (var g = d - 1; g > f; g--)i = a[--s - 1]; for (var y = f + 1; y < p; y++) { var v = {}; vw(c[y], v, e); var m = Xb(\"g\", \"clip-g-\" + l++, v, []); (i ? i.children : n).push(m), a[s++] = m, i = m } r = c; var x = yw(h, e); x && (i ? i.children : n).push(x) } } }, t.prototype.resize = function (t, e) { var n = this._opts, i = this.root, r = this._viewport; if (null != t && (n.width = t), null != e && (n.height = e), i && r && (r.style.display = \"none\", t = Fy(i, 0, n), e = Fy(i, 1, n), r.style.display = \"\"), this._width !== t || this._height !== e) { if (this._width = t, this._height = e, r) { var o = r.style; o.width = t + \"px\", o.height = e + \"px\" } var a = this._svgDom; a && (a.setAttribute(\"width\", t), a.setAttribute(\"height\", e)) } }, t.prototype.getWidth = function () { return this._width }, t.prototype.getHeight = function () { return this._height }, t.prototype.dispose = function () { this.root && (this.root.innerHTML = \"\"), this._svgDom = this._viewport = this.storage = this._oldVNode = this._bgVNode = this._mainVNode = null }, t.prototype.clear = function () { this._svgDom && (this._svgDom.innerHTML = null), this._oldVNode = null }, t.prototype.toDataURL = function (t) { var e = encodeURIComponent(this.renderToString()), n = \"data:image/svg+xml;\"; return t ? (e = vi(e)) && n + \"base64,\" + e : n + \"charset=UTF-8,\" + e }, t }(); function zw(t) { return function () { 0 } } function Vw(t, e, n) { var i = h.createCanvas(), r = e.getWidth(), o = e.getHeight(), a = i.style; return a && (a.position = \"absolute\", a.left = \"0\", a.top = \"0\", a.width = r + \"px\", a.height = o + \"px\", i.setAttribute(\"data-zr-dom-id\", t)), i.width = r * n, i.height = o * n, i } var Bw = function (t) { function e(e, n, i) { var r, o = t.call(this) || this; o.motionBlur = !1, o.lastFrameAlpha = .7, o.dpr = 1, o.virtual = !1, o.config = {}, o.incremental = !1, o.zlevel = 0, o.maxRepaintRectCount = 5, o.__dirty = !0, o.__firstTimePaint = !0, o.__used = !1, o.__drawIndex = 0, o.__startIndex = 0, o.__endIndex = 0, o.__prevStartIndex = null, o.__prevEndIndex = null, i = i || tr, \"string\" == typeof e ? r = Vw(e, n, i) : q(e) && (e = (r = e).id), o.id = e, o.dom = r; var a = r.style; return a && (vt(r), r.onselectstart = function () { return !1 }, a.padding = \"0\", a.margin = \"0\", a.borderWidth = \"0\"), o.painter = n, o.dpr = i, o } return n(e, t), e.prototype.getElementCount = function () { return this.__endIndex - this.__startIndex }, e.prototype.afterBrush = function () { this.__prevStartIndex = this.__startIndex, this.__prevEndIndex = this.__endIndex }, e.prototype.initContext = function () { this.ctx = this.dom.getContext(\"2d\"), this.ctx.dpr = this.dpr }, e.prototype.setUnpainted = function () { this.__firstTimePaint = !0 }, e.prototype.createBackBuffer = function () { var t = this.dpr; this.domBack = Vw(\"back-\" + this.id, this.painter, t), this.ctxBack = this.domBack.getContext(\"2d\"), 1 !== t && this.ctxBack.scale(t, t) }, e.prototype.createRepaintRects = function (t, e, n, i) { if (this.__firstTimePaint) return this.__firstTimePaint = !1, null; var r, o = [], a = this.maxRepaintRectCount, s = !1, l = new Re(0, 0, 0, 0); function u(t) { if (t.isFinite() && !t.isZero()) if (0 === o.length) { (e = new Re(0, 0, 0, 0)).copy(t), o.push(e) } else { for (var e, n = !1, i = 1 / 0, r = 0, u = 0; u < o.length; ++u) { var h = o[u]; if (h.intersect(t)) { var c = new Re(0, 0, 0, 0); c.copy(h), c.union(t), o[u] = c, n = !0; break } if (s) { l.copy(t), l.union(h); var p = t.width * t.height, d = h.width * h.height, f = l.width * l.height - p - d; f < i && (i = f, r = u) } } if (s && (o[r].union(t), n = !0), !n) (e = new Re(0, 0, 0, 0)).copy(t), o.push(e); s || (s = o.length >= a) } } for (var h = this.__startIndex; h < this.__endIndex; ++h) { if (d = t[h]) { var c = d.shouldBePainted(n, i, !0, !0); (f = d.__isRendered && (1 & d.__dirty || !c) ? d.getPrevPaintRect() : null) && u(f); var p = c && (1 & d.__dirty || !d.__isRendered) ? d.getPaintRect() : null; p && u(p) } } for (h = this.__prevStartIndex; h < this.__prevEndIndex; ++h) { var d, f; c = (d = e[h]).shouldBePainted(n, i, !0, !0); if (d && (!c || !d.__zr) && d.__isRendered) (f = d.getPrevPaintRect()) && u(f) } do { r = !1; for (h = 0; h < o.length;)if (o[h].isZero()) o.splice(h, 1); else { for (var g = h + 1; g < o.length;)o[h].intersect(o[g]) ? (r = !0, o[h].union(o[g]), o.splice(g, 1)) : g++; h++ } } while (r); return this._paintRects = o, o }, e.prototype.debugGetPaintRects = function () { return (this._paintRects || []).slice() }, e.prototype.resize = function (t, e) { var n = this.dpr, i = this.dom, r = i.style, o = this.domBack; r && (r.width = t + \"px\", r.height = e + \"px\"), i.width = t * n, i.height = e * n, o && (o.width = t * n, o.height = e * n, 1 !== n && this.ctxBack.scale(n, n)) }, e.prototype.clear = function (t, e, n) { var i = this.dom, r = this.ctx, o = i.width, a = i.height; e = e || this.clearColor; var s = this.motionBlur && !t, l = this.lastFrameAlpha, u = this.dpr, h = this; s && (this.domBack || this.createBackBuffer(), this.ctxBack.globalCompositeOperation = \"copy\", this.ctxBack.drawImage(i, 0, 0, o / u, a / u)); var c = this.domBack; function p(t, n, i, o) { if (r.clearRect(t, n, i, o), e && \"transparent\" !== e) { var a = void 0; Q(e) ? (a = e.__canvasGradient || Vy(r, e, { x: 0, y: 0, width: i, height: o }), e.__canvasGradient = a) : tt(e) && (e.scaleX = e.scaleX || u, e.scaleY = e.scaleY || u, a = jy(r, e, { dirty: function () { h.setUnpainted(), h.__painter.refresh() } })), r.save(), r.fillStyle = a || e, r.fillRect(t, n, i, o), r.restore() } s && (r.save(), r.globalAlpha = l, r.drawImage(c, t, n, i, o), r.restore()) } !n || s ? p(0, 0, o, a) : n.length && E(n, (function (t) { p(t.x * u, t.y * u, t.width * u, t.height * u) })) }, e }(Xt), Fw = 1e5, Gw = 314159, Ww = .01; var Hw = function () { function t(t, e, n, i) { this.type = \"canvas\", this._zlevelList = [], this._prevDisplayList = [], this._layers = {}, this._layerConfig = {}, this._needsManuallyCompositing = !1, this.type = \"canvas\"; var r = !t.nodeName || \"CANVAS\" === t.nodeName.toUpperCase(); this._opts = n = A({}, n || {}), this.dpr = n.devicePixelRatio || tr, this._singleCanvas = r, this.root = t, t.style && (vt(t), t.innerHTML = \"\"), this.storage = e; var o = this._zlevelList; this._prevDisplayList = []; var a = this._layers; if (r) { var s = t, l = s.width, u = s.height; null != n.width && (l = n.width), null != n.height && (u = n.height), this.dpr = n.devicePixelRatio || 1, s.width = l * this.dpr, s.height = u * this.dpr, this._width = l, this._height = u; var h = new Bw(s, this, this.dpr); h.__builtin__ = !0, h.initContext(), a[314159] = h, h.zlevel = Gw, o.push(Gw), this._domRoot = t } else { this._width = Fy(t, 0, n), this._height = Fy(t, 1, n); var c = this._domRoot = function (t, e) { var n = document.createElement(\"div\"); return n.style.cssText = [\"position:relative\", \"width:\" + t + \"px\", \"height:\" + e + \"px\", \"padding:0\", \"margin:0\", \"border-width:0\"].join(\";\") + \";\", n }(this._width, this._height); t.appendChild(c) } } return t.prototype.getType = function () { return \"canvas\" }, t.prototype.isSingleCanvas = function () { return this._singleCanvas }, t.prototype.getViewportRoot = function () { return this._domRoot }, t.prototype.getViewportRootOffset = function () { var t = this.getViewportRoot(); if (t) return { offsetLeft: t.offsetLeft || 0, offsetTop: t.offsetTop || 0 } }, t.prototype.refresh = function (t) { var e = this.storage.getDisplayList(!0), n = this._prevDisplayList, i = this._zlevelList; this._redrawId = Math.random(), this._paintList(e, n, t, this._redrawId); for (var r = 0; r < i.length; r++) { var o = i[r], a = this._layers[o]; if (!a.__builtin__ && a.refresh) { var s = 0 === r ? this._backgroundColor : null; a.refresh(s) } } return this._opts.useDirtyRect && (this._prevDisplayList = e.slice()), this }, t.prototype.refreshHover = function () { this._paintHoverList(this.storage.getDisplayList(!1)) }, t.prototype._paintHoverList = function (t) { var e = t.length, n = this._hoverlayer; if (n && n.clear(), e) { for (var i, r = { inHover: !0, viewWidth: this._width, viewHeight: this._height }, o = 0; o < e; o++) { var a = t[o]; a.__inHover && (n || (n = this._hoverlayer = this.getLayer(Fw)), i || (i = n.ctx).save(), iv(i, a, r, o === e - 1)) } i && i.restore() } }, t.prototype.getHoverLayer = function () { return this.getLayer(Fw) }, t.prototype.paintOne = function (t, e) { nv(t, e) }, t.prototype._paintList = function (t, e, n, i) { if (this._redrawId === i) { n = n || !1, this._updateLayerStatus(t); var r = this._doPaintList(t, e, n), o = r.finished, a = r.needsRefreshHover; if (this._needsManuallyCompositing && this._compositeManually(), a && this._paintHoverList(t), o) this.eachLayer((function (t) { t.afterBrush && t.afterBrush() })); else { var s = this; en((function () { s._paintList(t, e, n, i) })) } } }, t.prototype._compositeManually = function () { var t = this.getLayer(Gw).ctx, e = this._domRoot.width, n = this._domRoot.height; t.clearRect(0, 0, e, n), this.eachBuiltinLayer((function (i) { i.virtual && t.drawImage(i.dom, 0, 0, e, n) })) }, t.prototype._doPaintList = function (t, e, n) { for (var i = this, o = [], a = this._opts.useDirtyRect, s = 0; s < this._zlevelList.length; s++) { var l = this._zlevelList[s], u = this._layers[l]; u.__builtin__ && u !== this._hoverlayer && (u.__dirty || n) && o.push(u) } for (var h = !0, c = !1, p = function (r) { var s, l = o[r], u = l.ctx, p = a && l.createRepaintRects(t, e, d._width, d._height), f = n ? l.__startIndex : l.__drawIndex, g = !n && l.incremental && Date.now, y = g && Date.now(), v = l.zlevel === d._zlevelList[0] ? d._backgroundColor : null; if (l.__startIndex === l.__endIndex) l.clear(!1, v, p); else if (f === l.__startIndex) { var m = t[f]; m.incremental && m.notClear && !n || l.clear(!1, v, p) } -1 === f && (console.error(\"For some unknown reason. drawIndex is -1\"), f = l.__startIndex); var x = function (e) { var n = { inHover: !1, allClipped: !1, prevEl: null, viewWidth: i._width, viewHeight: i._height }; for (s = f; s < l.__endIndex; s++) { var r = t[s]; if (r.__inHover && (c = !0), i._doPaintEl(r, l, a, e, n, s === l.__endIndex - 1), g) if (Date.now() - y > 15) break } n.prevElClipPaths && u.restore() }; if (p) if (0 === p.length) s = l.__endIndex; else for (var _ = d.dpr, b = 0; b < p.length; ++b) { var w = p[b]; u.save(), u.beginPath(), u.rect(w.x * _, w.y * _, w.width * _, w.height * _), u.clip(), x(w), u.restore() } else u.save(), x(), u.restore(); l.__drawIndex = s, l.__drawIndex < l.__endIndex && (h = !1) }, d = this, f = 0; f < o.length; f++)p(f); return r.wxa && E(this._layers, (function (t) { t && t.ctx && t.ctx.draw && t.ctx.draw() })), { finished: h, needsRefreshHover: c } }, t.prototype._doPaintEl = function (t, e, n, i, r, o) { var a = e.ctx; if (n) { var s = t.getPaintRect(); (!i || s && s.intersect(i)) && (iv(a, t, r, o), t.setPrevPaintRect(s)) } else iv(a, t, r, o) }, t.prototype.getLayer = function (t, e) { this._singleCanvas && !this._needsManuallyCompositing && (t = Gw); var n = this._layers[t]; return n || ((n = new Bw(\"zr_\" + t, this, this.dpr)).zlevel = t, n.__builtin__ = !0, this._layerConfig[t] ? C(n, this._layerConfig[t], !0) : this._layerConfig[t - Ww] && C(n, this._layerConfig[t - Ww], !0), e && (n.virtual = e), this.insertLayer(t, n), n.initContext()), n }, t.prototype.insertLayer = function (t, e) { var n = this._layers, i = this._zlevelList, r = i.length, o = this._domRoot, a = null, s = -1; if (!n[t] && function (t) { return !!t && (!!t.__builtin__ || \"function\" == typeof t.resize && \"function\" == typeof t.refresh) }(e)) { if (r > 0 && t > i[0]) { for (s = 0; s < r - 1 && !(i[s] < t && i[s + 1] > t); s++); a = n[i[s]] } if (i.splice(s + 1, 0, t), n[t] = e, !e.virtual) if (a) { var l = a.dom; l.nextSibling ? o.insertBefore(e.dom, l.nextSibling) : o.appendChild(e.dom) } else o.firstChild ? o.insertBefore(e.dom, o.firstChild) : o.appendChild(e.dom); e.__painter = this } }, t.prototype.eachLayer = function (t, e) { for (var n = this._zlevelList, i = 0; i < n.length; i++) { var r = n[i]; t.call(e, this._layers[r], r) } }, t.prototype.eachBuiltinLayer = function (t, e) { for (var n = this._zlevelList, i = 0; i < n.length; i++) { var r = n[i], o = this._layers[r]; o.__builtin__ && t.call(e, o, r) } }, t.prototype.eachOtherLayer = function (t, e) { for (var n = this._zlevelList, i = 0; i < n.length; i++) { var r = n[i], o = this._layers[r]; o.__builtin__ || t.call(e, o, r) } }, t.prototype.getLayers = function () { return this._layers }, t.prototype._updateLayerStatus = function (t) { function e(t) { o && (o.__endIndex !== t && (o.__dirty = !0), o.__endIndex = t) } if (this.eachBuiltinLayer((function (t, e) { t.__dirty = t.__used = !1 })), this._singleCanvas) for (var n = 1; n < t.length; n++) { if ((s = t[n]).zlevel !== t[n - 1].zlevel || s.incremental) { this._needsManuallyCompositing = !0; break } } var i, r, o = null, a = 0; for (r = 0; r < t.length; r++) { var s, l = (s = t[r]).zlevel, u = void 0; i !== l && (i = l, a = 0), s.incremental ? ((u = this.getLayer(l + .001, this._needsManuallyCompositing)).incremental = !0, a = 1) : u = this.getLayer(l + (a > 0 ? Ww : 0), this._needsManuallyCompositing), u.__builtin__ || I(\"ZLevel \" + l + \" has been used by unkown layer \" + u.id), u !== o && (u.__used = !0, u.__startIndex !== r && (u.__dirty = !0), u.__startIndex = r, u.incremental ? u.__drawIndex = -1 : u.__drawIndex = r, e(r), o = u), 1 & s.__dirty && !s.__inHover && (u.__dirty = !0, u.incremental && u.__drawIndex < 0 && (u.__drawIndex = r)) } e(r), this.eachBuiltinLayer((function (t, e) { !t.__used && t.getElementCount() > 0 && (t.__dirty = !0, t.__startIndex = t.__endIndex = t.__drawIndex = 0), t.__dirty && t.__drawIndex < 0 && (t.__drawIndex = t.__startIndex) })) }, t.prototype.clear = function () { return this.eachBuiltinLayer(this._clearLayer), this }, t.prototype._clearLayer = function (t) { t.clear() }, t.prototype.setBackgroundColor = function (t) { this._backgroundColor = t, E(this._layers, (function (t) { t.setUnpainted() })) }, t.prototype.configLayer = function (t, e) { if (e) { var n = this._layerConfig; n[t] ? C(n[t], e, !0) : n[t] = e; for (var i = 0; i < this._zlevelList.length; i++) { var r = this._zlevelList[i]; if (r === t || r === t + Ww) C(this._layers[r], n[t], !0) } } }, t.prototype.delLayer = function (t) { var e = this._layers, n = this._zlevelList, i = e[t]; i && (i.dom.parentNode.removeChild(i.dom), delete e[t], n.splice(P(n, t), 1)) }, t.prototype.resize = function (t, e) { if (this._domRoot.style) { var n = this._domRoot; n.style.display = \"none\"; var i = this._opts, r = this.root; if (null != t && (i.width = t), null != e && (i.height = e), t = Fy(r, 0, i), e = Fy(r, 1, i), n.style.display = \"\", this._width !== t || e !== this._height) { for (var o in n.style.width = t + \"px\", n.style.height = e + \"px\", this._layers) this._layers.hasOwnProperty(o) && this._layers[o].resize(t, e); this.refresh(!0) } this._width = t, this._height = e } else { if (null == t || null == e) return; this._width = t, this._height = e, this.getLayer(Gw).resize(t, e) } return this }, t.prototype.clearLayer = function (t) { var e = this._layers[t]; e && e.clear() }, t.prototype.dispose = function () { this.root.innerHTML = \"\", this.root = this.storage = this._domRoot = this._layers = null }, t.prototype.getRenderedCanvas = function (t) { if (t = t || {}, this._singleCanvas && !this._compositeManually) return this._layers[314159].dom; var e = new Bw(\"image\", this, t.pixelRatio || this.dpr); e.initContext(), e.clear(!1, t.backgroundColor || this._backgroundColor); var n = e.ctx; if (t.pixelRatio <= this.dpr) { this.refresh(); var i = e.dom.width, r = e.dom.height; this.eachLayer((function (t) { t.__builtin__ ? n.drawImage(t.dom, 0, 0, i, r) : t.renderToCanvas && (n.save(), t.renderToCanvas(n), n.restore()) })) } else for (var o = { inHover: !1, viewWidth: this._width, viewHeight: this._height }, a = this.storage.getDisplayList(!0), s = 0, l = a.length; s < l; s++) { var u = a[s]; iv(n, u, o, s === l - 1) } return e.dom }, t.prototype.getWidth = function () { return this._width }, t.prototype.getHeight = function () { return this._height }, t }(); var Yw = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.hasSymbolVisual = !0, n } return n(e, t), e.prototype.getInitialData = function (t) { return sx(null, this, { useEncodeDefaulter: !0 }) }, e.prototype.getLegendIcon = function (t) { var e = new Pr, n = Ry(\"line\", 0, t.itemHeight / 2, t.itemWidth, 0, t.lineStyle.stroke, !1); e.add(n), n.setStyle(t.lineStyle); var i = this.getData().getVisual(\"symbol\"), r = this.getData().getVisual(\"symbolRotate\"), o = \"none\" === i ? \"circle\" : i, a = .8 * t.itemHeight, s = Ry(o, (t.itemWidth - a) / 2, (t.itemHeight - a) / 2, a, a, t.itemStyle.fill); e.add(s), s.setStyle(t.itemStyle); var l = \"inherit\" === t.iconRotate ? r : t.iconRotate || 0; return s.rotation = l * Math.PI / 180, s.setOrigin([t.itemWidth / 2, t.itemHeight / 2]), o.indexOf(\"empty\") > -1 && (s.style.stroke = s.style.fill, s.style.fill = \"#fff\", s.style.lineWidth = 2), e }, e.type = \"series.line\", e.dependencies = [\"grid\", \"polar\"], e.defaultOption = { z: 3, coordinateSystem: \"cartesian2d\", legendHoverLink: !0, clip: !0, label: { position: \"top\" }, endLabel: { show: !1, valueAnimation: !0, distance: 8 }, lineStyle: { width: 2, type: \"solid\" }, emphasis: { scale: !0 }, step: !1, smooth: !1, smoothMonotone: null, symbol: \"emptyCircle\", symbolSize: 4, symbolRotate: null, showSymbol: !0, showAllSymbol: \"auto\", connectNulls: !1, sampling: \"none\", animationEasing: \"linear\", progressive: 0, hoverLayerThreshold: 1 / 0, universalTransition: { divideShape: \"clone\" }, triggerLineEvent: !1 }, e }(hg); function Uw(t, e) { var n = t.mapDimensionsAll(\"defaultedLabel\"), i = n.length; if (1 === i) { var r = uf(t, e, n[0]); return null != r ? r + \"\" : null } if (i) { for (var o = [], a = 0; a < n.length; a++)o.push(uf(t, e, n[a])); return o.join(\" \") } } function Xw(t, e) { var n = t.mapDimensionsAll(\"defaultedLabel\"); if (!Y(e)) return e + \"\"; for (var i = [], r = 0; r < n.length; r++) { var o = t.getDimensionIndex(n[r]); o >= 0 && i.push(e[o]) } return i.join(\" \") } var Zw = function (t) { function e(e, n, i, r) { var o = t.call(this) || this; return o.updateData(e, n, i, r), o } return n(e, t), e.prototype._createSymbol = function (t, e, n, i, r) { this.removeAll(); var o = Ry(t, -1, -1, 2, 2, null, r); o.attr({ z2: 100, culling: !0, scaleX: i[0] / 2, scaleY: i[1] / 2 }), o.drift = jw, this._symbolType = t, this.add(o) }, e.prototype.stopSymbolAnimation = function (t) { this.childAt(0).stopAnimation(null, t) }, e.prototype.getSymbolType = function () { return this._symbolType }, e.prototype.getSymbolPath = function () { return this.childAt(0) }, e.prototype.highlight = function () { Il(this.childAt(0)) }, e.prototype.downplay = function () { Tl(this.childAt(0)) }, e.prototype.setZ = function (t, e) { var n = this.childAt(0); n.zlevel = t, n.z = e }, e.prototype.setDraggable = function (t, e) { var n = this.childAt(0); n.draggable = t, n.cursor = !e && t ? \"move\" : n.cursor }, e.prototype.updateData = function (t, n, i, r) { this.silent = !1; var o = t.getItemVisual(n, \"symbol\") || \"circle\", a = t.hostModel, s = e.getSymbolSize(t, n), l = o !== this._symbolType, u = r && r.disableAnimation; if (l) { var h = t.getItemVisual(n, \"symbolKeepAspect\"); this._createSymbol(o, t, n, s, h) } else { (p = this.childAt(0)).silent = !1; var c = { scaleX: s[0] / 2, scaleY: s[1] / 2 }; u ? p.attr(c) : uh(p, c, a, n), gh(p) } if (this._updateCommon(t, n, s, i, r), l) { var p = this.childAt(0); if (!u) { c = { scaleX: this._sizeX, scaleY: this._sizeY, style: { opacity: p.style.opacity } }; p.scaleX = p.scaleY = 0, p.style.opacity = 0, hh(p, c, a, n) } } u && this.childAt(0).stopAnimation(\"leave\") }, e.prototype._updateCommon = function (t, e, n, i, r) { var o, a, s, l, u, h, c, p, d, f = this.childAt(0), g = t.hostModel; if (i && (o = i.emphasisItemStyle, a = i.blurItemStyle, s = i.selectItemStyle, l = i.focus, u = i.blurScope, c = i.labelStatesModels, p = i.hoverScale, d = i.cursorStyle, h = i.emphasisDisabled), !i || t.hasItemOption) { var y = i && i.itemModel ? i.itemModel : t.getItemModel(e), v = y.getModel(\"emphasis\"); o = v.getModel(\"itemStyle\").getItemStyle(), s = y.getModel([\"select\", \"itemStyle\"]).getItemStyle(), a = y.getModel([\"blur\", \"itemStyle\"]).getItemStyle(), l = v.get(\"focus\"), u = v.get(\"blurScope\"), h = v.get(\"disabled\"), c = Kh(y), p = v.getShallow(\"scale\"), d = y.getShallow(\"cursor\") } var m = t.getItemVisual(e, \"symbolRotate\"); f.attr(\"rotation\", (m || 0) * Math.PI / 180 || 0); var x = Ey(t.getItemVisual(e, \"symbolOffset\"), n); x && (f.x = x[0], f.y = x[1]), d && f.attr(\"cursor\", d); var _ = t.getItemVisual(e, \"style\"), b = _.fill; if (f instanceof Is) { var w = f.style; f.useStyle(A({ image: w.image, x: w.x, y: w.y, width: w.width, height: w.height }, _)) } else f.__isEmptyBrush ? f.useStyle(A({}, _)) : f.useStyle(_), f.style.decal = null, f.setColor(b, r && r.symbolInnerColor), f.style.strokeNoScale = !0; var S = t.getItemVisual(e, \"liftZ\"), M = this._z2; null != S ? null == M && (this._z2 = f.z2, f.z2 += S) : null != M && (f.z2 = M, this._z2 = null); var I = r && r.useNameLabel; qh(f, c, { labelFetcher: g, labelDataIndex: e, defaultText: function (e) { return I ? t.getName(e) : Uw(t, e) }, inheritColor: b, defaultOpacity: _.opacity }), this._sizeX = n[0] / 2, this._sizeY = n[1] / 2; var T = f.ensureState(\"emphasis\"); T.style = o, f.ensureState(\"select\").style = s, f.ensureState(\"blur\").style = a; var C = null == p || !0 === p ? Math.max(1.1, 3 / this._sizeY) : isFinite(p) && p > 0 ? +p : 1; T.scaleX = this._sizeX * C, T.scaleY = this._sizeY * C, this.setSymbolScale(1), Bl(this, l, u, h) }, e.prototype.setSymbolScale = function (t) { this.scaleX = this.scaleY = t }, e.prototype.fadeOut = function (t, e, n) { var i = this.childAt(0), r = js(this).dataIndex, o = n && n.animation; if (this.silent = i.silent = !0, n && n.fadeLabel) { var a = i.getTextContent(); a && ph(a, { style: { opacity: 0 } }, e, { dataIndex: r, removeOpt: o, cb: function () { i.removeTextContent() } }) } else i.removeTextContent(); ph(i, { style: { opacity: 0 }, scaleX: 0, scaleY: 0 }, e, { dataIndex: r, cb: t, removeOpt: o }) }, e.getSymbolSize = function (t, e) { return Ny(t.getItemVisual(e, \"symbolSize\")) }, e }(Pr); function jw(t, e) { this.parent.drift(t, e) } function qw(t, e, n, i) { return e && !isNaN(e[0]) && !isNaN(e[1]) && !(i.isIgnore && i.isIgnore(n)) && !(i.clipShape && !i.clipShape.contain(e[0], e[1])) && \"none\" !== t.getItemVisual(n, \"symbol\") } function Kw(t) { return null == t || q(t) || (t = { isIgnore: t }), t || {} } function $w(t) { var e = t.hostModel, n = e.getModel(\"emphasis\"); return { emphasisItemStyle: n.getModel(\"itemStyle\").getItemStyle(), blurItemStyle: e.getModel([\"blur\", \"itemStyle\"]).getItemStyle(), selectItemStyle: e.getModel([\"select\", \"itemStyle\"]).getItemStyle(), focus: n.get(\"focus\"), blurScope: n.get(\"blurScope\"), emphasisDisabled: n.get(\"disabled\"), hoverScale: n.get(\"scale\"), labelStatesModels: Kh(e), cursorStyle: e.get(\"cursor\") } } var Jw = function () { function t(t) { this.group = new Pr, this._SymbolCtor = t || Zw } return t.prototype.updateData = function (t, e) { this._progressiveEls = null, e = Kw(e); var n = this.group, i = t.hostModel, r = this._data, o = this._SymbolCtor, a = e.disableAnimation, s = $w(t), l = { disableAnimation: a }, u = e.getSymbolPoint || function (e) { return t.getItemLayout(e) }; r || n.removeAll(), t.diff(r).add((function (i) { var r = u(i); if (qw(t, r, i, e)) { var a = new o(t, i, s, l); a.setPosition(r), t.setItemGraphicEl(i, a), n.add(a) } })).update((function (h, c) { var p = r.getItemGraphicEl(c), d = u(h); if (qw(t, d, h, e)) { var f = t.getItemVisual(h, \"symbol\") || \"circle\", g = p && p.getSymbolType && p.getSymbolType(); if (!p || g && g !== f) n.remove(p), (p = new o(t, h, s, l)).setPosition(d); else { p.updateData(t, h, s, l); var y = { x: d[0], y: d[1] }; a ? p.attr(y) : uh(p, y, i) } n.add(p), t.setItemGraphicEl(h, p) } else n.remove(p) })).remove((function (t) { var e = r.getItemGraphicEl(t); e && e.fadeOut((function () { n.remove(e) }), i) })).execute(), this._getSymbolPoint = u, this._data = t }, t.prototype.updateLayout = function () { var t = this, e = this._data; e && e.eachItemGraphicEl((function (e, n) { var i = t._getSymbolPoint(n); e.setPosition(i), e.markRedraw() })) }, t.prototype.incrementalPrepareUpdate = function (t) { this._seriesScope = $w(t), this._data = null, this.group.removeAll() }, t.prototype.incrementalUpdate = function (t, e, n) { function i(t) { t.isGroup || (t.incremental = !0, t.ensureState(\"emphasis\").hoverLayer = !0) } this._progressiveEls = [], n = Kw(n); for (var r = t.start; r < t.end; r++) { var o = e.getItemLayout(r); if (qw(e, o, r, n)) { var a = new this._SymbolCtor(e, r, this._seriesScope); a.traverse(i), a.setPosition(o), this.group.add(a), e.setItemGraphicEl(r, a), this._progressiveEls.push(a) } } }, t.prototype.eachRendered = function (t) { Yh(this._progressiveEls || this.group, t) }, t.prototype.remove = function (t) { var e = this.group, n = this._data; n && t ? n.eachItemGraphicEl((function (t) { t.fadeOut((function () { e.remove(t) }), n.hostModel) })) : e.removeAll() }, t }(); function Qw(t, e, n) { var i = t.getBaseAxis(), r = t.getOtherAxis(i), o = function (t, e) { var n = 0, i = t.scale.getExtent(); \"start\" === e ? n = i[0] : \"end\" === e ? n = i[1] : j(e) && !isNaN(e) ? n = e : i[0] > 0 ? n = i[0] : i[1] < 0 && (n = i[1]); return n }(r, n), a = i.dim, s = r.dim, l = e.mapDimension(s), u = e.mapDimension(a), h = \"x\" === s || \"radius\" === s ? 1 : 0, c = z(t.dimensions, (function (t) { return e.mapDimension(t) })), p = !1, d = e.getCalculationInfo(\"stackResultDimension\"); return ox(e, c[0]) && (p = !0, c[0] = d), ox(e, c[1]) && (p = !0, c[1] = d), { dataDimsForPoint: c, valueStart: o, valueAxisDim: s, baseAxisDim: a, stacked: !!p, valueDim: l, baseDim: u, baseDataOffset: h, stackedOverDimension: e.getCalculationInfo(\"stackedOverDimension\") } } function tS(t, e, n, i) { var r = NaN; t.stacked && (r = n.get(n.getCalculationInfo(\"stackedOverDimension\"), i)), isNaN(r) && (r = t.valueStart); var o = t.baseDataOffset, a = []; return a[o] = n.get(t.baseDim, i), a[1 - o] = r, e.dataToPoint(a) } var eS = Math.min, nS = Math.max; function iS(t, e) { return isNaN(t) || isNaN(e) } function rS(t, e, n, i, r, o, a, s, l) { for (var u, h, c, p, d, f, g = n, y = 0; y < i; y++) { var v = e[2 * g], m = e[2 * g + 1]; if (g >= r || g < 0) break; if (iS(v, m)) { if (l) { g += o; continue } break } if (g === n) t[o > 0 ? \"moveTo\" : \"lineTo\"](v, m), c = v, p = m; else { var x = v - u, _ = m - h; if (x * x + _ * _ < .5) { g += o; continue } if (a > 0) { for (var b = g + o, w = e[2 * b], S = e[2 * b + 1]; w === v && S === m && y < i;)y++, g += o, w = e[2 * (b += o)], S = e[2 * b + 1], x = (v = e[2 * g]) - u, _ = (m = e[2 * g + 1]) - h; var M = y + 1; if (l) for (; iS(w, S) && M < i;)M++, w = e[2 * (b += o)], S = e[2 * b + 1]; var I = .5, T = 0, C = 0, D = void 0, A = void 0; if (M >= i || iS(w, S)) d = v, f = m; else { T = w - u, C = S - h; var k = v - u, L = w - v, P = m - h, O = S - m, R = void 0, N = void 0; if (\"x\" === s) { var E = T > 0 ? 1 : -1; d = v - E * (R = Math.abs(k)) * a, f = m, D = v + E * (N = Math.abs(L)) * a, A = m } else if (\"y\" === s) { var z = C > 0 ? 1 : -1; d = v, f = m - z * (R = Math.abs(P)) * a, D = v, A = m + z * (N = Math.abs(O)) * a } else R = Math.sqrt(k * k + P * P), d = v - T * a * (1 - (I = (N = Math.sqrt(L * L + O * O)) / (N + R))), f = m - C * a * (1 - I), A = m + C * a * I, D = eS(D = v + T * a * I, nS(w, v)), A = eS(A, nS(S, m)), D = nS(D, eS(w, v)), f = m - (C = (A = nS(A, eS(S, m))) - m) * R / N, d = eS(d = v - (T = D - v) * R / N, nS(u, v)), f = eS(f, nS(h, m)), D = v + (T = v - (d = nS(d, eS(u, v)))) * N / R, A = m + (C = m - (f = nS(f, eS(h, m)))) * N / R } t.bezierCurveTo(c, p, d, f, v, m), c = D, p = A } else t.lineTo(v, m) } u = v, h = m, g += o } return y } var oS = function () { this.smooth = 0, this.smoothConstraint = !0 }, aS = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"ec-polyline\", n } return n(e, t), e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new oS }, e.prototype.buildPath = function (t, e) { var n = e.points, i = 0, r = n.length / 2; if (e.connectNulls) { for (; r > 0 && iS(n[2 * r - 2], n[2 * r - 1]); r--); for (; i < r && iS(n[2 * i], n[2 * i + 1]); i++); } for (; i < r;)i += rS(t, n, i, r, r, 1, e.smooth, e.smoothMonotone, e.connectNulls) + 1 }, e.prototype.getPointOn = function (t, e) { this.path || (this.createPathProxy(), this.buildPath(this.path, this.shape)); for (var n, i, r = this.path.data, o = ts.CMD, a = \"x\" === e, s = [], l = 0; l < r.length;) { var u = void 0, h = void 0, c = void 0, p = void 0, d = void 0, f = void 0, g = void 0; switch (r[l++]) { case o.M: n = r[l++], i = r[l++]; break; case o.L: if (u = r[l++], h = r[l++], (g = a ? (t - n) / (u - n) : (t - i) / (h - i)) <= 1 && g >= 0) { var y = a ? (h - i) * g + i : (u - n) * g + n; return a ? [t, y] : [y, t] } n = u, i = h; break; case o.C: u = r[l++], h = r[l++], c = r[l++], p = r[l++], d = r[l++], f = r[l++]; var v = a ? vn(n, u, c, d, t, s) : vn(i, h, p, f, t, s); if (v > 0) for (var m = 0; m < v; m++) { var x = s[m]; if (x <= 1 && x >= 0) { y = a ? gn(i, h, p, f, x) : gn(n, u, c, d, x); return a ? [t, y] : [y, t] } } n = d, i = f } } }, e }(_s), sS = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e }(oS), lS = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"ec-polygon\", n } return n(e, t), e.prototype.getDefaultShape = function () { return new sS }, e.prototype.buildPath = function (t, e) { var n = e.points, i = e.stackedOnPoints, r = 0, o = n.length / 2, a = e.smoothMonotone; if (e.connectNulls) { for (; o > 0 && iS(n[2 * o - 2], n[2 * o - 1]); o--); for (; r < o && iS(n[2 * r], n[2 * r + 1]); r++); } for (; r < o;) { var s = rS(t, n, r, o, o, 1, e.smooth, a, e.connectNulls); rS(t, i, r + s - 1, s, o, -1, e.stackedOnSmooth, a, e.connectNulls), r += s + 1, t.closePath() } }, e }(_s); function uS(t, e, n, i, r) { var o = t.getArea(), a = o.x, s = o.y, l = o.width, u = o.height, h = n.get([\"lineStyle\", \"width\"]) || 2; a -= h / 2, s -= h / 2, l += h, u += h, a = Math.floor(a), l = Math.round(l); var c = new Ps({ shape: { x: a, y: s, width: l, height: u } }); if (e) { var p = t.getBaseAxis(), d = p.isHorizontal(), f = p.inverse; d ? (f && (c.shape.x += l), c.shape.width = 0) : (f || (c.shape.y += u), c.shape.height = 0); var g = U(r) ? function (t) { r(t, c) } : null; hh(c, { shape: { width: l, height: u, x: a, y: s } }, n, null, i, g) } return c } function hS(t, e, n) { var i = t.getArea(), r = Wr(i.r0, 1), o = Wr(i.r, 1), a = new Pu({ shape: { cx: Wr(t.cx, 1), cy: Wr(t.cy, 1), r0: r, r: o, startAngle: i.startAngle, endAngle: i.endAngle, clockwise: i.clockwise } }); e && (\"angle\" === t.getBaseAxis().dim ? a.shape.endAngle = i.startAngle : a.shape.r = r, hh(a, { shape: { endAngle: i.endAngle, r: o } }, n)); return a } function cS(t, e, n, i, r) { return t ? \"polar\" === t.type ? hS(t, e, n) : \"cartesian2d\" === t.type ? uS(t, e, n, i, r) : null : null } function pS(t, e) { return t.type === e } function dS(t, e) { if (t.length === e.length) { for (var n = 0; n < t.length; n++)if (t[n] !== e[n]) return; return !0 } } function fS(t) { for (var e = 1 / 0, n = 1 / 0, i = -1 / 0, r = -1 / 0, o = 0; o < t.length;) { var a = t[o++], s = t[o++]; isNaN(a) || (e = Math.min(a, e), i = Math.max(a, i)), isNaN(s) || (n = Math.min(s, n), r = Math.max(s, r)) } return [[e, n], [i, r]] } function gS(t, e) { var n = fS(t), i = n[0], r = n[1], o = fS(e), a = o[0], s = o[1]; return Math.max(Math.abs(i[0] - a[0]), Math.abs(i[1] - a[1]), Math.abs(r[0] - s[0]), Math.abs(r[1] - s[1])) } function yS(t) { return j(t) ? t : t ? .5 : 0 } function vS(t, e, n, i) { var r = e.getBaseAxis(), o = \"x\" === r.dim || \"radius\" === r.dim ? 0 : 1, a = [], s = 0, l = [], u = [], h = [], c = []; if (i) { for (s = 0; s < t.length; s += 2)isNaN(t[s]) || isNaN(t[s + 1]) || c.push(t[s], t[s + 1]); t = c } for (s = 0; s < t.length - 2; s += 2)switch (h[0] = t[s + 2], h[1] = t[s + 3], u[0] = t[s], u[1] = t[s + 1], a.push(u[0], u[1]), n) { case \"end\": l[o] = h[o], l[1 - o] = u[1 - o], a.push(l[0], l[1]); break; case \"middle\": var p = (u[o] + h[o]) / 2, d = []; l[o] = d[o] = p, l[1 - o] = u[1 - o], d[1 - o] = h[1 - o], a.push(l[0], l[1]), a.push(d[0], d[1]); break; default: l[o] = u[o], l[1 - o] = h[1 - o], a.push(l[0], l[1]) }return a.push(t[s++], t[s++]), a } function mS(t, e, n) { var i = t.getVisual(\"visualMeta\"); if (i && i.length && t.count() && \"cartesian2d\" === e.type) { for (var r, o, a = i.length - 1; a >= 0; a--) { var s = t.getDimensionInfo(i[a].dimension); if (\"x\" === (r = s && s.coordDim) || \"y\" === r) { o = i[a]; break } } if (o) { var l = e.getAxis(r), u = z(o.stops, (function (t) { return { coord: l.toGlobalCoord(l.dataToCoord(t.value)), color: t.color } })), h = u.length, c = o.outerColors.slice(); h && u[0].coord > u[h - 1].coord && (u.reverse(), c.reverse()); var p = function (t, e) { var n, i, r = [], o = t.length; function a(t, e, n) { var i = t.coord; return { coord: n, color: $n((n - i) / (e.coord - i), [t.color, e.color]) } } for (var s = 0; s < o; s++) { var l = t[s], u = l.coord; if (u < 0) n = l; else { if (u > e) { i ? r.push(a(i, l, e)) : n && r.push(a(n, l, 0), a(n, l, e)); break } n && (r.push(a(n, l, 0)), n = null), r.push(l), i = l } } return r }(u, \"x\" === r ? n.getWidth() : n.getHeight()), d = p.length; if (!d && h) return u[0].coord < 0 ? c[1] ? c[1] : u[h - 1].color : c[0] ? c[0] : u[0].color; var f = p[0].coord - 10, g = p[d - 1].coord + 10, y = g - f; if (y < .001) return \"transparent\"; E(p, (function (t) { t.offset = (t.coord - f) / y })), p.push({ offset: d ? p[d - 1].offset : .5, color: c[1] || \"transparent\" }), p.unshift({ offset: d ? p[0].offset : .5, color: c[0] || \"transparent\" }); var v = new $u(0, 0, 0, 0, p, !0); return v[r] = f, v[r + \"2\"] = g, v } } } function xS(t, e, n) { var i = t.get(\"showAllSymbol\"), r = \"auto\" === i; if (!i || r) { var o = n.getAxesByScale(\"ordinal\")[0]; if (o && (!r || !function (t, e) { var n = t.getExtent(), i = Math.abs(n[1] - n[0]) / t.scale.count(); isNaN(i) && (i = 0); for (var r = e.count(), o = Math.max(1, Math.round(r / 5)), a = 0; a < r; a += o)if (1.5 * Zw.getSymbolSize(e, a)[t.isHorizontal() ? 1 : 0] > i) return !1; return !0 }(o, e))) { var a = e.mapDimension(o.dim), s = {}; return E(o.getViewLabels(), (function (t) { var e = o.scale.getRawOrdinalNumber(t.tickValue); s[e] = 1 })), function (t) { return !s.hasOwnProperty(e.get(a, t)) } } } } function _S(t, e) { return [t[2 * e], t[2 * e + 1]] } function bS(t) { if (t.get([\"endLabel\", \"show\"])) return !0; for (var e = 0; e < tl.length; e++)if (t.get([tl[e], \"endLabel\", \"show\"])) return !0; return !1 } function wS(t, e, n, i) { if (pS(e, \"cartesian2d\")) { var r = i.getModel(\"endLabel\"), o = r.get(\"valueAnimation\"), a = i.getData(), s = { lastFrameIndex: 0 }, l = bS(i) ? function (n, i) { t._endLabelOnDuring(n, i, a, s, o, r, e) } : null, u = e.getBaseAxis().isHorizontal(), h = uS(e, n, i, (function () { var e = t._endLabel; e && n && null != s.originalX && e.attr({ x: s.originalX, y: s.originalY }) }), l); if (!i.get(\"clip\", !0)) { var c = h.shape, p = Math.max(c.width, c.height); u ? (c.y -= p, c.height += 2 * p) : (c.x -= p, c.width += 2 * p) } return l && l(1, h), h } return hS(e, n, i) } var SS = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.init = function () { var t = new Pr, e = new Jw; this.group.add(e.group), this._symbolDraw = e, this._lineGroup = t }, e.prototype.render = function (t, e, n) { var i = this, r = t.coordinateSystem, o = this.group, a = t.getData(), s = t.getModel(\"lineStyle\"), l = t.getModel(\"areaStyle\"), u = a.getLayout(\"points\") || [], h = \"polar\" === r.type, c = this._coordSys, p = this._symbolDraw, d = this._polyline, f = this._polygon, g = this._lineGroup, y = t.get(\"animation\"), v = !l.isEmpty(), m = l.get(\"origin\"), x = Qw(r, a, m), _ = v && function (t, e, n) { if (!n.valueDim) return []; for (var i = e.count(), r = Tx(2 * i), o = 0; o < i; o++) { var a = tS(n, t, e, o); r[2 * o] = a[0], r[2 * o + 1] = a[1] } return r }(r, a, x), b = t.get(\"showSymbol\"), w = t.get(\"connectNulls\"), S = b && !h && xS(t, a, r), M = this._data; M && M.eachItemGraphicEl((function (t, e) { t.__temp && (o.remove(t), M.setItemGraphicEl(e, null)) })), b || p.remove(), o.add(g); var I, T = !h && t.get(\"step\"); r && r.getArea && t.get(\"clip\", !0) && (null != (I = r.getArea()).width ? (I.x -= .1, I.y -= .1, I.width += .2, I.height += .2) : I.r0 && (I.r0 -= .5, I.r += .5)), this._clipShapeForSymbol = I; var C = mS(a, r, n) || a.getVisual(\"style\")[a.getVisual(\"drawType\")]; if (d && c.type === r.type && T === this._step) { v && !f ? f = this._newPolygon(u, _) : f && !v && (g.remove(f), f = this._polygon = null), h || this._initOrUpdateEndLabel(t, r, gp(C)); var D = g.getClipPath(); if (D) hh(D, { shape: wS(this, r, !1, t).shape }, t); else g.setClipPath(wS(this, r, !0, t)); b && p.updateData(a, { isIgnore: S, clipShape: I, disableAnimation: !0, getSymbolPoint: function (t) { return [u[2 * t], u[2 * t + 1]] } }), dS(this._stackedOnPoints, _) && dS(this._points, u) || (y ? this._doUpdateAnimation(a, _, r, n, T, m, w) : (T && (u = vS(u, r, T, w), _ && (_ = vS(_, r, T, w))), d.setShape({ points: u }), f && f.setShape({ points: u, stackedOnPoints: _ }))) } else b && p.updateData(a, { isIgnore: S, clipShape: I, disableAnimation: !0, getSymbolPoint: function (t) { return [u[2 * t], u[2 * t + 1]] } }), y && this._initSymbolLabelAnimation(a, r, I), T && (u = vS(u, r, T, w), _ && (_ = vS(_, r, T, w))), d = this._newPolyline(u), v ? f = this._newPolygon(u, _) : f && (g.remove(f), f = this._polygon = null), h || this._initOrUpdateEndLabel(t, r, gp(C)), g.setClipPath(wS(this, r, !0, t)); var A = t.getModel(\"emphasis\"), L = A.get(\"focus\"), P = A.get(\"blurScope\"), O = A.get(\"disabled\"); (d.useStyle(k(s.getLineStyle(), { fill: \"none\", stroke: C, lineJoin: \"bevel\" })), Hl(d, t, \"lineStyle\"), d.style.lineWidth > 0 && \"bolder\" === t.get([\"emphasis\", \"lineStyle\", \"width\"])) && (d.getState(\"emphasis\").style.lineWidth = +d.style.lineWidth + 1); js(d).seriesIndex = t.seriesIndex, Bl(d, L, P, O); var R = yS(t.get(\"smooth\")), N = t.get(\"smoothMonotone\"); if (d.setShape({ smooth: R, smoothMonotone: N, connectNulls: w }), f) { var E = a.getCalculationInfo(\"stackedOnSeries\"), z = 0; f.useStyle(k(l.getAreaStyle(), { fill: C, opacity: .7, lineJoin: \"bevel\", decal: a.getVisual(\"style\").decal })), E && (z = yS(E.get(\"smooth\"))), f.setShape({ smooth: R, stackedOnSmooth: z, smoothMonotone: N, connectNulls: w }), Hl(f, t, \"areaStyle\"), js(f).seriesIndex = t.seriesIndex, Bl(f, L, P, O) } var V = function (t) { i._changePolyState(t) }; a.eachItemGraphicEl((function (t) { t && (t.onHoverStateChange = V) })), this._polyline.onHoverStateChange = V, this._data = a, this._coordSys = r, this._stackedOnPoints = _, this._points = u, this._step = T, this._valueOrigin = m, t.get(\"triggerLineEvent\") && (this.packEventData(t, d), f && this.packEventData(t, f)) }, e.prototype.packEventData = function (t, e) { js(e).eventData = { componentType: \"series\", componentSubType: \"line\", componentIndex: t.componentIndex, seriesIndex: t.seriesIndex, seriesName: t.name, seriesType: \"line\" } }, e.prototype.highlight = function (t, e, n, i) { var r = t.getData(), o = Co(r, i); if (this._changePolyState(\"emphasis\"), !(o instanceof Array) && null != o && o >= 0) { var a = r.getLayout(\"points\"), s = r.getItemGraphicEl(o); if (!s) { var l = a[2 * o], u = a[2 * o + 1]; if (isNaN(l) || isNaN(u)) return; if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(l, u)) return; var h = t.get(\"zlevel\") || 0, c = t.get(\"z\") || 0; (s = new Zw(r, o)).x = l, s.y = u, s.setZ(h, c); var p = s.getSymbolPath().getTextContent(); p && (p.zlevel = h, p.z = c, p.z2 = this._polyline.z2 + 1), s.__temp = !0, r.setItemGraphicEl(o, s), s.stopSymbolAnimation(!0), this.group.add(s) } s.highlight() } else wg.prototype.highlight.call(this, t, e, n, i) }, e.prototype.downplay = function (t, e, n, i) { var r = t.getData(), o = Co(r, i); if (this._changePolyState(\"normal\"), null != o && o >= 0) { var a = r.getItemGraphicEl(o); a && (a.__temp ? (r.setItemGraphicEl(o, null), this.group.remove(a)) : a.downplay()) } else wg.prototype.downplay.call(this, t, e, n, i) }, e.prototype._changePolyState = function (t) { var e = this._polygon; _l(this._polyline, t), e && _l(e, t) }, e.prototype._newPolyline = function (t) { var e = this._polyline; return e && this._lineGroup.remove(e), e = new aS({ shape: { points: t }, segmentIgnoreThreshold: 2, z2: 10 }), this._lineGroup.add(e), this._polyline = e, e }, e.prototype._newPolygon = function (t, e) { var n = this._polygon; return n && this._lineGroup.remove(n), n = new lS({ shape: { points: t, stackedOnPoints: e }, segmentIgnoreThreshold: 2 }), this._lineGroup.add(n), this._polygon = n, n }, e.prototype._initSymbolLabelAnimation = function (t, e, n) { var i, r, o = e.getBaseAxis(), a = o.inverse; \"cartesian2d\" === e.type ? (i = o.isHorizontal(), r = !1) : \"polar\" === e.type && (i = \"angle\" === o.dim, r = !0); var s = t.hostModel, l = s.get(\"animationDuration\"); U(l) && (l = l(null)); var u = s.get(\"animationDelay\") || 0, h = U(u) ? u(null) : u; t.eachItemGraphicEl((function (t, o) { var s = t; if (s) { var c = [t.x, t.y], p = void 0, d = void 0, f = void 0; if (n) if (r) { var g = n, y = e.pointToCoord(c); i ? (p = g.startAngle, d = g.endAngle, f = -y[1] / 180 * Math.PI) : (p = g.r0, d = g.r, f = y[0]) } else { var v = n; i ? (p = v.x, d = v.x + v.width, f = t.x) : (p = v.y + v.height, d = v.y, f = t.y) } var m = d === p ? 0 : (f - p) / (d - p); a && (m = 1 - m); var x = U(u) ? u(o) : l * m + h, _ = s.getSymbolPath(), b = _.getTextContent(); s.attr({ scaleX: 0, scaleY: 0 }), s.animateTo({ scaleX: 1, scaleY: 1 }, { duration: 200, setToFinal: !0, delay: x }), b && b.animateFrom({ style: { opacity: 0 } }, { duration: 300, delay: x }), _.disableLabelAnimation = !0 } })) }, e.prototype._initOrUpdateEndLabel = function (t, e, n) { var i = t.getModel(\"endLabel\"); if (bS(t)) { var r = t.getData(), o = this._polyline, a = r.getLayout(\"points\"); if (!a) return o.removeTextContent(), void (this._endLabel = null); var s = this._endLabel; s || ((s = this._endLabel = new Ns({ z2: 200 })).ignoreClip = !0, o.setTextContent(this._endLabel), o.disableLabelAnimation = !0); var l = function (t) { for (var e, n, i = t.length / 2; i > 0 && (e = t[2 * i - 2], n = t[2 * i - 1], isNaN(e) || isNaN(n)); i--); return i - 1 }(a); l >= 0 && (qh(o, Kh(t, \"endLabel\"), { inheritColor: n, labelFetcher: t, labelDataIndex: l, defaultText: function (t, e, n) { return null != n ? Xw(r, n) : Uw(r, t) }, enableTextSetter: !0 }, function (t, e) { var n = e.getBaseAxis(), i = n.isHorizontal(), r = n.inverse, o = i ? r ? \"right\" : \"left\" : \"center\", a = i ? \"middle\" : r ? \"top\" : \"bottom\"; return { normal: { align: t.get(\"align\") || o, verticalAlign: t.get(\"verticalAlign\") || a } } }(i, e)), o.textConfig.position = null) } else this._endLabel && (this._polyline.removeTextContent(), this._endLabel = null) }, e.prototype._endLabelOnDuring = function (t, e, n, i, r, o, a) { var s = this._endLabel, l = this._polyline; if (s) { t < 1 && null == i.originalX && (i.originalX = s.x, i.originalY = s.y); var u = n.getLayout(\"points\"), h = n.hostModel, c = h.get(\"connectNulls\"), p = o.get(\"precision\"), d = o.get(\"distance\") || 0, f = a.getBaseAxis(), g = f.isHorizontal(), y = f.inverse, v = e.shape, m = y ? g ? v.x : v.y + v.height : g ? v.x + v.width : v.y, x = (g ? d : 0) * (y ? -1 : 1), _ = (g ? 0 : -d) * (y ? -1 : 1), b = g ? \"x\" : \"y\", w = function (t, e, n) { for (var i, r, o = t.length / 2, a = \"x\" === n ? 0 : 1, s = 0, l = -1, u = 0; u < o; u++)if (r = t[2 * u + a], !isNaN(r) && !isNaN(t[2 * u + 1 - a])) if (0 !== u) { if (i <= e && r >= e || i >= e && r <= e) { l = u; break } s = u, i = r } else i = r; return { range: [s, l], t: (e - i) / (r - i) } }(u, m, b), S = w.range, M = S[1] - S[0], I = void 0; if (M >= 1) { if (M > 1 && !c) { var T = _S(u, S[0]); s.attr({ x: T[0] + x, y: T[1] + _ }), r && (I = h.getRawValue(S[0])) } else { (T = l.getPointOn(m, b)) && s.attr({ x: T[0] + x, y: T[1] + _ }); var C = h.getRawValue(S[0]), D = h.getRawValue(S[1]); r && (I = zo(n, p, C, D, w.t)) } i.lastFrameIndex = S[0] } else { var A = 1 === t || i.lastFrameIndex > 0 ? S[0] : 0; T = _S(u, A); r && (I = h.getRawValue(A)), s.attr({ x: T[0] + x, y: T[1] + _ }) } r && rc(s).setLabelText(I) } }, e.prototype._doUpdateAnimation = function (t, e, n, i, r, o, a) { var s = this._polyline, l = this._polygon, u = t.hostModel, h = function (t, e, n, i, r, o, a, s) { for (var l = function (t, e) { var n = []; return e.diff(t).add((function (t) { n.push({ cmd: \"+\", idx: t }) })).update((function (t, e) { n.push({ cmd: \"=\", idx: e, idx1: t }) })).remove((function (t) { n.push({ cmd: \"-\", idx: t }) })).execute(), n }(t, e), u = [], h = [], c = [], p = [], d = [], f = [], g = [], y = Qw(r, e, a), v = t.getLayout(\"points\") || [], m = e.getLayout(\"points\") || [], x = 0; x < l.length; x++) { var _ = l[x], b = !0, w = void 0, S = void 0; switch (_.cmd) { case \"=\": w = 2 * _.idx, S = 2 * _.idx1; var M = v[w], I = v[w + 1], T = m[S], C = m[S + 1]; (isNaN(M) || isNaN(I)) && (M = T, I = C), u.push(M, I), h.push(T, C), c.push(n[w], n[w + 1]), p.push(i[S], i[S + 1]), g.push(e.getRawIndex(_.idx1)); break; case \"+\": var D = _.idx, A = y.dataDimsForPoint, k = r.dataToPoint([e.get(A[0], D), e.get(A[1], D)]); S = 2 * D, u.push(k[0], k[1]), h.push(m[S], m[S + 1]); var L = tS(y, r, e, D); c.push(L[0], L[1]), p.push(i[S], i[S + 1]), g.push(e.getRawIndex(D)); break; case \"-\": b = !1 }b && (d.push(_), f.push(f.length)) } f.sort((function (t, e) { return g[t] - g[e] })); var P = u.length, O = Tx(P), R = Tx(P), N = Tx(P), E = Tx(P), z = []; for (x = 0; x < f.length; x++) { var V = f[x], B = 2 * x, F = 2 * V; O[B] = u[F], O[B + 1] = u[F + 1], R[B] = h[F], R[B + 1] = h[F + 1], N[B] = c[F], N[B + 1] = c[F + 1], E[B] = p[F], E[B + 1] = p[F + 1], z[x] = d[V] } return { current: O, next: R, stackedOnCurrent: N, stackedOnNext: E, status: z } }(this._data, t, this._stackedOnPoints, e, this._coordSys, 0, this._valueOrigin), c = h.current, p = h.stackedOnCurrent, d = h.next, f = h.stackedOnNext; if (r && (c = vS(h.current, n, r, a), p = vS(h.stackedOnCurrent, n, r, a), d = vS(h.next, n, r, a), f = vS(h.stackedOnNext, n, r, a)), gS(c, d) > 3e3 || l && gS(p, f) > 3e3) return s.stopAnimation(), s.setShape({ points: d }), void (l && (l.stopAnimation(), l.setShape({ points: d, stackedOnPoints: f }))); s.shape.__points = h.current, s.shape.points = c; var g = { shape: { points: d } }; h.current !== c && (g.shape.__points = h.next), s.stopAnimation(), uh(s, g, u), l && (l.setShape({ points: c, stackedOnPoints: p }), l.stopAnimation(), uh(l, { shape: { stackedOnPoints: f } }, u), s.shape.points !== l.shape.points && (l.shape.points = s.shape.points)); for (var y = [], v = h.status, m = 0; m < v.length; m++) { if (\"=\" === v[m].cmd) { var x = t.getItemGraphicEl(v[m].idx1); x && y.push({ el: x, ptIdx: m }) } } s.animators && s.animators.length && s.animators[0].during((function () { l && l.dirtyShape(); for (var t = s.shape.__points, e = 0; e < y.length; e++) { var n = y[e].el, i = 2 * y[e].ptIdx; n.x = t[i], n.y = t[i + 1], n.markRedraw() } })) }, e.prototype.remove = function (t) { var e = this.group, n = this._data; this._lineGroup.removeAll(), this._symbolDraw.remove(!0), n && n.eachItemGraphicEl((function (t, i) { t.__temp && (e.remove(t), n.setItemGraphicEl(i, null)) })), this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null }, e.type = \"line\", e }(wg); function MS(t, e) { return { seriesType: t, plan: xg(), reset: function (t) { var n = t.getData(), i = t.coordinateSystem, r = t.pipelineContext, o = e || r.large; if (i) { var a = z(i.dimensions, (function (t) { return n.mapDimension(t) })).slice(0, 2), s = a.length, l = n.getCalculationInfo(\"stackResultDimension\"); ox(n, a[0]) && (a[0] = l), ox(n, a[1]) && (a[1] = l); var u = n.getStore(), h = n.getDimensionIndex(a[0]), c = n.getDimensionIndex(a[1]); return s && { progress: function (t, e) { for (var n = t.end - t.start, r = o && Tx(n * s), a = [], l = [], p = t.start, d = 0; p < t.end; p++) { var f = void 0; if (1 === s) { var g = u.get(h, p); f = i.dataToPoint(g, null, l) } else a[0] = u.get(h, p), a[1] = u.get(c, p), f = i.dataToPoint(a, null, l); o ? (r[d++] = f[0], r[d++] = f[1]) : e.setItemLayout(p, f.slice()) } o && e.setLayout(\"points\", r) } } } } } } var IS = { average: function (t) { for (var e = 0, n = 0, i = 0; i < t.length; i++)isNaN(t[i]) || (e += t[i], n++); return 0 === n ? NaN : e / n }, sum: function (t) { for (var e = 0, n = 0; n < t.length; n++)e += t[n] || 0; return e }, max: function (t) { for (var e = -1 / 0, n = 0; n < t.length; n++)t[n] > e && (e = t[n]); return isFinite(e) ? e : NaN }, min: function (t) { for (var e = 1 / 0, n = 0; n < t.length; n++)t[n] < e && (e = t[n]); return isFinite(e) ? e : NaN }, nearest: function (t) { return t[0] } }, TS = function (t) { return Math.round(t.length / 2) }; function CS(t) { return { seriesType: t, reset: function (t, e, n) { var i = t.getData(), r = t.get(\"sampling\"), o = t.coordinateSystem, a = i.count(); if (a > 10 && \"cartesian2d\" === o.type && r) { var s = o.getBaseAxis(), l = o.getOtherAxis(s), u = s.getExtent(), h = n.getDevicePixelRatio(), c = Math.abs(u[1] - u[0]) * (h || 1), p = Math.round(a / c); if (isFinite(p) && p > 1) { \"lttb\" === r && t.setData(i.lttbDownSample(i.mapDimension(l.dim), 1 / p)); var d = void 0; X(r) ? d = IS[r] : U(r) && (d = r), d && t.setData(i.downSample(i.mapDimension(l.dim), 1 / p, d, TS)) } } } } } var DS = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.getInitialData = function (t, e) { return sx(null, this, { useEncodeDefaulter: !0 }) }, e.prototype.getMarkerPosition = function (t) { var e = this.coordinateSystem; if (e && e.clampData) { var n = e.dataToPoint(e.clampData(t)), i = this.getData(), r = i.getLayout(\"offset\"), o = i.getLayout(\"size\"); return n[e.getBaseAxis().isHorizontal() ? 0 : 1] += r + o / 2, n } return [NaN, NaN] }, e.type = \"series.__base_bar__\", e.defaultOption = { z: 2, coordinateSystem: \"cartesian2d\", legendHoverLink: !0, barMinHeight: 0, barMinAngle: 0, large: !1, largeThreshold: 400, progressive: 3e3, progressiveChunkMode: \"mod\" }, e }(hg); hg.registerClass(DS); var AS = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.getInitialData = function () { return sx(null, this, { useEncodeDefaulter: !0, createInvertedIndices: !!this.get(\"realtimeSort\", !0) || null }) }, e.prototype.getProgressive = function () { return !!this.get(\"large\") && this.get(\"progressive\") }, e.prototype.getProgressiveThreshold = function () { var t = this.get(\"progressiveThreshold\"), e = this.get(\"largeThreshold\"); return e > t && (t = e), t }, e.prototype.brushSelector = function (t, e, n) { return n.rect(e.getItemLayout(t)) }, e.type = \"series.bar\", e.dependencies = [\"grid\", \"polar\"], e.defaultOption = wc(DS.defaultOption, { clip: !0, roundCap: !1, showBackground: !1, backgroundStyle: { color: \"rgba(180, 180, 180, 0.2)\", borderColor: null, borderWidth: 0, borderType: \"solid\", borderRadius: 0, shadowBlur: 0, shadowColor: null, shadowOffsetX: 0, shadowOffsetY: 0, opacity: 1 }, select: { itemStyle: { borderColor: \"#212121\" } }, realtimeSort: !1 }), e }(DS), kS = function () { this.cx = 0, this.cy = 0, this.r0 = 0, this.r = 0, this.startAngle = 0, this.endAngle = 2 * Math.PI, this.clockwise = !0 }, LS = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"sausage\", n } return n(e, t), e.prototype.getDefaultShape = function () { return new kS }, e.prototype.buildPath = function (t, e) { var n = e.cx, i = e.cy, r = Math.max(e.r0 || 0, 0), o = Math.max(e.r, 0), a = .5 * (o - r), s = r + a, l = e.startAngle, u = e.endAngle, h = e.clockwise, c = 2 * Math.PI, p = h ? u - l < c : l - u < c; p || (l = u - (h ? c : -c)); var d = Math.cos(l), f = Math.sin(l), g = Math.cos(u), y = Math.sin(u); p ? (t.moveTo(d * r + n, f * r + i), t.arc(d * s + n, f * s + i, a, -Math.PI + l, l, !h)) : t.moveTo(d * o + n, f * o + i), t.arc(n, i, o, l, u, !h), t.arc(g * s + n, y * s + i, a, u - 2 * Math.PI, u - Math.PI, !h), 0 !== r && t.arc(n, i, r, u, l, h) }, e }(_s); function PS(t, e, n) { return e * Math.sin(t) * (n ? -1 : 1) } function OS(t, e, n) { return e * Math.cos(t) * (n ? 1 : -1) } var RS = Math.max, NS = Math.min; var ES = function (t) { function e() { var n = t.call(this) || this; return n.type = e.type, n._isFirstFrame = !0, n } return n(e, t), e.prototype.render = function (t, e, n, i) { this._model = t, this._removeOnRenderedListener(n), this._updateDrawMode(t); var r = t.get(\"coordinateSystem\"); (\"cartesian2d\" === r || \"polar\" === r) && (this._progressiveEls = null, this._isLargeDraw ? this._renderLarge(t, e, n) : this._renderNormal(t, e, n, i)) }, e.prototype.incrementalPrepareRender = function (t) { this._clear(), this._updateDrawMode(t), this._updateLargeClip(t) }, e.prototype.incrementalRender = function (t, e) { this._progressiveEls = [], this._incrementalRenderLarge(t, e) }, e.prototype.eachRendered = function (t) { Yh(this._progressiveEls || this.group, t) }, e.prototype._updateDrawMode = function (t) { var e = t.pipelineContext.large; null != this._isLargeDraw && e === this._isLargeDraw || (this._isLargeDraw = e, this._clear()) }, e.prototype._renderNormal = function (t, e, n, i) { var r, o = this.group, a = t.getData(), s = this._data, l = t.coordinateSystem, u = l.getBaseAxis(); \"cartesian2d\" === l.type ? r = u.isHorizontal() : \"polar\" === l.type && (r = \"angle\" === u.dim); var h = t.isAnimationEnabled() ? t : null, c = function (t, e) { var n = t.get(\"realtimeSort\", !0), i = e.getBaseAxis(); 0; if (n && \"category\" === i.type && \"cartesian2d\" === e.type) return { baseAxis: i, otherAxis: e.getOtherAxis(i) } }(t, l); c && this._enableRealtimeSort(c, a, n); var p = t.get(\"clip\", !0) || c, d = function (t, e) { var n = t.getArea && t.getArea(); if (pS(t, \"cartesian2d\")) { var i = t.getBaseAxis(); if (\"category\" !== i.type || !i.onBand) { var r = e.getLayout(\"bandWidth\"); i.isHorizontal() ? (n.x -= r, n.width += 2 * r) : (n.y -= r, n.height += 2 * r) } } return n }(l, a); o.removeClipPath(); var f = t.get(\"roundCap\", !0), g = t.get(\"showBackground\", !0), y = t.getModel(\"backgroundStyle\"), v = y.get(\"borderRadius\") || 0, m = [], x = this._backgroundEls, _ = i && i.isInitSort, b = i && \"changeAxisOrder\" === i.type; function w(t) { var e = YS[l.type](a, t), n = function (t, e, n) { return new (\"polar\" === t.type ? Pu : Ps)({ shape: $S(e, n, t), silent: !0, z2: 0 }) }(l, r, e); return n.useStyle(y.getItemStyle()), \"cartesian2d\" === l.type && n.setShape(\"r\", v), m[t] = n, n } a.diff(s).add((function (e) { var n = a.getItemModel(e), i = YS[l.type](a, e, n); if (g && w(e), a.hasValue(e) && HS[l.type](i)) { var s = !1; p && (s = zS[l.type](d, i)); var y = VS[l.type](t, a, e, i, r, h, u.model, !1, f); c && (y.forceLabelAnimation = !0), XS(y, a, e, n, i, t, r, \"polar\" === l.type), _ ? y.attr({ shape: i }) : c ? BS(c, h, y, i, e, r, !1, !1) : hh(y, { shape: i }, t, e), a.setItemGraphicEl(e, y), o.add(y), y.ignore = s } })).update((function (e, n) { var i = a.getItemModel(e), S = YS[l.type](a, e, i); if (g) { var M = void 0; 0 === x.length ? M = w(n) : ((M = x[n]).useStyle(y.getItemStyle()), \"cartesian2d\" === l.type && M.setShape(\"r\", v), m[e] = M); var I = YS[l.type](a, e); uh(M, { shape: $S(r, I, l) }, h, e) } var T = s.getItemGraphicEl(n); if (a.hasValue(e) && HS[l.type](S)) { var C = !1; if (p && (C = zS[l.type](d, S)) && o.remove(T), T ? gh(T) : T = VS[l.type](t, a, e, S, r, h, u.model, !!T, f), c && (T.forceLabelAnimation = !0), b) { var D = T.getTextContent(); if (D) { var A = rc(D); null != A.prevValue && (A.prevValue = A.value) } } else XS(T, a, e, i, S, t, r, \"polar\" === l.type); _ ? T.attr({ shape: S }) : c ? BS(c, h, T, S, e, r, !0, b) : uh(T, { shape: S }, t, e, null), a.setItemGraphicEl(e, T), T.ignore = C, o.add(T) } else o.remove(T) })).remove((function (e) { var n = s.getItemGraphicEl(e); n && fh(n, t, e) })).execute(); var S = this._backgroundGroup || (this._backgroundGroup = new Pr); S.removeAll(); for (var M = 0; M < m.length; ++M)S.add(m[M]); o.add(S), this._backgroundEls = m, this._data = a }, e.prototype._renderLarge = function (t, e, n) { this._clear(), qS(t, this.group), this._updateLargeClip(t) }, e.prototype._incrementalRenderLarge = function (t, e) { this._removeBackground(), qS(e, this.group, this._progressiveEls, !0) }, e.prototype._updateLargeClip = function (t) { var e = t.get(\"clip\", !0) && cS(t.coordinateSystem, !1, t), n = this.group; e ? n.setClipPath(e) : n.removeClipPath() }, e.prototype._enableRealtimeSort = function (t, e, n) { var i = this; if (e.count()) { var r = t.baseAxis; if (this._isFirstFrame) this._dispatchInitSort(e, t, n), this._isFirstFrame = !1; else { var o = function (t) { var n = e.getItemGraphicEl(t), i = n && n.shape; return i && Math.abs(r.isHorizontal() ? i.height : i.width) || 0 }; this._onRendered = function () { i._updateSortWithinSameData(e, o, r, n) }, n.getZr().on(\"rendered\", this._onRendered) } } }, e.prototype._dataSort = function (t, e, n) { var i = []; return t.each(t.mapDimension(e.dim), (function (t, e) { var r = n(e); r = null == r ? NaN : r, i.push({ dataIndex: e, mappedValue: r, ordinalNumber: t }) })), i.sort((function (t, e) { return e.mappedValue - t.mappedValue })), { ordinalNumbers: z(i, (function (t) { return t.ordinalNumber })) } }, e.prototype._isOrderChangedWithinSameData = function (t, e, n) { for (var i = n.scale, r = t.mapDimension(n.dim), o = Number.MAX_VALUE, a = 0, s = i.getOrdinalMeta().categories.length; a < s; ++a) { var l = t.rawIndexOf(r, i.getRawOrdinalNumber(a)), u = l < 0 ? Number.MIN_VALUE : e(t.indexOfRawIndex(l)); if (u > o) return !0; o = u } return !1 }, e.prototype._isOrderDifferentInView = function (t, e) { for (var n = e.scale, i = n.getExtent(), r = Math.max(0, i[0]), o = Math.min(i[1], n.getOrdinalMeta().categories.length - 1); r <= o; ++r)if (t.ordinalNumbers[r] !== n.getRawOrdinalNumber(r)) return !0 }, e.prototype._updateSortWithinSameData = function (t, e, n, i) { if (this._isOrderChangedWithinSameData(t, e, n)) { var r = this._dataSort(t, n, e); this._isOrderDifferentInView(r, n) && (this._removeOnRenderedListener(i), i.dispatchAction({ type: \"changeAxisOrder\", componentType: n.dim + \"Axis\", axisId: n.index, sortInfo: r })) } }, e.prototype._dispatchInitSort = function (t, e, n) { var i = e.baseAxis, r = this._dataSort(t, i, (function (n) { return t.get(t.mapDimension(e.otherAxis.dim), n) })); n.dispatchAction({ type: \"changeAxisOrder\", componentType: i.dim + \"Axis\", isInitSort: !0, axisId: i.index, sortInfo: r }) }, e.prototype.remove = function (t, e) { this._clear(this._model), this._removeOnRenderedListener(e) }, e.prototype.dispose = function (t, e) { this._removeOnRenderedListener(e) }, e.prototype._removeOnRenderedListener = function (t) { this._onRendered && (t.getZr().off(\"rendered\", this._onRendered), this._onRendered = null) }, e.prototype._clear = function (t) { var e = this.group, n = this._data; t && t.isAnimationEnabled() && n && !this._isLargeDraw ? (this._removeBackground(), this._backgroundEls = [], n.eachItemGraphicEl((function (e) { fh(e, t, js(e).dataIndex) }))) : e.removeAll(), this._data = null, this._isFirstFrame = !0 }, e.prototype._removeBackground = function () { this.group.remove(this._backgroundGroup), this._backgroundGroup = null }, e.type = \"bar\", e }(wg), zS = { cartesian2d: function (t, e) { var n = e.width < 0 ? -1 : 1, i = e.height < 0 ? -1 : 1; n < 0 && (e.x += e.width, e.width = -e.width), i < 0 && (e.y += e.height, e.height = -e.height); var r = t.x + t.width, o = t.y + t.height, a = RS(e.x, t.x), s = NS(e.x + e.width, r), l = RS(e.y, t.y), u = NS(e.y + e.height, o), h = s < a, c = u < l; return e.x = h && a > r ? s : a, e.y = c && l > o ? u : l, e.width = h ? 0 : s - a, e.height = c ? 0 : u - l, n < 0 && (e.x += e.width, e.width = -e.width), i < 0 && (e.y += e.height, e.height = -e.height), h || c }, polar: function (t, e) { var n = e.r0 <= e.r ? 1 : -1; if (n < 0) { var i = e.r; e.r = e.r0, e.r0 = i } var r = NS(e.r, t.r), o = RS(e.r0, t.r0); e.r = r, e.r0 = o; var a = r - o < 0; if (n < 0) { i = e.r; e.r = e.r0, e.r0 = i } return a } }, VS = { cartesian2d: function (t, e, n, i, r, o, a, s, l) { var u = new Ps({ shape: A({}, i), z2: 1 }); (u.__dataIndex = n, u.name = \"item\", o) && (u.shape[r ? \"height\" : \"width\"] = 0); return u }, polar: function (t, e, n, i, r, o, a, s, l) { var u = !r && l ? LS : Pu, h = new u({ shape: i, z2: 1 }); h.name = \"item\"; var c, p, d = US(r); if (h.calculateTextPosition = (c = d, p = ({ isRoundCap: u === LS } || {}).isRoundCap, function (t, e, n) { var i = e.position; if (!i || i instanceof Array) return br(t, e, n); var r = c(i), o = null != e.distance ? e.distance : 5, a = this.shape, s = a.cx, l = a.cy, u = a.r, h = a.r0, d = (u + h) / 2, f = a.startAngle, g = a.endAngle, y = (f + g) / 2, v = p ? Math.abs(u - h) / 2 : 0, m = Math.cos, x = Math.sin, _ = s + u * m(f), b = l + u * x(f), w = \"left\", S = \"top\"; switch (r) { case \"startArc\": _ = s + (h - o) * m(y), b = l + (h - o) * x(y), w = \"center\", S = \"top\"; break; case \"insideStartArc\": _ = s + (h + o) * m(y), b = l + (h + o) * x(y), w = \"center\", S = \"bottom\"; break; case \"startAngle\": _ = s + d * m(f) + PS(f, o + v, !1), b = l + d * x(f) + OS(f, o + v, !1), w = \"right\", S = \"middle\"; break; case \"insideStartAngle\": _ = s + d * m(f) + PS(f, -o + v, !1), b = l + d * x(f) + OS(f, -o + v, !1), w = \"left\", S = \"middle\"; break; case \"middle\": _ = s + d * m(y), b = l + d * x(y), w = \"center\", S = \"middle\"; break; case \"endArc\": _ = s + (u + o) * m(y), b = l + (u + o) * x(y), w = \"center\", S = \"bottom\"; break; case \"insideEndArc\": _ = s + (u - o) * m(y), b = l + (u - o) * x(y), w = \"center\", S = \"top\"; break; case \"endAngle\": _ = s + d * m(g) + PS(g, o + v, !0), b = l + d * x(g) + OS(g, o + v, !0), w = \"left\", S = \"middle\"; break; case \"insideEndAngle\": _ = s + d * m(g) + PS(g, -o + v, !0), b = l + d * x(g) + OS(g, -o + v, !0), w = \"right\", S = \"middle\"; break; default: return br(t, e, n) }return (t = t || {}).x = _, t.y = b, t.align = w, t.verticalAlign = S, t }), o) { var f = r ? \"r\" : \"endAngle\", g = {}; h.shape[f] = r ? 0 : i.startAngle, g[f] = i[f], (s ? uh : hh)(h, { shape: g }, o) } return h } }; function BS(t, e, n, i, r, o, a, s) { var l, u; o ? (u = { x: i.x, width: i.width }, l = { y: i.y, height: i.height }) : (u = { y: i.y, height: i.height }, l = { x: i.x, width: i.width }), s || (a ? uh : hh)(n, { shape: l }, e, r, null), (a ? uh : hh)(n, { shape: u }, e ? t.baseAxis.model : null, r) } function FS(t, e) { for (var n = 0; n < e.length; n++)if (!isFinite(t[e[n]])) return !0; return !1 } var GS = [\"x\", \"y\", \"width\", \"height\"], WS = [\"cx\", \"cy\", \"r\", \"startAngle\", \"endAngle\"], HS = { cartesian2d: function (t) { return !FS(t, GS) }, polar: function (t) { return !FS(t, WS) } }, YS = { cartesian2d: function (t, e, n) { var i = t.getItemLayout(e), r = n ? function (t, e) { var n = t.get([\"itemStyle\", \"borderColor\"]); if (!n || \"none\" === n) return 0; var i = t.get([\"itemStyle\", \"borderWidth\"]) || 0, r = isNaN(e.width) ? Number.MAX_VALUE : Math.abs(e.width), o = isNaN(e.height) ? Number.MAX_VALUE : Math.abs(e.height); return Math.min(i, r, o) }(n, i) : 0, o = i.width > 0 ? 1 : -1, a = i.height > 0 ? 1 : -1; return { x: i.x + o * r / 2, y: i.y + a * r / 2, width: i.width - o * r, height: i.height - a * r } }, polar: function (t, e, n) { var i = t.getItemLayout(e); return { cx: i.cx, cy: i.cy, r0: i.r0, r: i.r, startAngle: i.startAngle, endAngle: i.endAngle, clockwise: i.clockwise } } }; function US(t) { return function (t) { var e = t ? \"Arc\" : \"Angle\"; return function (t) { switch (t) { case \"start\": case \"insideStart\": case \"end\": case \"insideEnd\": return t + e; default: return t } } }(t) } function XS(t, e, n, i, r, o, a, s) { var l = e.getItemVisual(n, \"style\"); s || t.setShape(\"r\", i.get([\"itemStyle\", \"borderRadius\"]) || 0), t.useStyle(l); var u = i.getShallow(\"cursor\"); u && t.attr(\"cursor\", u); var h = s ? a ? r.r >= r.r0 ? \"endArc\" : \"startArc\" : r.endAngle >= r.startAngle ? \"endAngle\" : \"startAngle\" : a ? r.height >= 0 ? \"bottom\" : \"top\" : r.width >= 0 ? \"right\" : \"left\", c = Kh(i); qh(t, c, { labelFetcher: o, labelDataIndex: n, defaultText: Uw(o.getData(), n), inheritColor: l.fill, defaultOpacity: l.opacity, defaultOutsidePosition: h }); var p = t.getTextContent(); if (s && p) { var d = i.get([\"label\", \"position\"]); t.textConfig.inside = \"middle\" === d || null, function (t, e, n, i) { if (j(i)) t.setTextConfig({ rotation: i }); else if (Y(e)) t.setTextConfig({ rotation: 0 }); else { var r, o = t.shape, a = o.clockwise ? o.startAngle : o.endAngle, s = o.clockwise ? o.endAngle : o.startAngle, l = (a + s) / 2, u = n(e); switch (u) { case \"startArc\": case \"insideStartArc\": case \"middle\": case \"insideEndArc\": case \"endArc\": r = l; break; case \"startAngle\": case \"insideStartAngle\": r = a; break; case \"endAngle\": case \"insideEndAngle\": r = s; break; default: return void t.setTextConfig({ rotation: 0 }) }var h = 1.5 * Math.PI - r; \"middle\" === u && h > Math.PI / 2 && h < 1.5 * Math.PI && (h -= Math.PI), t.setTextConfig({ rotation: h }) } }(t, \"outside\" === d ? h : d, US(a), i.get([\"label\", \"rotate\"])) } oc(p, c, o.getRawValue(n), (function (t) { return Xw(e, t) })); var f = i.getModel([\"emphasis\"]); Bl(t, f.get(\"focus\"), f.get(\"blurScope\"), f.get(\"disabled\")), Hl(t, i), function (t) { return null != t.startAngle && null != t.endAngle && t.startAngle === t.endAngle }(r) && (t.style.fill = \"none\", t.style.stroke = \"none\", E(t.states, (function (t) { t.style && (t.style.fill = t.style.stroke = \"none\") }))) } var ZS = function () { }, jS = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"largeBar\", n } return n(e, t), e.prototype.getDefaultShape = function () { return new ZS }, e.prototype.buildPath = function (t, e) { for (var n = e.points, i = this.baseDimIdx, r = 1 - this.baseDimIdx, o = [], a = [], s = this.barWidth, l = 0; l < n.length; l += 3)a[i] = s, a[r] = n[l + 2], o[i] = n[l + i], o[r] = n[l + r], t.rect(o[0], o[1], a[0], a[1]) }, e }(_s); function qS(t, e, n, i) { var r = t.getData(), o = r.getLayout(\"valueAxisHorizontal\") ? 1 : 0, a = r.getLayout(\"largeDataIndices\"), s = r.getLayout(\"size\"), l = t.getModel(\"backgroundStyle\"), u = r.getLayout(\"largeBackgroundPoints\"); if (u) { var h = new jS({ shape: { points: u }, incremental: !!i, silent: !0, z2: 0 }); h.baseDimIdx = o, h.largeDataIndices = a, h.barWidth = s, h.useStyle(l.getItemStyle()), e.add(h), n && n.push(h) } var c = new jS({ shape: { points: r.getLayout(\"largePoints\") }, incremental: !!i, ignoreCoarsePointer: !0, z2: 1 }); c.baseDimIdx = o, c.largeDataIndices = a, c.barWidth = s, e.add(c), c.useStyle(r.getVisual(\"style\")), js(c).seriesIndex = t.seriesIndex, t.get(\"silent\") || (c.on(\"mousedown\", KS), c.on(\"mousemove\", KS)), n && n.push(c) } var KS = Lg((function (t) { var e = function (t, e, n) { for (var i = t.baseDimIdx, r = 1 - i, o = t.shape.points, a = t.largeDataIndices, s = [], l = [], u = t.barWidth, h = 0, c = o.length / 3; h < c; h++) { var p = 3 * h; if (l[i] = u, l[r] = o[p + 2], s[i] = o[p + i], s[r] = o[p + r], l[r] < 0 && (s[r] += l[r], l[r] = -l[r]), e >= s[0] && e <= s[0] + l[0] && n >= s[1] && n <= s[1] + l[1]) return a[h] } return -1 }(this, t.offsetX, t.offsetY); js(this).dataIndex = e >= 0 ? e : null }), 30, !1); function $S(t, e, n) { if (pS(n, \"cartesian2d\")) { var i = e, r = n.getArea(); return { x: t ? i.x : r.x, y: t ? r.y : i.y, width: t ? i.width : r.width, height: t ? r.height : i.height } } var o = e; return { cx: (r = n.getArea()).cx, cy: r.cy, r0: t ? r.r0 : o.r0, r: t ? r.r : o.r, startAngle: t ? o.startAngle : 0, endAngle: t ? o.endAngle : 2 * Math.PI } } var JS = 2 * Math.PI, QS = Math.PI / 180; function tM(t, e) { return wp(t.getBoxLayoutParams(), { width: e.getWidth(), height: e.getHeight() }) } function eM(t, e) { var n = tM(t, e), i = t.get(\"center\"), r = t.get(\"radius\"); Y(r) || (r = [0, r]), Y(i) || (i = [i, i]); var o, a, s = Gr(n.width, e.getWidth()), l = Gr(n.height, e.getHeight()), u = Math.min(s, l), h = Gr(r[0], u / 2), c = Gr(r[1], u / 2), p = t.coordinateSystem; if (p) { var d = p.dataToPoint(i); o = d[0] || 0, a = d[1] || 0 } else o = Gr(i[0], s) + n.x, a = Gr(i[1], l) + n.y; return { cx: o, cy: a, r0: h, r: c } } function nM(t, e, n) { e.eachSeriesByType(t, (function (t) { var e = t.getData(), i = e.mapDimension(\"value\"), r = tM(t, n), o = eM(t, n), a = o.cx, s = o.cy, l = o.r, u = o.r0, h = -t.get(\"startAngle\") * QS, c = t.get(\"minAngle\") * QS, p = 0; e.each(i, (function (t) { !isNaN(t) && p++ })); var d = e.getSum(i), f = Math.PI / (d || p) * 2, g = t.get(\"clockwise\"), y = t.get(\"roseType\"), v = t.get(\"stillShowZeroSum\"), m = e.getDataExtent(i); m[0] = 0; var x = JS, _ = 0, b = h, w = g ? 1 : -1; if (e.setLayout({ viewRect: r, r: l }), e.each(i, (function (t, n) { var i; if (isNaN(t)) e.setItemLayout(n, { angle: NaN, startAngle: NaN, endAngle: NaN, clockwise: g, cx: a, cy: s, r0: u, r: y ? NaN : l }); else { (i = \"area\" !== y ? 0 === d && v ? f : t * f : JS / p) < c ? (i = c, x -= c) : _ += t; var r = b + w * i; e.setItemLayout(n, { angle: i, startAngle: b, endAngle: r, clockwise: g, cx: a, cy: s, r0: u, r: y ? Fr(t, m, [u, l]) : l }), b = r } })), x < JS && p) if (x <= .001) { var S = JS / p; e.each(i, (function (t, n) { if (!isNaN(t)) { var i = e.getItemLayout(n); i.angle = S, i.startAngle = h + w * n * S, i.endAngle = h + w * (n + 1) * S } })) } else f = x / _, b = h, e.each(i, (function (t, n) { if (!isNaN(t)) { var i = e.getItemLayout(n), r = i.angle === c ? c : t * f; i.startAngle = b, i.endAngle = b + w * r, b += w * r } })) })) } function iM(t) { return { seriesType: t, reset: function (t, e) { var n = e.findComponents({ mainType: \"legend\" }); if (n && n.length) { var i = t.getData(); i.filterSelf((function (t) { for (var e = i.getName(t), r = 0; r < n.length; r++)if (!n[r].isSelected(e)) return !1; return !0 })) } } } } var rM = Math.PI / 180; function oM(t, e, n, i, r, o, a, s, l, u) { if (!(t.length < 2)) { for (var h = t.length, c = 0; c < h; c++)if (\"outer\" === t[c].position && \"labelLine\" === t[c].labelAlignTo) { var p = t[c].label.x - u; t[c].linePoints[1][0] += p, t[c].label.x = u } _b(t, l, l + a) && function (t) { for (var o = { list: [], maxY: 0 }, a = { list: [], maxY: 0 }, s = 0; s < t.length; s++)if (\"none\" === t[s].labelAlignTo) { var l = t[s], u = l.label.y > n ? a : o, h = Math.abs(l.label.y - n); if (h >= u.maxY) { var c = l.label.x - e - l.len2 * r, p = i + l.len, f = Math.abs(c) < p ? Math.sqrt(h * h / (1 - c * c / p / p)) : p; u.rB = f, u.maxY = h } u.list.push(l) } d(o), d(a) }(t) } function d(t) { for (var o = t.rB, a = o * o, s = 0; s < t.list.length; s++) { var l = t.list[s], u = Math.abs(l.label.y - n), h = i + l.len, c = h * h, p = Math.sqrt((1 - Math.abs(u * u / a)) * c), d = e + (p + l.len2) * r, f = d - l.label.x; aM(l, l.targetTextWidth - f * r, !0), l.label.x = d } } } function aM(t, e, n) { if (void 0 === n && (n = !1), null == t.labelStyleWidth) { var i = t.label, r = i.style, o = t.rect, a = r.backgroundColor, s = r.padding, l = s ? s[1] + s[3] : 0, u = r.overflow, h = o.width + (a ? 0 : l); if (e < h || n) { var c = o.height; if (u && u.match(\"break\")) { i.setStyle(\"backgroundColor\", null), i.setStyle(\"width\", e - l); var p = i.getBoundingRect(); i.setStyle(\"width\", Math.ceil(p.width)), i.setStyle(\"backgroundColor\", a) } else { var d = e - l, f = e < h ? d : n ? d > t.unconstrainedWidth ? null : d : null; i.setStyle(\"width\", f) } var g = i.getBoundingRect(); o.width = g.width; var y = (i.style.margin || 0) + 2.1; o.height = g.height + y, o.y -= (o.height - c) / 2 } } } function sM(t) { return \"center\" === t.position } function lM(t) { var e, n, i = t.getData(), r = [], o = !1, a = (t.get(\"minShowLabelAngle\") || 0) * rM, s = i.getLayout(\"viewRect\"), l = i.getLayout(\"r\"), u = s.width, h = s.x, c = s.y, p = s.height; function d(t) { t.ignore = !0 } i.each((function (t) { var s = i.getItemGraphicEl(t), c = s.shape, p = s.getTextContent(), f = s.getTextGuideLine(), g = i.getItemModel(t), y = g.getModel(\"label\"), v = y.get(\"position\") || g.get([\"emphasis\", \"label\", \"position\"]), m = y.get(\"distanceToLabelLine\"), x = y.get(\"alignTo\"), _ = Gr(y.get(\"edgeDistance\"), u), b = y.get(\"bleedMargin\"), w = g.getModel(\"labelLine\"), S = w.get(\"length\"); S = Gr(S, u); var M = w.get(\"length2\"); if (M = Gr(M, u), Math.abs(c.endAngle - c.startAngle) < a) return E(p.states, d), E(f.states, d), void (p.ignore = f.ignore = !0); if (function (t) { if (!t.ignore) return !0; for (var e in t.states) if (!1 === t.states[e].ignore) return !0; return !1 }(p)) { var I, T, C, D, A = (c.startAngle + c.endAngle) / 2, k = Math.cos(A), L = Math.sin(A); e = c.cx, n = c.cy; var P = \"inside\" === v || \"inner\" === v; if (\"center\" === v) I = c.cx, T = c.cy, D = \"center\"; else { var O = (P ? (c.r + c.r0) / 2 * k : c.r * k) + e, R = (P ? (c.r + c.r0) / 2 * L : c.r * L) + n; if (I = O + 3 * k, T = R + 3 * L, !P) { var N = O + k * (S + l - c.r), z = R + L * (S + l - c.r), V = N + (k < 0 ? -1 : 1) * M; I = \"edge\" === x ? k < 0 ? h + _ : h + u - _ : V + (k < 0 ? -m : m), T = z, C = [[O, R], [N, z], [V, z]] } D = P ? \"center\" : \"edge\" === x ? k > 0 ? \"right\" : \"left\" : k > 0 ? \"left\" : \"right\" } var B = Math.PI, F = 0, G = y.get(\"rotate\"); if (j(G)) F = G * (B / 180); else if (\"center\" === v) F = 0; else if (\"radial\" === G || !0 === G) { F = k < 0 ? -A + B : -A } else if (\"tangential\" === G && \"outside\" !== v && \"outer\" !== v) { var W = Math.atan2(k, L); W < 0 && (W = 2 * B + W), L > 0 && (W = B + W), F = W - B } if (o = !!F, p.x = I, p.y = T, p.rotation = F, p.setStyle({ verticalAlign: \"middle\" }), P) { p.setStyle({ align: D }); var H = p.states.select; H && (H.x += p.x, H.y += p.y) } else { var Y = p.getBoundingRect().clone(); Y.applyTransform(p.getComputedTransform()); var U = (p.style.margin || 0) + 2.1; Y.y -= U / 2, Y.height += U, r.push({ label: p, labelLine: f, position: v, len: S, len2: M, minTurnAngle: w.get(\"minTurnAngle\"), maxSurfaceAngle: w.get(\"maxSurfaceAngle\"), surfaceNormal: new Ie(k, L), linePoints: C, textAlign: D, labelDistance: m, labelAlignTo: x, edgeDistance: _, bleedMargin: b, rect: Y, unconstrainedWidth: Y.width, labelStyleWidth: p.style.width }) } s.setTextConfig({ inside: P }) } })), !o && t.get(\"avoidLabelOverlap\") && function (t, e, n, i, r, o, a, s) { for (var l = [], u = [], h = Number.MAX_VALUE, c = -Number.MAX_VALUE, p = 0; p < t.length; p++) { var d = t[p].label; sM(t[p]) || (d.x < e ? (h = Math.min(h, d.x), l.push(t[p])) : (c = Math.max(c, d.x), u.push(t[p]))) } for (p = 0; p < t.length; p++)if (!sM(y = t[p]) && y.linePoints) { if (null != y.labelStyleWidth) continue; d = y.label; var f = y.linePoints, g = void 0; g = \"edge\" === y.labelAlignTo ? d.x < e ? f[2][0] - y.labelDistance - a - y.edgeDistance : a + r - y.edgeDistance - f[2][0] - y.labelDistance : \"labelLine\" === y.labelAlignTo ? d.x < e ? h - a - y.bleedMargin : a + r - c - y.bleedMargin : d.x < e ? d.x - a - y.bleedMargin : a + r - d.x - y.bleedMargin, y.targetTextWidth = g, aM(y, g) } for (oM(u, e, n, i, 1, 0, o, 0, s, c), oM(l, e, n, i, -1, 0, o, 0, s, h), p = 0; p < t.length; p++) { var y; if (!sM(y = t[p]) && y.linePoints) { d = y.label, f = y.linePoints; var v = \"edge\" === y.labelAlignTo, m = d.style.padding, x = m ? m[1] + m[3] : 0, _ = d.style.backgroundColor ? 0 : x, b = y.rect.width + _, w = f[1][0] - f[2][0]; v ? d.x < e ? f[2][0] = a + y.edgeDistance + b + y.labelDistance : f[2][0] = a + r - y.edgeDistance - b - y.labelDistance : (d.x < e ? f[2][0] = d.x + y.labelDistance : f[2][0] = d.x - y.labelDistance, f[1][0] = f[2][0] + w), f[1][1] = f[2][1] = d.y } } }(r, e, n, l, u, p, h, c); for (var f = 0; f < r.length; f++) { var g = r[f], y = g.label, v = g.labelLine, m = isNaN(y.x) || isNaN(y.y); if (y) { y.setStyle({ align: g.textAlign }), m && (E(y.states, d), y.ignore = !0); var x = y.states.select; x && (x.x += y.x, x.y += y.y) } if (v) { var _ = g.linePoints; m || !_ ? (E(v.states, d), v.ignore = !0) : (pb(_, g.minTurnAngle), db(_, g.surfaceNormal, g.maxSurfaceAngle), v.setShape({ points: _ }), y.__hostTarget.textGuideLineConfig = { anchor: new Ie(_[0][0], _[0][1]) }) } } } function uM(t, e, n) { var i = t.get(\"borderRadius\"); if (null == i) return n ? { cornerRadius: 0 } : null; Y(i) || (i = [i, i, i, i]); var r = Math.abs(e.r || 0 - e.r0 || 0); return { cornerRadius: z(i, (function (t) { return _r(t, r) })) } } var hM = function (t) { function e(e, n, i) { var r = t.call(this) || this; r.z2 = 2; var o = new Ns; return r.setTextContent(o), r.updateData(e, n, i, !0), r } return n(e, t), e.prototype.updateData = function (t, e, n, i) { var r = this, o = t.hostModel, a = t.getItemModel(e), s = a.getModel(\"emphasis\"), l = t.getItemLayout(e), u = A(uM(a.getModel(\"itemStyle\"), l, !0), l); if (isNaN(u.startAngle)) r.setShape(u); else { if (i) { r.setShape(u); var h = o.getShallow(\"animationType\"); o.ecModel.ssr ? (hh(r, { scaleX: 0, scaleY: 0 }, o, { dataIndex: e, isFrom: !0 }), r.originX = u.cx, r.originY = u.cy) : \"scale\" === h ? (r.shape.r = l.r0, hh(r, { shape: { r: l.r } }, o, e)) : null != n ? (r.setShape({ startAngle: n, endAngle: n }), hh(r, { shape: { startAngle: l.startAngle, endAngle: l.endAngle } }, o, e)) : (r.shape.endAngle = l.startAngle, uh(r, { shape: { endAngle: l.endAngle } }, o, e)) } else gh(r), uh(r, { shape: u }, o, e); r.useStyle(t.getItemVisual(e, \"style\")), Hl(r, a); var c = (l.startAngle + l.endAngle) / 2, p = o.get(\"selectedOffset\"), d = Math.cos(c) * p, f = Math.sin(c) * p, g = a.getShallow(\"cursor\"); g && r.attr(\"cursor\", g), this._updateLabel(o, t, e), r.ensureState(\"emphasis\").shape = A({ r: l.r + (s.get(\"scale\") && s.get(\"scaleSize\") || 0) }, uM(s.getModel(\"itemStyle\"), l)), A(r.ensureState(\"select\"), { x: d, y: f, shape: uM(a.getModel([\"select\", \"itemStyle\"]), l) }), A(r.ensureState(\"blur\"), { shape: uM(a.getModel([\"blur\", \"itemStyle\"]), l) }); var y = r.getTextGuideLine(), v = r.getTextContent(); y && A(y.ensureState(\"select\"), { x: d, y: f }), A(v.ensureState(\"select\"), { x: d, y: f }), Bl(this, s.get(\"focus\"), s.get(\"blurScope\"), s.get(\"disabled\")) } }, e.prototype._updateLabel = function (t, e, n) { var i = this, r = e.getItemModel(n), o = r.getModel(\"labelLine\"), a = e.getItemVisual(n, \"style\"), s = a && a.fill, l = a && a.opacity; qh(i, Kh(r), { labelFetcher: e.hostModel, labelDataIndex: n, inheritColor: s, defaultOpacity: l, defaultText: t.getFormattedLabel(n, \"normal\") || e.getName(n) }); var u = i.getTextContent(); i.setTextConfig({ position: null, rotation: null }), u.attr({ z2: 10 }); var h = t.get([\"label\", \"position\"]); if (\"outside\" !== h && \"outer\" !== h) i.removeTextGuideLine(); else { var c = this.getTextGuideLine(); c || (c = new Bu, this.setTextGuideLine(c)), yb(this, vb(r), { stroke: s, opacity: ot(o.get([\"lineStyle\", \"opacity\"]), l, 1) }) } }, e }(Pu), cM = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.ignoreLabelLineUpdate = !0, e } return n(e, t), e.prototype.render = function (t, e, n, i) { var r, o = t.getData(), a = this._data, s = this.group; if (!a && o.count() > 0) { for (var l = o.getItemLayout(0), u = 1; isNaN(l && l.startAngle) && u < o.count(); ++u)l = o.getItemLayout(u); l && (r = l.startAngle) } if (this._emptyCircleSector && s.remove(this._emptyCircleSector), 0 === o.count() && t.get(\"showEmptyCircle\")) { var h = new Pu({ shape: eM(t, n) }); h.useStyle(t.getModel(\"emptyCircleStyle\").getItemStyle()), this._emptyCircleSector = h, s.add(h) } o.diff(a).add((function (t) { var e = new hM(o, t, r); o.setItemGraphicEl(t, e), s.add(e) })).update((function (t, e) { var n = a.getItemGraphicEl(e); n.updateData(o, t, r), n.off(\"click\"), s.add(n), o.setItemGraphicEl(t, n) })).remove((function (e) { fh(a.getItemGraphicEl(e), t, e) })).execute(), lM(t), \"expansion\" !== t.get(\"animationTypeUpdate\") && (this._data = o) }, e.prototype.dispose = function () { }, e.prototype.containPoint = function (t, e) { var n = e.getData().getItemLayout(0); if (n) { var i = t[0] - n.cx, r = t[1] - n.cy, o = Math.sqrt(i * i + r * r); return o <= n.r && o >= n.r0 } }, e.type = \"pie\", e }(wg); function pM(t, e, n) { e = Y(e) && { coordDimensions: e } || A({ encodeDefine: t.getEncode() }, e); var i = t.getSource(), r = Qm(i, e).dimensions, o = new Jm(r, t); return o.initData(i, n), o } var dM = function () { function t(t, e) { this._getDataWithEncodedVisual = t, this._getRawData = e } return t.prototype.getAllNames = function () { var t = this._getRawData(); return t.mapArray(t.getName) }, t.prototype.containName = function (t) { return this._getRawData().indexOfName(t) >= 0 }, t.prototype.indexOfName = function (t) { return this._getDataWithEncodedVisual().indexOfName(t) }, t.prototype.getItemVisual = function (t, e) { return this._getDataWithEncodedVisual().getItemVisual(t, e) }, t }(), fM = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.init = function (e) { t.prototype.init.apply(this, arguments), this.legendVisualProvider = new dM(W(this.getData, this), W(this.getRawData, this)), this._defaultLabelLine(e) }, e.prototype.mergeOption = function () { t.prototype.mergeOption.apply(this, arguments) }, e.prototype.getInitialData = function () { var t = pM(this, { coordDimensions: [\"value\"], encodeDefaulter: H(Zp, this) }), e = []; return t.each(t.mapDimension(\"value\"), (function (t) { e.push(t) })), this.seats = Zr(e, t.hostModel.get(\"percentPrecision\")), t }, e.prototype.getDataParams = function (e) { var n = t.prototype.getDataParams.call(this, e); return n.percent = this.seats[e], n.$vars.push(\"percent\"), n }, e.prototype._defaultLabelLine = function (t) { vo(t, \"labelLine\", [\"show\"]); var e = t.labelLine, n = t.emphasis.labelLine; e.show = e.show && t.label.show, n.show = n.show && t.emphasis.label.show }, e.type = \"series.pie\", e.defaultOption = { z: 2, legendHoverLink: !0, colorBy: \"data\", center: [\"50%\", \"50%\"], radius: [0, \"75%\"], clockwise: !0, startAngle: 90, minAngle: 0, minShowLabelAngle: 0, selectedOffset: 10, percentPrecision: 2, stillShowZeroSum: !0, left: 0, top: 0, right: 0, bottom: 0, width: null, height: null, label: { rotate: 0, show: !0, overflow: \"truncate\", position: \"outer\", alignTo: \"none\", edgeDistance: \"25%\", bleedMargin: 10, distanceToLabelLine: 5 }, labelLine: { show: !0, length: 15, length2: 15, smooth: !1, minTurnAngle: 90, maxSurfaceAngle: 90, lineStyle: { width: 1, type: \"solid\" } }, itemStyle: { borderWidth: 1, borderJoin: \"round\" }, showEmptyCircle: !0, emptyCircleStyle: { color: \"lightgray\", opacity: 1 }, labelLayout: { hideOverlap: !0 }, emphasis: { scale: !0, scaleSize: 5 }, avoidLabelOverlap: !0, animationType: \"expansion\", animationDuration: 1e3, animationTypeUpdate: \"transition\", animationEasingUpdate: \"cubicInOut\", animationDurationUpdate: 500, animationEasing: \"cubicInOut\" }, e }(hg); var gM = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.hasSymbolVisual = !0, n } return n(e, t), e.prototype.getInitialData = function (t, e) { return sx(null, this, { useEncodeDefaulter: !0 }) }, e.prototype.getProgressive = function () { var t = this.option.progressive; return null == t ? this.option.large ? 5e3 : this.get(\"progressive\") : t }, e.prototype.getProgressiveThreshold = function () { var t = this.option.progressiveThreshold; return null == t ? this.option.large ? 1e4 : this.get(\"progressiveThreshold\") : t }, e.prototype.brushSelector = function (t, e, n) { return n.point(e.getItemLayout(t)) }, e.prototype.getZLevelKey = function () { return this.getData().count() > this.getProgressiveThreshold() ? this.id : \"\" }, e.type = \"series.scatter\", e.dependencies = [\"grid\", \"polar\", \"geo\", \"singleAxis\", \"calendar\"], e.defaultOption = { coordinateSystem: \"cartesian2d\", z: 2, legendHoverLink: !0, symbolSize: 10, large: !1, largeThreshold: 2e3, itemStyle: { opacity: .8 }, emphasis: { scale: !0 }, clip: !0, select: { itemStyle: { borderColor: \"#212121\" } }, universalTransition: { divideShape: \"clone\" } }, e }(hg), yM = function () { }, vM = function (t) { function e(e) { var n = t.call(this, e) || this; return n._off = 0, n.hoverDataIdx = -1, n } return n(e, t), e.prototype.getDefaultShape = function () { return new yM }, e.prototype.reset = function () { this.notClear = !1, this._off = 0 }, e.prototype.buildPath = function (t, e) { var n, i = e.points, r = e.size, o = this.symbolProxy, a = o.shape, s = t.getContext ? t.getContext() : t, l = s && r[0] < 4, u = this.softClipShape; if (l) this._ctx = s; else { for (this._ctx = null, n = this._off; n < i.length;) { var h = i[n++], c = i[n++]; isNaN(h) || isNaN(c) || (u && !u.contain(h, c) || (a.x = h - r[0] / 2, a.y = c - r[1] / 2, a.width = r[0], a.height = r[1], o.buildPath(t, a, !0))) } this.incremental && (this._off = n, this.notClear = !0) } }, e.prototype.afterBrush = function () { var t, e = this.shape, n = e.points, i = e.size, r = this._ctx, o = this.softClipShape; if (r) { for (t = this._off; t < n.length;) { var a = n[t++], s = n[t++]; isNaN(a) || isNaN(s) || (o && !o.contain(a, s) || r.fillRect(a - i[0] / 2, s - i[1] / 2, i[0], i[1])) } this.incremental && (this._off = t, this.notClear = !0) } }, e.prototype.findDataIndex = function (t, e) { for (var n = this.shape, i = n.points, r = n.size, o = Math.max(r[0], 4), a = Math.max(r[1], 4), s = i.length / 2 - 1; s >= 0; s--) { var l = 2 * s, u = i[l] - o / 2, h = i[l + 1] - a / 2; if (t >= u && e >= h && t <= u + o && e <= h + a) return s } return -1 }, e.prototype.contain = function (t, e) { var n = this.transformCoordToLocal(t, e), i = this.getBoundingRect(); return t = n[0], e = n[1], i.contain(t, e) ? (this.hoverDataIdx = this.findDataIndex(t, e)) >= 0 : (this.hoverDataIdx = -1, !1) }, e.prototype.getBoundingRect = function () { var t = this._rect; if (!t) { for (var e = this.shape, n = e.points, i = e.size, r = i[0], o = i[1], a = 1 / 0, s = 1 / 0, l = -1 / 0, u = -1 / 0, h = 0; h < n.length;) { var c = n[h++], p = n[h++]; a = Math.min(c, a), l = Math.max(c, l), s = Math.min(p, s), u = Math.max(p, u) } t = this._rect = new Re(a - r / 2, s - o / 2, l - a + r, u - s + o) } return t }, e }(_s), mM = function () { function t() { this.group = new Pr } return t.prototype.updateData = function (t, e) { this._clear(); var n = this._create(); n.setShape({ points: t.getLayout(\"points\") }), this._setCommon(n, t, e) }, t.prototype.updateLayout = function (t) { var e = t.getLayout(\"points\"); this.group.eachChild((function (t) { if (null != t.startIndex) { var n = 2 * (t.endIndex - t.startIndex), i = 4 * t.startIndex * 2; e = new Float32Array(e.buffer, i, n) } t.setShape(\"points\", e), t.reset() })) }, t.prototype.incrementalPrepareUpdate = function (t) { this._clear() }, t.prototype.incrementalUpdate = function (t, e, n) { var i = this._newAdded[0], r = e.getLayout(\"points\"), o = i && i.shape.points; if (o && o.length < 2e4) { var a = o.length, s = new Float32Array(a + r.length); s.set(o), s.set(r, a), i.endIndex = t.end, i.setShape({ points: s }) } else { this._newAdded = []; var l = this._create(); l.startIndex = t.start, l.endIndex = t.end, l.incremental = !0, l.setShape({ points: r }), this._setCommon(l, e, n) } }, t.prototype.eachRendered = function (t) { this._newAdded[0] && t(this._newAdded[0]) }, t.prototype._create = function () { var t = new vM({ cursor: \"default\" }); return t.ignoreCoarsePointer = !0, this.group.add(t), this._newAdded.push(t), t }, t.prototype._setCommon = function (t, e, n) { var i = e.hostModel; n = n || {}; var r = e.getVisual(\"symbolSize\"); t.setShape(\"size\", r instanceof Array ? r : [r, r]), t.softClipShape = n.clipShape || null, t.symbolProxy = Ry(e.getVisual(\"symbol\"), 0, 0, 0, 0), t.setColor = t.symbolProxy.setColor; var o = t.shape.size[0] < 4; t.useStyle(i.getModel(\"itemStyle\").getItemStyle(o ? [\"color\", \"shadowBlur\", \"shadowColor\"] : [\"color\"])); var a = e.getVisual(\"style\"), s = a && a.fill; s && t.setColor(s); var l = js(t); l.seriesIndex = i.seriesIndex, t.on(\"mousemove\", (function (e) { l.dataIndex = null; var n = t.hoverDataIdx; n >= 0 && (l.dataIndex = n + (t.startIndex || 0)) })) }, t.prototype.remove = function () { this._clear() }, t.prototype._clear = function () { this._newAdded = [], this.group.removeAll() }, t }(), xM = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = t.getData(); this._updateSymbolDraw(i, t).updateData(i, { clipShape: this._getClipShape(t) }), this._finished = !0 }, e.prototype.incrementalPrepareRender = function (t, e, n) { var i = t.getData(); this._updateSymbolDraw(i, t).incrementalPrepareUpdate(i), this._finished = !1 }, e.prototype.incrementalRender = function (t, e, n) { this._symbolDraw.incrementalUpdate(t, e.getData(), { clipShape: this._getClipShape(e) }), this._finished = t.end === e.getData().count() }, e.prototype.updateTransform = function (t, e, n) { var i = t.getData(); if (this.group.dirty(), !this._finished || i.count() > 1e4) return { update: !0 }; var r = MS(\"\").reset(t, e, n); r.progress && r.progress({ start: 0, end: i.count(), count: i.count() }, i), this._symbolDraw.updateLayout(i) }, e.prototype.eachRendered = function (t) { this._symbolDraw && this._symbolDraw.eachRendered(t) }, e.prototype._getClipShape = function (t) { var e = t.coordinateSystem, n = e && e.getArea && e.getArea(); return t.get(\"clip\", !0) ? n : null }, e.prototype._updateSymbolDraw = function (t, e) { var n = this._symbolDraw, i = e.pipelineContext.large; return n && i === this._isLargeDraw || (n && n.remove(), n = this._symbolDraw = i ? new mM : new Jw, this._isLargeDraw = i, this.group.removeAll()), this.group.add(n.group), n }, e.prototype.remove = function (t, e) { this._symbolDraw && this._symbolDraw.remove(!0), this._symbolDraw = null }, e.prototype.dispose = function () { }, e.type = \"scatter\", e }(wg), _M = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.type = \"grid\", e.dependencies = [\"xAxis\", \"yAxis\"], e.layoutMode = \"box\", e.defaultOption = { show: !1, z: 0, left: \"10%\", top: 60, right: \"10%\", bottom: 70, containLabel: !1, backgroundColor: \"rgba(0,0,0,0)\", borderWidth: 1, borderColor: \"#ccc\" }, e }(Ap), bM = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.getCoordSysModel = function () { return this.getReferringComponents(\"grid\", Po).models[0] }, e.type = \"cartesian2dAxis\", e }(Ap); R(bM, g_); var wM = { show: !0, z: 0, inverse: !1, name: \"\", nameLocation: \"end\", nameRotate: null, nameTruncate: { maxWidth: null, ellipsis: \"...\", placeholder: \".\" }, nameTextStyle: {}, nameGap: 15, silent: !1, triggerEvent: !1, tooltip: { show: !1 }, axisPointer: {}, axisLine: { show: !0, onZero: !0, onZeroAxisIndex: null, lineStyle: { color: \"#6E7079\", width: 1, type: \"solid\" }, symbol: [\"none\", \"none\"], symbolSize: [10, 15] }, axisTick: { show: !0, inside: !1, length: 5, lineStyle: { width: 1 } }, axisLabel: { show: !0, inside: !1, rotate: 0, showMinLabel: null, showMaxLabel: null, margin: 8, fontSize: 12 }, splitLine: { show: !0, lineStyle: { color: [\"#E0E6F1\"], width: 1, type: \"solid\" } }, splitArea: { show: !1, areaStyle: { color: [\"rgba(250,250,250,0.2)\", \"rgba(210,219,238,0.2)\"] } } }, SM = C({ boundaryGap: !0, deduplication: null, splitLine: { show: !1 }, axisTick: { alignWithLabel: !1, interval: \"auto\" }, axisLabel: { interval: \"auto\" } }, wM), MM = C({ boundaryGap: [0, 0], axisLine: { show: \"auto\" }, axisTick: { show: \"auto\" }, splitNumber: 5, minorTick: { show: !1, splitNumber: 5, length: 3, lineStyle: {} }, minorSplitLine: { show: !1, lineStyle: { color: \"#F4F7FD\", width: 1 } } }, wM), IM = { category: SM, value: MM, time: C({ splitNumber: 6, axisLabel: { showMinLabel: !1, showMaxLabel: !1, rich: { primary: { fontWeight: \"bold\" } } }, splitLine: { show: !1 } }, MM), log: k({ logBase: 10 }, MM) }, TM = { value: 1, category: 1, time: 1, log: 1 }; function CM(t, e, i, r) { E(TM, (function (o, a) { var s = C(C({}, IM[a], !0), r, !0), l = function (t) { function i() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e + \"Axis.\" + a, n } return n(i, t), i.prototype.mergeDefaultAndTheme = function (t, e) { var n = Mp(this), i = n ? Tp(t) : {}; C(t, e.getTheme().get(a + \"Axis\")), C(t, this.getDefaultOption()), t.type = DM(t), n && Ip(t, i, n) }, i.prototype.optionUpdated = function () { \"category\" === this.option.type && (this.__ordinalMeta = hx.createByAxisModel(this)) }, i.prototype.getCategories = function (t) { var e = this.option; if (\"category\" === e.type) return t ? e.data : this.__ordinalMeta.categories }, i.prototype.getOrdinalMeta = function () { return this.__ordinalMeta }, i.type = e + \"Axis.\" + a, i.defaultOption = s, i }(i); t.registerComponentModel(l) })), t.registerSubTypeDefaulter(e + \"Axis\", DM) } function DM(t) { return t.type || (t.data ? \"category\" : \"value\") } var AM = function () { function t(t) { this.type = \"cartesian\", this._dimList = [], this._axes = {}, this.name = t || \"\" } return t.prototype.getAxis = function (t) { return this._axes[t] }, t.prototype.getAxes = function () { return z(this._dimList, (function (t) { return this._axes[t] }), this) }, t.prototype.getAxesByScale = function (t) { return t = t.toLowerCase(), B(this.getAxes(), (function (e) { return e.scale.type === t })) }, t.prototype.addAxis = function (t) { var e = t.dim; this._axes[e] = t, this._dimList.push(e) }, t }(), kM = [\"x\", \"y\"]; function LM(t) { return \"interval\" === t.type || \"time\" === t.type } var PM = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"cartesian2d\", e.dimensions = kM, e } return n(e, t), e.prototype.calcAffineTransform = function () { this._transform = this._invTransform = null; var t = this.getAxis(\"x\").scale, e = this.getAxis(\"y\").scale; if (LM(t) && LM(e)) { var n = t.getExtent(), i = e.getExtent(), r = this.dataToPoint([n[0], i[0]]), o = this.dataToPoint([n[1], i[1]]), a = n[1] - n[0], s = i[1] - i[0]; if (a && s) { var l = (o[0] - r[0]) / a, u = (o[1] - r[1]) / s, h = r[0] - n[0] * l, c = r[1] - i[0] * u, p = this._transform = [l, 0, 0, u, h, c]; this._invTransform = we([], p) } } }, e.prototype.getBaseAxis = function () { return this.getAxesByScale(\"ordinal\")[0] || this.getAxesByScale(\"time\")[0] || this.getAxis(\"x\") }, e.prototype.containPoint = function (t) { var e = this.getAxis(\"x\"), n = this.getAxis(\"y\"); return e.contain(e.toLocalCoord(t[0])) && n.contain(n.toLocalCoord(t[1])) }, e.prototype.containData = function (t) { return this.getAxis(\"x\").containData(t[0]) && this.getAxis(\"y\").containData(t[1]) }, e.prototype.containZone = function (t, e) { var n = this.dataToPoint(t), i = this.dataToPoint(e), r = this.getArea(), o = new Re(n[0], n[1], i[0] - n[0], i[1] - n[1]); return r.intersect(o) }, e.prototype.dataToPoint = function (t, e, n) { n = n || []; var i = t[0], r = t[1]; if (this._transform && null != i && isFinite(i) && null != r && isFinite(r)) return Ft(n, t, this._transform); var o = this.getAxis(\"x\"), a = this.getAxis(\"y\"); return n[0] = o.toGlobalCoord(o.dataToCoord(i, e)), n[1] = a.toGlobalCoord(a.dataToCoord(r, e)), n }, e.prototype.clampData = function (t, e) { var n = this.getAxis(\"x\").scale, i = this.getAxis(\"y\").scale, r = n.getExtent(), o = i.getExtent(), a = n.parse(t[0]), s = i.parse(t[1]); return (e = e || [])[0] = Math.min(Math.max(Math.min(r[0], r[1]), a), Math.max(r[0], r[1])), e[1] = Math.min(Math.max(Math.min(o[0], o[1]), s), Math.max(o[0], o[1])), e }, e.prototype.pointToData = function (t, e) { var n = []; if (this._invTransform) return Ft(n, t, this._invTransform); var i = this.getAxis(\"x\"), r = this.getAxis(\"y\"); return n[0] = i.coordToData(i.toLocalCoord(t[0]), e), n[1] = r.coordToData(r.toLocalCoord(t[1]), e), n }, e.prototype.getOtherAxis = function (t) { return this.getAxis(\"x\" === t.dim ? \"y\" : \"x\") }, e.prototype.getArea = function () { var t = this.getAxis(\"x\").getGlobalExtent(), e = this.getAxis(\"y\").getGlobalExtent(), n = Math.min(t[0], t[1]), i = Math.min(e[0], e[1]), r = Math.max(t[0], t[1]) - n, o = Math.max(e[0], e[1]) - i; return new Re(n, i, r, o) }, e }(AM), OM = function (t) { function e(e, n, i, r, o) { var a = t.call(this, e, n, i) || this; return a.index = 0, a.type = r || \"value\", a.position = o || \"bottom\", a } return n(e, t), e.prototype.isHorizontal = function () { var t = this.position; return \"top\" === t || \"bottom\" === t }, e.prototype.getGlobalExtent = function (t) { var e = this.getExtent(); return e[0] = this.toGlobalCoord(e[0]), e[1] = this.toGlobalCoord(e[1]), t && e[0] > e[1] && e.reverse(), e }, e.prototype.pointToData = function (t, e) { return this.coordToData(this.toLocalCoord(t[\"x\" === this.dim ? 0 : 1]), e) }, e.prototype.setCategorySortInfo = function (t) { if (\"category\" !== this.type) return !1; this.model.option.categorySortInfo = t, this.scale.setSortInfo(t) }, e }(X_); function RM(t, e, n) { n = n || {}; var i = t.coordinateSystem, r = e.axis, o = {}, a = r.getAxesOnZeroOf()[0], s = r.position, l = a ? \"onZero\" : s, u = r.dim, h = i.getRect(), c = [h.x, h.x + h.width, h.y, h.y + h.height], p = { left: 0, right: 1, top: 0, bottom: 1, onZero: 2 }, d = e.get(\"offset\") || 0, f = \"x\" === u ? [c[2] - d, c[3] + d] : [c[0] - d, c[1] + d]; if (a) { var g = a.toGlobalCoord(a.dataToCoord(0)); f[p.onZero] = Math.max(Math.min(g, f[1]), f[0]) } o.position = [\"y\" === u ? f[p[l]] : c[0], \"x\" === u ? f[p[l]] : c[3]], o.rotation = Math.PI / 2 * (\"x\" === u ? 0 : 1); o.labelDirection = o.tickDirection = o.nameDirection = { top: -1, bottom: 1, left: -1, right: 1 }[s], o.labelOffset = a ? f[p[s]] - f[p.onZero] : 0, e.get([\"axisTick\", \"inside\"]) && (o.tickDirection = -o.tickDirection), it(n.labelInside, e.get([\"axisLabel\", \"inside\"])) && (o.labelDirection = -o.labelDirection); var y = e.get([\"axisLabel\", \"rotate\"]); return o.labelRotate = \"top\" === l ? -y : y, o.z2 = 1, o } function NM(t) { return \"cartesian2d\" === t.get(\"coordinateSystem\") } function EM(t) { var e = { xAxisModel: null, yAxisModel: null }; return E(e, (function (n, i) { var r = i.replace(/Model$/, \"\"), o = t.getReferringComponents(r, Po).models[0]; e[i] = o })), e } var zM = Math.log; function VM(t, e, n) { var i = Sx.prototype, r = i.getTicks.call(n), o = i.getTicks.call(n, !0), a = r.length - 1, s = i.getInterval.call(n), l = a_(t, e), u = l.extent, h = l.fixMin, c = l.fixMax; if (\"log\" === t.type) { var p = zM(t.base); u = [zM(u[0]) / p, zM(u[1]) / p] } t.setExtent(u[0], u[1]), t.calcNiceExtent({ splitNumber: a, fixMin: h, fixMax: c }); var d = i.getExtent.call(t); h && (u[0] = d[0]), c && (u[1] = d[1]); var f = i.getInterval.call(t), g = u[0], y = u[1]; if (h && c) f = (y - g) / a; else if (h) for (y = u[0] + f * a; y < u[1] && isFinite(y) && isFinite(u[1]);)f = fx(f), y = u[0] + f * a; else if (c) for (g = u[1] - f * a; g > u[0] && isFinite(g) && isFinite(u[0]);)f = fx(f), g = u[1] - f * a; else { t.getTicks().length - 1 > a && (f = fx(f)); var v = f * a; (g = Wr((y = Math.ceil(u[1] / f) * f) - v)) < 0 && u[0] >= 0 ? (g = 0, y = Wr(v)) : y > 0 && u[1] <= 0 && (y = 0, g = -Wr(v)) } var m = (r[0].value - o[0].value) / s, x = (r[a].value - o[a].value) / s; i.setExtent.call(t, g + f * m, y + f * x), i.setInterval.call(t, f), (m || x) && i.setNiceExtent.call(t, g + f, y - f) } var BM = function () { function t(t, e, n) { this.type = \"grid\", this._coordsMap = {}, this._coordsList = [], this._axesMap = {}, this._axesList = [], this.axisPointerEnabled = !0, this.dimensions = kM, this._initCartesian(t, e, n), this.model = t } return t.prototype.getRect = function () { return this._rect }, t.prototype.update = function (t, e) { var n = this._axesMap; function i(t) { var e, n = G(t), i = n.length; if (i) { for (var r = [], o = i - 1; o >= 0; o--) { var a = t[+n[o]], s = a.model, l = a.scale; px(l) && s.get(\"alignTicks\") && null == s.get(\"interval\") ? r.push(a) : (s_(l, s), px(l) && (e = a)) } r.length && (e || s_((e = r.pop()).scale, e.model), E(r, (function (t) { VM(t.scale, t.model, e.scale) }))) } } this._updateScale(t, this.model), i(n.x), i(n.y); var r = {}; E(n.x, (function (t) { GM(n, \"y\", t, r) })), E(n.y, (function (t) { GM(n, \"x\", t, r) })), this.resize(this.model, e) }, t.prototype.resize = function (t, e, n) { var i = t.getBoxLayoutParams(), r = !n && t.get(\"containLabel\"), o = wp(i, { width: e.getWidth(), height: e.getHeight() }); this._rect = o; var a = this._axesList; function s() { E(a, (function (t) { var e = t.isHorizontal(), n = e ? [0, o.width] : [0, o.height], i = t.inverse ? 1 : 0; t.setExtent(n[i], n[1 - i]), function (t, e) { var n = t.getExtent(), i = n[0] + n[1]; t.toGlobalCoord = \"x\" === t.dim ? function (t) { return t + e } : function (t) { return i - t + e }, t.toLocalCoord = \"x\" === t.dim ? function (t) { return t - e } : function (t) { return i - t + e } }(t, e ? o.x : o.y) })) } s(), r && (E(a, (function (t) { if (!t.model.get([\"axisLabel\", \"inside\"])) { var e = function (t) { var e = t.model, n = t.scale; if (e.get([\"axisLabel\", \"show\"]) && !n.isBlank()) { var i, r, o = n.getExtent(); r = n instanceof _x ? n.count() : (i = n.getTicks()).length; var a, s = t.getLabelModel(), l = u_(t), u = 1; r > 40 && (u = Math.ceil(r / 40)); for (var h = 0; h < r; h += u) { var c = l(i ? i[h] : { value: o[0] + h }, h), p = c_(s.getTextRect(c), s.get(\"rotate\") || 0); a ? a.union(p) : a = p } return a } }(t); if (e) { var n = t.isHorizontal() ? \"height\" : \"width\", i = t.model.get([\"axisLabel\", \"margin\"]); o[n] -= e[n] + i, \"top\" === t.position ? o.y += e.height + i : \"left\" === t.position && (o.x += e.width + i) } } })), s()), E(this._coordsList, (function (t) { t.calcAffineTransform() })) }, t.prototype.getAxis = function (t, e) { var n = this._axesMap[t]; if (null != n) return n[e || 0] }, t.prototype.getAxes = function () { return this._axesList.slice() }, t.prototype.getCartesian = function (t, e) { if (null != t && null != e) { var n = \"x\" + t + \"y\" + e; return this._coordsMap[n] } q(t) && (e = t.yAxisIndex, t = t.xAxisIndex); for (var i = 0, r = this._coordsList; i < r.length; i++)if (r[i].getAxis(\"x\").index === t || r[i].getAxis(\"y\").index === e) return r[i] }, t.prototype.getCartesians = function () { return this._coordsList.slice() }, t.prototype.convertToPixel = function (t, e, n) { var i = this._findConvertTarget(e); return i.cartesian ? i.cartesian.dataToPoint(n) : i.axis ? i.axis.toGlobalCoord(i.axis.dataToCoord(n)) : null }, t.prototype.convertFromPixel = function (t, e, n) { var i = this._findConvertTarget(e); return i.cartesian ? i.cartesian.pointToData(n) : i.axis ? i.axis.coordToData(i.axis.toLocalCoord(n)) : null }, t.prototype._findConvertTarget = function (t) { var e, n, i = t.seriesModel, r = t.xAxisModel || i && i.getReferringComponents(\"xAxis\", Po).models[0], o = t.yAxisModel || i && i.getReferringComponents(\"yAxis\", Po).models[0], a = t.gridModel, s = this._coordsList; if (i) P(s, e = i.coordinateSystem) < 0 && (e = null); else if (r && o) e = this.getCartesian(r.componentIndex, o.componentIndex); else if (r) n = this.getAxis(\"x\", r.componentIndex); else if (o) n = this.getAxis(\"y\", o.componentIndex); else if (a) { a.coordinateSystem === this && (e = this._coordsList[0]) } return { cartesian: e, axis: n } }, t.prototype.containPoint = function (t) { var e = this._coordsList[0]; if (e) return e.containPoint(t) }, t.prototype._initCartesian = function (t, e, n) { var i = this, r = this, o = { left: !1, right: !1, top: !1, bottom: !1 }, a = { x: {}, y: {} }, s = { x: 0, y: 0 }; if (e.eachComponent(\"xAxis\", l(\"x\"), this), e.eachComponent(\"yAxis\", l(\"y\"), this), !s.x || !s.y) return this._axesMap = {}, void (this._axesList = []); function l(e) { return function (n, i) { if (FM(n, t)) { var l = n.get(\"position\"); \"x\" === e ? \"top\" !== l && \"bottom\" !== l && (l = o.bottom ? \"top\" : \"bottom\") : \"left\" !== l && \"right\" !== l && (l = o.left ? \"right\" : \"left\"), o[l] = !0; var u = new OM(e, l_(n), [0, 0], n.get(\"type\"), l), h = \"category\" === u.type; u.onBand = h && n.get(\"boundaryGap\"), u.inverse = n.get(\"inverse\"), n.axis = u, u.model = n, u.grid = r, u.index = i, r._axesList.push(u), a[e][i] = u, s[e]++ } } } this._axesMap = a, E(a.x, (function (e, n) { E(a.y, (function (r, o) { var a = \"x\" + n + \"y\" + o, s = new PM(a); s.master = i, s.model = t, i._coordsMap[a] = s, i._coordsList.push(s), s.addAxis(e), s.addAxis(r) })) })) }, t.prototype._updateScale = function (t, e) { function n(t, e) { E(f_(t, e.dim), (function (n) { e.scale.unionExtentFromData(t, n) })) } E(this._axesList, (function (t) { if (t.scale.setExtent(1 / 0, -1 / 0), \"category\" === t.type) { var e = t.model.get(\"categorySortInfo\"); t.scale.setSortInfo(e) } })), t.eachSeries((function (t) { if (NM(t)) { var i = EM(t), r = i.xAxisModel, o = i.yAxisModel; if (!FM(r, e) || !FM(o, e)) return; var a = this.getCartesian(r.componentIndex, o.componentIndex), s = t.getData(), l = a.getAxis(\"x\"), u = a.getAxis(\"y\"); n(s, l), n(s, u) } }), this) }, t.prototype.getTooltipAxes = function (t) { var e = [], n = []; return E(this.getCartesians(), (function (i) { var r = null != t && \"auto\" !== t ? i.getAxis(t) : i.getBaseAxis(), o = i.getOtherAxis(r); P(e, r) < 0 && e.push(r), P(n, o) < 0 && n.push(o) })), { baseAxes: e, otherAxes: n } }, t.create = function (e, n) { var i = []; return e.eachComponent(\"grid\", (function (r, o) { var a = new t(r, e, n); a.name = \"grid_\" + o, a.resize(r, n, !0), r.coordinateSystem = a, i.push(a) })), e.eachSeries((function (t) { if (NM(t)) { var e = EM(t), n = e.xAxisModel, i = e.yAxisModel, r = n.getCoordSysModel(); 0; var o = r.coordinateSystem; t.coordinateSystem = o.getCartesian(n.componentIndex, i.componentIndex) } })), i }, t.dimensions = kM, t }(); function FM(t, e) { return t.getCoordSysModel() === e } function GM(t, e, n, i) { n.getAxesOnZeroOf = function () { return r ? [r] : [] }; var r, o = t[e], a = n.model, s = a.get([\"axisLine\", \"onZero\"]), l = a.get([\"axisLine\", \"onZeroAxisIndex\"]); if (s) { if (null != l) WM(o[l]) && (r = o[l]); else for (var u in o) if (o.hasOwnProperty(u) && WM(o[u]) && !i[h(o[u])]) { r = o[u]; break } r && (i[h(r)] = !0) } function h(t) { return t.dim + \"_\" + t.index } } function WM(t) { return t && \"category\" !== t.type && \"time\" !== t.type && function (t) { var e = t.scale.getExtent(), n = e[0], i = e[1]; return !(n > 0 && i > 0 || n < 0 && i < 0) }(t) } var HM = Math.PI, YM = function () { function t(t, e) { this.group = new Pr, this.opt = e, this.axisModel = t, k(e, { labelOffset: 0, nameDirection: 1, tickDirection: 1, labelDirection: 1, silent: !0, handleAutoShown: function () { return !0 } }); var n = new Pr({ x: e.position[0], y: e.position[1], rotation: e.rotation }); n.updateTransform(), this._transformGroup = n } return t.prototype.hasBuilder = function (t) { return !!UM[t] }, t.prototype.add = function (t) { UM[t](this.opt, this.axisModel, this.group, this._transformGroup) }, t.prototype.getGroup = function () { return this.group }, t.innerTextLayout = function (t, e, n) { var i, r, o = Kr(e - t); return $r(o) ? (r = n > 0 ? \"top\" : \"bottom\", i = \"center\") : $r(o - HM) ? (r = n > 0 ? \"bottom\" : \"top\", i = \"center\") : (r = \"middle\", i = o > 0 && o < HM ? n > 0 ? \"right\" : \"left\" : n > 0 ? \"left\" : \"right\"), { rotation: o, textAlign: i, textVerticalAlign: r } }, t.makeAxisEventDataBase = function (t) { var e = { componentType: t.mainType, componentIndex: t.componentIndex }; return e[t.mainType + \"Index\"] = t.componentIndex, e }, t.isLabelSilent = function (t) { var e = t.get(\"tooltip\"); return t.get(\"silent\") || !(t.get(\"triggerEvent\") || e && e.show) }, t }(), UM = { axisLine: function (t, e, n, i) { var r = e.get([\"axisLine\", \"show\"]); if (\"auto\" === r && t.handleAutoShown && (r = t.handleAutoShown(\"axisLine\")), r) { var o = e.axis.getExtent(), a = i.transform, s = [o[0], 0], l = [o[1], 0], u = s[0] > l[0]; a && (Ft(s, s, a), Ft(l, l, a)); var h = A({ lineCap: \"round\" }, e.getModel([\"axisLine\", \"lineStyle\"]).getLineStyle()), c = new Wu({ shape: { x1: s[0], y1: s[1], x2: l[0], y2: l[1] }, style: h, strokeContainThreshold: t.strokeContainThreshold || 5, silent: !0, z2: 1 }); Ah(c.shape, c.style.lineWidth), c.anid = \"line\", n.add(c); var p = e.get([\"axisLine\", \"symbol\"]); if (null != p) { var d = e.get([\"axisLine\", \"symbolSize\"]); X(p) && (p = [p, p]), (X(d) || j(d)) && (d = [d, d]); var f = Ey(e.get([\"axisLine\", \"symbolOffset\"]) || 0, d), g = d[0], y = d[1]; E([{ rotate: t.rotation + Math.PI / 2, offset: f[0], r: 0 }, { rotate: t.rotation - Math.PI / 2, offset: f[1], r: Math.sqrt((s[0] - l[0]) * (s[0] - l[0]) + (s[1] - l[1]) * (s[1] - l[1])) }], (function (e, i) { if (\"none\" !== p[i] && null != p[i]) { var r = Ry(p[i], -g / 2, -y / 2, g, y, h.stroke, !0), o = e.r + e.offset, a = u ? l : s; r.attr({ rotation: e.rotate, x: a[0] + o * Math.cos(t.rotation), y: a[1] - o * Math.sin(t.rotation), silent: !0, z2: 11 }), n.add(r) } })) } } }, axisTickLabel: function (t, e, n, i) { var r = function (t, e, n, i) { var r = n.axis, o = n.getModel(\"axisTick\"), a = o.get(\"show\"); \"auto\" === a && i.handleAutoShown && (a = i.handleAutoShown(\"axisTick\")); if (!a || r.scale.isBlank()) return; for (var s = o.getModel(\"lineStyle\"), l = i.tickDirection * o.get(\"length\"), u = qM(r.getTicksCoords(), e.transform, l, k(s.getLineStyle(), { stroke: n.get([\"axisLine\", \"lineStyle\", \"color\"]) }), \"ticks\"), h = 0; h < u.length; h++)t.add(u[h]); return u }(n, i, e, t), o = function (t, e, n, i) { var r = n.axis; if (!it(i.axisLabelShow, n.get([\"axisLabel\", \"show\"])) || r.scale.isBlank()) return; var o = n.getModel(\"axisLabel\"), a = o.get(\"margin\"), s = r.getViewLabels(), l = (it(i.labelRotate, o.get(\"rotate\")) || 0) * HM / 180, u = YM.innerTextLayout(i.rotation, l, i.labelDirection), h = n.getCategories && n.getCategories(!0), c = [], p = YM.isLabelSilent(n), d = n.get(\"triggerEvent\"); return E(s, (function (s, l) { var f = \"ordinal\" === r.scale.type ? r.scale.getRawOrdinalNumber(s.tickValue) : s.tickValue, g = s.formattedLabel, y = s.rawLabel, v = o; if (h && h[f]) { var m = h[f]; q(m) && m.textStyle && (v = new xc(m.textStyle, o, n.ecModel)) } var x = v.getTextColor() || n.get([\"axisLine\", \"lineStyle\", \"color\"]), _ = r.dataToCoord(f), b = new Ns({ x: _, y: i.labelOffset + i.labelDirection * a, rotation: u.rotation, silent: p, z2: 10 + (s.level || 0), style: $h(v, { text: g, align: v.getShallow(\"align\", !0) || u.textAlign, verticalAlign: v.getShallow(\"verticalAlign\", !0) || v.getShallow(\"baseline\", !0) || u.textVerticalAlign, fill: U(x) ? x(\"category\" === r.type ? y : \"value\" === r.type ? f + \"\" : f, l) : x }) }); if (b.anid = \"label_\" + f, d) { var w = YM.makeAxisEventDataBase(n); w.targetType = \"axisLabel\", w.value = y, w.tickIndex = l, \"category\" === r.type && (w.dataIndex = f), js(b).eventData = w } e.add(b), b.updateTransform(), c.push(b), t.add(b), b.decomposeTransform() })), c }(n, i, e, t); (function (t, e, n) { if (d_(t.axis)) return; var i = t.get([\"axisLabel\", \"showMinLabel\"]), r = t.get([\"axisLabel\", \"showMaxLabel\"]); n = n || []; var o = (e = e || [])[0], a = e[1], s = e[e.length - 1], l = e[e.length - 2], u = n[0], h = n[1], c = n[n.length - 1], p = n[n.length - 2]; !1 === i ? (XM(o), XM(u)) : ZM(o, a) && (i ? (XM(a), XM(h)) : (XM(o), XM(u))); !1 === r ? (XM(s), XM(c)) : ZM(l, s) && (r ? (XM(l), XM(p)) : (XM(s), XM(c))) }(e, o, r), function (t, e, n, i) { var r = n.axis, o = n.getModel(\"minorTick\"); if (!o.get(\"show\") || r.scale.isBlank()) return; var a = r.getMinorTicksCoords(); if (!a.length) return; for (var s = o.getModel(\"lineStyle\"), l = i * o.get(\"length\"), u = k(s.getLineStyle(), k(n.getModel(\"axisTick\").getLineStyle(), { stroke: n.get([\"axisLine\", \"lineStyle\", \"color\"]) })), h = 0; h < a.length; h++)for (var c = qM(a[h], e.transform, l, u, \"minorticks_\" + h), p = 0; p < c.length; p++)t.add(c[p]) }(n, i, e, t.tickDirection), e.get([\"axisLabel\", \"hideOverlap\"])) && bb(mb(z(o, (function (t) { return { label: t, priority: t.z2, defaultAttr: { ignore: t.ignore } } })))) }, axisName: function (t, e, n, i) { var r = it(t.axisName, e.get(\"name\")); if (r) { var o, a, s = e.get(\"nameLocation\"), l = t.nameDirection, u = e.getModel(\"nameTextStyle\"), h = e.get(\"nameGap\") || 0, c = e.axis.getExtent(), p = c[0] > c[1] ? -1 : 1, d = [\"start\" === s ? c[0] - p * h : \"end\" === s ? c[1] + p * h : (c[0] + c[1]) / 2, jM(s) ? t.labelOffset + l * h : 0], f = e.get(\"nameRotate\"); null != f && (f = f * HM / 180), jM(s) ? o = YM.innerTextLayout(t.rotation, null != f ? f : t.rotation, l) : (o = function (t, e, n, i) { var r, o, a = Kr(n - t), s = i[0] > i[1], l = \"start\" === e && !s || \"start\" !== e && s; $r(a - HM / 2) ? (o = l ? \"bottom\" : \"top\", r = \"center\") : $r(a - 1.5 * HM) ? (o = l ? \"top\" : \"bottom\", r = \"center\") : (o = \"middle\", r = a < 1.5 * HM && a > HM / 2 ? l ? \"left\" : \"right\" : l ? \"right\" : \"left\"); return { rotation: a, textAlign: r, textVerticalAlign: o } }(t.rotation, s, f || 0, c), null != (a = t.axisNameAvailableWidth) && (a = Math.abs(a / Math.sin(o.rotation)), !isFinite(a) && (a = null))); var g = u.getFont(), y = e.get(\"nameTruncate\", !0) || {}, v = y.ellipsis, m = it(t.nameTruncateMaxWidth, y.maxWidth, a), x = new Ns({ x: d[0], y: d[1], rotation: o.rotation, silent: YM.isLabelSilent(e), style: $h(u, { text: r, font: g, overflow: \"truncate\", width: m, ellipsis: v, fill: u.getTextColor() || e.get([\"axisLine\", \"lineStyle\", \"color\"]), align: u.get(\"align\") || o.textAlign, verticalAlign: u.get(\"verticalAlign\") || o.textVerticalAlign }), z2: 1 }); if (Wh({ el: x, componentModel: e, itemName: r }), x.__fullText = r, x.anid = \"name\", e.get(\"triggerEvent\")) { var _ = YM.makeAxisEventDataBase(e); _.targetType = \"axisName\", _.name = r, js(x).eventData = _ } i.add(x), x.updateTransform(), n.add(x), x.decomposeTransform() } } }; function XM(t) { t && (t.ignore = !0) } function ZM(t, e) { var n = t && t.getBoundingRect().clone(), i = e && e.getBoundingRect().clone(); if (n && i) { var r = ye([]); return _e(r, r, -t.rotation), n.applyTransform(me([], r, t.getLocalTransform())), i.applyTransform(me([], r, e.getLocalTransform())), n.intersect(i) } } function jM(t) { return \"middle\" === t || \"center\" === t } function qM(t, e, n, i, r) { for (var o = [], a = [], s = [], l = 0; l < t.length; l++) { var u = t[l].coord; a[0] = u, a[1] = 0, s[0] = u, s[1] = n, e && (Ft(a, a, e), Ft(s, s, e)); var h = new Wu({ shape: { x1: a[0], y1: a[1], x2: s[0], y2: s[1] }, style: i, z2: 2, autoBatch: !0, silent: !0 }); Ah(h.shape, h.style.lineWidth), h.anid = r + \"_\" + t[l].tickValue, o.push(h) } return o } function KM(t, e) { var n = { axesInfo: {}, seriesInvolved: !1, coordSysAxesInfo: {}, coordSysMap: {} }; return function (t, e, n) { var i = e.getComponent(\"tooltip\"), r = e.getComponent(\"axisPointer\"), o = r.get(\"link\", !0) || [], a = []; E(n.getCoordinateSystems(), (function (n) { if (n.axisPointerEnabled) { var s = eI(n.model), l = t.coordSysAxesInfo[s] = {}; t.coordSysMap[s] = n; var u = n.model.getModel(\"tooltip\", i); if (E(n.getAxes(), H(d, !1, null)), n.getTooltipAxes && i && u.get(\"show\")) { var h = \"axis\" === u.get(\"trigger\"), c = \"cross\" === u.get([\"axisPointer\", \"type\"]), p = n.getTooltipAxes(u.get([\"axisPointer\", \"axis\"])); (h || c) && E(p.baseAxes, H(d, !c || \"cross\", h)), c && E(p.otherAxes, H(d, \"cross\", !1)) } } function d(i, s, h) { var c = h.model.getModel(\"axisPointer\", r), p = c.get(\"show\"); if (p && (\"auto\" !== p || i || tI(c))) { null == s && (s = c.get(\"triggerTooltip\")), c = i ? function (t, e, n, i, r, o) { var a = e.getModel(\"axisPointer\"), s = {}; E([\"type\", \"snap\", \"lineStyle\", \"shadowStyle\", \"label\", \"animation\", \"animationDurationUpdate\", \"animationEasingUpdate\", \"z\"], (function (t) { s[t] = T(a.get(t)) })), s.snap = \"category\" !== t.type && !!o, \"cross\" === a.get(\"type\") && (s.type = \"line\"); var l = s.label || (s.label = {}); if (null == l.show && (l.show = !1), \"cross\" === r) { var u = a.get([\"label\", \"show\"]); if (l.show = null == u || u, !o) { var h = s.lineStyle = a.get(\"crossStyle\"); h && k(l, h.textStyle) } } return t.model.getModel(\"axisPointer\", new xc(s, n, i)) }(h, u, r, e, i, s) : c; var d = c.get(\"snap\"), f = eI(h.model), g = s || d || \"category\" === h.type, y = t.axesInfo[f] = { key: f, axis: h, coordSys: n, axisPointerModel: c, triggerTooltip: s, involveSeries: g, snap: d, useHandle: tI(c), seriesModels: [], linkGroup: null }; l[f] = y, t.seriesInvolved = t.seriesInvolved || g; var v = function (t, e) { for (var n = e.model, i = e.dim, r = 0; r < t.length; r++) { var o = t[r] || {}; if ($M(o[i + \"AxisId\"], n.id) || $M(o[i + \"AxisIndex\"], n.componentIndex) || $M(o[i + \"AxisName\"], n.name)) return r } }(o, h); if (null != v) { var m = a[v] || (a[v] = { axesInfo: {} }); m.axesInfo[f] = y, m.mapper = o[v].mapper, y.linkGroup = m } } } })) }(n, t, e), n.seriesInvolved && function (t, e) { e.eachSeries((function (e) { var n = e.coordinateSystem, i = e.get([\"tooltip\", \"trigger\"], !0), r = e.get([\"tooltip\", \"show\"], !0); n && \"none\" !== i && !1 !== i && \"item\" !== i && !1 !== r && !1 !== e.get([\"axisPointer\", \"show\"], !0) && E(t.coordSysAxesInfo[eI(n.model)], (function (t) { var i = t.axis; n.getAxis(i.dim) === i && (t.seriesModels.push(e), null == t.seriesDataCount && (t.seriesDataCount = 0), t.seriesDataCount += e.getData().count()) })) })) }(n, t), n } function $M(t, e) { return \"all\" === t || Y(t) && P(t, e) >= 0 || t === e } function JM(t) { var e = QM(t); if (e) { var n = e.axisPointerModel, i = e.axis.scale, r = n.option, o = n.get(\"status\"), a = n.get(\"value\"); null != a && (a = i.parse(a)); var s = tI(n); null == o && (r.status = s ? \"show\" : \"hide\"); var l = i.getExtent().slice(); l[0] > l[1] && l.reverse(), (null == a || a > l[1]) && (a = l[1]), a < l[0] && (a = l[0]), r.value = a, s && (r.status = e.axis.scale.isBlank() ? \"hide\" : \"show\") } } function QM(t) { var e = (t.ecModel.getComponent(\"axisPointer\") || {}).coordSysAxesInfo; return e && e.axesInfo[eI(t)] } function tI(t) { return !!t.get([\"handle\", \"show\"]) } function eI(t) { return t.type + \"||\" + t.id } var nI = {}, iI = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (e, n, i, r) { this.axisPointerClass && JM(e), t.prototype.render.apply(this, arguments), this._doUpdateAxisPointerClass(e, i, !0) }, e.prototype.updateAxisPointer = function (t, e, n, i) { this._doUpdateAxisPointerClass(t, n, !1) }, e.prototype.remove = function (t, e) { var n = this._axisPointer; n && n.remove(e) }, e.prototype.dispose = function (e, n) { this._disposeAxisPointer(n), t.prototype.dispose.apply(this, arguments) }, e.prototype._doUpdateAxisPointerClass = function (t, n, i) { var r = e.getAxisPointerClass(this.axisPointerClass); if (r) { var o = function (t) { var e = QM(t); return e && e.axisPointerModel }(t); o ? (this._axisPointer || (this._axisPointer = new r)).render(t, o, n, i) : this._disposeAxisPointer(n) } }, e.prototype._disposeAxisPointer = function (t) { this._axisPointer && this._axisPointer.dispose(t), this._axisPointer = null }, e.registerAxisPointerClass = function (t, e) { nI[t] = e }, e.getAxisPointerClass = function (t) { return t && nI[t] }, e.type = \"axis\", e }(mg), rI = Do(); function oI(t, e, n, i) { var r = n.axis; if (!r.scale.isBlank()) { var o = n.getModel(\"splitArea\"), a = o.getModel(\"areaStyle\"), s = a.get(\"color\"), l = i.coordinateSystem.getRect(), u = r.getTicksCoords({ tickModel: o, clamp: !0 }); if (u.length) { var h = s.length, c = rI(t).splitAreaColors, p = ft(), d = 0; if (c) for (var f = 0; f < u.length; f++) { var g = c.get(u[f].tickValue); if (null != g) { d = (g + (h - 1) * f) % h; break } } var y = r.toGlobalCoord(u[0].coord), v = a.getAreaStyle(); s = Y(s) ? s : [s]; for (f = 1; f < u.length; f++) { var m = r.toGlobalCoord(u[f].coord), x = void 0, _ = void 0, b = void 0, w = void 0; r.isHorizontal() ? (x = y, _ = l.y, b = m - x, w = l.height, y = x + b) : (x = l.x, _ = y, b = l.width, y = _ + (w = m - _)); var S = u[f - 1].tickValue; null != S && p.set(S, d), e.add(new Ps({ anid: null != S ? \"area_\" + S : null, shape: { x: x, y: _, width: b, height: w }, style: k({ fill: s[d] }, v), autoBatch: !0, silent: !0 })), d = (d + 1) % h } rI(t).splitAreaColors = p } } } function aI(t) { rI(t).splitAreaColors = null } var sI = [\"axisLine\", \"axisTickLabel\", \"axisName\"], lI = [\"splitArea\", \"splitLine\", \"minorSplitLine\"], uI = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.axisPointerClass = \"CartesianAxisPointer\", n } return n(e, t), e.prototype.render = function (e, n, i, r) { this.group.removeAll(); var o = this._axisGroup; if (this._axisGroup = new Pr, this.group.add(this._axisGroup), e.get(\"show\")) { var a = e.getCoordSysModel(), s = RM(a, e), l = new YM(e, A({ handleAutoShown: function (t) { for (var n = a.coordinateSystem.getCartesians(), i = 0; i < n.length; i++)if (px(n[i].getOtherAxis(e.axis).scale)) return !0; return !1 } }, s)); E(sI, l.add, l), this._axisGroup.add(l.getGroup()), E(lI, (function (t) { e.get([t, \"show\"]) && hI[t](this, this._axisGroup, e, a) }), this), r && \"changeAxisOrder\" === r.type && r.isInitSort || Nh(o, this._axisGroup, e), t.prototype.render.call(this, e, n, i, r) } }, e.prototype.remove = function () { aI(this) }, e.type = \"cartesianAxis\", e }(iI), hI = { splitLine: function (t, e, n, i) { var r = n.axis; if (!r.scale.isBlank()) { var o = n.getModel(\"splitLine\"), a = o.getModel(\"lineStyle\"), s = a.get(\"color\"); s = Y(s) ? s : [s]; for (var l = i.coordinateSystem.getRect(), u = r.isHorizontal(), h = 0, c = r.getTicksCoords({ tickModel: o }), p = [], d = [], f = a.getLineStyle(), g = 0; g < c.length; g++) { var y = r.toGlobalCoord(c[g].coord); u ? (p[0] = y, p[1] = l.y, d[0] = y, d[1] = l.y + l.height) : (p[0] = l.x, p[1] = y, d[0] = l.x + l.width, d[1] = y); var v = h++ % s.length, m = c[g].tickValue, x = new Wu({ anid: null != m ? \"line_\" + c[g].tickValue : null, autoBatch: !0, shape: { x1: p[0], y1: p[1], x2: d[0], y2: d[1] }, style: k({ stroke: s[v] }, f), silent: !0 }); Ah(x.shape, f.lineWidth), e.add(x) } } }, minorSplitLine: function (t, e, n, i) { var r = n.axis, o = n.getModel(\"minorSplitLine\").getModel(\"lineStyle\"), a = i.coordinateSystem.getRect(), s = r.isHorizontal(), l = r.getMinorTicksCoords(); if (l.length) for (var u = [], h = [], c = o.getLineStyle(), p = 0; p < l.length; p++)for (var d = 0; d < l[p].length; d++) { var f = r.toGlobalCoord(l[p][d].coord); s ? (u[0] = f, u[1] = a.y, h[0] = f, h[1] = a.y + a.height) : (u[0] = a.x, u[1] = f, h[0] = a.x + a.width, h[1] = f); var g = new Wu({ anid: \"minor_line_\" + l[p][d].tickValue, autoBatch: !0, shape: { x1: u[0], y1: u[1], x2: h[0], y2: h[1] }, style: c, silent: !0 }); Ah(g.shape, c.lineWidth), e.add(g) } }, splitArea: function (t, e, n, i) { oI(t, e, n, i) } }, cI = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"xAxis\", e }(uI), pI = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = cI.type, e } return n(e, t), e.type = \"yAxis\", e }(uI), dI = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"grid\", e } return n(e, t), e.prototype.render = function (t, e) { this.group.removeAll(), t.get(\"show\") && this.group.add(new Ps({ shape: t.coordinateSystem.getRect(), style: k({ fill: t.get(\"backgroundColor\") }, t.getItemStyle()), silent: !0, z2: -1 })) }, e.type = \"grid\", e }(mg), fI = { offset: 0 }; function gI(t) { t.registerComponentView(dI), t.registerComponentModel(_M), t.registerCoordinateSystem(\"cartesian2d\", BM), CM(t, \"x\", bM, fI), CM(t, \"y\", bM, fI), t.registerComponentView(cI), t.registerComponentView(pI), t.registerPreprocessor((function (t) { t.xAxis && t.yAxis && !t.grid && (t.grid = {}) })) } function yI(t) { t.eachSeriesByType(\"radar\", (function (t) { var e = t.getData(), n = [], i = t.coordinateSystem; if (i) { var r = i.getIndicatorAxes(); E(r, (function (t, o) { e.each(e.mapDimension(r[o].dim), (function (t, e) { n[e] = n[e] || []; var r = i.dataToPoint(t, o); n[e][o] = vI(r) ? r : mI(i) })) })), e.each((function (t) { var r = F(n[t], (function (t) { return vI(t) })) || mI(i); n[t].push(r.slice()), e.setItemLayout(t, n[t]) })) } })) } function vI(t) { return !isNaN(t[0]) && !isNaN(t[1]) } function mI(t) { return [t.cx, t.cy] } function xI(t) { var e = t.polar; if (e) { Y(e) || (e = [e]); var n = []; E(e, (function (e, i) { e.indicator ? (e.type && !e.shape && (e.shape = e.type), t.radar = t.radar || [], Y(t.radar) || (t.radar = [t.radar]), t.radar.push(e)) : n.push(e) })), t.polar = n } E(t.series, (function (t) { t && \"radar\" === t.type && t.polarIndex && (t.radarIndex = t.polarIndex) })) } var _I = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = t.coordinateSystem, r = this.group, o = t.getData(), a = this._data; function s(t, e) { var n = t.getItemVisual(e, \"symbol\") || \"circle\"; if (\"none\" !== n) { var i = Ny(t.getItemVisual(e, \"symbolSize\")), r = Ry(n, -1, -1, 2, 2), o = t.getItemVisual(e, \"symbolRotate\") || 0; return r.attr({ style: { strokeNoScale: !0 }, z2: 100, scaleX: i[0] / 2, scaleY: i[1] / 2, rotation: o * Math.PI / 180 || 0 }), r } } function l(e, n, i, r, o, a) { i.removeAll(); for (var l = 0; l < n.length - 1; l++) { var u = s(r, o); u && (u.__dimIdx = l, e[l] ? (u.setPosition(e[l]), Uh[a ? \"initProps\" : \"updateProps\"](u, { x: n[l][0], y: n[l][1] }, t, o)) : u.setPosition(n[l]), i.add(u)) } } function u(t) { return z(t, (function (t) { return [i.cx, i.cy] })) } o.diff(a).add((function (e) { var n = o.getItemLayout(e); if (n) { var i = new zu, r = new Bu, a = { shape: { points: n } }; i.shape.points = u(n), r.shape.points = u(n), hh(i, a, t, e), hh(r, a, t, e); var s = new Pr, h = new Pr; s.add(r), s.add(i), s.add(h), l(r.shape.points, n, h, o, e, !0), o.setItemGraphicEl(e, s) } })).update((function (e, n) { var i = a.getItemGraphicEl(n), r = i.childAt(0), s = i.childAt(1), u = i.childAt(2), h = { shape: { points: o.getItemLayout(e) } }; h.shape.points && (l(r.shape.points, h.shape.points, u, o, e, !1), gh(s), gh(r), uh(r, h, t), uh(s, h, t), o.setItemGraphicEl(e, i)) })).remove((function (t) { r.remove(a.getItemGraphicEl(t)) })).execute(), o.eachItemGraphicEl((function (t, e) { var n = o.getItemModel(e), i = t.childAt(0), a = t.childAt(1), s = t.childAt(2), l = o.getItemVisual(e, \"style\"), u = l.fill; r.add(t), i.useStyle(k(n.getModel(\"lineStyle\").getLineStyle(), { fill: \"none\", stroke: u })), Hl(i, n, \"lineStyle\"), Hl(a, n, \"areaStyle\"); var h = n.getModel(\"areaStyle\"), c = h.isEmpty() && h.parentModel.isEmpty(); a.ignore = c, E([\"emphasis\", \"select\", \"blur\"], (function (t) { var e = n.getModel([t, \"areaStyle\"]), i = e.isEmpty() && e.parentModel.isEmpty(); a.ensureState(t).ignore = i && c })), a.useStyle(k(h.getAreaStyle(), { fill: u, opacity: .7, decal: l.decal })); var p = n.getModel(\"emphasis\"), d = p.getModel(\"itemStyle\").getItemStyle(); s.eachChild((function (t) { if (t instanceof Is) { var i = t.style; t.useStyle(A({ image: i.image, x: i.x, y: i.y, width: i.width, height: i.height }, l)) } else t.useStyle(l), t.setColor(u), t.style.strokeNoScale = !0; t.ensureState(\"emphasis\").style = T(d); var r = o.getStore().get(o.getDimensionIndex(t.__dimIdx), e); (null == r || isNaN(r)) && (r = \"\"), qh(t, Kh(n), { labelFetcher: o.hostModel, labelDataIndex: e, labelDimIndex: t.__dimIdx, defaultText: r, inheritColor: u, defaultOpacity: l.opacity }) })), Bl(t, p.get(\"focus\"), p.get(\"blurScope\"), p.get(\"disabled\")) })), this._data = o }, e.prototype.remove = function () { this.group.removeAll(), this._data = null }, e.type = \"radar\", e }(wg), bI = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.hasSymbolVisual = !0, n } return n(e, t), e.prototype.init = function (e) { t.prototype.init.apply(this, arguments), this.legendVisualProvider = new dM(W(this.getData, this), W(this.getRawData, this)) }, e.prototype.getInitialData = function (t, e) { return pM(this, { generateCoord: \"indicator_\", generateCoordCount: 1 / 0 }) }, e.prototype.formatTooltip = function (t, e, n) { var i = this.getData(), r = this.coordinateSystem.getIndicatorAxes(), o = this.getData().getName(t), a = \"\" === o ? this.name : o, s = rg(this, t); return qf(\"section\", { header: a, sortBlocks: !0, blocks: z(r, (function (e) { var n = i.get(i.mapDimension(e.dim), t); return qf(\"nameValue\", { markerType: \"subItem\", markerColor: s, name: e.name, value: n, sortParam: n }) })) }) }, e.prototype.getTooltipPosition = function (t) { if (null != t) for (var e = this.getData(), n = this.coordinateSystem, i = e.getValues(z(n.dimensions, (function (t) { return e.mapDimension(t) })), t), r = 0, o = i.length; r < o; r++)if (!isNaN(i[r])) { var a = n.getIndicatorAxes(); return n.coordToPoint(a[r].dataToCoord(i[r]), r) } }, e.type = \"series.radar\", e.dependencies = [\"radar\"], e.defaultOption = { z: 2, colorBy: \"data\", coordinateSystem: \"radar\", legendHoverLink: !0, radarIndex: 0, lineStyle: { width: 2, type: \"solid\", join: \"round\" }, label: { position: \"top\" }, symbolSize: 8 }, e }(hg), wI = IM.value; function SI(t, e) { return k({ show: e }, t) } var MI = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.optionUpdated = function () { var t = this.get(\"boundaryGap\"), e = this.get(\"splitNumber\"), n = this.get(\"scale\"), i = this.get(\"axisLine\"), r = this.get(\"axisTick\"), o = this.get(\"axisLabel\"), a = this.get(\"axisName\"), s = this.get([\"axisName\", \"show\"]), l = this.get([\"axisName\", \"formatter\"]), u = this.get(\"axisNameGap\"), h = this.get(\"triggerEvent\"), c = z(this.get(\"indicator\") || [], (function (c) { null != c.max && c.max > 0 && !c.min ? c.min = 0 : null != c.min && c.min < 0 && !c.max && (c.max = 0); var p = a; null != c.color && (p = k({ color: c.color }, a)); var d = C(T(c), { boundaryGap: t, splitNumber: e, scale: n, axisLine: i, axisTick: r, axisLabel: o, name: c.text, showName: s, nameLocation: \"end\", nameGap: u, nameTextStyle: p, triggerEvent: h }, !1); if (X(l)) { var f = d.name; d.name = l.replace(\"{value}\", null != f ? f : \"\") } else U(l) && (d.name = l(d.name, d)); var g = new xc(d, null, this.ecModel); return R(g, g_.prototype), g.mainType = \"radar\", g.componentIndex = this.componentIndex, g }), this); this._indicatorModels = c }, e.prototype.getIndicatorModels = function () { return this._indicatorModels }, e.type = \"radar\", e.defaultOption = { z: 0, center: [\"50%\", \"50%\"], radius: \"75%\", startAngle: 90, axisName: { show: !0 }, boundaryGap: [0, 0], splitNumber: 5, axisNameGap: 15, scale: !1, shape: \"polygon\", axisLine: C({ lineStyle: { color: \"#bbb\" } }, wI.axisLine), axisLabel: SI(wI.axisLabel, !1), axisTick: SI(wI.axisTick, !1), splitLine: SI(wI.splitLine, !0), splitArea: SI(wI.splitArea, !0), indicator: [] }, e }(Ap), II = [\"axisLine\", \"axisTickLabel\", \"axisName\"], TI = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { this.group.removeAll(), this._buildAxes(t), this._buildSplitLineAndArea(t) }, e.prototype._buildAxes = function (t) { var e = t.coordinateSystem; E(z(e.getIndicatorAxes(), (function (t) { var n = t.model.get(\"showName\") ? t.name : \"\"; return new YM(t.model, { axisName: n, position: [e.cx, e.cy], rotation: t.angle, labelDirection: -1, tickDirection: -1, nameDirection: 1 }) })), (function (t) { E(II, t.add, t), this.group.add(t.getGroup()) }), this) }, e.prototype._buildSplitLineAndArea = function (t) { var e = t.coordinateSystem, n = e.getIndicatorAxes(); if (n.length) { var i = t.get(\"shape\"), r = t.getModel(\"splitLine\"), o = t.getModel(\"splitArea\"), a = r.getModel(\"lineStyle\"), s = o.getModel(\"areaStyle\"), l = r.get(\"show\"), u = o.get(\"show\"), h = a.get(\"color\"), c = s.get(\"color\"), p = Y(h) ? h : [h], d = Y(c) ? c : [c], f = [], g = []; if (\"circle\" === i) for (var y = n[0].getTicksCoords(), v = e.cx, m = e.cy, x = 0; x < y.length; x++) { if (l) f[C(f, p, x)].push(new gu({ shape: { cx: v, cy: m, r: y[x].coord } })); if (u && x < y.length - 1) g[C(g, d, x)].push(new Ru({ shape: { cx: v, cy: m, r0: y[x].coord, r: y[x + 1].coord } })) } else { var _, b = z(n, (function (t, n) { var i = t.getTicksCoords(); return _ = null == _ ? i.length - 1 : Math.min(i.length - 1, _), z(i, (function (t) { return e.coordToPoint(t.coord, n) })) })), w = []; for (x = 0; x <= _; x++) { for (var S = [], M = 0; M < n.length; M++)S.push(b[M][x]); if (S[0] && S.push(S[0].slice()), l) f[C(f, p, x)].push(new Bu({ shape: { points: S } })); if (u && w) g[C(g, d, x - 1)].push(new zu({ shape: { points: S.concat(w) } })); w = S.slice().reverse() } } var I = a.getLineStyle(), T = s.getAreaStyle(); E(g, (function (t, e) { this.group.add(Ch(t, { style: k({ stroke: \"none\", fill: d[e % d.length] }, T), silent: !0 })) }), this), E(f, (function (t, e) { this.group.add(Ch(t, { style: k({ fill: \"none\", stroke: p[e % p.length] }, I), silent: !0 })) }), this) } function C(t, e, n) { var i = n % e.length; return t[i] = t[i] || [], i } }, e.type = \"radar\", e }(mg), CI = function (t) { function e(e, n, i) { var r = t.call(this, e, n, i) || this; return r.type = \"value\", r.angle = 0, r.name = \"\", r } return n(e, t), e }(X_), DI = function () { function t(t, e, n) { this.dimensions = [], this._model = t, this._indicatorAxes = z(t.getIndicatorModels(), (function (t, e) { var n = \"indicator_\" + e, i = new CI(n, new Sx); return i.name = t.get(\"name\"), i.model = t, t.axis = i, this.dimensions.push(n), i }), this), this.resize(t, n) } return t.prototype.getIndicatorAxes = function () { return this._indicatorAxes }, t.prototype.dataToPoint = function (t, e) { var n = this._indicatorAxes[e]; return this.coordToPoint(n.dataToCoord(t), e) }, t.prototype.coordToPoint = function (t, e) { var n = this._indicatorAxes[e].angle; return [this.cx + t * Math.cos(n), this.cy - t * Math.sin(n)] }, t.prototype.pointToData = function (t) { var e = t[0] - this.cx, n = t[1] - this.cy, i = Math.sqrt(e * e + n * n); e /= i, n /= i; for (var r, o = Math.atan2(-n, e), a = 1 / 0, s = -1, l = 0; l < this._indicatorAxes.length; l++) { var u = this._indicatorAxes[l], h = Math.abs(o - u.angle); h < a && (r = u, s = l, a = h) } return [s, +(r && r.coordToData(i))] }, t.prototype.resize = function (t, e) { var n = t.get(\"center\"), i = e.getWidth(), r = e.getHeight(), o = Math.min(i, r) / 2; this.cx = Gr(n[0], i), this.cy = Gr(n[1], r), this.startAngle = t.get(\"startAngle\") * Math.PI / 180; var a = t.get(\"radius\"); (X(a) || j(a)) && (a = [0, a]), this.r0 = Gr(a[0], o), this.r = Gr(a[1], o), E(this._indicatorAxes, (function (t, e) { t.setExtent(this.r0, this.r); var n = this.startAngle + e * Math.PI * 2 / this._indicatorAxes.length; n = Math.atan2(Math.sin(n), Math.cos(n)), t.angle = n }), this) }, t.prototype.update = function (t, e) { var n = this._indicatorAxes, i = this._model; E(n, (function (t) { t.scale.setExtent(1 / 0, -1 / 0) })), t.eachSeriesByType(\"radar\", (function (e, r) { if (\"radar\" === e.get(\"coordinateSystem\") && t.getComponent(\"radar\", e.get(\"radarIndex\")) === i) { var o = e.getData(); E(n, (function (t) { t.scale.unionExtentFromData(o, o.mapDimension(t.dim)) })) } }), this); var r = i.get(\"splitNumber\"), o = new Sx; o.setExtent(0, r), o.setInterval(1), E(n, (function (t, e) { VM(t.scale, t.model, o) })) }, t.prototype.convertToPixel = function (t, e, n) { return console.warn(\"Not implemented.\"), null }, t.prototype.convertFromPixel = function (t, e, n) { return console.warn(\"Not implemented.\"), null }, t.prototype.containPoint = function (t) { return console.warn(\"Not implemented.\"), !1 }, t.create = function (e, n) { var i = []; return e.eachComponent(\"radar\", (function (r) { var o = new t(r, e, n); i.push(o), r.coordinateSystem = o })), e.eachSeriesByType(\"radar\", (function (t) { \"radar\" === t.get(\"coordinateSystem\") && (t.coordinateSystem = i[t.get(\"radarIndex\") || 0]) })), i }, t.dimensions = [], t }(); function AI(t) { t.registerCoordinateSystem(\"radar\", DI), t.registerComponentModel(MI), t.registerComponentView(TI), t.registerVisual({ seriesType: \"radar\", reset: function (t) { var e = t.getData(); e.each((function (t) { e.setItemVisual(t, \"legendIcon\", \"roundRect\") })), e.setVisual(\"legendIcon\", \"roundRect\") } }) } var kI = \"\\0_ec_interaction_mutex\"; function LI(t, e) { return !!PI(t)[e] } function PI(t) { return t[kI] || (t[kI] = {}) } fm({ type: \"takeGlobalCursor\", event: \"globalCursorTaken\", update: \"update\" }, xt); var OI = function (t) { function e(e) { var n = t.call(this) || this; n._zr = e; var i = W(n._mousedownHandler, n), r = W(n._mousemoveHandler, n), o = W(n._mouseupHandler, n), a = W(n._mousewheelHandler, n), s = W(n._pinchHandler, n); return n.enable = function (t, n) { this.disable(), this._opt = k(T(n) || {}, { zoomOnMouseWheel: !0, moveOnMouseMove: !0, moveOnMouseWheel: !1, preventDefaultMouseMove: !0 }), null == t && (t = !0), !0 !== t && \"move\" !== t && \"pan\" !== t || (e.on(\"mousedown\", i), e.on(\"mousemove\", r), e.on(\"mouseup\", o)), !0 !== t && \"scale\" !== t && \"zoom\" !== t || (e.on(\"mousewheel\", a), e.on(\"pinch\", s)) }, n.disable = function () { e.off(\"mousedown\", i), e.off(\"mousemove\", r), e.off(\"mouseup\", o), e.off(\"mousewheel\", a), e.off(\"pinch\", s) }, n } return n(e, t), e.prototype.isDragging = function () { return this._dragging }, e.prototype.isPinching = function () { return this._pinching }, e.prototype.setPointerChecker = function (t) { this.pointerChecker = t }, e.prototype.dispose = function () { this.disable() }, e.prototype._mousedownHandler = function (t) { if (!ce(t)) { for (var e = t.target; e;) { if (e.draggable) return; e = e.__hostTarget || e.parent } var n = t.offsetX, i = t.offsetY; this.pointerChecker && this.pointerChecker(t, n, i) && (this._x = n, this._y = i, this._dragging = !0) } }, e.prototype._mousemoveHandler = function (t) { if (this._dragging && EI(\"moveOnMouseMove\", t, this._opt) && \"pinch\" !== t.gestureEvent && !LI(this._zr, \"globalPan\")) { var e = t.offsetX, n = t.offsetY, i = this._x, r = this._y, o = e - i, a = n - r; this._x = e, this._y = n, this._opt.preventDefaultMouseMove && he(t.event), NI(this, \"pan\", \"moveOnMouseMove\", t, { dx: o, dy: a, oldX: i, oldY: r, newX: e, newY: n, isAvailableBehavior: null }) } }, e.prototype._mouseupHandler = function (t) { ce(t) || (this._dragging = !1) }, e.prototype._mousewheelHandler = function (t) { var e = EI(\"zoomOnMouseWheel\", t, this._opt), n = EI(\"moveOnMouseWheel\", t, this._opt), i = t.wheelDelta, r = Math.abs(i), o = t.offsetX, a = t.offsetY; if (0 !== i && (e || n)) { if (e) { var s = r > 3 ? 1.4 : r > 1 ? 1.2 : 1.1; RI(this, \"zoom\", \"zoomOnMouseWheel\", t, { scale: i > 0 ? s : 1 / s, originX: o, originY: a, isAvailableBehavior: null }) } if (n) { var l = Math.abs(i); RI(this, \"scrollMove\", \"moveOnMouseWheel\", t, { scrollDelta: (i > 0 ? 1 : -1) * (l > 3 ? .4 : l > 1 ? .15 : .05), originX: o, originY: a, isAvailableBehavior: null }) } } }, e.prototype._pinchHandler = function (t) { LI(this._zr, \"globalPan\") || RI(this, \"zoom\", null, t, { scale: t.pinchScale > 1 ? 1.1 : 1 / 1.1, originX: t.pinchX, originY: t.pinchY, isAvailableBehavior: null }) }, e }(Xt); function RI(t, e, n, i, r) { t.pointerChecker && t.pointerChecker(i, r.originX, r.originY) && (he(i.event), NI(t, e, n, i, r)) } function NI(t, e, n, i, r) { r.isAvailableBehavior = W(EI, null, n, i), t.trigger(e, r) } function EI(t, e, n) { var i = n[t]; return !t || i && (!X(i) || e.event[i + \"Key\"]) } function zI(t, e, n) { var i = t.target; i.x += e, i.y += n, i.dirty() } function VI(t, e, n, i) { var r = t.target, o = t.zoomLimit, a = t.zoom = t.zoom || 1; if (a *= e, o) { var s = o.min || 0, l = o.max || 1 / 0; a = Math.max(Math.min(l, a), s) } var u = a / t.zoom; t.zoom = a, r.x -= (n - r.x) * (u - 1), r.y -= (i - r.y) * (u - 1), r.scaleX *= u, r.scaleY *= u, r.dirty() } var BI, FI = { axisPointer: 1, tooltip: 1, brush: 1 }; function GI(t, e, n) { var i = e.getComponentByElement(t.topTarget), r = i && i.coordinateSystem; return i && i !== n && !FI.hasOwnProperty(i.mainType) && r && r.model !== n } function WI(t) { X(t) && (t = (new DOMParser).parseFromString(t, \"text/xml\")); var e = t; for (9 === e.nodeType && (e = e.firstChild); \"svg\" !== e.nodeName.toLowerCase() || 1 !== e.nodeType;)e = e.nextSibling; return e } var HI = { fill: \"fill\", stroke: \"stroke\", \"stroke-width\": \"lineWidth\", opacity: \"opacity\", \"fill-opacity\": \"fillOpacity\", \"stroke-opacity\": \"strokeOpacity\", \"stroke-dasharray\": \"lineDash\", \"stroke-dashoffset\": \"lineDashOffset\", \"stroke-linecap\": \"lineCap\", \"stroke-linejoin\": \"lineJoin\", \"stroke-miterlimit\": \"miterLimit\", \"font-family\": \"fontFamily\", \"font-size\": \"fontSize\", \"font-style\": \"fontStyle\", \"font-weight\": \"fontWeight\", \"text-anchor\": \"textAlign\", visibility: \"visibility\", display: \"display\" }, YI = G(HI), UI = { \"alignment-baseline\": \"textBaseline\", \"stop-color\": \"stopColor\" }, XI = G(UI), ZI = function () { function t() { this._defs = {}, this._root = null } return t.prototype.parse = function (t, e) { e = e || {}; var n = WI(t); this._defsUsePending = []; var i = new Pr; this._root = i; var r = [], o = n.getAttribute(\"viewBox\") || \"\", a = parseFloat(n.getAttribute(\"width\") || e.width), s = parseFloat(n.getAttribute(\"height\") || e.height); isNaN(a) && (a = null), isNaN(s) && (s = null), QI(n, i, null, !0, !1); for (var l, u, h = n.firstChild; h;)this._parseNode(h, i, r, null, !1, !1), h = h.nextSibling; if (function (t, e) { for (var n = 0; n < e.length; n++) { var i = e[n]; i[0].style[i[1]] = t[i[2]] } }(this._defs, this._defsUsePending), this._defsUsePending = [], o) { var c = iT(o); c.length >= 4 && (l = { x: parseFloat(c[0] || 0), y: parseFloat(c[1] || 0), width: parseFloat(c[2]), height: parseFloat(c[3]) }) } if (l && null != a && null != s && (u = lT(l, { x: 0, y: 0, width: a, height: s }), !e.ignoreViewBox)) { var p = i; (i = new Pr).add(p), p.scaleX = p.scaleY = u.scale, p.x = u.x, p.y = u.y } return e.ignoreRootClip || null == a || null == s || i.setClipPath(new Ps({ shape: { x: 0, y: 0, width: a, height: s } })), { root: i, width: a, height: s, viewBoxRect: l, viewBoxTransform: u, named: r } }, t.prototype._parseNode = function (t, e, n, i, r, o) { var a, s = t.nodeName.toLowerCase(), l = i; if (\"defs\" === s && (r = !0), \"text\" === s && (o = !0), \"defs\" === s || \"switch\" === s) a = e; else { if (!r) { var u = BI[s]; if (u && mt(BI, s)) { a = u.call(this, t, e); var h = t.getAttribute(\"name\"); if (h) { var c = { name: h, namedFrom: null, svgNodeTagLower: s, el: a }; n.push(c), \"g\" === s && (l = c) } else i && n.push({ name: i.name, namedFrom: i, svgNodeTagLower: s, el: a }); e.add(a) } } var p = jI[s]; if (p && mt(jI, s)) { var d = p.call(this, t), f = t.getAttribute(\"id\"); f && (this._defs[f] = d) } } if (a && a.isGroup) for (var g = t.firstChild; g;)1 === g.nodeType ? this._parseNode(g, a, n, l, r, o) : 3 === g.nodeType && o && this._parseText(g, a), g = g.nextSibling }, t.prototype._parseText = function (t, e) { var n = new ws({ style: { text: t.textContent }, silent: !0, x: this._textX || 0, y: this._textY || 0 }); $I(e, n), QI(t, n, this._defsUsePending, !1, !1), function (t, e) { var n = e.__selfStyle; if (n) { var i = n.textBaseline, r = i; i && \"auto\" !== i ? \"baseline\" === i ? r = \"alphabetic\" : \"before-edge\" === i || \"text-before-edge\" === i ? r = \"top\" : \"after-edge\" === i || \"text-after-edge\" === i ? r = \"bottom\" : \"central\" !== i && \"mathematical\" !== i || (r = \"middle\") : r = \"alphabetic\", t.style.textBaseline = r } var o = e.__inheritedStyle; if (o) { var a = o.textAlign, s = a; a && (\"middle\" === a && (s = \"center\"), t.style.textAlign = s) } }(n, e); var i = n.style, r = i.fontSize; r && r < 9 && (i.fontSize = 9, n.scaleX *= r / 9, n.scaleY *= r / 9); var o = (i.fontSize || i.fontFamily) && [i.fontStyle, i.fontWeight, (i.fontSize || 12) + \"px\", i.fontFamily || \"sans-serif\"].join(\" \"); i.font = o; var a = n.getBoundingRect(); return this._textX += a.width, e.add(n), n }, t.internalField = void (BI = { g: function (t, e) { var n = new Pr; return $I(e, n), QI(t, n, this._defsUsePending, !1, !1), n }, rect: function (t, e) { var n = new Ps; return $I(e, n), QI(t, n, this._defsUsePending, !1, !1), n.setShape({ x: parseFloat(t.getAttribute(\"x\") || \"0\"), y: parseFloat(t.getAttribute(\"y\") || \"0\"), width: parseFloat(t.getAttribute(\"width\") || \"0\"), height: parseFloat(t.getAttribute(\"height\") || \"0\") }), n.silent = !0, n }, circle: function (t, e) { var n = new gu; return $I(e, n), QI(t, n, this._defsUsePending, !1, !1), n.setShape({ cx: parseFloat(t.getAttribute(\"cx\") || \"0\"), cy: parseFloat(t.getAttribute(\"cy\") || \"0\"), r: parseFloat(t.getAttribute(\"r\") || \"0\") }), n.silent = !0, n }, line: function (t, e) { var n = new Wu; return $I(e, n), QI(t, n, this._defsUsePending, !1, !1), n.setShape({ x1: parseFloat(t.getAttribute(\"x1\") || \"0\"), y1: parseFloat(t.getAttribute(\"y1\") || \"0\"), x2: parseFloat(t.getAttribute(\"x2\") || \"0\"), y2: parseFloat(t.getAttribute(\"y2\") || \"0\") }), n.silent = !0, n }, ellipse: function (t, e) { var n = new vu; return $I(e, n), QI(t, n, this._defsUsePending, !1, !1), n.setShape({ cx: parseFloat(t.getAttribute(\"cx\") || \"0\"), cy: parseFloat(t.getAttribute(\"cy\") || \"0\"), rx: parseFloat(t.getAttribute(\"rx\") || \"0\"), ry: parseFloat(t.getAttribute(\"ry\") || \"0\") }), n.silent = !0, n }, polygon: function (t, e) { var n, i = t.getAttribute(\"points\"); i && (n = JI(i)); var r = new zu({ shape: { points: n || [] }, silent: !0 }); return $I(e, r), QI(t, r, this._defsUsePending, !1, !1), r }, polyline: function (t, e) { var n, i = t.getAttribute(\"points\"); i && (n = JI(i)); var r = new Bu({ shape: { points: n || [] }, silent: !0 }); return $I(e, r), QI(t, r, this._defsUsePending, !1, !1), r }, image: function (t, e) { var n = new Is; return $I(e, n), QI(t, n, this._defsUsePending, !1, !1), n.setStyle({ image: t.getAttribute(\"xlink:href\") || t.getAttribute(\"href\"), x: +t.getAttribute(\"x\"), y: +t.getAttribute(\"y\"), width: +t.getAttribute(\"width\"), height: +t.getAttribute(\"height\") }), n.silent = !0, n }, text: function (t, e) { var n = t.getAttribute(\"x\") || \"0\", i = t.getAttribute(\"y\") || \"0\", r = t.getAttribute(\"dx\") || \"0\", o = t.getAttribute(\"dy\") || \"0\"; this._textX = parseFloat(n) + parseFloat(r), this._textY = parseFloat(i) + parseFloat(o); var a = new Pr; return $I(e, a), QI(t, a, this._defsUsePending, !1, !0), a }, tspan: function (t, e) { var n = t.getAttribute(\"x\"), i = t.getAttribute(\"y\"); null != n && (this._textX = parseFloat(n)), null != i && (this._textY = parseFloat(i)); var r = t.getAttribute(\"dx\") || \"0\", o = t.getAttribute(\"dy\") || \"0\", a = new Pr; return $I(e, a), QI(t, a, this._defsUsePending, !1, !0), this._textX += parseFloat(r), this._textY += parseFloat(o), a }, path: function (t, e) { var n = pu(t.getAttribute(\"d\") || \"\"); return $I(e, n), QI(t, n, this._defsUsePending, !1, !1), n.silent = !0, n } }), t }(), jI = { lineargradient: function (t) { var e = parseInt(t.getAttribute(\"x1\") || \"0\", 10), n = parseInt(t.getAttribute(\"y1\") || \"0\", 10), i = parseInt(t.getAttribute(\"x2\") || \"10\", 10), r = parseInt(t.getAttribute(\"y2\") || \"0\", 10), o = new $u(e, n, i, r); return qI(t, o), KI(t, o), o }, radialgradient: function (t) { var e = parseInt(t.getAttribute(\"cx\") || \"0\", 10), n = parseInt(t.getAttribute(\"cy\") || \"0\", 10), i = parseInt(t.getAttribute(\"r\") || \"0\", 10), r = new Ju(e, n, i); return qI(t, r), KI(t, r), r } }; function qI(t, e) { \"userSpaceOnUse\" === t.getAttribute(\"gradientUnits\") && (e.global = !0) } function KI(t, e) { for (var n = t.firstChild; n;) { if (1 === n.nodeType && \"stop\" === n.nodeName.toLocaleLowerCase()) { var i = n.getAttribute(\"offset\"), r = void 0; r = i && i.indexOf(\"%\") > 0 ? parseInt(i, 10) / 100 : i ? parseFloat(i) : 0; var o = {}; sT(n, o, o); var a = o.stopColor || n.getAttribute(\"stop-color\") || \"#000000\"; e.colorStops.push({ offset: r, color: a }) } n = n.nextSibling } } function $I(t, e) { t && t.__inheritedStyle && (e.__inheritedStyle || (e.__inheritedStyle = {}), k(e.__inheritedStyle, t.__inheritedStyle)) } function JI(t) { for (var e = iT(t), n = [], i = 0; i < e.length; i += 2) { var r = parseFloat(e[i]), o = parseFloat(e[i + 1]); n.push([r, o]) } return n } function QI(t, e, n, i, r) { var o = e, a = o.__inheritedStyle = o.__inheritedStyle || {}, s = {}; 1 === t.nodeType && (function (t, e) { var n = t.getAttribute(\"transform\"); if (n) { n = n.replace(/,/g, \" \"); var i = [], r = null; n.replace(rT, (function (t, e, n) { return i.push(e, n), \"\" })); for (var o = i.length - 1; o > 0; o -= 2) { var a = i[o], s = i[o - 1], l = iT(a); switch (r = r || [1, 0, 0, 1, 0, 0], s) { case \"translate\": xe(r, r, [parseFloat(l[0]), parseFloat(l[1] || \"0\")]); break; case \"scale\": be(r, r, [parseFloat(l[0]), parseFloat(l[1] || l[0])]); break; case \"rotate\": _e(r, r, -parseFloat(l[0]) * oT); break; case \"skewX\": me(r, [1, 0, Math.tan(parseFloat(l[0]) * oT), 1, 0, 0], r); break; case \"skewY\": me(r, [1, Math.tan(parseFloat(l[0]) * oT), 0, 1, 0, 0], r); break; case \"matrix\": r[0] = parseFloat(l[0]), r[1] = parseFloat(l[1]), r[2] = parseFloat(l[2]), r[3] = parseFloat(l[3]), r[4] = parseFloat(l[4]), r[5] = parseFloat(l[5]) } } e.setLocalTransform(r) } }(t, e), sT(t, a, s), i || function (t, e, n) { for (var i = 0; i < YI.length; i++) { var r = YI[i]; null != (o = t.getAttribute(r)) && (e[HI[r]] = o) } for (i = 0; i < XI.length; i++) { var o; r = XI[i]; null != (o = t.getAttribute(r)) && (n[UI[r]] = o) } }(t, a, s)), o.style = o.style || {}, null != a.fill && (o.style.fill = eT(o, \"fill\", a.fill, n)), null != a.stroke && (o.style.stroke = eT(o, \"stroke\", a.stroke, n)), E([\"lineWidth\", \"opacity\", \"fillOpacity\", \"strokeOpacity\", \"miterLimit\", \"fontSize\"], (function (t) { null != a[t] && (o.style[t] = parseFloat(a[t])) })), E([\"lineDashOffset\", \"lineCap\", \"lineJoin\", \"fontWeight\", \"fontFamily\", \"fontStyle\", \"textAlign\"], (function (t) { null != a[t] && (o.style[t] = a[t]) })), r && (o.__selfStyle = s), a.lineDash && (o.style.lineDash = z(iT(a.lineDash), (function (t) { return parseFloat(t) }))), \"hidden\" !== a.visibility && \"collapse\" !== a.visibility || (o.invisible = !0), \"none\" === a.display && (o.ignore = !0) } var tT = /^url\\(\\s*#(.*?)\\)/; function eT(t, e, n, i) { var r = n && n.match(tT); if (!r) return \"none\" === n && (n = null), n; var o = ut(r[1]); i.push([t, e, o]) } var nT = /-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g; function iT(t) { return t.match(nT) || [] } var rT = /(translate|scale|rotate|skewX|skewY|matrix)\\(([\\-\\s0-9\\.eE,]*)\\)/g, oT = Math.PI / 180; var aT = /([^\\s:;]+)\\s*:\\s*([^:;]+)/g; function sT(t, e, n) { var i, r = t.getAttribute(\"style\"); if (r) for (aT.lastIndex = 0; null != (i = aT.exec(r));) { var o = i[1], a = mt(HI, o) ? HI[o] : null; a && (e[a] = i[2]); var s = mt(UI, o) ? UI[o] : null; s && (n[s] = i[2]) } } function lT(t, e) { var n = e.width / t.width, i = e.height / t.height, r = Math.min(n, i); return { scale: r, x: -(t.x + t.width / 2) * r + (e.x + e.width / 2), y: -(t.y + t.height / 2) * r + (e.y + e.height / 2) } } var uT = ft([\"rect\", \"circle\", \"line\", \"ellipse\", \"polygon\", \"polyline\", \"path\", \"text\", \"tspan\", \"g\"]), hT = function () { function t(t, e) { this.type = \"geoSVG\", this._usedGraphicMap = ft(), this._freedGraphics = [], this._mapName = t, this._parsedXML = WI(e) } return t.prototype.load = function () { var t = this._firstGraphic; if (!t) { t = this._firstGraphic = this._buildGraphic(this._parsedXML), this._freedGraphics.push(t), this._boundingRect = this._firstGraphic.boundingRect.clone(); var e = function (t) { var e = [], n = ft(); return E(t, (function (t) { if (null == t.namedFrom) { var i = new C_(t.name, t.el); e.push(i), n.set(t.name, i) } })), { regions: e, regionsMap: n } }(t.named), n = e.regions, i = e.regionsMap; this._regions = n, this._regionsMap = i } return { boundingRect: this._boundingRect, regions: this._regions, regionsMap: this._regionsMap } }, t.prototype._buildGraphic = function (t) { var e, n, i, r; try { lt(null != (n = (e = t && (i = t, r = { ignoreViewBox: !0, ignoreRootClip: !0 }, (new ZI).parse(i, r)) || {}).root)) } catch (t) { throw new Error(\"Invalid svg format\\n\" + t.message) } var o = new Pr; o.add(n), o.isGeoSVGGraphicRoot = !0; var a = e.width, s = e.height, l = e.viewBoxRect, u = this._boundingRect; if (!u) { var h = void 0, c = void 0, p = void 0, d = void 0; if (null != a ? (h = 0, p = a) : l && (h = l.x, p = l.width), null != s ? (c = 0, d = s) : l && (c = l.y, d = l.height), null == h || null == c) { var f = n.getBoundingRect(); null == h && (h = f.x, p = f.width), null == c && (c = f.y, d = f.height) } u = this._boundingRect = new Re(h, c, p, d) } if (l) { var g = lT(l, u); n.scaleX = n.scaleY = g.scale, n.x = g.x, n.y = g.y } o.setClipPath(new Ps({ shape: u.plain() })); var y = []; return E(e.named, (function (t) { var e; null != uT.get(t.svgNodeTagLower) && (y.push(t), (e = t.el).silent = !1, e.isGroup && e.traverse((function (t) { t.silent = !1 }))) })), { root: o, boundingRect: u, named: y } }, t.prototype.useGraphic = function (t) { var e = this._usedGraphicMap, n = e.get(t); return n || (n = this._freedGraphics.pop() || this._buildGraphic(this._parsedXML), e.set(t, n), n) }, t.prototype.freeGraphic = function (t) { var e = this._usedGraphicMap, n = e.get(t); n && (e.removeKey(t), this._freedGraphics.push(n)) }, t }(); for (var cT = [126, 25], pT = \"南海诸岛\", dT = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, .7], [52, .7], [56, 7.7], [59, .7], [64, .7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]], fT = 0; fT < dT.length; fT++)for (var gT = 0; gT < dT[fT].length; gT++)dT[fT][gT][0] /= 10.5, dT[fT][gT][1] /= -14, dT[fT][gT][0] += cT[0], dT[fT][gT][1] += cT[1]; var yT = { \"南海诸岛\": [32, 80], \"广东\": [0, -10], \"香港\": [10, 5], \"澳门\": [-10, 10], \"天津\": [5, 5] }; var vT = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]]; var mT = function () { function t(t, e, n) { var i; this.type = \"geoJSON\", this._parsedMap = ft(), this._mapName = t, this._specialAreas = n, this._geoJSON = X(i = e) ? \"undefined\" != typeof JSON && JSON.parse ? JSON.parse(i) : new Function(\"return (\" + i + \");\")() : i } return t.prototype.load = function (t, e) { e = e || \"name\"; var n = this._parsedMap.get(e); if (!n) { var i = this._parseToRegions(e); n = this._parsedMap.set(e, { regions: i, boundingRect: xT(i) }) } var r = ft(), o = []; return E(n.regions, (function (e) { var n = e.name; t && mt(t, n) && (e = e.cloneShallow(n = t[n])), o.push(e), r.set(n, e) })), { regions: o, boundingRect: n.boundingRect || new Re(0, 0, 0, 0), regionsMap: r } }, t.prototype._parseToRegions = function (t) { var e, n = this._mapName, i = this._geoJSON; try { e = i ? k_(i, t) : [] } catch (t) { throw new Error(\"Invalid geoJson format\\n\" + t.message) } return function (t, e) { if (\"china\" === t) { for (var n = 0; n < e.length; n++)if (e[n].name === pT) return; e.push(new T_(pT, z(dT, (function (t) { return { type: \"polygon\", exterior: t } })), cT)) } }(n, e), E(e, (function (t) { var e = t.name; !function (t, e) { if (\"china\" === t) { var n = yT[e.name]; if (n) { var i = e.getCenter(); i[0] += n[0] / 10.5, i[1] += -n[1] / 14, e.setCenter(i) } } }(n, t), function (t, e) { \"china\" === t && \"台湾\" === e.name && e.geometries.push({ type: \"polygon\", exterior: vT[0] }) }(n, t); var i = this._specialAreas && this._specialAreas[e]; i && t.transformTo(i.left, i.top, i.width, i.height) }), this), e }, t.prototype.getMapForUser = function () { return { geoJson: this._geoJSON, geoJSON: this._geoJSON, specialAreas: this._specialAreas } }, t }(); function xT(t) { for (var e, n = 0; n < t.length; n++) { var i = t[n].getBoundingRect(); (e = e || i.clone()).union(i) } return e } var _T = ft(), bT = function (t, e, n) { if (e.svg) { var i = new hT(t, e.svg); _T.set(t, i) } else { var r = e.geoJson || e.geoJSON; r && !e.features ? n = e.specialAreas : r = e; i = new mT(t, r, n); _T.set(t, i) } }, wT = function (t) { return _T.get(t) }, ST = function (t) { var e = _T.get(t); return e && \"geoJSON\" === e.type && e.getMapForUser() }, MT = function (t, e, n) { var i = _T.get(t); if (i) return i.load(e, n) }, IT = [\"rect\", \"circle\", \"line\", \"ellipse\", \"polygon\", \"polyline\", \"path\"], TT = ft(IT), CT = ft(IT.concat([\"g\"])), DT = ft(IT.concat([\"g\"])), AT = Do(); function kT(t) { var e = t.getItemStyle(), n = t.get(\"areaColor\"); return null != n && (e.fill = n), e } function LT(t) { var e = t.style; e && (e.stroke = e.stroke || e.fill, e.fill = null) } var PT = function () { function t(t) { var e = new Pr; this.uid = bc(\"ec_map_draw\"), this._controller = new OI(t.getZr()), this._controllerHost = { target: e }, this.group = e, e.add(this._regionsGroup = new Pr), e.add(this._svgGroup = new Pr) } return t.prototype.draw = function (t, e, n, i, r) { var o = \"geo\" === t.mainType, a = t.getData && t.getData(); o && e.eachComponent({ mainType: \"series\", subType: \"map\" }, (function (e) { a || e.getHostGeoModel() !== t || (a = e.getData()) })); var s = t.coordinateSystem, l = this._regionsGroup, u = this.group, h = s.getTransformInfo(), c = h.raw, p = h.roam; !l.childAt(0) || r ? (u.x = p.x, u.y = p.y, u.scaleX = p.scaleX, u.scaleY = p.scaleY, u.dirty()) : uh(u, p, t); var d = a && a.getVisual(\"visualMeta\") && a.getVisual(\"visualMeta\").length > 0, f = { api: n, geo: s, mapOrGeoModel: t, data: a, isVisualEncodedByVisualMap: d, isGeo: o, transformInfoRaw: c }; \"geoJSON\" === s.resourceType ? this._buildGeoJSON(f) : \"geoSVG\" === s.resourceType && this._buildSVG(f), this._updateController(t, e, n), this._updateMapSelectHandler(t, l, n, i) }, t.prototype._buildGeoJSON = function (t) { var e = this._regionsGroupByName = ft(), n = ft(), i = this._regionsGroup, r = t.transformInfoRaw, o = t.mapOrGeoModel, a = t.data, s = t.geo.projection, l = s && s.stream; function u(t, e) { return e && (t = e(t)), t && [t[0] * r.scaleX + r.x, t[1] * r.scaleY + r.y] } function h(t) { for (var e = [], n = !l && s && s.project, i = 0; i < t.length; ++i) { var r = u(t[i], n); r && e.push(r) } return e } function c(t) { return { shape: { points: h(t) } } } i.removeAll(), E(t.geo.regions, (function (r) { var h = r.name, p = e.get(h), d = n.get(h) || {}, f = d.dataIdx, g = d.regionModel; p || (p = e.set(h, new Pr), i.add(p), f = a ? a.indexOfName(h) : null, g = t.isGeo ? o.getRegionModel(h) : a ? a.getItemModel(f) : null, n.set(h, { dataIdx: f, regionModel: g })); var y = [], v = []; E(r.geometries, (function (t) { if (\"polygon\" === t.type) { var e = [t.exterior].concat(t.interiors || []); l && (e = VT(e, l)), E(e, (function (t) { y.push(new zu(c(t))) })) } else { var n = t.points; l && (n = VT(n, l, !0)), E(n, (function (t) { v.push(new Bu(c(t))) })) } })); var m = u(r.getCenter(), s && s.project); function x(e, n) { if (e.length) { var i = new qu({ culling: !0, segmentIgnoreThreshold: 1, shape: { paths: e } }); p.add(i), OT(t, i, f, g), RT(t, i, h, g, o, f, m), n && (LT(i), E(i.states, LT)) } } x(y), x(v, !0) })), e.each((function (e, i) { var r = n.get(i), a = r.dataIdx, s = r.regionModel; NT(t, e, i, s, o, a), ET(t, e, i, s, o), zT(t, e, i, s, o) }), this) }, t.prototype._buildSVG = function (t) { var e = t.geo.map, n = t.transformInfoRaw; this._svgGroup.x = n.x, this._svgGroup.y = n.y, this._svgGroup.scaleX = n.scaleX, this._svgGroup.scaleY = n.scaleY, this._svgResourceChanged(e) && (this._freeSVG(), this._useSVG(e)); var i = this._svgDispatcherMap = ft(), r = !1; E(this._svgGraphicRecord.named, (function (e) { var n = e.name, o = t.mapOrGeoModel, a = t.data, s = e.svgNodeTagLower, l = e.el, u = a ? a.indexOfName(n) : null, h = o.getRegionModel(n); (null != TT.get(s) && l instanceof ma && OT(t, l, u, h), l instanceof ma && (l.culling = !0), l.z2EmphasisLift = 0, e.namedFrom) || (null != DT.get(s) && RT(t, l, n, h, o, u, null), NT(t, l, n, h, o, u), ET(t, l, n, h, o), null != CT.get(s) && (\"self\" === zT(t, l, n, h, o) && (r = !0), (i.get(n) || i.set(n, [])).push(l))) }), this), this._enableBlurEntireSVG(r, t) }, t.prototype._enableBlurEntireSVG = function (t, e) { if (t && e.isGeo) { var n = e.mapOrGeoModel.getModel([\"blur\", \"itemStyle\"]).getItemStyle().opacity; this._svgGraphicRecord.root.traverse((function (t) { if (!t.isGroup) { wl(t); var e = t.ensureState(\"blur\").style || {}; null == e.opacity && null != n && (e.opacity = n), t.ensureState(\"emphasis\") } })) } }, t.prototype.remove = function () { this._regionsGroup.removeAll(), this._regionsGroupByName = null, this._svgGroup.removeAll(), this._freeSVG(), this._controller.dispose(), this._controllerHost = null }, t.prototype.findHighDownDispatchers = function (t, e) { if (null == t) return []; var n = e.coordinateSystem; if (\"geoJSON\" === n.resourceType) { var i = this._regionsGroupByName; if (i) { var r = i.get(t); return r ? [r] : [] } } else if (\"geoSVG\" === n.resourceType) return this._svgDispatcherMap && this._svgDispatcherMap.get(t) || [] }, t.prototype._svgResourceChanged = function (t) { return this._svgMapName !== t }, t.prototype._useSVG = function (t) { var e = wT(t); if (e && \"geoSVG\" === e.type) { var n = e.useGraphic(this.uid); this._svgGroup.add(n.root), this._svgGraphicRecord = n, this._svgMapName = t } }, t.prototype._freeSVG = function () { var t = this._svgMapName; if (null != t) { var e = wT(t); e && \"geoSVG\" === e.type && e.freeGraphic(this.uid), this._svgGraphicRecord = null, this._svgDispatcherMap = null, this._svgGroup.removeAll(), this._svgMapName = null } }, t.prototype._updateController = function (t, e, n) { var i = t.coordinateSystem, r = this._controller, o = this._controllerHost; o.zoomLimit = t.get(\"scaleLimit\"), o.zoom = i.getZoom(), r.enable(t.get(\"roam\") || !1); var a = t.mainType; function s() { var e = { type: \"geoRoam\", componentType: a }; return e[a + \"Id\"] = t.id, e } r.off(\"pan\").on(\"pan\", (function (t) { this._mouseDownFlag = !1, zI(o, t.dx, t.dy), n.dispatchAction(A(s(), { dx: t.dx, dy: t.dy, animation: { duration: 0 } })) }), this), r.off(\"zoom\").on(\"zoom\", (function (t) { this._mouseDownFlag = !1, VI(o, t.scale, t.originX, t.originY), n.dispatchAction(A(s(), { zoom: t.scale, originX: t.originX, originY: t.originY, animation: { duration: 0 } })) }), this), r.setPointerChecker((function (e, r, o) { return i.containPoint([r, o]) && !GI(e, n, t) })) }, t.prototype.resetForLabelLayout = function () { this.group.traverse((function (t) { var e = t.getTextContent(); e && (e.ignore = AT(e).ignore) })) }, t.prototype._updateMapSelectHandler = function (t, e, n, i) { var r = this; e.off(\"mousedown\"), e.off(\"click\"), t.get(\"selectedMode\") && (e.on(\"mousedown\", (function () { r._mouseDownFlag = !0 })), e.on(\"click\", (function (t) { r._mouseDownFlag && (r._mouseDownFlag = !1) }))) }, t }(); function OT(t, e, n, i) { var r = i.getModel(\"itemStyle\"), o = i.getModel([\"emphasis\", \"itemStyle\"]), a = i.getModel([\"blur\", \"itemStyle\"]), s = i.getModel([\"select\", \"itemStyle\"]), l = kT(r), u = kT(o), h = kT(s), c = kT(a), p = t.data; if (p) { var d = p.getItemVisual(n, \"style\"), f = p.getItemVisual(n, \"decal\"); t.isVisualEncodedByVisualMap && d.fill && (l.fill = d.fill), f && (l.decal = sv(f, t.api)) } e.setStyle(l), e.style.strokeNoScale = !0, e.ensureState(\"emphasis\").style = u, e.ensureState(\"select\").style = h, e.ensureState(\"blur\").style = c, wl(e) } function RT(t, e, n, i, r, o, a) { var s = t.data, l = t.isGeo, u = s && isNaN(s.get(s.mapDimension(\"value\"), o)), h = s && s.getItemLayout(o); if (l || u || h && h.showLabel) { var c = l ? n : o, p = void 0; (!s || o >= 0) && (p = r); var d = a ? { normal: { align: \"center\", verticalAlign: \"middle\" } } : null; qh(e, Kh(i), { labelFetcher: p, labelDataIndex: c, defaultText: n }, d); var f = e.getTextContent(); if (f && (AT(f).ignore = f.ignore, e.textConfig && a)) { var g = e.getBoundingRect().clone(); e.textConfig.layoutRect = g, e.textConfig.position = [(a[0] - g.x) / g.width * 100 + \"%\", (a[1] - g.y) / g.height * 100 + \"%\"] } e.disableLabelAnimation = !0 } else e.removeTextContent(), e.removeTextConfig(), e.disableLabelAnimation = null } function NT(t, e, n, i, r, o) { t.data ? t.data.setItemGraphicEl(o, e) : js(e).eventData = { componentType: \"geo\", componentIndex: r.componentIndex, geoIndex: r.componentIndex, name: n, region: i && i.option || {} } } function ET(t, e, n, i, r) { t.data || Wh({ el: e, componentModel: r, itemName: n, itemTooltipOption: i.get(\"tooltip\") }) } function zT(t, e, n, i, r) { e.highDownSilentOnTouch = !!r.get(\"selectedMode\"); var o = i.getModel(\"emphasis\"), a = o.get(\"focus\"); return Bl(e, a, o.get(\"blurScope\"), o.get(\"disabled\")), t.isGeo && function (t, e, n) { var i = js(t); i.componentMainType = e.mainType, i.componentIndex = e.componentIndex, i.componentHighDownName = n }(e, r, n), a } function VT(t, e, n) { var i, r = []; function o() { i = [] } function a() { i.length && (r.push(i), i = []) } var s = e({ polygonStart: o, polygonEnd: a, lineStart: o, lineEnd: a, point: function (t, e) { isFinite(t) && isFinite(e) && i.push([t, e]) }, sphere: function () { } }); return !n && s.polygonStart(), E(t, (function (t) { s.lineStart(); for (var e = 0; e < t.length; e++)s.point(t[e][0], t[e][1]); s.lineEnd() })), !n && s.polygonEnd(), r } var BT = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n, i) { if (!i || \"mapToggleSelect\" !== i.type || i.from !== this.uid) { var r = this.group; if (r.removeAll(), !t.getHostGeoModel()) { if (this._mapDraw && i && \"geoRoam\" === i.type && this._mapDraw.resetForLabelLayout(), i && \"geoRoam\" === i.type && \"series\" === i.componentType && i.seriesId === t.id) (o = this._mapDraw) && r.add(o.group); else if (t.needsDrawMap) { var o = this._mapDraw || new PT(n); r.add(o.group), o.draw(t, e, n, this, i), this._mapDraw = o } else this._mapDraw && this._mapDraw.remove(), this._mapDraw = null; t.get(\"showLegendSymbol\") && e.getComponent(\"legend\") && this._renderSymbols(t, e, n) } } }, e.prototype.remove = function () { this._mapDraw && this._mapDraw.remove(), this._mapDraw = null, this.group.removeAll() }, e.prototype.dispose = function () { this._mapDraw && this._mapDraw.remove(), this._mapDraw = null }, e.prototype._renderSymbols = function (t, e, n) { var i = t.originalData, r = this.group; i.each(i.mapDimension(\"value\"), (function (e, n) { if (!isNaN(e)) { var o = i.getItemLayout(n); if (o && o.point) { var a = o.point, s = o.offset, l = new gu({ style: { fill: t.getData().getVisual(\"style\").fill }, shape: { cx: a[0] + 9 * s, cy: a[1], r: 3 }, silent: !0, z2: 8 + (s ? 0 : 11) }); if (!s) { var u = t.mainSeries.getData(), h = i.getName(n), c = u.indexOfName(h), p = i.getItemModel(n), d = p.getModel(\"label\"), f = u.getItemGraphicEl(c); qh(l, Kh(p), { labelFetcher: { getFormattedLabel: function (e, n) { return t.getFormattedLabel(c, n) } }, defaultText: h }), l.disableLabelAnimation = !0, d.get(\"position\") || l.setTextConfig({ position: \"bottom\" }), f.onHoverStateChange = function (t) { _l(l, t) } } r.add(l) } } })) }, e.type = \"map\", e }(wg), FT = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.needsDrawMap = !1, n.seriesGroup = [], n.getTooltipPosition = function (t) { if (null != t) { var e = this.getData().getName(t), n = this.coordinateSystem, i = n.getRegion(e); return i && n.dataToPoint(i.getCenter()) } }, n } return n(e, t), e.prototype.getInitialData = function (t) { for (var e = pM(this, { coordDimensions: [\"value\"], encodeDefaulter: H(Zp, this) }), n = ft(), i = [], r = 0, o = e.count(); r < o; r++) { var a = e.getName(r); n.set(a, !0) } return E(MT(this.getMapType(), this.option.nameMap, this.option.nameProperty).regions, (function (t) { var e = t.name; n.get(e) || i.push(e) })), e.appendValues([], i), e }, e.prototype.getHostGeoModel = function () { var t = this.option.geoIndex; return null != t ? this.ecModel.getComponent(\"geo\", t) : null }, e.prototype.getMapType = function () { return (this.getHostGeoModel() || this).option.map }, e.prototype.getRawValue = function (t) { var e = this.getData(); return e.get(e.mapDimension(\"value\"), t) }, e.prototype.getRegionModel = function (t) { var e = this.getData(); return e.getItemModel(e.indexOfName(t)) }, e.prototype.formatTooltip = function (t, e, n) { for (var i = this.getData(), r = this.getRawValue(t), o = i.getName(t), a = this.seriesGroup, s = [], l = 0; l < a.length; l++) { var u = a[l].originalData.indexOfName(o), h = i.mapDimension(\"value\"); isNaN(a[l].originalData.get(h, u)) || s.push(a[l].name) } return qf(\"section\", { header: s.join(\", \"), noHeader: !s.length, blocks: [qf(\"nameValue\", { name: o, value: r })] }) }, e.prototype.setZoom = function (t) { this.option.zoom = t }, e.prototype.setCenter = function (t) { this.option.center = t }, e.prototype.getLegendIcon = function (t) { var e = t.icon || \"roundRect\", n = Ry(e, 0, 0, t.itemWidth, t.itemHeight, t.itemStyle.fill); return n.setStyle(t.itemStyle), n.style.stroke = \"none\", e.indexOf(\"empty\") > -1 && (n.style.stroke = n.style.fill, n.style.fill = \"#fff\", n.style.lineWidth = 2), n }, e.type = \"series.map\", e.dependencies = [\"geo\"], e.layoutMode = \"box\", e.defaultOption = { z: 2, coordinateSystem: \"geo\", map: \"\", left: \"center\", top: \"center\", aspectScale: null, showLegendSymbol: !0, boundingCoords: null, center: null, zoom: 1, scaleLimit: null, selectedMode: !0, label: { show: !1, color: \"#000\" }, itemStyle: { borderWidth: .5, borderColor: \"#444\", areaColor: \"#eee\" }, emphasis: { label: { show: !0, color: \"rgb(100,0,0)\" }, itemStyle: { areaColor: \"rgba(255,215,0,0.8)\" } }, select: { label: { show: !0, color: \"rgb(100,0,0)\" }, itemStyle: { color: \"rgba(255,215,0,0.8)\" } }, nameProperty: \"name\" }, e }(hg); function GT(t) { var e = {}; t.eachSeriesByType(\"map\", (function (t) { var n = t.getHostGeoModel(), i = n ? \"o\" + n.id : \"i\" + t.getMapType(); (e[i] = e[i] || []).push(t) })), E(e, (function (t, e) { for (var n, i, r, o = (n = z(t, (function (t) { return t.getData() })), i = t[0].get(\"mapValueCalculation\"), r = {}, E(n, (function (t) { t.each(t.mapDimension(\"value\"), (function (e, n) { var i = \"ec-\" + t.getName(n); r[i] = r[i] || [], isNaN(e) || r[i].push(e) })) })), n[0].map(n[0].mapDimension(\"value\"), (function (t, e) { for (var o = \"ec-\" + n[0].getName(e), a = 0, s = 1 / 0, l = -1 / 0, u = r[o].length, h = 0; h < u; h++)s = Math.min(s, r[o][h]), l = Math.max(l, r[o][h]), a += r[o][h]; return 0 === u ? NaN : \"min\" === i ? s : \"max\" === i ? l : \"average\" === i ? a / u : a }))), a = 0; a < t.length; a++)t[a].originalData = t[a].getData(); for (a = 0; a < t.length; a++)t[a].seriesGroup = t, t[a].needsDrawMap = 0 === a && !t[a].getHostGeoModel(), t[a].setData(o.cloneShallow()), t[a].mainSeries = t[0] })) } function WT(t) { var e = {}; t.eachSeriesByType(\"map\", (function (n) { var i = n.getMapType(); if (!n.getHostGeoModel() && !e[i]) { var r = {}; E(n.seriesGroup, (function (e) { var n = e.coordinateSystem, i = e.originalData; e.get(\"showLegendSymbol\") && t.getComponent(\"legend\") && i.each(i.mapDimension(\"value\"), (function (t, e) { var o = i.getName(e), a = n.getRegion(o); if (a && !isNaN(t)) { var s = r[o] || 0, l = n.dataToPoint(a.getCenter()); r[o] = s + 1, i.setItemLayout(e, { point: l, offset: s }) } })) })); var o = n.getData(); o.each((function (t) { var e = o.getName(t), n = o.getItemLayout(t) || {}; n.showLabel = !r[e], o.setItemLayout(t, n) })), e[i] = !0 } })) } var HT = Ft, YT = function (t) { function e(e) { var n = t.call(this) || this; return n.type = \"view\", n.dimensions = [\"x\", \"y\"], n._roamTransformable = new hr, n._rawTransformable = new hr, n.name = e, n } return n(e, t), e.prototype.setBoundingRect = function (t, e, n, i) { return this._rect = new Re(t, e, n, i), this._rect }, e.prototype.getBoundingRect = function () { return this._rect }, e.prototype.setViewRect = function (t, e, n, i) { this._transformTo(t, e, n, i), this._viewRect = new Re(t, e, n, i) }, e.prototype._transformTo = function (t, e, n, i) { var r = this.getBoundingRect(), o = this._rawTransformable; o.transform = r.calculateTransform(new Re(t, e, n, i)); var a = o.parent; o.parent = null, o.decomposeTransform(), o.parent = a, this._updateTransform() }, e.prototype.setCenter = function (t, e) { t && (this._center = [Gr(t[0], e.getWidth()), Gr(t[1], e.getHeight())], this._updateCenterAndZoom()) }, e.prototype.setZoom = function (t) { t = t || 1; var e = this.zoomLimit; e && (null != e.max && (t = Math.min(e.max, t)), null != e.min && (t = Math.max(e.min, t))), this._zoom = t, this._updateCenterAndZoom() }, e.prototype.getDefaultCenter = function () { var t = this.getBoundingRect(); return [t.x + t.width / 2, t.y + t.height / 2] }, e.prototype.getCenter = function () { return this._center || this.getDefaultCenter() }, e.prototype.getZoom = function () { return this._zoom || 1 }, e.prototype.getRoamTransform = function () { return this._roamTransformable.getLocalTransform() }, e.prototype._updateCenterAndZoom = function () { var t = this._rawTransformable.getLocalTransform(), e = this._roamTransformable, n = this.getDefaultCenter(), i = this.getCenter(), r = this.getZoom(); i = Ft([], i, t), n = Ft([], n, t), e.originX = i[0], e.originY = i[1], e.x = n[0] - i[0], e.y = n[1] - i[1], e.scaleX = e.scaleY = r, this._updateTransform() }, e.prototype._updateTransform = function () { var t = this._roamTransformable, e = this._rawTransformable; e.parent = t, t.updateTransform(), e.updateTransform(), ve(this.transform || (this.transform = []), e.transform || [1, 0, 0, 1, 0, 0]), this._rawTransform = e.getLocalTransform(), this.invTransform = this.invTransform || [], we(this.invTransform, this.transform), this.decomposeTransform() }, e.prototype.getTransformInfo = function () { var t = this._rawTransformable, e = this._roamTransformable, n = new hr; return n.transform = e.transform, n.decomposeTransform(), { roam: { x: n.x, y: n.y, scaleX: n.scaleX, scaleY: n.scaleY }, raw: { x: t.x, y: t.y, scaleX: t.scaleX, scaleY: t.scaleY } } }, e.prototype.getViewRect = function () { return this._viewRect }, e.prototype.getViewRectAfterRoam = function () { var t = this.getBoundingRect().clone(); return t.applyTransform(this.transform), t }, e.prototype.dataToPoint = function (t, e, n) { var i = e ? this._rawTransform : this.transform; return n = n || [], i ? HT(n, t, i) : St(n, t) }, e.prototype.pointToData = function (t) { var e = this.invTransform; return e ? HT([], t, e) : [t[0], t[1]] }, e.prototype.convertToPixel = function (t, e, n) { var i = UT(e); return i === this ? i.dataToPoint(n) : null }, e.prototype.convertFromPixel = function (t, e, n) { var i = UT(e); return i === this ? i.pointToData(n) : null }, e.prototype.containPoint = function (t) { return this.getViewRectAfterRoam().contain(t[0], t[1]) }, e.dimensions = [\"x\", \"y\"], e }(hr); function UT(t) { var e = t.seriesModel; return e ? e.coordinateSystem : null } var XT = { geoJSON: { aspectScale: .75, invertLongitute: !0 }, geoSVG: { aspectScale: 1, invertLongitute: !1 } }, ZT = [\"lng\", \"lat\"], jT = function (t) { function e(e, n, i) { var r = t.call(this, e) || this; r.dimensions = ZT, r.type = \"geo\", r._nameCoordMap = ft(), r.map = n; var o, a = i.projection, s = MT(n, i.nameMap, i.nameProperty), l = wT(n), u = (r.resourceType = l ? l.type : null, r.regions = s.regions), h = XT[l.type]; if (r._regionsMap = s.regionsMap, r.regions = s.regions, r.projection = a, a) for (var c = 0; c < u.length; c++) { var p = u[c].getBoundingRect(a); (o = o || p.clone()).union(p) } else o = s.boundingRect; return r.setBoundingRect(o.x, o.y, o.width, o.height), r.aspectScale = a ? 1 : rt(i.aspectScale, h.aspectScale), r._invertLongitute = !a && h.invertLongitute, r } return n(e, t), e.prototype._transformTo = function (t, e, n, i) { var r = this.getBoundingRect(), o = this._invertLongitute; r = r.clone(), o && (r.y = -r.y - r.height); var a = this._rawTransformable; a.transform = r.calculateTransform(new Re(t, e, n, i)); var s = a.parent; a.parent = null, a.decomposeTransform(), a.parent = s, o && (a.scaleY = -a.scaleY), this._updateTransform() }, e.prototype.getRegion = function (t) { return this._regionsMap.get(t) }, e.prototype.getRegionByCoord = function (t) { for (var e = this.regions, n = 0; n < e.length; n++) { var i = e[n]; if (\"geoJSON\" === i.type && i.contain(t)) return e[n] } }, e.prototype.addGeoCoord = function (t, e) { this._nameCoordMap.set(t, e) }, e.prototype.getGeoCoord = function (t) { var e = this._regionsMap.get(t); return this._nameCoordMap.get(t) || e && e.getCenter() }, e.prototype.dataToPoint = function (t, e, n) { if (X(t) && (t = this.getGeoCoord(t)), t) { var i = this.projection; return i && (t = i.project(t)), t && this.projectedToPoint(t, e, n) } }, e.prototype.pointToData = function (t) { var e = this.projection; return e && (t = e.unproject(t)), t && this.pointToProjected(t) }, e.prototype.pointToProjected = function (e) { return t.prototype.pointToData.call(this, e) }, e.prototype.projectedToPoint = function (e, n, i) { return t.prototype.dataToPoint.call(this, e, n, i) }, e.prototype.convertToPixel = function (t, e, n) { var i = qT(e); return i === this ? i.dataToPoint(n) : null }, e.prototype.convertFromPixel = function (t, e, n) { var i = qT(e); return i === this ? i.pointToData(n) : null }, e }(YT); function qT(t) { var e = t.geoModel, n = t.seriesModel; return e ? e.coordinateSystem : n ? n.coordinateSystem || (n.getReferringComponents(\"geo\", Po).models[0] || {}).coordinateSystem : null } function KT(t, e) { var n = t.get(\"boundingCoords\"); if (null != n) { var i = n[0], r = n[1]; if (isFinite(i[0]) && isFinite(i[1]) && isFinite(r[0]) && isFinite(r[1])) { var o = this.projection; if (o) { var a = i[0], s = i[1], l = r[0], u = r[1]; i = [1 / 0, 1 / 0], r = [-1 / 0, -1 / 0]; var h = function (t, e, n, a) { for (var s = n - t, l = a - e, u = 0; u <= 100; u++) { var h = u / 100, c = o.project([t + s * h, e + l * h]); Gt(i, i, c), Wt(r, r, c) } }; h(a, s, l, s), h(l, s, l, u), h(l, u, a, u), h(a, u, l, s) } this.setBoundingRect(i[0], i[1], r[0] - i[0], r[1] - i[1]) } else 0 } var c, p, d, f = this.getBoundingRect(), g = t.get(\"layoutCenter\"), y = t.get(\"layoutSize\"), v = e.getWidth(), m = e.getHeight(), x = f.width / f.height * this.aspectScale, _ = !1; if (g && y && (c = [Gr(g[0], v), Gr(g[1], m)], p = Gr(y, Math.min(v, m)), isNaN(c[0]) || isNaN(c[1]) || isNaN(p) || (_ = !0)), _) d = {}, x > 1 ? (d.width = p, d.height = p / x) : (d.height = p, d.width = p * x), d.y = c[1] - d.height / 2, d.x = c[0] - d.width / 2; else { var b = t.getBoxLayoutParams(); b.aspect = x, d = wp(b, { width: v, height: m }) } this.setViewRect(d.x, d.y, d.width, d.height), this.setCenter(t.get(\"center\"), e), this.setZoom(t.get(\"zoom\")) } R(jT, YT); var $T = function () { function t() { this.dimensions = ZT } return t.prototype.create = function (t, e) { var n = []; function i(t) { return { nameProperty: t.get(\"nameProperty\"), aspectScale: t.get(\"aspectScale\"), projection: t.get(\"projection\") } } t.eachComponent(\"geo\", (function (t, r) { var o = t.get(\"map\"), a = new jT(o + r, o, A({ nameMap: t.get(\"nameMap\") }, i(t))); a.zoomLimit = t.get(\"scaleLimit\"), n.push(a), t.coordinateSystem = a, a.model = t, a.resize = KT, a.resize(t, e) })), t.eachSeries((function (t) { if (\"geo\" === t.get(\"coordinateSystem\")) { var e = t.get(\"geoIndex\") || 0; t.coordinateSystem = n[e] } })); var r = {}; return t.eachSeriesByType(\"map\", (function (t) { if (!t.getHostGeoModel()) { var e = t.getMapType(); r[e] = r[e] || [], r[e].push(t) } })), E(r, (function (t, r) { var o = z(t, (function (t) { return t.get(\"nameMap\") })), a = new jT(r, r, A({ nameMap: D(o) }, i(t[0]))); a.zoomLimit = it.apply(null, z(t, (function (t) { return t.get(\"scaleLimit\") }))), n.push(a), a.resize = KT, a.resize(t[0], e), E(t, (function (t) { t.coordinateSystem = a, function (t, e) { E(e.get(\"geoCoord\"), (function (e, n) { t.addGeoCoord(n, e) })) }(a, t) })) })), n }, t.prototype.getFilledRegions = function (t, e, n, i) { for (var r = (t || []).slice(), o = ft(), a = 0; a < r.length; a++)o.set(r[a].name, r[a]); return E(MT(e, n, i).regions, (function (t) { var e = t.name; !o.get(e) && r.push({ name: e }) })), r }, t }(), JT = new $T, QT = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (t, e, n) { var i = wT(t.map); if (i && \"geoJSON\" === i.type) { var r = t.itemStyle = t.itemStyle || {}; \"color\" in r || (r.color = \"#eee\") } this.mergeDefaultAndTheme(t, n), vo(t, \"label\", [\"show\"]) }, e.prototype.optionUpdated = function () { var t = this, e = this.option; e.regions = JT.getFilledRegions(e.regions, e.map, e.nameMap, e.nameProperty); var n = {}; this._optionModelMap = V(e.regions || [], (function (e, i) { var r = i.name; return r && (e.set(r, new xc(i, t, t.ecModel)), i.selected && (n[r] = !0)), e }), ft()), e.selectedMap || (e.selectedMap = n) }, e.prototype.getRegionModel = function (t) { return this._optionModelMap.get(t) || new xc(null, this, this.ecModel) }, e.prototype.getFormattedLabel = function (t, e) { var n = this.getRegionModel(t), i = \"normal\" === e ? n.get([\"label\", \"formatter\"]) : n.get([\"emphasis\", \"label\", \"formatter\"]), r = { name: t }; return U(i) ? (r.status = e, i(r)) : X(i) ? i.replace(\"{a}\", null != t ? t : \"\") : void 0 }, e.prototype.setZoom = function (t) { this.option.zoom = t }, e.prototype.setCenter = function (t) { this.option.center = t }, e.prototype.select = function (t) { var e = this.option, n = e.selectedMode; n && (\"multiple\" !== n && (e.selectedMap = null), (e.selectedMap || (e.selectedMap = {}))[t] = !0) }, e.prototype.unSelect = function (t) { var e = this.option.selectedMap; e && (e[t] = !1) }, e.prototype.toggleSelected = function (t) { this[this.isSelected(t) ? \"unSelect\" : \"select\"](t) }, e.prototype.isSelected = function (t) { var e = this.option.selectedMap; return !(!e || !e[t]) }, e.type = \"geo\", e.layoutMode = \"box\", e.defaultOption = { z: 0, show: !0, left: \"center\", top: \"center\", aspectScale: null, silent: !1, map: \"\", boundingCoords: null, center: null, zoom: 1, scaleLimit: null, label: { show: !1, color: \"#000\" }, itemStyle: { borderWidth: .5, borderColor: \"#444\" }, emphasis: { label: { show: !0, color: \"rgb(100,0,0)\" }, itemStyle: { color: \"rgba(255,215,0,0.8)\" } }, select: { label: { show: !0, color: \"rgb(100,0,0)\" }, itemStyle: { color: \"rgba(255,215,0,0.8)\" } }, regions: [] }, e }(Ap); function tC(t, e) { return t.pointToProjected ? t.pointToProjected(e) : t.pointToData(e) } function eC(t, e, n, i) { var r = t.getZoom(), o = t.getCenter(), a = e.zoom, s = t.projectedToPoint ? t.projectedToPoint(o) : t.dataToPoint(o); if (null != e.dx && null != e.dy && (s[0] -= e.dx, s[1] -= e.dy, t.setCenter(tC(t, s), i)), null != a) { if (n) { var l = n.min || 0, u = n.max || 1 / 0; a = Math.max(Math.min(r * a, u), l) / r } t.scaleX *= a, t.scaleY *= a; var h = (e.originX - t.x) * (a - 1), c = (e.originY - t.y) * (a - 1); t.x -= h, t.y -= c, t.updateTransform(), t.setCenter(tC(t, s), i), t.setZoom(a * r) } return { center: t.getCenter(), zoom: t.getZoom() } } var nC = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.focusBlurEnabled = !0, n } return n(e, t), e.prototype.init = function (t, e) { this._api = e }, e.prototype.render = function (t, e, n, i) { if (this._model = t, !t.get(\"show\")) return this._mapDraw && this._mapDraw.remove(), void (this._mapDraw = null); this._mapDraw || (this._mapDraw = new PT(n)); var r = this._mapDraw; r.draw(t, e, n, this, i), r.group.on(\"click\", this._handleRegionClick, this), r.group.silent = t.get(\"silent\"), this.group.add(r.group), this.updateSelectStatus(t, e, n) }, e.prototype._handleRegionClick = function (t) { var e; wy(t.target, (function (t) { return null != (e = js(t).eventData) }), !0), e && this._api.dispatchAction({ type: \"geoToggleSelect\", geoId: this._model.id, name: e.name }) }, e.prototype.updateSelectStatus = function (t, e, n) { var i = this; this._mapDraw.group.traverse((function (t) { var e = js(t).eventData; if (e) return i._model.isSelected(e.name) ? n.enterSelect(t) : n.leaveSelect(t), !0 })) }, e.prototype.findHighDownDispatchers = function (t) { return this._mapDraw && this._mapDraw.findHighDownDispatchers(t, this._model) }, e.prototype.dispose = function () { this._mapDraw && this._mapDraw.remove() }, e.type = \"geo\", e }(mg); function iC(t, e, n) { bT(t, e, n) } function rC(t) { function e(e, n) { n.update = \"geo:updateSelectStatus\", t.registerAction(n, (function (t, n) { var i = {}, r = []; return n.eachComponent({ mainType: \"geo\", query: t }, (function (n) { n[e](t.name), E(n.coordinateSystem.regions, (function (t) { i[t.name] = n.isSelected(t.name) || !1 })); var o = []; E(i, (function (t, e) { i[e] && o.push(e) })), r.push({ geoIndex: n.componentIndex, name: o }) })), { selected: i, allSelected: r, name: t.name } })) } t.registerCoordinateSystem(\"geo\", JT), t.registerComponentModel(QT), t.registerComponentView(nC), t.registerImpl(\"registerMap\", iC), t.registerImpl(\"getMap\", (function (t) { return ST(t) })), e(\"toggleSelected\", { type: \"geoToggleSelect\", event: \"geoselectchanged\" }), e(\"select\", { type: \"geoSelect\", event: \"geoselected\" }), e(\"unSelect\", { type: \"geoUnSelect\", event: \"geounselected\" }), t.registerAction({ type: \"geoRoam\", event: \"geoRoam\", update: \"updateTransform\" }, (function (t, e, n) { var i = t.componentType || \"series\"; e.eachComponent({ mainType: i, query: t }, (function (e) { var r = e.coordinateSystem; if (\"geo\" === r.type) { var o = eC(r, t, e.get(\"scaleLimit\"), n); e.setCenter && e.setCenter(o.center), e.setZoom && e.setZoom(o.zoom), \"series\" === i && E(e.seriesGroup, (function (t) { t.setCenter(o.center), t.setZoom(o.zoom) })) } })) })) } function oC(t, e) { var n = t.isExpand ? t.children : [], i = t.parentNode.children, r = t.hierNode.i ? i[t.hierNode.i - 1] : null; if (n.length) { !function (t) { var e = t.children, n = e.length, i = 0, r = 0; for (; --n >= 0;) { var o = e[n]; o.hierNode.prelim += i, o.hierNode.modifier += i, r += o.hierNode.change, i += o.hierNode.shift + r } }(t); var o = (n[0].hierNode.prelim + n[n.length - 1].hierNode.prelim) / 2; r ? (t.hierNode.prelim = r.hierNode.prelim + e(t, r), t.hierNode.modifier = t.hierNode.prelim - o) : t.hierNode.prelim = o } else r && (t.hierNode.prelim = r.hierNode.prelim + e(t, r)); t.parentNode.hierNode.defaultAncestor = function (t, e, n, i) { if (e) { for (var r = t, o = t, a = o.parentNode.children[0], s = e, l = r.hierNode.modifier, u = o.hierNode.modifier, h = a.hierNode.modifier, c = s.hierNode.modifier; s = uC(s), o = hC(o), s && o;) { r = uC(r), a = hC(a), r.hierNode.ancestor = t; var p = s.hierNode.prelim + c - o.hierNode.prelim - u + i(s, o); p > 0 && (pC(cC(s, t, n), t, p), u += p, l += p), c += s.hierNode.modifier, u += o.hierNode.modifier, l += r.hierNode.modifier, h += a.hierNode.modifier } s && !uC(r) && (r.hierNode.thread = s, r.hierNode.modifier += c - l), o && !hC(a) && (a.hierNode.thread = o, a.hierNode.modifier += u - h, n = t) } return n }(t, r, t.parentNode.hierNode.defaultAncestor || i[0], e) } function aC(t) { var e = t.hierNode.prelim + t.parentNode.hierNode.modifier; t.setLayout({ x: e }, !0), t.hierNode.modifier += t.parentNode.hierNode.modifier } function sC(t) { return arguments.length ? t : dC } function lC(t, e) { return t -= Math.PI / 2, { x: e * Math.cos(t), y: e * Math.sin(t) } } function uC(t) { var e = t.children; return e.length && t.isExpand ? e[e.length - 1] : t.hierNode.thread } function hC(t) { var e = t.children; return e.length && t.isExpand ? e[0] : t.hierNode.thread } function cC(t, e, n) { return t.hierNode.ancestor.parentNode === e.parentNode ? t.hierNode.ancestor : n } function pC(t, e, n) { var i = n / (e.hierNode.i - t.hierNode.i); e.hierNode.change -= i, e.hierNode.shift += n, e.hierNode.modifier += n, e.hierNode.prelim += n, t.hierNode.change += i } function dC(t, e) { return t.parentNode === e.parentNode ? 1 : 2 } var fC = function () { this.parentPoint = [], this.childPoints = [] }, gC = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new fC }, e.prototype.buildPath = function (t, e) { var n = e.childPoints, i = n.length, r = e.parentPoint, o = n[0], a = n[i - 1]; if (1 === i) return t.moveTo(r[0], r[1]), void t.lineTo(o[0], o[1]); var s = e.orient, l = \"TB\" === s || \"BT\" === s ? 0 : 1, u = 1 - l, h = Gr(e.forkPosition, 1), c = []; c[l] = r[l], c[u] = r[u] + (a[u] - r[u]) * h, t.moveTo(r[0], r[1]), t.lineTo(c[0], c[1]), t.moveTo(o[0], o[1]), c[l] = o[l], t.lineTo(c[0], c[1]), c[l] = a[l], t.lineTo(c[0], c[1]), t.lineTo(a[0], a[1]); for (var p = 1; p < i - 1; p++) { var d = n[p]; t.moveTo(d[0], d[1]), c[l] = d[l], t.lineTo(c[0], c[1]) } }, e }(_s), yC = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._mainGroup = new Pr, n } return n(e, t), e.prototype.init = function (t, e) { this._controller = new OI(e.getZr()), this._controllerHost = { target: this.group }, this.group.add(this._mainGroup) }, e.prototype.render = function (t, e, n) { var i = t.getData(), r = t.layoutInfo, o = this._mainGroup; \"radial\" === t.get(\"layout\") ? (o.x = r.x + r.width / 2, o.y = r.y + r.height / 2) : (o.x = r.x, o.y = r.y), this._updateViewCoordSys(t, n), this._updateController(t, e, n); var a = this._data; i.diff(a).add((function (e) { vC(i, e) && mC(i, e, null, o, t) })).update((function (e, n) { var r = a.getItemGraphicEl(n); vC(i, e) ? mC(i, e, r, o, t) : r && bC(a, n, r, o, t) })).remove((function (e) { var n = a.getItemGraphicEl(e); n && bC(a, e, n, o, t) })).execute(), this._nodeScaleRatio = t.get(\"nodeScaleRatio\"), this._updateNodeAndLinkScale(t), !0 === t.get(\"expandAndCollapse\") && i.eachItemGraphicEl((function (e, i) { e.off(\"click\").on(\"click\", (function () { n.dispatchAction({ type: \"treeExpandAndCollapse\", seriesId: t.id, dataIndex: i }) })) })), this._data = i }, e.prototype._updateViewCoordSys = function (t, e) { var n = t.getData(), i = []; n.each((function (t) { var e = n.getItemLayout(t); !e || isNaN(e.x) || isNaN(e.y) || i.push([+e.x, +e.y]) })); var r = [], o = []; Aa(i, r, o); var a = this._min, s = this._max; o[0] - r[0] == 0 && (r[0] = a ? a[0] : r[0] - 1, o[0] = s ? s[0] : o[0] + 1), o[1] - r[1] == 0 && (r[1] = a ? a[1] : r[1] - 1, o[1] = s ? s[1] : o[1] + 1); var l = t.coordinateSystem = new YT; l.zoomLimit = t.get(\"scaleLimit\"), l.setBoundingRect(r[0], r[1], o[0] - r[0], o[1] - r[1]), l.setCenter(t.get(\"center\"), e), l.setZoom(t.get(\"zoom\")), this.group.attr({ x: l.x, y: l.y, scaleX: l.scaleX, scaleY: l.scaleY }), this._min = r, this._max = o }, e.prototype._updateController = function (t, e, n) { var i = this, r = this._controller, o = this._controllerHost, a = this.group; r.setPointerChecker((function (e, i, r) { var o = a.getBoundingRect(); return o.applyTransform(a.transform), o.contain(i, r) && !GI(e, n, t) })), r.enable(t.get(\"roam\")), o.zoomLimit = t.get(\"scaleLimit\"), o.zoom = t.coordinateSystem.getZoom(), r.off(\"pan\").off(\"zoom\").on(\"pan\", (function (e) { zI(o, e.dx, e.dy), n.dispatchAction({ seriesId: t.id, type: \"treeRoam\", dx: e.dx, dy: e.dy }) })).on(\"zoom\", (function (e) { VI(o, e.scale, e.originX, e.originY), n.dispatchAction({ seriesId: t.id, type: \"treeRoam\", zoom: e.scale, originX: e.originX, originY: e.originY }), i._updateNodeAndLinkScale(t), n.updateLabelLayout() })) }, e.prototype._updateNodeAndLinkScale = function (t) { var e = t.getData(), n = this._getNodeGlobalScale(t); e.eachItemGraphicEl((function (t, e) { t.setSymbolScale(n) })) }, e.prototype._getNodeGlobalScale = function (t) { var e = t.coordinateSystem; if (\"view\" !== e.type) return 1; var n = this._nodeScaleRatio, i = e.scaleX || 1; return ((e.getZoom() - 1) * n + 1) / i }, e.prototype.dispose = function () { this._controller && this._controller.dispose(), this._controllerHost = null }, e.prototype.remove = function () { this._mainGroup.removeAll(), this._data = null }, e.type = \"tree\", e }(wg); function vC(t, e) { var n = t.getItemLayout(e); return n && !isNaN(n.x) && !isNaN(n.y) } function mC(t, e, n, i, r) { var o = !n, a = t.tree.getNodeByDataIndex(e), s = a.getModel(), l = a.getVisual(\"style\").fill, u = !1 === a.isExpand && 0 !== a.children.length ? l : \"#fff\", h = t.tree.root, c = a.parentNode === h ? a : a.parentNode || a, p = t.getItemGraphicEl(c.dataIndex), d = c.getLayout(), f = p ? { x: p.__oldX, y: p.__oldY, rawX: p.__radialOldRawX, rawY: p.__radialOldRawY } : d, g = a.getLayout(); o ? ((n = new Zw(t, e, null, { symbolInnerColor: u, useNameLabel: !0 })).x = f.x, n.y = f.y) : n.updateData(t, e, null, { symbolInnerColor: u, useNameLabel: !0 }), n.__radialOldRawX = n.__radialRawX, n.__radialOldRawY = n.__radialRawY, n.__radialRawX = g.rawX, n.__radialRawY = g.rawY, i.add(n), t.setItemGraphicEl(e, n), n.__oldX = n.x, n.__oldY = n.y, uh(n, { x: g.x, y: g.y }, r); var y = n.getSymbolPath(); if (\"radial\" === r.get(\"layout\")) { var v = h.children[0], m = v.getLayout(), x = v.children.length, _ = void 0, b = void 0; if (g.x === m.x && !0 === a.isExpand && v.children.length) { var w = { x: (v.children[0].getLayout().x + v.children[x - 1].getLayout().x) / 2, y: (v.children[0].getLayout().y + v.children[x - 1].getLayout().y) / 2 }; (_ = Math.atan2(w.y - m.y, w.x - m.x)) < 0 && (_ = 2 * Math.PI + _), (b = w.x < m.x) && (_ -= Math.PI) } else (_ = Math.atan2(g.y - m.y, g.x - m.x)) < 0 && (_ = 2 * Math.PI + _), 0 === a.children.length || 0 !== a.children.length && !1 === a.isExpand ? (b = g.x < m.x) && (_ -= Math.PI) : (b = g.x > m.x) || (_ -= Math.PI); var S = b ? \"left\" : \"right\", M = s.getModel(\"label\"), I = M.get(\"rotate\"), T = I * (Math.PI / 180), C = y.getTextContent(); C && (y.setTextConfig({ position: M.get(\"position\") || S, rotation: null == I ? -_ : T, origin: \"center\" }), C.setStyle(\"verticalAlign\", \"middle\")) } var D = s.get([\"emphasis\", \"focus\"]), A = \"relative\" === D ? gt(a.getAncestorsIndices(), a.getDescendantIndices()) : \"ancestor\" === D ? a.getAncestorsIndices() : \"descendant\" === D ? a.getDescendantIndices() : null; A && (js(n).focus = A), function (t, e, n, i, r, o, a, s) { var l = e.getModel(), u = t.get(\"edgeShape\"), h = t.get(\"layout\"), c = t.getOrient(), p = t.get([\"lineStyle\", \"curveness\"]), d = t.get(\"edgeForkPosition\"), f = l.getModel(\"lineStyle\").getLineStyle(), g = i.__edge; if (\"curve\" === u) e.parentNode && e.parentNode !== n && (g || (g = i.__edge = new Xu({ shape: wC(h, c, p, r, r) })), uh(g, { shape: wC(h, c, p, o, a) }, t)); else if (\"polyline\" === u) if (\"orthogonal\" === h) { if (e !== n && e.children && 0 !== e.children.length && !0 === e.isExpand) { for (var y = e.children, v = [], m = 0; m < y.length; m++) { var x = y[m].getLayout(); v.push([x.x, x.y]) } g || (g = i.__edge = new gC({ shape: { parentPoint: [a.x, a.y], childPoints: [[a.x, a.y]], orient: c, forkPosition: d } })), uh(g, { shape: { parentPoint: [a.x, a.y], childPoints: v } }, t) } } else 0; g && (\"polyline\" !== u || e.isExpand) && (g.useStyle(k({ strokeNoScale: !0, fill: null }, f)), Hl(g, l, \"lineStyle\"), wl(g), s.add(g)) }(r, a, h, n, f, d, g, i), n.__edge && (n.onHoverStateChange = function (e) { if (\"blur\" !== e) { var i = a.parentNode && t.getItemGraphicEl(a.parentNode.dataIndex); i && 1 === i.hoverState || _l(n.__edge, e) } }) } function xC(t, e, n, i, r) { var o = _C(e.tree.root, t), a = o.source, s = o.sourceLayout, l = e.getItemGraphicEl(t.dataIndex); if (l) { var u = e.getItemGraphicEl(a.dataIndex).__edge, h = l.__edge || (!1 === a.isExpand || 1 === a.children.length ? u : void 0), c = i.get(\"edgeShape\"), p = i.get(\"layout\"), d = i.get(\"orient\"), f = i.get([\"lineStyle\", \"curveness\"]); h && (\"curve\" === c ? ph(h, { shape: wC(p, d, f, s, s), style: { opacity: 0 } }, i, { cb: function () { n.remove(h) }, removeOpt: r }) : \"polyline\" === c && \"orthogonal\" === i.get(\"layout\") && ph(h, { shape: { parentPoint: [s.x, s.y], childPoints: [[s.x, s.y]] }, style: { opacity: 0 } }, i, { cb: function () { n.remove(h) }, removeOpt: r })) } } function _C(t, e) { for (var n, i = e.parentNode === t ? e : e.parentNode || e; null == (n = i.getLayout());)i = i.parentNode === t ? i : i.parentNode || i; return { source: i, sourceLayout: n } } function bC(t, e, n, i, r) { var o = t.tree.getNodeByDataIndex(e), a = _C(t.tree.root, o).sourceLayout, s = { duration: r.get(\"animationDurationUpdate\"), easing: r.get(\"animationEasingUpdate\") }; ph(n, { x: a.x + 1, y: a.y + 1 }, r, { cb: function () { i.remove(n), t.setItemGraphicEl(e, null) }, removeOpt: s }), n.fadeOut(null, t.hostModel, { fadeLabel: !0, animation: s }), o.children.forEach((function (e) { xC(e, t, i, r, s) })), xC(o, t, i, r, s) } function wC(t, e, n, i, r) { var o, a, s, l, u, h, c, p; if (\"radial\" === t) { u = i.rawX, c = i.rawY, h = r.rawX, p = r.rawY; var d = lC(u, c), f = lC(u, c + (p - c) * n), g = lC(h, p + (c - p) * n), y = lC(h, p); return { x1: d.x || 0, y1: d.y || 0, x2: y.x || 0, y2: y.y || 0, cpx1: f.x || 0, cpy1: f.y || 0, cpx2: g.x || 0, cpy2: g.y || 0 } } return u = i.x, c = i.y, h = r.x, p = r.y, \"LR\" !== e && \"RL\" !== e || (o = u + (h - u) * n, a = c, s = h + (u - h) * n, l = p), \"TB\" !== e && \"BT\" !== e || (o = u, a = c + (p - c) * n, s = h, l = p + (c - p) * n), { x1: u, y1: c, x2: h, y2: p, cpx1: o, cpy1: a, cpx2: s, cpy2: l } } var SC = Do(); function MC(t) { var e = t.mainData, n = t.datas; n || (n = { main: e }, t.datasAttr = { main: \"data\" }), t.datas = t.mainData = null, kC(e, n, t), E(n, (function (n) { E(e.TRANSFERABLE_METHODS, (function (e) { n.wrapMethod(e, H(IC, t)) })) })), e.wrapMethod(\"cloneShallow\", H(CC, t)), E(e.CHANGABLE_METHODS, (function (n) { e.wrapMethod(n, H(TC, t)) })), lt(n[e.dataType] === e) } function IC(t, e) { if (SC(i = this).mainData === i) { var n = A({}, SC(this).datas); n[this.dataType] = e, kC(e, n, t) } else LC(e, this.dataType, SC(this).mainData, t); var i; return e } function TC(t, e) { return t.struct && t.struct.update(), e } function CC(t, e) { return E(SC(e).datas, (function (n, i) { n !== e && LC(n.cloneShallow(), i, e, t) })), e } function DC(t) { var e = SC(this).mainData; return null == t || null == e ? e : SC(e).datas[t] } function AC() { var t = SC(this).mainData; return null == t ? [{ data: t }] : z(G(SC(t).datas), (function (e) { return { type: e, data: SC(t).datas[e] } })) } function kC(t, e, n) { SC(t).datas = {}, E(e, (function (e, i) { LC(e, i, t, n) })) } function LC(t, e, n, i) { SC(n).datas[e] = t, SC(t).mainData = n, t.dataType = e, i.struct && (t[i.structAttr] = i.struct, i.struct[i.datasAttr[e]] = t), t.getLinkedData = DC, t.getLinkedDataAll = AC } var PC = function () { function t(t, e) { this.depth = 0, this.height = 0, this.dataIndex = -1, this.children = [], this.viewChildren = [], this.isExpand = !1, this.name = t || \"\", this.hostTree = e } return t.prototype.isRemoved = function () { return this.dataIndex < 0 }, t.prototype.eachNode = function (t, e, n) { U(t) && (n = e, e = t, t = null), X(t = t || {}) && (t = { order: t }); var i, r = t.order || \"preorder\", o = this[t.attr || \"children\"]; \"preorder\" === r && (i = e.call(n, this)); for (var a = 0; !i && a < o.length; a++)o[a].eachNode(t, e, n); \"postorder\" === r && e.call(n, this) }, t.prototype.updateDepthAndHeight = function (t) { var e = 0; this.depth = t; for (var n = 0; n < this.children.length; n++) { var i = this.children[n]; i.updateDepthAndHeight(t + 1), i.height > e && (e = i.height) } this.height = e + 1 }, t.prototype.getNodeById = function (t) { if (this.getId() === t) return this; for (var e = 0, n = this.children, i = n.length; e < i; e++) { var r = n[e].getNodeById(t); if (r) return r } }, t.prototype.contains = function (t) { if (t === this) return !0; for (var e = 0, n = this.children, i = n.length; e < i; e++) { var r = n[e].contains(t); if (r) return r } }, t.prototype.getAncestors = function (t) { for (var e = [], n = t ? this : this.parentNode; n;)e.push(n), n = n.parentNode; return e.reverse(), e }, t.prototype.getAncestorsIndices = function () { for (var t = [], e = this; e;)t.push(e.dataIndex), e = e.parentNode; return t.reverse(), t }, t.prototype.getDescendantIndices = function () { var t = []; return this.eachNode((function (e) { t.push(e.dataIndex) })), t }, t.prototype.getValue = function (t) { var e = this.hostTree.data; return e.getStore().get(e.getDimensionIndex(t || \"value\"), this.dataIndex) }, t.prototype.setLayout = function (t, e) { this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, t, e) }, t.prototype.getLayout = function () { return this.hostTree.data.getItemLayout(this.dataIndex) }, t.prototype.getModel = function (t) { if (!(this.dataIndex < 0)) return this.hostTree.data.getItemModel(this.dataIndex).getModel(t) }, t.prototype.getLevelModel = function () { return (this.hostTree.levelModels || [])[this.depth] }, t.prototype.setVisual = function (t, e) { this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, t, e) }, t.prototype.getVisual = function (t) { return this.hostTree.data.getItemVisual(this.dataIndex, t) }, t.prototype.getRawIndex = function () { return this.hostTree.data.getRawIndex(this.dataIndex) }, t.prototype.getId = function () { return this.hostTree.data.getId(this.dataIndex) }, t.prototype.getChildIndex = function () { if (this.parentNode) { for (var t = this.parentNode.children, e = 0; e < t.length; ++e)if (t[e] === this) return e; return -1 } return -1 }, t.prototype.isAncestorOf = function (t) { for (var e = t.parentNode; e;) { if (e === this) return !0; e = e.parentNode } return !1 }, t.prototype.isDescendantOf = function (t) { return t !== this && t.isAncestorOf(this) }, t }(), OC = function () { function t(t) { this.type = \"tree\", this._nodes = [], this.hostModel = t } return t.prototype.eachNode = function (t, e, n) { this.root.eachNode(t, e, n) }, t.prototype.getNodeByDataIndex = function (t) { var e = this.data.getRawIndex(t); return this._nodes[e] }, t.prototype.getNodeById = function (t) { return this.root.getNodeById(t) }, t.prototype.update = function () { for (var t = this.data, e = this._nodes, n = 0, i = e.length; n < i; n++)e[n].dataIndex = -1; for (n = 0, i = t.count(); n < i; n++)e[t.getRawIndex(n)].dataIndex = n }, t.prototype.clearLayouts = function () { this.data.clearItemLayouts() }, t.createTree = function (e, n, i) { var r = new t(n), o = [], a = 1; !function t(e, n) { var i = e.value; a = Math.max(a, Y(i) ? i.length : 1), o.push(e); var s = new PC(Mo(e.name, \"\"), r); n ? function (t, e) { var n = e.children; if (t.parentNode === e) return; n.push(t), t.parentNode = e }(s, n) : r.root = s, r._nodes.push(s); var l = e.children; if (l) for (var u = 0; u < l.length; u++)t(l[u], s) }(e), r.root.updateDepthAndHeight(0); var s = Qm(o, { coordDimensions: [\"value\"], dimensionsCount: a }).dimensions, l = new Jm(s, n); return l.initData(o), i && i(l), MC({ mainData: l, struct: r, structAttr: \"tree\" }), r.update(), r }, t }(); function RC(t, e, n) { if (t && P(e, t.type) >= 0) { var i = n.getData().tree.root, r = t.targetNode; if (X(r) && (r = i.getNodeById(r)), r && i.contains(r)) return { node: r }; var o = t.targetNodeId; if (null != o && (r = i.getNodeById(o))) return { node: r } } } function NC(t) { for (var e = []; t;)(t = t.parentNode) && e.push(t); return e.reverse() } function EC(t, e) { return P(NC(t), e) >= 0 } function zC(t, e) { for (var n = []; t;) { var i = t.dataIndex; n.push({ name: t.name, dataIndex: i, value: e.getRawValue(i) }), t = t.parentNode } return n.reverse(), n } var VC = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.hasSymbolVisual = !0, e.ignoreStyleOnData = !0, e } return n(e, t), e.prototype.getInitialData = function (t) { var e = { name: t.name, children: t.data }, n = t.leaves || {}, i = new xc(n, this, this.ecModel), r = OC.createTree(e, this, (function (t) { t.wrapMethod(\"getItemModel\", (function (t, e) { var n = r.getNodeByDataIndex(e); return n && n.children.length && n.isExpand || (t.parentModel = i), t })) })); var o = 0; r.eachNode(\"preorder\", (function (t) { t.depth > o && (o = t.depth) })); var a = t.expandAndCollapse && t.initialTreeDepth >= 0 ? t.initialTreeDepth : o; return r.root.eachNode(\"preorder\", (function (t) { var e = t.hostTree.data.getRawDataItem(t.dataIndex); t.isExpand = e && null != e.collapsed ? !e.collapsed : t.depth <= a })), r.data }, e.prototype.getOrient = function () { var t = this.get(\"orient\"); return \"horizontal\" === t ? t = \"LR\" : \"vertical\" === t && (t = \"TB\"), t }, e.prototype.setZoom = function (t) { this.option.zoom = t }, e.prototype.setCenter = function (t) { this.option.center = t }, e.prototype.formatTooltip = function (t, e, n) { for (var i = this.getData().tree, r = i.root.children[0], o = i.getNodeByDataIndex(t), a = o.getValue(), s = o.name; o && o !== r;)s = o.parentNode.name + \".\" + s, o = o.parentNode; return qf(\"nameValue\", { name: s, value: a, noValue: isNaN(a) || null == a }) }, e.prototype.getDataParams = function (e) { var n = t.prototype.getDataParams.apply(this, arguments), i = this.getData().tree.getNodeByDataIndex(e); return n.treeAncestors = zC(i, this), n.collapsed = !i.isExpand, n }, e.type = \"series.tree\", e.layoutMode = \"box\", e.defaultOption = { z: 2, coordinateSystem: \"view\", left: \"12%\", top: \"12%\", right: \"12%\", bottom: \"12%\", layout: \"orthogonal\", edgeShape: \"curve\", edgeForkPosition: \"50%\", roam: !1, nodeScaleRatio: .4, center: null, zoom: 1, orient: \"LR\", symbol: \"emptyCircle\", symbolSize: 7, expandAndCollapse: !0, initialTreeDepth: 2, lineStyle: { color: \"#ccc\", width: 1.5, curveness: .5 }, itemStyle: { color: \"lightsteelblue\", borderWidth: 1.5 }, label: { show: !0 }, animationEasing: \"linear\", animationDuration: 700, animationDurationUpdate: 500 }, e }(hg); function BC(t, e) { for (var n, i = [t]; n = i.pop();)if (e(n), n.isExpand) { var r = n.children; if (r.length) for (var o = r.length - 1; o >= 0; o--)i.push(r[o]) } } function FC(t, e) { t.eachSeriesByType(\"tree\", (function (t) { !function (t, e) { var n = function (t, e) { return wp(t.getBoxLayoutParams(), { width: e.getWidth(), height: e.getHeight() }) }(t, e); t.layoutInfo = n; var i = t.get(\"layout\"), r = 0, o = 0, a = null; \"radial\" === i ? (r = 2 * Math.PI, o = Math.min(n.height, n.width) / 2, a = sC((function (t, e) { return (t.parentNode === e.parentNode ? 1 : 2) / t.depth }))) : (r = n.width, o = n.height, a = sC()); var s = t.getData().tree.root, l = s.children[0]; if (l) { !function (t) { var e = t; e.hierNode = { defaultAncestor: null, ancestor: e, prelim: 0, modifier: 0, change: 0, shift: 0, i: 0, thread: null }; for (var n, i, r = [e]; n = r.pop();)if (i = n.children, n.isExpand && i.length) for (var o = i.length - 1; o >= 0; o--) { var a = i[o]; a.hierNode = { defaultAncestor: null, ancestor: a, prelim: 0, modifier: 0, change: 0, shift: 0, i: o, thread: null }, r.push(a) } }(s), function (t, e, n) { for (var i, r = [t], o = []; i = r.pop();)if (o.push(i), i.isExpand) { var a = i.children; if (a.length) for (var s = 0; s < a.length; s++)r.push(a[s]) } for (; i = o.pop();)e(i, n) }(l, oC, a), s.hierNode.modifier = -l.hierNode.prelim, BC(l, aC); var u = l, h = l, c = l; BC(l, (function (t) { var e = t.getLayout().x; e < u.getLayout().x && (u = t), e > h.getLayout().x && (h = t), t.depth > c.depth && (c = t) })); var p = u === h ? 1 : a(u, h) / 2, d = p - u.getLayout().x, f = 0, g = 0, y = 0, v = 0; if (\"radial\" === i) f = r / (h.getLayout().x + p + d), g = o / (c.depth - 1 || 1), BC(l, (function (t) { y = (t.getLayout().x + d) * f, v = (t.depth - 1) * g; var e = lC(y, v); t.setLayout({ x: e.x, y: e.y, rawX: y, rawY: v }, !0) })); else { var m = t.getOrient(); \"RL\" === m || \"LR\" === m ? (g = o / (h.getLayout().x + p + d), f = r / (c.depth - 1 || 1), BC(l, (function (t) { v = (t.getLayout().x + d) * g, y = \"LR\" === m ? (t.depth - 1) * f : r - (t.depth - 1) * f, t.setLayout({ x: y, y: v }, !0) }))) : \"TB\" !== m && \"BT\" !== m || (f = r / (h.getLayout().x + p + d), g = o / (c.depth - 1 || 1), BC(l, (function (t) { y = (t.getLayout().x + d) * f, v = \"TB\" === m ? (t.depth - 1) * g : o - (t.depth - 1) * g, t.setLayout({ x: y, y: v }, !0) }))) } } }(t, e) })) } function GC(t) { t.eachSeriesByType(\"tree\", (function (t) { var e = t.getData(); e.tree.eachNode((function (t) { var n = t.getModel().getModel(\"itemStyle\").getItemStyle(); A(e.ensureUniqueItemVisual(t.dataIndex, \"style\"), n) })) })) } var WC = [\"treemapZoomToNode\", \"treemapRender\", \"treemapMove\"]; function HC(t) { var e = t.getData().tree, n = {}; e.eachNode((function (e) { for (var i = e; i && i.depth > 1;)i = i.parentNode; var r = rd(t.ecModel, i.name || i.dataIndex + \"\", n); e.setVisual(\"decal\", r) })) } var YC = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.preventUsingHoverLayer = !0, n } return n(e, t), e.prototype.getInitialData = function (t, e) { var n = { name: t.name, children: t.data }; UC(n); var i = t.levels || [], r = this.designatedVisualItemStyle = {}, o = new xc({ itemStyle: r }, this, e); i = t.levels = function (t, e) { var n, i, r = yo(e.get(\"color\")), o = yo(e.get([\"aria\", \"decal\", \"decals\"])); if (!r) return; E(t = t || [], (function (t) { var e = new xc(t), r = e.get(\"color\"), o = e.get(\"decal\"); (e.get([\"itemStyle\", \"color\"]) || r && \"none\" !== r) && (n = !0), (e.get([\"itemStyle\", \"decal\"]) || o && \"none\" !== o) && (i = !0) })); var a = t[0] || (t[0] = {}); n || (a.color = r.slice()); !i && o && (a.decal = o.slice()); return t }(i, e); var a = z(i || [], (function (t) { return new xc(t, o, e) }), this), s = OC.createTree(n, this, (function (t) { t.wrapMethod(\"getItemModel\", (function (t, e) { var n = s.getNodeByDataIndex(e), i = n ? a[n.depth] : null; return t.parentModel = i || o, t })) })); return s.data }, e.prototype.optionUpdated = function () { this.resetViewRoot() }, e.prototype.formatTooltip = function (t, e, n) { var i = this.getData(), r = this.getRawValue(t); return qf(\"nameValue\", { name: i.getName(t), value: r }) }, e.prototype.getDataParams = function (e) { var n = t.prototype.getDataParams.apply(this, arguments), i = this.getData().tree.getNodeByDataIndex(e); return n.treeAncestors = zC(i, this), n.treePathInfo = n.treeAncestors, n }, e.prototype.setLayoutInfo = function (t) { this.layoutInfo = this.layoutInfo || {}, A(this.layoutInfo, t) }, e.prototype.mapIdToIndex = function (t) { var e = this._idIndexMap; e || (e = this._idIndexMap = ft(), this._idIndexMapCount = 0); var n = e.get(t); return null == n && e.set(t, n = this._idIndexMapCount++), n }, e.prototype.getViewRoot = function () { return this._viewRoot }, e.prototype.resetViewRoot = function (t) { t ? this._viewRoot = t : t = this._viewRoot; var e = this.getRawData().tree.root; t && (t === e || e.contains(t)) || (this._viewRoot = e) }, e.prototype.enableAriaDecal = function () { HC(this) }, e.type = \"series.treemap\", e.layoutMode = \"box\", e.defaultOption = { progressive: 0, left: \"center\", top: \"middle\", width: \"80%\", height: \"80%\", sort: !0, clipWindow: \"origin\", squareRatio: .5 * (1 + Math.sqrt(5)), leafDepth: null, drillDownIcon: \"▶\", zoomToNodeRatio: .1024, roam: !0, nodeClick: \"zoomToNode\", animation: !0, animationDurationUpdate: 900, animationEasing: \"quinticInOut\", breadcrumb: { show: !0, height: 22, left: \"center\", top: \"bottom\", emptyItemWidth: 25, itemStyle: { color: \"rgba(0,0,0,0.7)\", textStyle: { color: \"#fff\" } }, emphasis: { itemStyle: { color: \"rgba(0,0,0,0.9)\" } } }, label: { show: !0, distance: 0, padding: 5, position: \"inside\", color: \"#fff\", overflow: \"truncate\" }, upperLabel: { show: !1, position: [0, \"50%\"], height: 20, overflow: \"truncate\", verticalAlign: \"middle\" }, itemStyle: { color: null, colorAlpha: null, colorSaturation: null, borderWidth: 0, gapWidth: 0, borderColor: \"#fff\", borderColorSaturation: null }, emphasis: { upperLabel: { show: !0, position: [0, \"50%\"], overflow: \"truncate\", verticalAlign: \"middle\" } }, visualDimension: 0, visualMin: null, visualMax: null, color: [], colorAlpha: null, colorSaturation: null, colorMappingBy: \"index\", visibleMin: 10, childrenVisibleMin: null, levels: [] }, e }(hg); function UC(t) { var e = 0; E(t.children, (function (t) { UC(t); var n = t.value; Y(n) && (n = n[0]), e += n })); var n = t.value; Y(n) && (n = n[0]), (null == n || isNaN(n)) && (n = e), n < 0 && (n = 0), Y(t.value) ? t.value[0] = n : t.value = n } var XC = function () { function t(t) { this.group = new Pr, t.add(this.group) } return t.prototype.render = function (t, e, n, i) { var r = t.getModel(\"breadcrumb\"), o = this.group; if (o.removeAll(), r.get(\"show\") && n) { var a = r.getModel(\"itemStyle\"), s = r.getModel(\"emphasis\"), l = a.getModel(\"textStyle\"), u = s.getModel([\"itemStyle\", \"textStyle\"]), h = { pos: { left: r.get(\"left\"), right: r.get(\"right\"), top: r.get(\"top\"), bottom: r.get(\"bottom\") }, box: { width: e.getWidth(), height: e.getHeight() }, emptyItemWidth: r.get(\"emptyItemWidth\"), totalWidth: 0, renderList: [] }; this._prepare(n, h, l), this._renderContent(t, h, a, s, l, u, i), Sp(o, h.pos, h.box) } }, t.prototype._prepare = function (t, e, n) { for (var i = t; i; i = i.parentNode) { var r = Mo(i.getModel().get(\"name\"), \"\"), o = n.getTextRect(r), a = Math.max(o.width + 16, e.emptyItemWidth); e.totalWidth += a + 8, e.renderList.push({ node: i, text: r, width: a }) } }, t.prototype._renderContent = function (t, e, n, i, r, o, a) { for (var s, l, u, h, c, p, d, f, g, y = 0, v = e.emptyItemWidth, m = t.get([\"breadcrumb\", \"height\"]), x = (s = e.pos, l = e.box, h = l.width, c = l.height, p = Gr(s.left, h), d = Gr(s.top, c), f = Gr(s.right, h), g = Gr(s.bottom, c), (isNaN(p) || isNaN(parseFloat(s.left))) && (p = 0), (isNaN(f) || isNaN(parseFloat(s.right))) && (f = h), (isNaN(d) || isNaN(parseFloat(s.top))) && (d = 0), (isNaN(g) || isNaN(parseFloat(s.bottom))) && (g = c), u = up(u || 0), { width: Math.max(f - p - u[1] - u[3], 0), height: Math.max(g - d - u[0] - u[2], 0) }), _ = e.totalWidth, b = e.renderList, w = i.getModel(\"itemStyle\").getItemStyle(), S = b.length - 1; S >= 0; S--) { var M = b[S], I = M.node, T = M.width, C = M.text; _ > x.width && (_ -= T - v, T = v, C = null); var D = new zu({ shape: { points: ZC(y, 0, T, m, S === b.length - 1, 0 === S) }, style: k(n.getItemStyle(), { lineJoin: \"bevel\" }), textContent: new Ns({ style: $h(r, { text: C }) }), textConfig: { position: \"inside\" }, z2: 1e5, onclick: H(a, I) }); D.disableLabelAnimation = !0, D.getTextContent().ensureState(\"emphasis\").style = $h(o, { text: C }), D.ensureState(\"emphasis\").style = w, Bl(D, i.get(\"focus\"), i.get(\"blurScope\"), i.get(\"disabled\")), this.group.add(D), jC(D, t, I), y += T + 8 } }, t.prototype.remove = function () { this.group.removeAll() }, t }(); function ZC(t, e, n, i, r, o) { var a = [[r ? t : t - 5, e], [t + n, e], [t + n, e + i], [r ? t : t - 5, e + i]]; return !o && a.splice(2, 0, [t + n + 5, e + i / 2]), !r && a.push([t, e + i / 2]), a } function jC(t, e, n) { js(t).eventData = { componentType: \"series\", componentSubType: \"treemap\", componentIndex: e.componentIndex, seriesIndex: e.seriesIndex, seriesName: e.name, seriesType: \"treemap\", selfType: \"breadcrumb\", nodeData: { dataIndex: n && n.dataIndex, name: n && n.name }, treePathInfo: n && zC(n, e) } } var qC = function () { function t() { this._storage = [], this._elExistsMap = {} } return t.prototype.add = function (t, e, n, i, r) { return !this._elExistsMap[t.id] && (this._elExistsMap[t.id] = !0, this._storage.push({ el: t, target: e, duration: n, delay: i, easing: r }), !0) }, t.prototype.finished = function (t) { return this._finishedCallback = t, this }, t.prototype.start = function () { for (var t = this, e = this._storage.length, n = function () { --e <= 0 && (t._storage.length = 0, t._elExistsMap = {}, t._finishedCallback && t._finishedCallback()) }, i = 0, r = this._storage.length; i < r; i++) { var o = this._storage[i]; o.el.animateTo(o.target, { duration: o.duration, delay: o.delay, easing: o.easing, setToFinal: !0, done: n, aborted: n }) } return this }, t }(); var KC = Pr, $C = Ps, JC = \"label\", QC = \"upperLabel\", tD = Zo([[\"fill\", \"color\"], [\"stroke\", \"strokeColor\"], [\"lineWidth\", \"strokeWidth\"], [\"shadowBlur\"], [\"shadowOffsetX\"], [\"shadowOffsetY\"], [\"shadowColor\"]]), eD = function (t) { var e = tD(t); return e.stroke = e.fill = e.lineWidth = null, e }, nD = Do(), iD = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._state = \"ready\", n._storage = { nodeGroup: [], background: [], content: [] }, n } return n(e, t), e.prototype.render = function (t, e, n, i) { if (!(P(e.findComponents({ mainType: \"series\", subType: \"treemap\", query: i }), t) < 0)) { this.seriesModel = t, this.api = n, this.ecModel = e; var r = RC(i, [\"treemapZoomToNode\", \"treemapRootToNode\"], t), o = i && i.type, a = t.layoutInfo, s = !this._oldTree, l = this._storage, u = \"treemapRootToNode\" === o && r && l ? { rootNodeGroup: l.nodeGroup[r.node.getRawIndex()], direction: i.direction } : null, h = this._giveContainerGroup(a), c = t.get(\"animation\"), p = this._doRender(h, t, u); !c || s || o && \"treemapZoomToNode\" !== o && \"treemapRootToNode\" !== o ? p.renderFinally() : this._doAnimation(h, p, t, u), this._resetController(n), this._renderBreadcrumb(t, n, r) } }, e.prototype._giveContainerGroup = function (t) { var e = this._containerGroup; return e || (e = this._containerGroup = new KC, this._initEvents(e), this.group.add(e)), e.x = t.x, e.y = t.y, e }, e.prototype._doRender = function (t, e, n) { var i = e.getData().tree, r = this._oldTree, o = { nodeGroup: [], background: [], content: [] }, a = { nodeGroup: [], background: [], content: [] }, s = this._storage, l = []; function u(t, i, r, u) { return function (t, e, n, i, r, o, a, s, l, u) { if (!a) return; var h = a.getLayout(), c = t.getData(), p = a.getModel(); if (c.setItemGraphicEl(a.dataIndex, null), !h || !h.isInView) return; var d = h.width, f = h.height, g = h.borderWidth, y = h.invisible, v = a.getRawIndex(), m = s && s.getRawIndex(), x = a.viewChildren, _ = h.upperHeight, b = x && x.length, w = p.getModel(\"itemStyle\"), S = p.getModel([\"emphasis\", \"itemStyle\"]), M = p.getModel([\"blur\", \"itemStyle\"]), I = p.getModel([\"select\", \"itemStyle\"]), T = w.get(\"borderRadius\") || 0, C = G(\"nodeGroup\", KC); if (!C) return; if (l.add(C), C.x = h.x || 0, C.y = h.y || 0, C.markRedraw(), nD(C).nodeWidth = d, nD(C).nodeHeight = f, h.isAboveViewRoot) return C; var D = G(\"background\", $C, u, 20); D && E(C, D, b && h.upperLabelHeight); var k = p.getModel(\"emphasis\"), L = k.get(\"focus\"), P = k.get(\"blurScope\"), O = k.get(\"disabled\"), R = \"ancestor\" === L ? a.getAncestorsIndices() : \"descendant\" === L ? a.getDescendantIndices() : L; if (b) Ul(C) && Yl(C, !1), D && (Yl(D, !O), c.setItemGraphicEl(a.dataIndex, D), Fl(D, R, P)); else { var N = G(\"content\", $C, u, 30); N && z(C, N), D.disableMorphing = !0, D && Ul(D) && Yl(D, !1), Yl(C, !O), c.setItemGraphicEl(a.dataIndex, C), Fl(C, R, P) } return C; function E(e, n, i) { var r = js(n); if (r.dataIndex = a.dataIndex, r.seriesIndex = t.seriesIndex, n.setShape({ x: 0, y: 0, width: d, height: f, r: T }), y) V(n); else { n.invisible = !1; var o = a.getVisual(\"style\"), s = o.stroke, l = eD(w); l.fill = s; var u = tD(S); u.fill = S.get(\"borderColor\"); var h = tD(M); h.fill = M.get(\"borderColor\"); var c = tD(I); if (c.fill = I.get(\"borderColor\"), i) { var p = d - 2 * g; B(n, s, o.opacity, { x: g, y: 0, width: p, height: _ }) } else n.removeTextContent(); n.setStyle(l), n.ensureState(\"emphasis\").style = u, n.ensureState(\"blur\").style = h, n.ensureState(\"select\").style = c, wl(n) } e.add(n) } function z(e, n) { var i = js(n); i.dataIndex = a.dataIndex, i.seriesIndex = t.seriesIndex; var r = Math.max(d - 2 * g, 0), o = Math.max(f - 2 * g, 0); if (n.culling = !0, n.setShape({ x: g, y: g, width: r, height: o, r: T }), y) V(n); else { n.invisible = !1; var s = a.getVisual(\"style\"), l = s.fill, u = eD(w); u.fill = l, u.decal = s.decal; var h = tD(S), c = tD(M), p = tD(I); B(n, l, s.opacity, null), n.setStyle(u), n.ensureState(\"emphasis\").style = h, n.ensureState(\"blur\").style = c, n.ensureState(\"select\").style = p, wl(n) } e.add(n) } function V(t) { !t.invisible && o.push(t) } function B(e, n, i, r) { var o = p.getModel(r ? QC : JC), s = Mo(p.get(\"name\"), null), l = o.getShallow(\"show\"); qh(e, Kh(p, r ? QC : JC), { defaultText: l ? s : null, inheritColor: n, defaultOpacity: i, labelFetcher: t, labelDataIndex: a.dataIndex }); var u = e.getTextContent(); if (u) { var c = u.style, d = st(c.padding || 0); r && (e.setTextConfig({ layoutRect: r }), u.disableLabelLayout = !0), u.beforeUpdate = function () { var t = Math.max((r ? r.width : e.shape.width) - d[1] - d[3], 0), n = Math.max((r ? r.height : e.shape.height) - d[0] - d[2], 0); c.width === t && c.height === n || u.setStyle({ width: t, height: n }) }, c.truncateMinChar = 2, c.lineOverflow = \"truncate\", F(c, r, h); var f = u.getState(\"emphasis\"); F(f ? f.style : null, r, h) } } function F(e, n, i) { var r = e ? e.text : null; if (!n && i.isLeafRoot && null != r) { var o = t.get(\"drillDownIcon\", !0); e.text = o ? o + \" \" + r : r } } function G(t, i, o, a) { var s = null != m && n[t][m], l = r[t]; return s ? (n[t][m] = null, W(l, s)) : y || ((s = new i) instanceof ma && (s.z2 = function (t, e) { return 100 * t + e }(o, a)), H(l, s)), e[t][v] = s } function W(t, e) { var n = t[v] = {}; e instanceof KC ? (n.oldX = e.x, n.oldY = e.y) : n.oldShape = A({}, e.shape) } function H(t, e) { var n = t[v] = {}, o = a.parentNode, s = e instanceof Pr; if (o && (!i || \"drillDown\" === i.direction)) { var l = 0, u = 0, h = r.background[o.getRawIndex()]; !i && h && h.oldShape && (l = h.oldShape.width, u = h.oldShape.height), s ? (n.oldX = 0, n.oldY = u) : n.oldShape = { x: l, y: u, width: 0, height: 0 } } n.fadein = !s } }(e, a, s, n, o, l, t, i, r, u) } !function t(e, n, i, r, o) { r ? (n = e, E(e, (function (t, e) { !t.isRemoved() && s(e, e) }))) : new Dm(n, e, a, a).add(s).update(s).remove(H(s, null)).execute(); function a(t) { return t.getId() } function s(a, s) { var l = null != a ? e[a] : null, h = null != s ? n[s] : null, c = u(l, h, i, o); c && t(l && l.viewChildren || [], h && h.viewChildren || [], c, r, o + 1) } }(i.root ? [i.root] : [], r && r.root ? [r.root] : [], t, i === r || !r, 0); var h = function (t) { var e = { nodeGroup: [], background: [], content: [] }; return t && E(t, (function (t, n) { var i = e[n]; E(t, (function (t) { t && (i.push(t), nD(t).willDelete = !0) })) })), e }(s); return this._oldTree = i, this._storage = a, { lastsForAnimation: o, willDeleteEls: h, renderFinally: function () { E(h, (function (t) { E(t, (function (t) { t.parent && t.parent.remove(t) })) })), E(l, (function (t) { t.invisible = !0, t.dirty() })) } } }, e.prototype._doAnimation = function (t, e, n, i) { var r = n.get(\"animationDurationUpdate\"), o = n.get(\"animationEasing\"), a = (U(r) ? 0 : r) || 0, s = (U(o) ? null : o) || \"cubicOut\", l = new qC; E(e.willDeleteEls, (function (t, e) { E(t, (function (t, n) { if (!t.invisible) { var r, o = t.parent, u = nD(o); if (i && \"drillDown\" === i.direction) r = o === i.rootNodeGroup ? { shape: { x: 0, y: 0, width: u.nodeWidth, height: u.nodeHeight }, style: { opacity: 0 } } : { style: { opacity: 0 } }; else { var h = 0, c = 0; u.willDelete || (h = u.nodeWidth / 2, c = u.nodeHeight / 2), r = \"nodeGroup\" === e ? { x: h, y: c, style: { opacity: 0 } } : { shape: { x: h, y: c, width: 0, height: 0 }, style: { opacity: 0 } } } r && l.add(t, r, a, 0, s) } })) })), E(this._storage, (function (t, n) { E(t, (function (t, i) { var r = e.lastsForAnimation[n][i], o = {}; r && (t instanceof Pr ? null != r.oldX && (o.x = t.x, o.y = t.y, t.x = r.oldX, t.y = r.oldY) : (r.oldShape && (o.shape = A({}, t.shape), t.setShape(r.oldShape)), r.fadein ? (t.setStyle(\"opacity\", 0), o.style = { opacity: 1 }) : 1 !== t.style.opacity && (o.style = { opacity: 1 })), l.add(t, o, a, 0, s)) })) }), this), this._state = \"animating\", l.finished(W((function () { this._state = \"ready\", e.renderFinally() }), this)).start() }, e.prototype._resetController = function (t) { var e = this._controller; e || ((e = this._controller = new OI(t.getZr())).enable(this.seriesModel.get(\"roam\")), e.on(\"pan\", W(this._onPan, this)), e.on(\"zoom\", W(this._onZoom, this))); var n = new Re(0, 0, t.getWidth(), t.getHeight()); e.setPointerChecker((function (t, e, i) { return n.contain(e, i) })) }, e.prototype._clearController = function () { var t = this._controller; t && (t.dispose(), t = null) }, e.prototype._onPan = function (t) { if (\"animating\" !== this._state && (Math.abs(t.dx) > 3 || Math.abs(t.dy) > 3)) { var e = this.seriesModel.getData().tree.root; if (!e) return; var n = e.getLayout(); if (!n) return; this.api.dispatchAction({ type: \"treemapMove\", from: this.uid, seriesId: this.seriesModel.id, rootRect: { x: n.x + t.dx, y: n.y + t.dy, width: n.width, height: n.height } }) } }, e.prototype._onZoom = function (t) { var e = t.originX, n = t.originY; if (\"animating\" !== this._state) { var i = this.seriesModel.getData().tree.root; if (!i) return; var r = i.getLayout(); if (!r) return; var o = new Re(r.x, r.y, r.width, r.height), a = this.seriesModel.layoutInfo, s = [1, 0, 0, 1, 0, 0]; xe(s, s, [-(e -= a.x), -(n -= a.y)]), be(s, s, [t.scale, t.scale]), xe(s, s, [e, n]), o.applyTransform(s), this.api.dispatchAction({ type: \"treemapRender\", from: this.uid, seriesId: this.seriesModel.id, rootRect: { x: o.x, y: o.y, width: o.width, height: o.height } }) } }, e.prototype._initEvents = function (t) { var e = this; t.on(\"click\", (function (t) { if (\"ready\" === e._state) { var n = e.seriesModel.get(\"nodeClick\", !0); if (n) { var i = e.findTarget(t.offsetX, t.offsetY); if (i) { var r = i.node; if (r.getLayout().isLeafRoot) e._rootToNode(i); else if (\"zoomToNode\" === n) e._zoomToNode(i); else if (\"link\" === n) { var o = r.hostTree.data.getItemModel(r.dataIndex), a = o.get(\"link\", !0), s = o.get(\"target\", !0) || \"blank\"; a && yp(a, s) } } } } }), this) }, e.prototype._renderBreadcrumb = function (t, e, n) { var i = this; n || (n = null != t.get(\"leafDepth\", !0) ? { node: t.getViewRoot() } : this.findTarget(e.getWidth() / 2, e.getHeight() / 2)) || (n = { node: t.getData().tree.root }), (this._breadcrumb || (this._breadcrumb = new XC(this.group))).render(t, e, n.node, (function (e) { \"animating\" !== i._state && (EC(t.getViewRoot(), e) ? i._rootToNode({ node: e }) : i._zoomToNode({ node: e })) })) }, e.prototype.remove = function () { this._clearController(), this._containerGroup && this._containerGroup.removeAll(), this._storage = { nodeGroup: [], background: [], content: [] }, this._state = \"ready\", this._breadcrumb && this._breadcrumb.remove() }, e.prototype.dispose = function () { this._clearController() }, e.prototype._zoomToNode = function (t) { this.api.dispatchAction({ type: \"treemapZoomToNode\", from: this.uid, seriesId: this.seriesModel.id, targetNode: t.node }) }, e.prototype._rootToNode = function (t) { this.api.dispatchAction({ type: \"treemapRootToNode\", from: this.uid, seriesId: this.seriesModel.id, targetNode: t.node }) }, e.prototype.findTarget = function (t, e) { var n; return this.seriesModel.getViewRoot().eachNode({ attr: \"viewChildren\", order: \"preorder\" }, (function (i) { var r = this._storage.background[i.getRawIndex()]; if (r) { var o = r.transformCoordToLocal(t, e), a = r.shape; if (!(a.x <= o[0] && o[0] <= a.x + a.width && a.y <= o[1] && o[1] <= a.y + a.height)) return !1; n = { node: i, offsetX: o[0], offsetY: o[1] } } }), this), n }, e.type = \"treemap\", e }(wg); var rD = E, oD = q, aD = -1, sD = function () { function t(e) { var n = e.mappingMethod, i = e.type, r = this.option = T(e); this.type = i, this.mappingMethod = n, this._normalizeData = vD[n]; var o = t.visualHandlers[i]; this.applyVisual = o.applyVisual, this.getColorMapper = o.getColorMapper, this._normalizedToVisual = o._normalizedToVisual[n], \"piecewise\" === n ? (lD(r), function (t) { var e = t.pieceList; t.hasSpecialVisual = !1, E(e, (function (e, n) { e.originIndex = n, null != e.visual && (t.hasSpecialVisual = !0) })) }(r)) : \"category\" === n ? r.categories ? function (t) { var e = t.categories, n = t.categoryMap = {}, i = t.visual; if (rD(e, (function (t, e) { n[t] = e })), !Y(i)) { var r = []; q(i) ? rD(i, (function (t, e) { var i = n[e]; r[null != i ? i : aD] = t })) : r[-1] = i, i = yD(t, r) } for (var o = e.length - 1; o >= 0; o--)null == i[o] && (delete n[e[o]], e.pop()) }(r) : lD(r, !0) : (lt(\"linear\" !== n || r.dataExtent), lD(r)) } return t.prototype.mapValueToVisual = function (t) { var e = this._normalizeData(t); return this._normalizedToVisual(e, t) }, t.prototype.getNormalizer = function () { return W(this._normalizeData, this) }, t.listVisualTypes = function () { return G(t.visualHandlers) }, t.isValidType = function (e) { return t.visualHandlers.hasOwnProperty(e) }, t.eachVisual = function (t, e, n) { q(t) ? E(t, e, n) : e.call(n, t) }, t.mapVisual = function (e, n, i) { var r, o = Y(e) ? [] : q(e) ? {} : (r = !0, null); return t.eachVisual(e, (function (t, e) { var a = n.call(i, t, e); r ? o = a : o[e] = a })), o }, t.retrieveVisuals = function (e) { var n, i = {}; return e && rD(t.visualHandlers, (function (t, r) { e.hasOwnProperty(r) && (i[r] = e[r], n = !0) })), n ? i : null }, t.prepareVisualTypes = function (t) { if (Y(t)) t = t.slice(); else { if (!oD(t)) return []; var e = []; rD(t, (function (t, n) { e.push(n) })), t = e } return t.sort((function (t, e) { return \"color\" === e && \"color\" !== t && 0 === t.indexOf(\"color\") ? 1 : -1 })), t }, t.dependsOn = function (t, e) { return \"color\" === e ? !(!t || 0 !== t.indexOf(e)) : t === e }, t.findPieceIndex = function (t, e, n) { for (var i, r = 1 / 0, o = 0, a = e.length; o < a; o++) { var s = e[o].value; if (null != s) { if (s === t || X(s) && s === t + \"\") return o; n && c(s, o) } } for (o = 0, a = e.length; o < a; o++) { var l = e[o], u = l.interval, h = l.close; if (u) { if (u[0] === -1 / 0) { if (mD(h[1], t, u[1])) return o } else if (u[1] === 1 / 0) { if (mD(h[0], u[0], t)) return o } else if (mD(h[0], u[0], t) && mD(h[1], t, u[1])) return o; n && c(u[0], o), n && c(u[1], o) } } if (n) return t === 1 / 0 ? e.length - 1 : t === -1 / 0 ? 0 : i; function c(e, n) { var o = Math.abs(e - t); o < r && (r = o, i = n) } }, t.visualHandlers = { color: { applyVisual: cD(\"color\"), getColorMapper: function () { var t = this.option; return W(\"category\" === t.mappingMethod ? function (t, e) { return !e && (t = this._normalizeData(t)), pD.call(this, t) } : function (e, n, i) { var r = !!i; return !n && (e = this._normalizeData(e)), i = qn(e, t.parsedVisual, i), r ? i : ei(i, \"rgba\") }, this) }, _normalizedToVisual: { linear: function (t) { return ei(qn(t, this.option.parsedVisual), \"rgba\") }, category: pD, piecewise: function (t, e) { var n = gD.call(this, e); return null == n && (n = ei(qn(t, this.option.parsedVisual), \"rgba\")), n }, fixed: dD } }, colorHue: uD((function (t, e) { return Qn(t, e) })), colorSaturation: uD((function (t, e) { return Qn(t, null, e) })), colorLightness: uD((function (t, e) { return Qn(t, null, null, e) })), colorAlpha: uD((function (t, e) { return ti(t, e) })), decal: { applyVisual: cD(\"decal\"), _normalizedToVisual: { linear: null, category: pD, piecewise: null, fixed: null } }, opacity: { applyVisual: cD(\"opacity\"), _normalizedToVisual: fD([0, 1]) }, liftZ: { applyVisual: cD(\"liftZ\"), _normalizedToVisual: { linear: dD, category: dD, piecewise: dD, fixed: dD } }, symbol: { applyVisual: function (t, e, n) { n(\"symbol\", this.mapValueToVisual(t)) }, _normalizedToVisual: { linear: hD, category: pD, piecewise: function (t, e) { var n = gD.call(this, e); return null == n && (n = hD.call(this, t)), n }, fixed: dD } }, symbolSize: { applyVisual: cD(\"symbolSize\"), _normalizedToVisual: fD([0, 1]) } }, t }(); function lD(t, e) { var n = t.visual, i = []; q(n) ? rD(n, (function (t) { i.push(t) })) : null != n && i.push(n); e || 1 !== i.length || { color: 1, symbol: 1 }.hasOwnProperty(t.type) || (i[1] = i[0]), yD(t, i) } function uD(t) { return { applyVisual: function (e, n, i) { var r = this.mapValueToVisual(e); i(\"color\", t(n(\"color\"), r)) }, _normalizedToVisual: fD([0, 1]) } } function hD(t) { var e = this.option.visual; return e[Math.round(Fr(t, [0, 1], [0, e.length - 1], !0))] || {} } function cD(t) { return function (e, n, i) { i(t, this.mapValueToVisual(e)) } } function pD(t) { var e = this.option.visual; return e[this.option.loop && t !== aD ? t % e.length : t] } function dD() { return this.option.visual[0] } function fD(t) { return { linear: function (e) { return Fr(e, t, this.option.visual, !0) }, category: pD, piecewise: function (e, n) { var i = gD.call(this, n); return null == i && (i = Fr(e, t, this.option.visual, !0)), i }, fixed: dD } } function gD(t) { var e = this.option, n = e.pieceList; if (e.hasSpecialVisual) { var i = n[sD.findPieceIndex(t, n)]; if (i && i.visual) return i.visual[this.type] } } function yD(t, e) { return t.visual = e, \"color\" === t.type && (t.parsedVisual = z(e, (function (t) { var e = Xn(t); return e || [0, 0, 0, 1] }))), e } var vD = { linear: function (t) { return Fr(t, this.option.dataExtent, [0, 1], !0) }, piecewise: function (t) { var e = this.option.pieceList, n = sD.findPieceIndex(t, e, !0); if (null != n) return Fr(n, [0, e.length - 1], [0, 1], !0) }, category: function (t) { var e = this.option.categories ? this.option.categoryMap[t] : t; return null == e ? aD : e }, fixed: xt }; function mD(t, e, n) { return t ? e <= n : e < n } var xD = Do(), _D = { seriesType: \"treemap\", reset: function (t) { var e = t.getData().tree.root; e.isRemoved() || bD(e, {}, t.getViewRoot().getAncestors(), t) } }; function bD(t, e, n, i) { var r = t.getModel(), o = t.getLayout(), a = t.hostTree.data; if (o && !o.invisible && o.isInView) { var s, l = r.getModel(\"itemStyle\"), u = function (t, e, n) { var i = A({}, e), r = n.designatedVisualItemStyle; return E([\"color\", \"colorAlpha\", \"colorSaturation\"], (function (n) { r[n] = e[n]; var o = t.get(n); r[n] = null, null != o && (i[n] = o) })), i }(l, e, i), h = a.ensureUniqueItemVisual(t.dataIndex, \"style\"), c = l.get(\"borderColor\"), p = l.get(\"borderColorSaturation\"); null != p && (c = function (t, e) { return null != e ? Qn(e, null, null, t) : null }(p, s = wD(u))), h.stroke = c; var d = t.viewChildren; if (d && d.length) { var f = function (t, e, n, i, r, o) { if (!o || !o.length) return; var a = MD(e, \"color\") || null != r.color && \"none\" !== r.color && (MD(e, \"colorAlpha\") || MD(e, \"colorSaturation\")); if (!a) return; var s = e.get(\"visualMin\"), l = e.get(\"visualMax\"), u = n.dataExtent.slice(); null != s && s < u[0] && (u[0] = s), null != l && l > u[1] && (u[1] = l); var h = e.get(\"colorMappingBy\"), c = { type: a.name, dataExtent: u, visual: a.range }; \"color\" !== c.type || \"index\" !== h && \"id\" !== h ? c.mappingMethod = \"linear\" : (c.mappingMethod = \"category\", c.loop = !0); var p = new sD(c); return xD(p).drColorMappingBy = h, p }(0, r, o, 0, u, d); E(d, (function (t, e) { if (t.depth >= n.length || t === n[t.depth]) { var o = function (t, e, n, i, r, o) { var a = A({}, e); if (r) { var s = r.type, l = \"color\" === s && xD(r).drColorMappingBy, u = \"index\" === l ? i : \"id\" === l ? o.mapIdToIndex(n.getId()) : n.getValue(t.get(\"visualDimension\")); a[s] = r.mapValueToVisual(u) } return a }(r, u, t, e, f, i); bD(t, o, n, i) } })) } else s = wD(u), h.fill = s } } function wD(t) { var e = SD(t, \"color\"); if (e) { var n = SD(t, \"colorAlpha\"), i = SD(t, \"colorSaturation\"); return i && (e = Qn(e, null, null, i)), n && (e = ti(e, n)), e } } function SD(t, e) { var n = t[e]; if (null != n && \"none\" !== n) return n } function MD(t, e) { var n = t.get(e); return Y(n) && n.length ? { name: e, range: n } : null } var ID = Math.max, TD = Math.min, CD = it, DD = E, AD = [\"itemStyle\", \"borderWidth\"], kD = [\"itemStyle\", \"gapWidth\"], LD = [\"upperLabel\", \"show\"], PD = [\"upperLabel\", \"height\"], OD = { seriesType: \"treemap\", reset: function (t, e, n, i) { var r = n.getWidth(), o = n.getHeight(), a = t.option, s = wp(t.getBoxLayoutParams(), { width: n.getWidth(), height: n.getHeight() }), l = a.size || [], u = Gr(CD(s.width, l[0]), r), h = Gr(CD(s.height, l[1]), o), c = i && i.type, p = RC(i, [\"treemapZoomToNode\", \"treemapRootToNode\"], t), d = \"treemapRender\" === c || \"treemapMove\" === c ? i.rootRect : null, f = t.getViewRoot(), g = NC(f); if (\"treemapMove\" !== c) { var y = \"treemapZoomToNode\" === c ? function (t, e, n, i, r) { var o, a = (e || {}).node, s = [i, r]; if (!a || a === n) return s; var l = i * r, u = l * t.option.zoomToNodeRatio; for (; o = a.parentNode;) { for (var h = 0, c = o.children, p = 0, d = c.length; p < d; p++)h += c[p].getValue(); var f = a.getValue(); if (0 === f) return s; u *= h / f; var g = o.getModel(), y = g.get(AD); (u += 4 * y * y + (3 * y + Math.max(y, VD(g))) * Math.pow(u, .5)) > qr && (u = qr), a = o } u < l && (u = l); var v = Math.pow(u / l, .5); return [i * v, r * v] }(t, p, f, u, h) : d ? [d.width, d.height] : [u, h], v = a.sort; v && \"asc\" !== v && \"desc\" !== v && (v = \"desc\"); var m = { squareRatio: a.squareRatio, sort: v, leafDepth: a.leafDepth }; f.hostTree.clearLayouts(); var x = { x: 0, y: 0, width: y[0], height: y[1], area: y[0] * y[1] }; f.setLayout(x), RD(f, m, !1, 0), x = f.getLayout(), DD(g, (function (t, e) { var n = (g[e + 1] || f).getValue(); t.setLayout(A({ dataExtent: [n, n], borderWidth: 0, upperHeight: 0 }, x)) })) } var _ = t.getData().tree.root; _.setLayout(function (t, e, n) { if (e) return { x: e.x, y: e.y }; var i = { x: 0, y: 0 }; if (!n) return i; var r = n.node, o = r.getLayout(); if (!o) return i; var a = [o.width / 2, o.height / 2], s = r; for (; s;) { var l = s.getLayout(); a[0] += l.x, a[1] += l.y, s = s.parentNode } return { x: t.width / 2 - a[0], y: t.height / 2 - a[1] } }(s, d, p), !0), t.setLayoutInfo(s), zD(_, new Re(-s.x, -s.y, r, o), g, f, 0) } }; function RD(t, e, n, i) { var r, o; if (!t.isRemoved()) { var a = t.getLayout(); r = a.width, o = a.height; var s = t.getModel(), l = s.get(AD), u = s.get(kD) / 2, h = VD(s), c = Math.max(l, h), p = l - u, d = c - u; t.setLayout({ borderWidth: l, upperHeight: c, upperLabelHeight: h }, !0); var f = (r = ID(r - 2 * p, 0)) * (o = ID(o - p - d, 0)), g = function (t, e, n, i, r, o) { var a = t.children || [], s = i.sort; \"asc\" !== s && \"desc\" !== s && (s = null); var l = null != i.leafDepth && i.leafDepth <= o; if (r && !l) return t.viewChildren = []; a = B(a, (function (t) { return !t.isRemoved() })), function (t, e) { e && t.sort((function (t, n) { var i = \"asc\" === e ? t.getValue() - n.getValue() : n.getValue() - t.getValue(); return 0 === i ? \"asc\" === e ? t.dataIndex - n.dataIndex : n.dataIndex - t.dataIndex : i })) }(a, s); var u = function (t, e, n) { for (var i = 0, r = 0, o = e.length; r < o; r++)i += e[r].getValue(); var a, s = t.get(\"visualDimension\"); e && e.length ? \"value\" === s && n ? (a = [e[e.length - 1].getValue(), e[0].getValue()], \"asc\" === n && a.reverse()) : (a = [1 / 0, -1 / 0], DD(e, (function (t) { var e = t.getValue(s); e < a[0] && (a[0] = e), e > a[1] && (a[1] = e) }))) : a = [NaN, NaN]; return { sum: i, dataExtent: a } }(e, a, s); if (0 === u.sum) return t.viewChildren = []; if (u.sum = function (t, e, n, i, r) { if (!i) return n; for (var o = t.get(\"visibleMin\"), a = r.length, s = a, l = a - 1; l >= 0; l--) { var u = r[\"asc\" === i ? a - l - 1 : l].getValue(); u / n * e < o && (s = l, n -= u) } return \"asc\" === i ? r.splice(0, a - s) : r.splice(s, a - s), n }(e, n, u.sum, s, a), 0 === u.sum) return t.viewChildren = []; for (var h = 0, c = a.length; h < c; h++) { var p = a[h].getValue() / u.sum * n; a[h].setLayout({ area: p }) } l && (a.length && t.setLayout({ isLeafRoot: !0 }, !0), a.length = 0); return t.viewChildren = a, t.setLayout({ dataExtent: u.dataExtent }, !0), a }(t, s, f, e, n, i); if (g.length) { var y = { x: p, y: d, width: r, height: o }, v = TD(r, o), m = 1 / 0, x = []; x.area = 0; for (var _ = 0, b = g.length; _ < b;) { var w = g[_]; x.push(w), x.area += w.getLayout().area; var S = ND(x, v, e.squareRatio); S <= m ? (_++, m = S) : (x.area -= x.pop().getLayout().area, ED(x, v, y, u, !1), v = TD(y.width, y.height), x.length = x.area = 0, m = 1 / 0) } if (x.length && ED(x, v, y, u, !0), !n) { var M = s.get(\"childrenVisibleMin\"); null != M && f < M && (n = !0) } for (_ = 0, b = g.length; _ < b; _++)RD(g[_], e, n, i + 1) } } } function ND(t, e, n) { for (var i = 0, r = 1 / 0, o = 0, a = void 0, s = t.length; o < s; o++)(a = t[o].getLayout().area) && (a < r && (r = a), a > i && (i = a)); var l = t.area * t.area, u = e * e * n; return l ? ID(u * i / l, l / (u * r)) : 1 / 0 } function ED(t, e, n, i, r) { var o = e === n.width ? 0 : 1, a = 1 - o, s = [\"x\", \"y\"], l = [\"width\", \"height\"], u = n[s[o]], h = e ? t.area / e : 0; (r || h > n[l[a]]) && (h = n[l[a]]); for (var c = 0, p = t.length; c < p; c++) { var d = t[c], f = {}, g = h ? d.getLayout().area / h : 0, y = f[l[a]] = ID(h - 2 * i, 0), v = n[s[o]] + n[l[o]] - u, m = c === p - 1 || v < g ? v : g, x = f[l[o]] = ID(m - 2 * i, 0); f[s[a]] = n[s[a]] + TD(i, y / 2), f[s[o]] = u + TD(i, x / 2), u += m, d.setLayout(f, !0) } n[s[a]] += h, n[l[a]] -= h } function zD(t, e, n, i, r) { var o = t.getLayout(), a = n[r], s = a && a === t; if (!(a && !s || r === n.length && t !== i)) { t.setLayout({ isInView: !0, invisible: !s && !e.intersect(o), isAboveViewRoot: s }, !0); var l = new Re(e.x - o.x, e.y - o.y, e.width, e.height); DD(t.viewChildren || [], (function (t) { zD(t, l, n, i, r + 1) })) } } function VD(t) { return t.get(LD) ? t.get(PD) : 0 } function BD(t) { var e = t.findComponents({ mainType: \"legend\" }); e && e.length && t.eachSeriesByType(\"graph\", (function (t) { var n = t.getCategoriesData(), i = t.getGraph().data, r = n.mapArray(n.getName); i.filterSelf((function (t) { var n = i.getItemModel(t).getShallow(\"category\"); if (null != n) { j(n) && (n = r[n]); for (var o = 0; o < e.length; o++)if (!e[o].isSelected(n)) return !1 } return !0 })) })) } function FD(t) { var e = {}; t.eachSeriesByType(\"graph\", (function (t) { var n = t.getCategoriesData(), i = t.getData(), r = {}; n.each((function (i) { var o = n.getName(i); r[\"ec-\" + o] = i; var a = n.getItemModel(i), s = a.getModel(\"itemStyle\").getItemStyle(); s.fill || (s.fill = t.getColorFromPalette(o, e)), n.setItemVisual(i, \"style\", s); for (var l = [\"symbol\", \"symbolSize\", \"symbolKeepAspect\"], u = 0; u < l.length; u++) { var h = a.getShallow(l[u], !0); null != h && n.setItemVisual(i, l[u], h) } })), n.count() && i.each((function (t) { var e = i.getItemModel(t).getShallow(\"category\"); if (null != e) { X(e) && (e = r[\"ec-\" + e]); var o = n.getItemVisual(e, \"style\"); A(i.ensureUniqueItemVisual(t, \"style\"), o); for (var a = [\"symbol\", \"symbolSize\", \"symbolKeepAspect\"], s = 0; s < a.length; s++)i.setItemVisual(t, a[s], n.getItemVisual(e, a[s])) } })) })) } function GD(t) { return t instanceof Array || (t = [t, t]), t } function WD(t) { t.eachSeriesByType(\"graph\", (function (t) { var e = t.getGraph(), n = t.getEdgeData(), i = GD(t.get(\"edgeSymbol\")), r = GD(t.get(\"edgeSymbolSize\")); n.setVisual(\"fromSymbol\", i && i[0]), n.setVisual(\"toSymbol\", i && i[1]), n.setVisual(\"fromSymbolSize\", r && r[0]), n.setVisual(\"toSymbolSize\", r && r[1]), n.setVisual(\"style\", t.getModel(\"lineStyle\").getLineStyle()), n.each((function (t) { var i = n.getItemModel(t), r = e.getEdgeByIndex(t), o = GD(i.getShallow(\"symbol\", !0)), a = GD(i.getShallow(\"symbolSize\", !0)), s = i.getModel(\"lineStyle\").getLineStyle(), l = n.ensureUniqueItemVisual(t, \"style\"); switch (A(l, s), l.stroke) { case \"source\": var u = r.node1.getVisual(\"style\"); l.stroke = u && u.fill; break; case \"target\": u = r.node2.getVisual(\"style\"); l.stroke = u && u.fill }o[0] && r.setVisual(\"fromSymbol\", o[0]), o[1] && r.setVisual(\"toSymbol\", o[1]), a[0] && r.setVisual(\"fromSymbolSize\", a[0]), a[1] && r.setVisual(\"toSymbolSize\", a[1]) })) })) } var HD = \"--\\x3e\", YD = function (t) { return t.get(\"autoCurveness\") || null }, UD = function (t, e) { var n = YD(t), i = 20, r = []; if (j(n)) i = n; else if (Y(n)) return void (t.__curvenessList = n); e > i && (i = e); var o = i % 2 ? i + 2 : i + 3; r = []; for (var a = 0; a < o; a++)r.push((a % 2 ? a + 1 : a) / 10 * (a % 2 ? -1 : 1)); t.__curvenessList = r }, XD = function (t, e, n) { var i = [t.id, t.dataIndex].join(\".\"), r = [e.id, e.dataIndex].join(\".\"); return [n.uid, i, r].join(HD) }, ZD = function (t) { var e = t.split(HD); return [e[0], e[2], e[1]].join(HD) }, jD = function (t, e) { var n = e.__edgeMap; return n[t] ? n[t].length : 0 }; function qD(t, e, n, i) { var r = YD(e), o = Y(r); if (!r) return null; var a = function (t, e) { var n = XD(t.node1, t.node2, e); return e.__edgeMap[n] }(t, e); if (!a) return null; for (var s = -1, l = 0; l < a.length; l++)if (a[l] === n) { s = l; break } var u = function (t, e) { return jD(XD(t.node1, t.node2, e), e) + jD(XD(t.node2, t.node1, e), e) }(t, e); UD(e, u), t.lineStyle = t.lineStyle || {}; var h = XD(t.node1, t.node2, e), c = e.__curvenessList, p = o || u % 2 ? 0 : 1; if (a.isForward) return c[p + s]; var d = ZD(h), f = jD(d, e), g = c[s + f + p]; return i ? o ? r && 0 === r[0] ? (f + p) % 2 ? g : -g : ((f % 2 ? 0 : 1) + p) % 2 ? g : -g : (f + p) % 2 ? g : -g : c[s + f + p] } function KD(t) { var e = t.coordinateSystem; if (!e || \"view\" === e.type) { var n = t.getGraph(); n.eachNode((function (t) { var e = t.getModel(); t.setLayout([+e.get(\"x\"), +e.get(\"y\")]) })), $D(n, t) } } function $D(t, e) { t.eachEdge((function (t, n) { var i = ot(t.getModel().get([\"lineStyle\", \"curveness\"]), -qD(t, e, n, !0), 0), r = Mt(t.node1.getLayout()), o = Mt(t.node2.getLayout()), a = [r, o]; +i && a.push([(r[0] + o[0]) / 2 - (r[1] - o[1]) * i, (r[1] + o[1]) / 2 - (o[0] - r[0]) * i]), t.setLayout(a) })) } function JD(t, e) { t.eachSeriesByType(\"graph\", (function (t) { var e = t.get(\"layout\"), n = t.coordinateSystem; if (n && \"view\" !== n.type) { var i = t.getData(), r = []; E(n.dimensions, (function (t) { r = r.concat(i.mapDimensionsAll(t)) })); for (var o = 0; o < i.count(); o++) { for (var a = [], s = !1, l = 0; l < r.length; l++) { var u = i.get(r[l], o); isNaN(u) || (s = !0), a.push(u) } s ? i.setItemLayout(o, n.dataToPoint(a)) : i.setItemLayout(o, [NaN, NaN]) } $D(i.graph, t) } else e && \"none\" !== e || KD(t) })) } function QD(t) { var e = t.coordinateSystem; if (\"view\" !== e.type) return 1; var n = t.option.nodeScaleRatio, i = e.scaleX; return ((e.getZoom() - 1) * n + 1) / i } function tA(t) { var e = t.getVisual(\"symbolSize\"); return e instanceof Array && (e = (e[0] + e[1]) / 2), +e } var eA = Math.PI, nA = []; function iA(t, e, n, i) { var r = t.coordinateSystem; if (!r || \"view\" === r.type) { var o = r.getBoundingRect(), a = t.getData(), s = a.graph, l = o.width / 2 + o.x, u = o.height / 2 + o.y, h = Math.min(o.width, o.height) / 2, c = a.count(); if (a.setLayout({ cx: l, cy: u }), c) { if (n) { var p = r.pointToData(i), d = p[0], f = p[1], g = [d - l, f - u]; Rt(g, g), Ot(g, g, h), n.setLayout([l + g[0], u + g[1]], !0), oA(n, t.get([\"circular\", \"rotateLabel\"]), l, u) } rA[e](t, s, a, h, l, u, c), s.eachEdge((function (e, n) { var i, r = ot(e.getModel().get([\"lineStyle\", \"curveness\"]), qD(e, t, n), 0), o = Mt(e.node1.getLayout()), a = Mt(e.node2.getLayout()), s = (o[0] + a[0]) / 2, h = (o[1] + a[1]) / 2; +r && (i = [l * (r *= 3) + s * (1 - r), u * r + h * (1 - r)]), e.setLayout([o, a, i]) })) } } } var rA = { value: function (t, e, n, i, r, o, a) { var s = 0, l = n.getSum(\"value\"), u = 2 * Math.PI / (l || a); e.eachNode((function (t) { var e = t.getValue(\"value\"), n = u * (l ? e : 1) / 2; s += n, t.setLayout([i * Math.cos(s) + r, i * Math.sin(s) + o]), s += n })) }, symbolSize: function (t, e, n, i, r, o, a) { var s = 0; nA.length = a; var l = QD(t); e.eachNode((function (t) { var e = tA(t); isNaN(e) && (e = 2), e < 0 && (e = 0), e *= l; var n = Math.asin(e / 2 / i); isNaN(n) && (n = eA / 2), nA[t.dataIndex] = n, s += 2 * n })); var u = (2 * eA - s) / a / 2, h = 0; e.eachNode((function (t) { var e = u + nA[t.dataIndex]; h += e, (!t.getLayout() || !t.getLayout().fixed) && t.setLayout([i * Math.cos(h) + r, i * Math.sin(h) + o]), h += e })) } }; function oA(t, e, n, i) { var r = t.getGraphicEl(); if (r) { var o = t.getModel().get([\"label\", \"rotate\"]) || 0, a = r.getSymbolPath(); if (e) { var s = t.getLayout(), l = Math.atan2(s[1] - i, s[0] - n); l < 0 && (l = 2 * Math.PI + l); var u = s[0] < n; u && (l -= Math.PI); var h = u ? \"left\" : \"right\"; a.setTextConfig({ rotation: -l, position: h, origin: \"center\" }); var c = a.ensureState(\"emphasis\"); A(c.textConfig || (c.textConfig = {}), { position: h }) } else a.setTextConfig({ rotation: o *= Math.PI / 180 }) } } function aA(t) { t.eachSeriesByType(\"graph\", (function (t) { \"circular\" === t.get(\"layout\") && iA(t, \"symbolSize\") })) } var sA = Ct; function lA(t) { t.eachSeriesByType(\"graph\", (function (t) { var e = t.coordinateSystem; if (!e || \"view\" === e.type) if (\"force\" === t.get(\"layout\")) { var n = t.preservedPoints || {}, i = t.getGraph(), r = i.data, o = i.edgeData, a = t.getModel(\"force\"), s = a.get(\"initLayout\"); t.preservedPoints ? r.each((function (t) { var e = r.getId(t); r.setItemLayout(t, n[e] || [NaN, NaN]) })) : s && \"none\" !== s ? \"circular\" === s && iA(t, \"value\") : KD(t); var l = r.getDataExtent(\"value\"), u = o.getDataExtent(\"value\"), h = a.get(\"repulsion\"), c = a.get(\"edgeLength\"), p = Y(h) ? h : [h, h], d = Y(c) ? c : [c, c]; d = [d[1], d[0]]; var f = r.mapArray(\"value\", (function (t, e) { var n = r.getItemLayout(e), i = Fr(t, l, p); return isNaN(i) && (i = (p[0] + p[1]) / 2), { w: i, rep: i, fixed: r.getItemModel(e).get(\"fixed\"), p: !n || isNaN(n[0]) || isNaN(n[1]) ? null : n } })), g = o.mapArray(\"value\", (function (e, n) { var r = i.getEdgeByIndex(n), o = Fr(e, u, d); isNaN(o) && (o = (d[0] + d[1]) / 2); var a = r.getModel(), s = ot(r.getModel().get([\"lineStyle\", \"curveness\"]), -qD(r, t, n, !0), 0); return { n1: f[r.node1.dataIndex], n2: f[r.node2.dataIndex], d: o, curveness: s, ignoreForceLayout: a.get(\"ignoreForceLayout\") } })), y = e.getBoundingRect(), v = function (t, e, n) { for (var i = t, r = e, o = n.rect, a = o.width, s = o.height, l = [o.x + a / 2, o.y + s / 2], u = null == n.gravity ? .1 : n.gravity, h = 0; h < i.length; h++) { var c = i[h]; c.p || (c.p = wt(a * (Math.random() - .5) + l[0], s * (Math.random() - .5) + l[1])), c.pp = Mt(c.p), c.edges = null } var p, d, f = null == n.friction ? .6 : n.friction, g = f; return { warmUp: function () { g = .8 * f }, setFixed: function (t) { i[t].fixed = !0 }, setUnfixed: function (t) { i[t].fixed = !1 }, beforeStep: function (t) { p = t }, afterStep: function (t) { d = t }, step: function (t) { p && p(i, r); for (var e = [], n = i.length, o = 0; o < r.length; o++) { var a = r[o]; if (!a.ignoreForceLayout) { var s = a.n1; Dt(e, (y = a.n2).p, s.p); var h = At(e) - a.d, c = y.w / (s.w + y.w); isNaN(c) && (c = 0), Rt(e, e), !s.fixed && sA(s.p, s.p, e, c * h * g), !y.fixed && sA(y.p, y.p, e, -(1 - c) * h * g) } } for (o = 0; o < n; o++)(x = i[o]).fixed || (Dt(e, l, x.p), sA(x.p, x.p, e, u * g)); for (o = 0; o < n; o++) { s = i[o]; for (var f = o + 1; f < n; f++) { var y; Dt(e, (y = i[f]).p, s.p), 0 === (h = At(e)) && (It(e, Math.random() - .5, Math.random() - .5), h = 1); var v = (s.rep + y.rep) / h / h; !s.fixed && sA(s.pp, s.pp, e, v), !y.fixed && sA(y.pp, y.pp, e, -v) } } var m = []; for (o = 0; o < n; o++) { var x; (x = i[o]).fixed || (Dt(m, x.p, x.pp), sA(x.p, x.p, m, g), St(x.pp, x.p)) } var _ = (g *= .992) < .01; d && d(i, r, _), t && t(_) } } }(f, g, { rect: y, gravity: a.get(\"gravity\"), friction: a.get(\"friction\") }); v.beforeStep((function (t, e) { for (var n = 0, r = t.length; n < r; n++)t[n].fixed && St(t[n].p, i.getNodeByIndex(n).getLayout()) })), v.afterStep((function (t, e, o) { for (var a = 0, s = t.length; a < s; a++)t[a].fixed || i.getNodeByIndex(a).setLayout(t[a].p), n[r.getId(a)] = t[a].p; for (a = 0, s = e.length; a < s; a++) { var l = e[a], u = i.getEdgeByIndex(a), h = l.n1.p, c = l.n2.p, p = u.getLayout(); (p = p ? p.slice() : [])[0] = p[0] || [], p[1] = p[1] || [], St(p[0], h), St(p[1], c), +l.curveness && (p[2] = [(h[0] + c[0]) / 2 - (h[1] - c[1]) * l.curveness, (h[1] + c[1]) / 2 - (c[0] - h[0]) * l.curveness]), u.setLayout(p) } })), t.forceLayout = v, t.preservedPoints = n, v.step() } else t.forceLayout = null })) } function uA(t, e) { var n = []; return t.eachSeriesByType(\"graph\", (function (t) { var i = t.get(\"coordinateSystem\"); if (!i || \"view\" === i) { var r = t.getData(), o = [], a = []; Aa(r.mapArray((function (t) { var e = r.getItemModel(t); return [+e.get(\"x\"), +e.get(\"y\")] })), o, a), a[0] - o[0] == 0 && (a[0] += 1, o[0] -= 1), a[1] - o[1] == 0 && (a[1] += 1, o[1] -= 1); var s = (a[0] - o[0]) / (a[1] - o[1]), l = function (t, e, n) { return wp(A(t.getBoxLayoutParams(), { aspect: n }), { width: e.getWidth(), height: e.getHeight() }) }(t, e, s); isNaN(s) && (o = [l.x, l.y], a = [l.x + l.width, l.y + l.height]); var u = a[0] - o[0], h = a[1] - o[1], c = l.width, p = l.height, d = t.coordinateSystem = new YT; d.zoomLimit = t.get(\"scaleLimit\"), d.setBoundingRect(o[0], o[1], u, h), d.setViewRect(l.x, l.y, c, p), d.setCenter(t.get(\"center\"), e), d.setZoom(t.get(\"zoom\")), n.push(d) } })), n } var hA = Wu.prototype, cA = Xu.prototype, pA = function () { this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.percent = 1 }; !function (t) { function e() { return null !== t && t.apply(this, arguments) || this } n(e, t) }(pA); function dA(t) { return isNaN(+t.cpx1) || isNaN(+t.cpy1) } var fA = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"ec-line\", n } return n(e, t), e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new pA }, e.prototype.buildPath = function (t, e) { dA(e) ? hA.buildPath.call(this, t, e) : cA.buildPath.call(this, t, e) }, e.prototype.pointAt = function (t) { return dA(this.shape) ? hA.pointAt.call(this, t) : cA.pointAt.call(this, t) }, e.prototype.tangentAt = function (t) { var e = this.shape, n = dA(e) ? [e.x2 - e.x1, e.y2 - e.y1] : cA.tangentAt.call(this, t); return Rt(n, n) }, e }(_s), gA = [\"fromSymbol\", \"toSymbol\"]; function yA(t) { return \"_\" + t + \"Type\" } function vA(t, e, n) { var i = e.getItemVisual(n, t); if (i && \"none\" !== i) { var r = e.getItemVisual(n, t + \"Size\"), o = e.getItemVisual(n, t + \"Rotate\"), a = e.getItemVisual(n, t + \"Offset\"), s = e.getItemVisual(n, t + \"KeepAspect\"), l = Ny(r), u = Ey(a || 0, l), h = Ry(i, -l[0] / 2 + u[0], -l[1] / 2 + u[1], l[0], l[1], null, s); return h.__specifiedRotation = null == o || isNaN(o) ? void 0 : +o * Math.PI / 180 || 0, h.name = t, h } } function mA(t, e) { t.x1 = e[0][0], t.y1 = e[0][1], t.x2 = e[1][0], t.y2 = e[1][1], t.percent = 1; var n = e[2]; n ? (t.cpx1 = n[0], t.cpy1 = n[1]) : (t.cpx1 = NaN, t.cpy1 = NaN) } var xA = function (t) { function e(e, n, i) { var r = t.call(this) || this; return r._createLine(e, n, i), r } return n(e, t), e.prototype._createLine = function (t, e, n) { var i = t.hostModel, r = function (t) { var e = new fA({ name: \"line\", subPixelOptimize: !0 }); return mA(e.shape, t), e }(t.getItemLayout(e)); r.shape.percent = 0, hh(r, { shape: { percent: 1 } }, i, e), this.add(r), E(gA, (function (n) { var i = vA(n, t, e); this.add(i), this[yA(n)] = t.getItemVisual(e, n) }), this), this._updateCommonStl(t, e, n) }, e.prototype.updateData = function (t, e, n) { var i = t.hostModel, r = this.childOfName(\"line\"), o = t.getItemLayout(e), a = { shape: {} }; mA(a.shape, o), uh(r, a, i, e), E(gA, (function (n) { var i = t.getItemVisual(e, n), r = yA(n); if (this[r] !== i) { this.remove(this.childOfName(n)); var o = vA(n, t, e); this.add(o) } this[r] = i }), this), this._updateCommonStl(t, e, n) }, e.prototype.getLinePath = function () { return this.childAt(0) }, e.prototype._updateCommonStl = function (t, e, n) { var i = t.hostModel, r = this.childOfName(\"line\"), o = n && n.emphasisLineStyle, a = n && n.blurLineStyle, s = n && n.selectLineStyle, l = n && n.labelStatesModels, u = n && n.emphasisDisabled, h = n && n.focus, c = n && n.blurScope; if (!n || t.hasItemOption) { var p = t.getItemModel(e), d = p.getModel(\"emphasis\"); o = d.getModel(\"lineStyle\").getLineStyle(), a = p.getModel([\"blur\", \"lineStyle\"]).getLineStyle(), s = p.getModel([\"select\", \"lineStyle\"]).getLineStyle(), u = d.get(\"disabled\"), h = d.get(\"focus\"), c = d.get(\"blurScope\"), l = Kh(p) } var f = t.getItemVisual(e, \"style\"), g = f.stroke; r.useStyle(f), r.style.fill = null, r.style.strokeNoScale = !0, r.ensureState(\"emphasis\").style = o, r.ensureState(\"blur\").style = a, r.ensureState(\"select\").style = s, E(gA, (function (t) { var e = this.childOfName(t); if (e) { e.setColor(g), e.style.opacity = f.opacity; for (var n = 0; n < tl.length; n++) { var i = tl[n], o = r.getState(i); if (o) { var a = o.style || {}, s = e.ensureState(i), l = s.style || (s.style = {}); null != a.stroke && (l[e.__isEmptyBrush ? \"stroke\" : \"fill\"] = a.stroke), null != a.opacity && (l.opacity = a.opacity) } } e.markRedraw() } }), this); var y = i.getRawValue(e); qh(this, l, { labelDataIndex: e, labelFetcher: { getFormattedLabel: function (e, n) { return i.getFormattedLabel(e, n, t.dataType) } }, inheritColor: g || \"#000\", defaultOpacity: f.opacity, defaultText: (null == y ? t.getName(e) : isFinite(y) ? Wr(y) : y) + \"\" }); var v = this.getTextContent(); if (v) { var m = l.normal; v.__align = v.style.align, v.__verticalAlign = v.style.verticalAlign, v.__position = m.get(\"position\") || \"middle\"; var x = m.get(\"distance\"); Y(x) || (x = [x, x]), v.__labelDistance = x } this.setTextConfig({ position: null, local: !0, inside: !1 }), Bl(this, h, c, u) }, e.prototype.highlight = function () { Il(this) }, e.prototype.downplay = function () { Tl(this) }, e.prototype.updateLayout = function (t, e) { this.setLinePoints(t.getItemLayout(e)) }, e.prototype.setLinePoints = function (t) { var e = this.childOfName(\"line\"); mA(e.shape, t), e.dirty() }, e.prototype.beforeUpdate = function () { var t = this, e = t.childOfName(\"fromSymbol\"), n = t.childOfName(\"toSymbol\"), i = t.getTextContent(); if (e || n || i && !i.ignore) { for (var r = 1, o = this.parent; o;)o.scaleX && (r /= o.scaleX), o = o.parent; var a = t.childOfName(\"line\"); if (this.__dirty || a.__dirty) { var s = a.shape.percent, l = a.pointAt(0), u = a.pointAt(s), h = Dt([], u, l); if (Rt(h, h), e && (e.setPosition(l), S(e, 0), e.scaleX = e.scaleY = r * s, e.markRedraw()), n && (n.setPosition(u), S(n, 1), n.scaleX = n.scaleY = r * s, n.markRedraw()), i && !i.ignore) { i.x = i.y = 0, i.originX = i.originY = 0; var c = void 0, p = void 0, d = i.__labelDistance, f = d[0] * r, g = d[1] * r, y = s / 2, v = a.tangentAt(y), m = [v[1], -v[0]], x = a.pointAt(y); m[1] > 0 && (m[0] = -m[0], m[1] = -m[1]); var _ = v[0] < 0 ? -1 : 1; if (\"start\" !== i.__position && \"end\" !== i.__position) { var b = -Math.atan2(v[1], v[0]); u[0] < l[0] && (b = Math.PI + b), i.rotation = b } var w = void 0; switch (i.__position) { case \"insideStartTop\": case \"insideMiddleTop\": case \"insideEndTop\": case \"middle\": w = -g, p = \"bottom\"; break; case \"insideStartBottom\": case \"insideMiddleBottom\": case \"insideEndBottom\": w = g, p = \"top\"; break; default: w = 0, p = \"middle\" }switch (i.__position) { case \"end\": i.x = h[0] * f + u[0], i.y = h[1] * g + u[1], c = h[0] > .8 ? \"left\" : h[0] < -.8 ? \"right\" : \"center\", p = h[1] > .8 ? \"top\" : h[1] < -.8 ? \"bottom\" : \"middle\"; break; case \"start\": i.x = -h[0] * f + l[0], i.y = -h[1] * g + l[1], c = h[0] > .8 ? \"right\" : h[0] < -.8 ? \"left\" : \"center\", p = h[1] > .8 ? \"bottom\" : h[1] < -.8 ? \"top\" : \"middle\"; break; case \"insideStartTop\": case \"insideStart\": case \"insideStartBottom\": i.x = f * _ + l[0], i.y = l[1] + w, c = v[0] < 0 ? \"right\" : \"left\", i.originX = -f * _, i.originY = -w; break; case \"insideMiddleTop\": case \"insideMiddle\": case \"insideMiddleBottom\": case \"middle\": i.x = x[0], i.y = x[1] + w, c = \"center\", i.originY = -w; break; case \"insideEndTop\": case \"insideEnd\": case \"insideEndBottom\": i.x = -f * _ + u[0], i.y = u[1] + w, c = v[0] >= 0 ? \"right\" : \"left\", i.originX = f * _, i.originY = -w }i.scaleX = i.scaleY = r, i.setStyle({ verticalAlign: i.__verticalAlign || p, align: i.__align || c }) } } } function S(t, e) { var n = t.__specifiedRotation; if (null == n) { var i = a.tangentAt(e); t.attr(\"rotation\", (1 === e ? -1 : 1) * Math.PI / 2 - Math.atan2(i[1], i[0])) } else t.attr(\"rotation\", n) } }, e }(Pr), _A = function () { function t(t) { this.group = new Pr, this._LineCtor = t || xA } return t.prototype.updateData = function (t) { var e = this; this._progressiveEls = null; var n = this, i = n.group, r = n._lineData; n._lineData = t, r || i.removeAll(); var o = bA(t); t.diff(r).add((function (n) { e._doAdd(t, n, o) })).update((function (n, i) { e._doUpdate(r, t, i, n, o) })).remove((function (t) { i.remove(r.getItemGraphicEl(t)) })).execute() }, t.prototype.updateLayout = function () { var t = this._lineData; t && t.eachItemGraphicEl((function (e, n) { e.updateLayout(t, n) }), this) }, t.prototype.incrementalPrepareUpdate = function (t) { this._seriesScope = bA(t), this._lineData = null, this.group.removeAll() }, t.prototype.incrementalUpdate = function (t, e) { function n(t) { t.isGroup || function (t) { return t.animators && t.animators.length > 0 }(t) || (t.incremental = !0, t.ensureState(\"emphasis\").hoverLayer = !0) } this._progressiveEls = []; for (var i = t.start; i < t.end; i++) { if (SA(e.getItemLayout(i))) { var r = new this._LineCtor(e, i, this._seriesScope); r.traverse(n), this.group.add(r), e.setItemGraphicEl(i, r), this._progressiveEls.push(r) } } }, t.prototype.remove = function () { this.group.removeAll() }, t.prototype.eachRendered = function (t) { Yh(this._progressiveEls || this.group, t) }, t.prototype._doAdd = function (t, e, n) { if (SA(t.getItemLayout(e))) { var i = new this._LineCtor(t, e, n); t.setItemGraphicEl(e, i), this.group.add(i) } }, t.prototype._doUpdate = function (t, e, n, i, r) { var o = t.getItemGraphicEl(n); SA(e.getItemLayout(i)) ? (o ? o.updateData(e, i, r) : o = new this._LineCtor(e, i, r), e.setItemGraphicEl(i, o), this.group.add(o)) : this.group.remove(o) }, t }(); function bA(t) { var e = t.hostModel, n = e.getModel(\"emphasis\"); return { lineStyle: e.getModel(\"lineStyle\").getLineStyle(), emphasisLineStyle: n.getModel([\"lineStyle\"]).getLineStyle(), blurLineStyle: e.getModel([\"blur\", \"lineStyle\"]).getLineStyle(), selectLineStyle: e.getModel([\"select\", \"lineStyle\"]).getLineStyle(), emphasisDisabled: n.get(\"disabled\"), blurScope: n.get(\"blurScope\"), focus: n.get(\"focus\"), labelStatesModels: Kh(e) } } function wA(t) { return isNaN(t[0]) || isNaN(t[1]) } function SA(t) { return t && !wA(t[0]) && !wA(t[1]) } var MA = [], IA = [], TA = [], CA = wn, DA = Vt, AA = Math.abs; function kA(t, e, n) { for (var i, r = t[0], o = t[1], a = t[2], s = 1 / 0, l = n * n, u = .1, h = .1; h <= .9; h += .1) { MA[0] = CA(r[0], o[0], a[0], h), MA[1] = CA(r[1], o[1], a[1], h), (d = AA(DA(MA, e) - l)) < s && (s = d, i = h) } for (var c = 0; c < 32; c++) { var p = i + u; IA[0] = CA(r[0], o[0], a[0], i), IA[1] = CA(r[1], o[1], a[1], i), TA[0] = CA(r[0], o[0], a[0], p), TA[1] = CA(r[1], o[1], a[1], p); var d = DA(IA, e) - l; if (AA(d) < .01) break; var f = DA(TA, e) - l; u /= 2, d < 0 ? f >= 0 ? i += u : i -= u : f >= 0 ? i -= u : i += u } return i } function LA(t, e) { var n = [], i = In, r = [[], [], []], o = [[], []], a = []; e /= 2, t.eachEdge((function (t, s) { var l = t.getLayout(), u = t.getVisual(\"fromSymbol\"), h = t.getVisual(\"toSymbol\"); l.__original || (l.__original = [Mt(l[0]), Mt(l[1])], l[2] && l.__original.push(Mt(l[2]))); var c = l.__original; if (null != l[2]) { if (St(r[0], c[0]), St(r[1], c[2]), St(r[2], c[1]), u && \"none\" !== u) { var p = tA(t.node1), d = kA(r, c[0], p * e); i(r[0][0], r[1][0], r[2][0], d, n), r[0][0] = n[3], r[1][0] = n[4], i(r[0][1], r[1][1], r[2][1], d, n), r[0][1] = n[3], r[1][1] = n[4] } if (h && \"none\" !== h) { p = tA(t.node2), d = kA(r, c[1], p * e); i(r[0][0], r[1][0], r[2][0], d, n), r[1][0] = n[1], r[2][0] = n[2], i(r[0][1], r[1][1], r[2][1], d, n), r[1][1] = n[1], r[2][1] = n[2] } St(l[0], r[0]), St(l[1], r[2]), St(l[2], r[1]) } else { if (St(o[0], c[0]), St(o[1], c[1]), Dt(a, o[1], o[0]), Rt(a, a), u && \"none\" !== u) { p = tA(t.node1); Ct(o[0], o[0], a, p * e) } if (h && \"none\" !== h) { p = tA(t.node2); Ct(o[1], o[1], a, -p * e) } St(l[0], o[0]), St(l[1], o[1]) } })) } function PA(t) { return \"view\" === t.type } var OA = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (t, e) { var n = new Jw, i = new _A, r = this.group; this._controller = new OI(e.getZr()), this._controllerHost = { target: r }, r.add(n.group), r.add(i.group), this._symbolDraw = n, this._lineDraw = i, this._firstRender = !0 }, e.prototype.render = function (t, e, n) { var i = this, r = t.coordinateSystem; this._model = t; var o = this._symbolDraw, a = this._lineDraw, s = this.group; if (PA(r)) { var l = { x: r.x, y: r.y, scaleX: r.scaleX, scaleY: r.scaleY }; this._firstRender ? s.attr(l) : uh(s, l, t) } LA(t.getGraph(), QD(t)); var u = t.getData(); o.updateData(u); var h = t.getEdgeData(); a.updateData(h), this._updateNodeAndLinkScale(), this._updateController(t, e, n), clearTimeout(this._layoutTimeout); var c = t.forceLayout, p = t.get([\"force\", \"layoutAnimation\"]); c && this._startForceLayoutIteration(c, p); var d = t.get(\"layout\"); u.graph.eachNode((function (e) { var n = e.dataIndex, r = e.getGraphicEl(), o = e.getModel(); if (r) { r.off(\"drag\").off(\"dragend\"); var a = o.get(\"draggable\"); a && r.on(\"drag\", (function (o) { switch (d) { case \"force\": c.warmUp(), !i._layouting && i._startForceLayoutIteration(c, p), c.setFixed(n), u.setItemLayout(n, [r.x, r.y]); break; case \"circular\": u.setItemLayout(n, [r.x, r.y]), e.setLayout({ fixed: !0 }, !0), iA(t, \"symbolSize\", e, [o.offsetX, o.offsetY]), i.updateLayout(t); break; default: u.setItemLayout(n, [r.x, r.y]), $D(t.getGraph(), t), i.updateLayout(t) } })).on(\"dragend\", (function () { c && c.setUnfixed(n) })), r.setDraggable(a && !!c, !!o.get(\"cursor\")), \"adjacency\" === o.get([\"emphasis\", \"focus\"]) && (js(r).focus = e.getAdjacentDataIndices()) } })), u.graph.eachEdge((function (t) { var e = t.getGraphicEl(), n = t.getModel().get([\"emphasis\", \"focus\"]); e && \"adjacency\" === n && (js(e).focus = { edge: [t.dataIndex], node: [t.node1.dataIndex, t.node2.dataIndex] }) })); var f = \"circular\" === t.get(\"layout\") && t.get([\"circular\", \"rotateLabel\"]), g = u.getLayout(\"cx\"), y = u.getLayout(\"cy\"); u.graph.eachNode((function (t) { oA(t, f, g, y) })), this._firstRender = !1 }, e.prototype.dispose = function () { this._controller && this._controller.dispose(), this._controllerHost = null }, e.prototype._startForceLayoutIteration = function (t, e) { var n = this; !function i() { t.step((function (t) { n.updateLayout(n._model), (n._layouting = !t) && (e ? n._layoutTimeout = setTimeout(i, 16) : i()) })) }() }, e.prototype._updateController = function (t, e, n) { var i = this, r = this._controller, o = this._controllerHost, a = this.group; r.setPointerChecker((function (e, i, r) { var o = a.getBoundingRect(); return o.applyTransform(a.transform), o.contain(i, r) && !GI(e, n, t) })), PA(t.coordinateSystem) ? (r.enable(t.get(\"roam\")), o.zoomLimit = t.get(\"scaleLimit\"), o.zoom = t.coordinateSystem.getZoom(), r.off(\"pan\").off(\"zoom\").on(\"pan\", (function (e) { zI(o, e.dx, e.dy), n.dispatchAction({ seriesId: t.id, type: \"graphRoam\", dx: e.dx, dy: e.dy }) })).on(\"zoom\", (function (e) { VI(o, e.scale, e.originX, e.originY), n.dispatchAction({ seriesId: t.id, type: \"graphRoam\", zoom: e.scale, originX: e.originX, originY: e.originY }), i._updateNodeAndLinkScale(), LA(t.getGraph(), QD(t)), i._lineDraw.updateLayout(), n.updateLabelLayout() }))) : r.disable() }, e.prototype._updateNodeAndLinkScale = function () { var t = this._model, e = t.getData(), n = QD(t); e.eachItemGraphicEl((function (t, e) { t && t.setSymbolScale(n) })) }, e.prototype.updateLayout = function (t) { LA(t.getGraph(), QD(t)), this._symbolDraw.updateLayout(), this._lineDraw.updateLayout() }, e.prototype.remove = function (t, e) { this._symbolDraw && this._symbolDraw.remove(), this._lineDraw && this._lineDraw.remove() }, e.type = \"graph\", e }(wg); function RA(t) { return \"_EC_\" + t } var NA = function () { function t(t) { this.type = \"graph\", this.nodes = [], this.edges = [], this._nodesMap = {}, this._edgesMap = {}, this._directed = t || !1 } return t.prototype.isDirected = function () { return this._directed }, t.prototype.addNode = function (t, e) { t = null == t ? \"\" + e : \"\" + t; var n = this._nodesMap; if (!n[RA(t)]) { var i = new EA(t, e); return i.hostGraph = this, this.nodes.push(i), n[RA(t)] = i, i } }, t.prototype.getNodeByIndex = function (t) { var e = this.data.getRawIndex(t); return this.nodes[e] }, t.prototype.getNodeById = function (t) { return this._nodesMap[RA(t)] }, t.prototype.addEdge = function (t, e, n) { var i = this._nodesMap, r = this._edgesMap; if (j(t) && (t = this.nodes[t]), j(e) && (e = this.nodes[e]), t instanceof EA || (t = i[RA(t)]), e instanceof EA || (e = i[RA(e)]), t && e) { var o = t.id + \"-\" + e.id, a = new zA(t, e, n); return a.hostGraph = this, this._directed && (t.outEdges.push(a), e.inEdges.push(a)), t.edges.push(a), t !== e && e.edges.push(a), this.edges.push(a), r[o] = a, a } }, t.prototype.getEdgeByIndex = function (t) { var e = this.edgeData.getRawIndex(t); return this.edges[e] }, t.prototype.getEdge = function (t, e) { t instanceof EA && (t = t.id), e instanceof EA && (e = e.id); var n = this._edgesMap; return this._directed ? n[t + \"-\" + e] : n[t + \"-\" + e] || n[e + \"-\" + t] }, t.prototype.eachNode = function (t, e) { for (var n = this.nodes, i = n.length, r = 0; r < i; r++)n[r].dataIndex >= 0 && t.call(e, n[r], r) }, t.prototype.eachEdge = function (t, e) { for (var n = this.edges, i = n.length, r = 0; r < i; r++)n[r].dataIndex >= 0 && n[r].node1.dataIndex >= 0 && n[r].node2.dataIndex >= 0 && t.call(e, n[r], r) }, t.prototype.breadthFirstTraverse = function (t, e, n, i) { if (e instanceof EA || (e = this._nodesMap[RA(e)]), e) { for (var r = \"out\" === n ? \"outEdges\" : \"in\" === n ? \"inEdges\" : \"edges\", o = 0; o < this.nodes.length; o++)this.nodes[o].__visited = !1; if (!t.call(i, e, null)) for (var a = [e]; a.length;) { var s = a.shift(), l = s[r]; for (o = 0; o < l.length; o++) { var u = l[o], h = u.node1 === s ? u.node2 : u.node1; if (!h.__visited) { if (t.call(i, h, s)) return; a.push(h), h.__visited = !0 } } } } }, t.prototype.update = function () { for (var t = this.data, e = this.edgeData, n = this.nodes, i = this.edges, r = 0, o = n.length; r < o; r++)n[r].dataIndex = -1; for (r = 0, o = t.count(); r < o; r++)n[t.getRawIndex(r)].dataIndex = r; e.filterSelf((function (t) { var n = i[e.getRawIndex(t)]; return n.node1.dataIndex >= 0 && n.node2.dataIndex >= 0 })); for (r = 0, o = i.length; r < o; r++)i[r].dataIndex = -1; for (r = 0, o = e.count(); r < o; r++)i[e.getRawIndex(r)].dataIndex = r }, t.prototype.clone = function () { for (var e = new t(this._directed), n = this.nodes, i = this.edges, r = 0; r < n.length; r++)e.addNode(n[r].id, n[r].dataIndex); for (r = 0; r < i.length; r++) { var o = i[r]; e.addEdge(o.node1.id, o.node2.id, o.dataIndex) } return e }, t }(), EA = function () { function t(t, e) { this.inEdges = [], this.outEdges = [], this.edges = [], this.dataIndex = -1, this.id = null == t ? \"\" : t, this.dataIndex = null == e ? -1 : e } return t.prototype.degree = function () { return this.edges.length }, t.prototype.inDegree = function () { return this.inEdges.length }, t.prototype.outDegree = function () { return this.outEdges.length }, t.prototype.getModel = function (t) { if (!(this.dataIndex < 0)) return this.hostGraph.data.getItemModel(this.dataIndex).getModel(t) }, t.prototype.getAdjacentDataIndices = function () { for (var t = { edge: [], node: [] }, e = 0; e < this.edges.length; e++) { var n = this.edges[e]; n.dataIndex < 0 || (t.edge.push(n.dataIndex), t.node.push(n.node1.dataIndex, n.node2.dataIndex)) } return t }, t }(), zA = function () { function t(t, e, n) { this.dataIndex = -1, this.node1 = t, this.node2 = e, this.dataIndex = null == n ? -1 : n } return t.prototype.getModel = function (t) { if (!(this.dataIndex < 0)) return this.hostGraph.edgeData.getItemModel(this.dataIndex).getModel(t) }, t.prototype.getAdjacentDataIndices = function () { return { edge: [this.dataIndex], node: [this.node1.dataIndex, this.node2.dataIndex] } }, t }(); function VA(t, e) { return { getValue: function (n) { var i = this[t][e]; return i.getStore().get(i.getDimensionIndex(n || \"value\"), this.dataIndex) }, setVisual: function (n, i) { this.dataIndex >= 0 && this[t][e].setItemVisual(this.dataIndex, n, i) }, getVisual: function (n) { return this[t][e].getItemVisual(this.dataIndex, n) }, setLayout: function (n, i) { this.dataIndex >= 0 && this[t][e].setItemLayout(this.dataIndex, n, i) }, getLayout: function () { return this[t][e].getItemLayout(this.dataIndex) }, getGraphicEl: function () { return this[t][e].getItemGraphicEl(this.dataIndex) }, getRawIndex: function () { return this[t][e].getRawIndex(this.dataIndex) } } } function BA(t, e, n, i, r) { for (var o = new NA(i), a = 0; a < t.length; a++)o.addNode(it(t[a].id, t[a].name, a), a); var s = [], l = [], u = 0; for (a = 0; a < e.length; a++) { var h = e[a], c = h.source, p = h.target; o.addEdge(c, p, u) && (l.push(h), s.push(it(Mo(h.id, null), c + \" > \" + p)), u++) } var d, f = n.get(\"coordinateSystem\"); if (\"cartesian2d\" === f || \"polar\" === f) d = sx(t, n); else { var g = dd.get(f), y = g && g.dimensions || []; P(y, \"value\") < 0 && y.concat([\"value\"]); var v = Qm(t, { coordDimensions: y, encodeDefine: n.getEncode() }).dimensions; (d = new Jm(v, n)).initData(t) } var m = new Jm([\"value\"], n); return m.initData(l, s), r && r(d, m), MC({ mainData: d, struct: o, structAttr: \"graph\", datas: { node: d, edge: m }, datasAttr: { node: \"data\", edge: \"edgeData\" } }), o.update(), o } R(EA, VA(\"hostGraph\", \"data\")), R(zA, VA(\"hostGraph\", \"edgeData\")); var FA = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.hasSymbolVisual = !0, n } return n(e, t), e.prototype.init = function (e) { t.prototype.init.apply(this, arguments); var n = this; function i() { return n._categoriesData } this.legendVisualProvider = new dM(i, i), this.fillDataTextStyle(e.edges || e.links), this._updateCategoriesData() }, e.prototype.mergeOption = function (e) { t.prototype.mergeOption.apply(this, arguments), this.fillDataTextStyle(e.edges || e.links), this._updateCategoriesData() }, e.prototype.mergeDefaultAndTheme = function (e) { t.prototype.mergeDefaultAndTheme.apply(this, arguments), vo(e, \"edgeLabel\", [\"show\"]) }, e.prototype.getInitialData = function (t, e) { var n, i = t.edges || t.links || [], r = t.data || t.nodes || [], o = this; if (r && i) { YD(n = this) && (n.__curvenessList = [], n.__edgeMap = {}, UD(n)); var a = BA(r, i, this, !0, (function (t, e) { t.wrapMethod(\"getItemModel\", (function (t) { var e = o._categoriesModels[t.getShallow(\"category\")]; return e && (e.parentModel = t.parentModel, t.parentModel = e), t })); var n = xc.prototype.getModel; function i(t, e) { var i = n.call(this, t, e); return i.resolveParentPath = r, i } function r(t) { if (t && (\"label\" === t[0] || \"label\" === t[1])) { var e = t.slice(); return \"label\" === t[0] ? e[0] = \"edgeLabel\" : \"label\" === t[1] && (e[1] = \"edgeLabel\"), e } return t } e.wrapMethod(\"getItemModel\", (function (t) { return t.resolveParentPath = r, t.getModel = i, t })) })); return E(a.edges, (function (t) { !function (t, e, n, i) { if (YD(n)) { var r = XD(t, e, n), o = n.__edgeMap, a = o[ZD(r)]; o[r] && !a ? o[r].isForward = !0 : a && o[r] && (a.isForward = !0, o[r].isForward = !1), o[r] = o[r] || [], o[r].push(i) } }(t.node1, t.node2, this, t.dataIndex) }), this), a.data } }, e.prototype.getGraph = function () { return this.getData().graph }, e.prototype.getEdgeData = function () { return this.getGraph().edgeData }, e.prototype.getCategoriesData = function () { return this._categoriesData }, e.prototype.formatTooltip = function (t, e, n) { if (\"edge\" === n) { var i = this.getData(), r = this.getDataParams(t, n), o = i.graph.getEdgeByIndex(t), a = i.getName(o.node1.dataIndex), s = i.getName(o.node2.dataIndex), l = []; return null != a && l.push(a), null != s && l.push(s), qf(\"nameValue\", { name: l.join(\" > \"), value: r.value, noValue: null == r.value }) } return sg({ series: this, dataIndex: t, multipleSeries: e }) }, e.prototype._updateCategoriesData = function () { var t = z(this.option.categories || [], (function (t) { return null != t.value ? t : A({ value: 0 }, t) })), e = new Jm([\"value\"], this); e.initData(t), this._categoriesData = e, this._categoriesModels = e.mapArray((function (t) { return e.getItemModel(t) })) }, e.prototype.setZoom = function (t) { this.option.zoom = t }, e.prototype.setCenter = function (t) { this.option.center = t }, e.prototype.isAnimationEnabled = function () { return t.prototype.isAnimationEnabled.call(this) && !(\"force\" === this.get(\"layout\") && this.get([\"force\", \"layoutAnimation\"])) }, e.type = \"series.graph\", e.dependencies = [\"grid\", \"polar\", \"geo\", \"singleAxis\", \"calendar\"], e.defaultOption = { z: 2, coordinateSystem: \"view\", legendHoverLink: !0, layout: null, circular: { rotateLabel: !1 }, force: { initLayout: null, repulsion: [0, 50], gravity: .1, friction: .6, edgeLength: 30, layoutAnimation: !0 }, left: \"center\", top: \"center\", symbol: \"circle\", symbolSize: 10, edgeSymbol: [\"none\", \"none\"], edgeSymbolSize: 10, edgeLabel: { position: \"middle\", distance: 5 }, draggable: !1, roam: !1, center: null, zoom: 1, nodeScaleRatio: .6, label: { show: !1, formatter: \"{b}\" }, itemStyle: {}, lineStyle: { color: \"#aaa\", width: 1, opacity: .5 }, emphasis: { scale: !0, label: { show: !0 } }, select: { itemStyle: { borderColor: \"#212121\" } } }, e }(hg), GA = { type: \"graphRoam\", event: \"graphRoam\", update: \"none\" }; var WA = function () { this.angle = 0, this.width = 10, this.r = 10, this.x = 0, this.y = 0 }, HA = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"pointer\", n } return n(e, t), e.prototype.getDefaultShape = function () { return new WA }, e.prototype.buildPath = function (t, e) { var n = Math.cos, i = Math.sin, r = e.r, o = e.width, a = e.angle, s = e.x - n(a) * o * (o >= r / 3 ? 1 : 2), l = e.y - i(a) * o * (o >= r / 3 ? 1 : 2); a = e.angle - Math.PI / 2, t.moveTo(s, l), t.lineTo(e.x + n(a) * o, e.y + i(a) * o), t.lineTo(e.x + n(e.angle) * r, e.y + i(e.angle) * r), t.lineTo(e.x - n(a) * o, e.y - i(a) * o), t.lineTo(s, l) }, e }(_s); function YA(t, e) { var n = null == t ? \"\" : t + \"\"; return e && (X(e) ? n = e.replace(\"{value}\", n) : U(e) && (n = e(t))), n } var UA = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { this.group.removeAll(); var i = t.get([\"axisLine\", \"lineStyle\", \"color\"]), r = function (t, e) { var n = t.get(\"center\"), i = e.getWidth(), r = e.getHeight(), o = Math.min(i, r); return { cx: Gr(n[0], e.getWidth()), cy: Gr(n[1], e.getHeight()), r: Gr(t.get(\"radius\"), o / 2) } }(t, n); this._renderMain(t, e, n, i, r), this._data = t.getData() }, e.prototype.dispose = function () { }, e.prototype._renderMain = function (t, e, n, i, r) { var o = this.group, a = t.get(\"clockwise\"), s = -t.get(\"startAngle\") / 180 * Math.PI, l = -t.get(\"endAngle\") / 180 * Math.PI, u = t.getModel(\"axisLine\"), h = u.get(\"roundCap\") ? LS : Pu, c = u.get(\"show\"), p = u.getModel(\"lineStyle\"), d = p.get(\"width\"), f = [s, l]; Qa(f, !a); for (var g = (l = f[1]) - (s = f[0]), y = s, v = 0; c && v < i.length; v++) { var m = new h({ shape: { startAngle: y, endAngle: l = s + g * Math.min(Math.max(i[v][0], 0), 1), cx: r.cx, cy: r.cy, clockwise: a, r0: r.r - d, r: r.r }, silent: !0 }); m.setStyle({ fill: i[v][1] }), m.setStyle(p.getLineStyle([\"color\", \"width\"])), o.add(m), y = l } var x = function (t) { if (t <= 0) return i[0][1]; var e; for (e = 0; e < i.length; e++)if (i[e][0] >= t && (0 === e ? 0 : i[e - 1][0]) < t) return i[e][1]; return i[e - 1][1] }; this._renderTicks(t, e, n, x, r, s, l, a, d), this._renderTitleAndDetail(t, e, n, x, r), this._renderAnchor(t, r), this._renderPointer(t, e, n, x, r, s, l, a, d) }, e.prototype._renderTicks = function (t, e, n, i, r, o, a, s, l) { for (var u, h, c = this.group, p = r.cx, d = r.cy, f = r.r, g = +t.get(\"min\"), y = +t.get(\"max\"), v = t.getModel(\"splitLine\"), m = t.getModel(\"axisTick\"), x = t.getModel(\"axisLabel\"), _ = t.get(\"splitNumber\"), b = m.get(\"splitNumber\"), w = Gr(v.get(\"length\"), f), S = Gr(m.get(\"length\"), f), M = o, I = (a - o) / _, T = I / b, C = v.getModel(\"lineStyle\").getLineStyle(), D = m.getModel(\"lineStyle\").getLineStyle(), A = v.get(\"distance\"), k = 0; k <= _; k++) { if (u = Math.cos(M), h = Math.sin(M), v.get(\"show\")) { var L = new Wu({ shape: { x1: u * (f - (P = A ? A + l : l)) + p, y1: h * (f - P) + d, x2: u * (f - w - P) + p, y2: h * (f - w - P) + d }, style: C, silent: !0 }); \"auto\" === C.stroke && L.setStyle({ stroke: i(k / _) }), c.add(L) } if (x.get(\"show\")) { var P = x.get(\"distance\") + A, O = YA(Wr(k / _ * (y - g) + g), x.get(\"formatter\")), R = i(k / _), N = u * (f - w - P) + p, E = h * (f - w - P) + d, z = x.get(\"rotate\"), V = 0; \"radial\" === z ? (V = -M + 2 * Math.PI) > Math.PI / 2 && (V += Math.PI) : \"tangential\" === z ? V = -M - Math.PI / 2 : j(z) && (V = z * Math.PI / 180), 0 === V ? c.add(new Ns({ style: $h(x, { text: O, x: N, y: E, verticalAlign: h < -.8 ? \"top\" : h > .8 ? \"bottom\" : \"middle\", align: u < -.4 ? \"left\" : u > .4 ? \"right\" : \"center\" }, { inheritColor: R }), silent: !0 })) : c.add(new Ns({ style: $h(x, { text: O, x: N, y: E, verticalAlign: \"middle\", align: \"center\" }, { inheritColor: R }), silent: !0, originX: N, originY: E, rotation: V })) } if (m.get(\"show\") && k !== _) { P = (P = m.get(\"distance\")) ? P + l : l; for (var B = 0; B <= b; B++) { u = Math.cos(M), h = Math.sin(M); var F = new Wu({ shape: { x1: u * (f - P) + p, y1: h * (f - P) + d, x2: u * (f - S - P) + p, y2: h * (f - S - P) + d }, silent: !0, style: D }); \"auto\" === D.stroke && F.setStyle({ stroke: i((k + B / b) / _) }), c.add(F), M += T } M -= T } else M += I } }, e.prototype._renderPointer = function (t, e, n, i, r, o, a, s, l) { var u = this.group, h = this._data, c = this._progressEls, p = [], d = t.get([\"pointer\", \"show\"]), f = t.getModel(\"progress\"), g = f.get(\"show\"), y = t.getData(), v = y.mapDimension(\"value\"), m = +t.get(\"min\"), x = +t.get(\"max\"), _ = [m, x], b = [o, a]; function w(e, n) { var i, o = y.getItemModel(e).getModel(\"pointer\"), a = Gr(o.get(\"width\"), r.r), s = Gr(o.get(\"length\"), r.r), l = t.get([\"pointer\", \"icon\"]), u = o.get(\"offsetCenter\"), h = Gr(u[0], r.r), c = Gr(u[1], r.r), p = o.get(\"keepAspect\"); return (i = l ? Ry(l, h - a / 2, c - s, a, s, null, p) : new HA({ shape: { angle: -Math.PI / 2, width: a, r: s, x: h, y: c } })).rotation = -(n + Math.PI / 2), i.x = r.cx, i.y = r.cy, i } function S(t, e) { var n = f.get(\"roundCap\") ? LS : Pu, i = f.get(\"overlap\"), a = i ? f.get(\"width\") : l / y.count(), u = i ? r.r - a : r.r - (t + 1) * a, h = i ? r.r : r.r - t * a, c = new n({ shape: { startAngle: o, endAngle: e, cx: r.cx, cy: r.cy, clockwise: s, r0: u, r: h } }); return i && (c.z2 = x - y.get(v, t) % x), c } (g || d) && (y.diff(h).add((function (e) { var n = y.get(v, e); if (d) { var i = w(e, o); hh(i, { rotation: -((isNaN(+n) ? b[0] : Fr(n, _, b, !0)) + Math.PI / 2) }, t), u.add(i), y.setItemGraphicEl(e, i) } if (g) { var r = S(e, o), a = f.get(\"clip\"); hh(r, { shape: { endAngle: Fr(n, _, b, a) } }, t), u.add(r), qs(t.seriesIndex, y.dataType, e, r), p[e] = r } })).update((function (e, n) { var i = y.get(v, e); if (d) { var r = h.getItemGraphicEl(n), a = r ? r.rotation : o, s = w(e, a); s.rotation = a, uh(s, { rotation: -((isNaN(+i) ? b[0] : Fr(i, _, b, !0)) + Math.PI / 2) }, t), u.add(s), y.setItemGraphicEl(e, s) } if (g) { var l = c[n], m = S(e, l ? l.shape.endAngle : o), x = f.get(\"clip\"); uh(m, { shape: { endAngle: Fr(i, _, b, x) } }, t), u.add(m), qs(t.seriesIndex, y.dataType, e, m), p[e] = m } })).execute(), y.each((function (t) { var e = y.getItemModel(t), n = e.getModel(\"emphasis\"), r = n.get(\"focus\"), o = n.get(\"blurScope\"), a = n.get(\"disabled\"); if (d) { var s = y.getItemGraphicEl(t), l = y.getItemVisual(t, \"style\"), u = l.fill; if (s instanceof Is) { var h = s.style; s.useStyle(A({ image: h.image, x: h.x, y: h.y, width: h.width, height: h.height }, l)) } else s.useStyle(l), \"pointer\" !== s.type && s.setColor(u); s.setStyle(e.getModel([\"pointer\", \"itemStyle\"]).getItemStyle()), \"auto\" === s.style.fill && s.setStyle(\"fill\", i(Fr(y.get(v, t), _, [0, 1], !0))), s.z2EmphasisLift = 0, Hl(s, e), Bl(s, r, o, a) } if (g) { var c = p[t]; c.useStyle(y.getItemVisual(t, \"style\")), c.setStyle(e.getModel([\"progress\", \"itemStyle\"]).getItemStyle()), c.z2EmphasisLift = 0, Hl(c, e), Bl(c, r, o, a) } })), this._progressEls = p) }, e.prototype._renderAnchor = function (t, e) { var n = t.getModel(\"anchor\"); if (n.get(\"show\")) { var i = n.get(\"size\"), r = n.get(\"icon\"), o = n.get(\"offsetCenter\"), a = n.get(\"keepAspect\"), s = Ry(r, e.cx - i / 2 + Gr(o[0], e.r), e.cy - i / 2 + Gr(o[1], e.r), i, i, null, a); s.z2 = n.get(\"showAbove\") ? 1 : 0, s.setStyle(n.getModel(\"itemStyle\").getItemStyle()), this.group.add(s) } }, e.prototype._renderTitleAndDetail = function (t, e, n, i, r) { var o = this, a = t.getData(), s = a.mapDimension(\"value\"), l = +t.get(\"min\"), u = +t.get(\"max\"), h = new Pr, c = [], p = [], d = t.isAnimationEnabled(), f = t.get([\"pointer\", \"showAbove\"]); a.diff(this._data).add((function (t) { c[t] = new Ns({ silent: !0 }), p[t] = new Ns({ silent: !0 }) })).update((function (t, e) { c[t] = o._titleEls[e], p[t] = o._detailEls[e] })).execute(), a.each((function (e) { var n = a.getItemModel(e), o = a.get(s, e), g = new Pr, y = i(Fr(o, [l, u], [0, 1], !0)), v = n.getModel(\"title\"); if (v.get(\"show\")) { var m = v.get(\"offsetCenter\"), x = r.cx + Gr(m[0], r.r), _ = r.cy + Gr(m[1], r.r); (D = c[e]).attr({ z2: f ? 0 : 2, style: $h(v, { x: x, y: _, text: a.getName(e), align: \"center\", verticalAlign: \"middle\" }, { inheritColor: y }) }), g.add(D) } var b = n.getModel(\"detail\"); if (b.get(\"show\")) { var w = b.get(\"offsetCenter\"), S = r.cx + Gr(w[0], r.r), M = r.cy + Gr(w[1], r.r), I = Gr(b.get(\"width\"), r.r), T = Gr(b.get(\"height\"), r.r), C = t.get([\"progress\", \"show\"]) ? a.getItemVisual(e, \"style\").fill : y, D = p[e], A = b.get(\"formatter\"); D.attr({ z2: f ? 0 : 2, style: $h(b, { x: S, y: M, text: YA(o, A), width: isNaN(I) ? null : I, height: isNaN(T) ? null : T, align: \"center\", verticalAlign: \"middle\" }, { inheritColor: C }) }), oc(D, { normal: b }, o, (function (t) { return YA(t, A) })), d && ac(D, e, a, t, { getFormattedLabel: function (t, e, n, i, r, a) { return YA(a ? a.interpolatedValue : o, A) } }), g.add(D) } h.add(g) })), this.group.add(h), this._titleEls = c, this._detailEls = p }, e.type = \"gauge\", e }(wg), XA = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.visualStyleAccessPath = \"itemStyle\", n } return n(e, t), e.prototype.getInitialData = function (t, e) { return pM(this, [\"value\"]) }, e.type = \"series.gauge\", e.defaultOption = { z: 2, colorBy: \"data\", center: [\"50%\", \"50%\"], legendHoverLink: !0, radius: \"75%\", startAngle: 225, endAngle: -45, clockwise: !0, min: 0, max: 100, splitNumber: 10, axisLine: { show: !0, roundCap: !1, lineStyle: { color: [[1, \"#E6EBF8\"]], width: 10 } }, progress: { show: !1, overlap: !0, width: 10, roundCap: !1, clip: !0 }, splitLine: { show: !0, length: 10, distance: 10, lineStyle: { color: \"#63677A\", width: 3, type: \"solid\" } }, axisTick: { show: !0, splitNumber: 5, length: 6, distance: 10, lineStyle: { color: \"#63677A\", width: 1, type: \"solid\" } }, axisLabel: { show: !0, distance: 15, color: \"#464646\", fontSize: 12, rotate: 0 }, pointer: { icon: null, offsetCenter: [0, 0], show: !0, showAbove: !0, length: \"60%\", width: 6, keepAspect: !1 }, anchor: { show: !1, showAbove: !1, size: 6, icon: \"circle\", offsetCenter: [0, 0], keepAspect: !1, itemStyle: { color: \"#fff\", borderWidth: 0, borderColor: \"#5470c6\" } }, title: { show: !0, offsetCenter: [0, \"20%\"], color: \"#464646\", fontSize: 16, valueAnimation: !1 }, detail: { show: !0, backgroundColor: \"rgba(0,0,0,0)\", borderWidth: 0, borderColor: \"#ccc\", width: 100, height: null, padding: [5, 10], offsetCenter: [0, \"40%\"], color: \"#464646\", fontSize: 30, fontWeight: \"bold\", lineHeight: 30, valueAnimation: !1 } }, e }(hg); var ZA = [\"itemStyle\", \"opacity\"], jA = function (t) { function e(e, n) { var i = t.call(this) || this, r = i, o = new Bu, a = new Ns; return r.setTextContent(a), i.setTextGuideLine(o), i.updateData(e, n, !0), i } return n(e, t), e.prototype.updateData = function (t, e, n) { var i = this, r = t.hostModel, o = t.getItemModel(e), a = t.getItemLayout(e), s = o.getModel(\"emphasis\"), l = o.get(ZA); l = null == l ? 1 : l, n || gh(i), i.useStyle(t.getItemVisual(e, \"style\")), i.style.lineJoin = \"round\", n ? (i.setShape({ points: a.points }), i.style.opacity = 0, hh(i, { style: { opacity: l } }, r, e)) : uh(i, { style: { opacity: l }, shape: { points: a.points } }, r, e), Hl(i, o), this._updateLabel(t, e), Bl(this, s.get(\"focus\"), s.get(\"blurScope\"), s.get(\"disabled\")) }, e.prototype._updateLabel = function (t, e) { var n = this, i = this.getTextGuideLine(), r = n.getTextContent(), o = t.hostModel, a = t.getItemModel(e), s = t.getItemLayout(e).label, l = t.getItemVisual(e, \"style\"), u = l.fill; qh(r, Kh(a), { labelFetcher: t.hostModel, labelDataIndex: e, defaultOpacity: l.opacity, defaultText: t.getName(e) }, { normal: { align: s.textAlign, verticalAlign: s.verticalAlign } }), n.setTextConfig({ local: !0, inside: !!s.inside, insideStroke: u, outsideFill: u }); var h = s.linePoints; i.setShape({ points: h }), n.textGuideLineConfig = { anchor: h ? new Ie(h[0][0], h[0][1]) : null }, uh(r, { style: { x: s.x, y: s.y } }, o, e), r.attr({ rotation: s.rotation, originX: s.x, originY: s.y, z2: 10 }), yb(n, vb(a), { stroke: u }) }, e }(zu), qA = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.ignoreLabelLineUpdate = !0, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = t.getData(), r = this._data, o = this.group; i.diff(r).add((function (t) { var e = new jA(i, t); i.setItemGraphicEl(t, e), o.add(e) })).update((function (t, e) { var n = r.getItemGraphicEl(e); n.updateData(i, t), o.add(n), i.setItemGraphicEl(t, n) })).remove((function (e) { fh(r.getItemGraphicEl(e), t, e) })).execute(), this._data = i }, e.prototype.remove = function () { this.group.removeAll(), this._data = null }, e.prototype.dispose = function () { }, e.type = \"funnel\", e }(wg), KA = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (e) { t.prototype.init.apply(this, arguments), this.legendVisualProvider = new dM(W(this.getData, this), W(this.getRawData, this)), this._defaultLabelLine(e) }, e.prototype.getInitialData = function (t, e) { return pM(this, { coordDimensions: [\"value\"], encodeDefaulter: H(Zp, this) }) }, e.prototype._defaultLabelLine = function (t) { vo(t, \"labelLine\", [\"show\"]); var e = t.labelLine, n = t.emphasis.labelLine; e.show = e.show && t.label.show, n.show = n.show && t.emphasis.label.show }, e.prototype.getDataParams = function (e) { var n = this.getData(), i = t.prototype.getDataParams.call(this, e), r = n.mapDimension(\"value\"), o = n.getSum(r); return i.percent = o ? +(n.get(r, e) / o * 100).toFixed(2) : 0, i.$vars.push(\"percent\"), i }, e.type = \"series.funnel\", e.defaultOption = { z: 2, legendHoverLink: !0, colorBy: \"data\", left: 80, top: 60, right: 80, bottom: 60, minSize: \"0%\", maxSize: \"100%\", sort: \"descending\", orient: \"vertical\", gap: 0, funnelAlign: \"center\", label: { show: !0, position: \"outer\" }, labelLine: { show: !0, length: 20, lineStyle: { width: 1 } }, itemStyle: { borderColor: \"#fff\", borderWidth: 1 }, emphasis: { label: { show: !0 } }, select: { itemStyle: { borderColor: \"#212121\" } } }, e }(hg); function $A(t, e) { t.eachSeriesByType(\"funnel\", (function (t) { var n = t.getData(), i = n.mapDimension(\"value\"), r = t.get(\"sort\"), o = function (t, e) { return wp(t.getBoxLayoutParams(), { width: e.getWidth(), height: e.getHeight() }) }(t, e), a = t.get(\"orient\"), s = o.width, l = o.height, u = function (t, e) { for (var n = t.mapDimension(\"value\"), i = t.mapArray(n, (function (t) { return t })), r = [], o = \"ascending\" === e, a = 0, s = t.count(); a < s; a++)r[a] = a; return U(e) ? r.sort(e) : \"none\" !== e && r.sort((function (t, e) { return o ? i[t] - i[e] : i[e] - i[t] })), r }(n, r), h = o.x, c = o.y, p = \"horizontal\" === a ? [Gr(t.get(\"minSize\"), l), Gr(t.get(\"maxSize\"), l)] : [Gr(t.get(\"minSize\"), s), Gr(t.get(\"maxSize\"), s)], d = n.getDataExtent(i), f = t.get(\"min\"), g = t.get(\"max\"); null == f && (f = Math.min(d[0], 0)), null == g && (g = d[1]); var y = t.get(\"funnelAlign\"), v = t.get(\"gap\"), m = ((\"horizontal\" === a ? s : l) - v * (n.count() - 1)) / n.count(), x = function (t, e) { if (\"horizontal\" === a) { var r = Fr(n.get(i, t) || 0, [f, g], p, !0), o = void 0; switch (y) { case \"top\": o = c; break; case \"center\": o = c + (l - r) / 2; break; case \"bottom\": o = c + (l - r) }return [[e, o], [e, o + r]] } var u, d = Fr(n.get(i, t) || 0, [f, g], p, !0); switch (y) { case \"left\": u = h; break; case \"center\": u = h + (s - d) / 2; break; case \"right\": u = h + s - d }return [[u, e], [u + d, e]] }; \"ascending\" === r && (m = -m, v = -v, \"horizontal\" === a ? h += s : c += l, u = u.reverse()); for (var _ = 0; _ < u.length; _++) { var b = u[_], w = u[_ + 1], S = n.getItemModel(b); if (\"horizontal\" === a) { var M = S.get([\"itemStyle\", \"width\"]); null == M ? M = m : (M = Gr(M, s), \"ascending\" === r && (M = -M)); var I = x(b, h), T = x(w, h + M); h += M + v, n.setItemLayout(b, { points: I.concat(T.slice().reverse()) }) } else { var C = S.get([\"itemStyle\", \"height\"]); null == C ? C = m : (C = Gr(C, l), \"ascending\" === r && (C = -C)); I = x(b, c), T = x(w, c + C); c += C + v, n.setItemLayout(b, { points: I.concat(T.slice().reverse()) }) } } !function (t) { var e = t.hostModel.get(\"orient\"); t.each((function (n) { var i, r, o, a, s = t.getItemModel(n), l = s.getModel(\"label\").get(\"position\"), u = s.getModel(\"labelLine\"), h = t.getItemLayout(n), c = h.points, p = \"inner\" === l || \"inside\" === l || \"center\" === l || \"insideLeft\" === l || \"insideRight\" === l; if (p) \"insideLeft\" === l ? (r = (c[0][0] + c[3][0]) / 2 + 5, o = (c[0][1] + c[3][1]) / 2, i = \"left\") : \"insideRight\" === l ? (r = (c[1][0] + c[2][0]) / 2 - 5, o = (c[1][1] + c[2][1]) / 2, i = \"right\") : (r = (c[0][0] + c[1][0] + c[2][0] + c[3][0]) / 4, o = (c[0][1] + c[1][1] + c[2][1] + c[3][1]) / 4, i = \"center\"), a = [[r, o], [r, o]]; else { var d = void 0, f = void 0, g = void 0, y = void 0, v = u.get(\"length\"); \"left\" === l ? (d = (c[3][0] + c[0][0]) / 2, f = (c[3][1] + c[0][1]) / 2, r = (g = d - v) - 5, i = \"right\") : \"right\" === l ? (d = (c[1][0] + c[2][0]) / 2, f = (c[1][1] + c[2][1]) / 2, r = (g = d + v) + 5, i = \"left\") : \"top\" === l ? (d = (c[3][0] + c[0][0]) / 2, o = (y = (f = (c[3][1] + c[0][1]) / 2) - v) - 5, i = \"center\") : \"bottom\" === l ? (d = (c[1][0] + c[2][0]) / 2, o = (y = (f = (c[1][1] + c[2][1]) / 2) + v) + 5, i = \"center\") : \"rightTop\" === l ? (d = \"horizontal\" === e ? c[3][0] : c[1][0], f = \"horizontal\" === e ? c[3][1] : c[1][1], \"horizontal\" === e ? (o = (y = f - v) - 5, i = \"center\") : (r = (g = d + v) + 5, i = \"top\")) : \"rightBottom\" === l ? (d = c[2][0], f = c[2][1], \"horizontal\" === e ? (o = (y = f + v) + 5, i = \"center\") : (r = (g = d + v) + 5, i = \"bottom\")) : \"leftTop\" === l ? (d = c[0][0], f = \"horizontal\" === e ? c[0][1] : c[1][1], \"horizontal\" === e ? (o = (y = f - v) - 5, i = \"center\") : (r = (g = d - v) - 5, i = \"right\")) : \"leftBottom\" === l ? (d = \"horizontal\" === e ? c[1][0] : c[3][0], f = \"horizontal\" === e ? c[1][1] : c[2][1], \"horizontal\" === e ? (o = (y = f + v) + 5, i = \"center\") : (r = (g = d - v) - 5, i = \"right\")) : (d = (c[1][0] + c[2][0]) / 2, f = (c[1][1] + c[2][1]) / 2, \"horizontal\" === e ? (o = (y = f + v) + 5, i = \"center\") : (r = (g = d + v) + 5, i = \"left\")), \"horizontal\" === e ? r = g = d : o = y = f, a = [[d, f], [g, y]] } h.label = { linePoints: a, x: r, y: o, verticalAlign: \"middle\", textAlign: i, inside: p } })) }(n) })) } var JA = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._dataGroup = new Pr, n._initialized = !1, n } return n(e, t), e.prototype.init = function () { this.group.add(this._dataGroup) }, e.prototype.render = function (t, e, n, i) { this._progressiveEls = null; var r = this._dataGroup, o = t.getData(), a = this._data, s = t.coordinateSystem, l = s.dimensions, u = ek(t); if (o.diff(a).add((function (t) { nk(tk(o, r, t, l, s), o, t, u) })).update((function (e, n) { var i = a.getItemGraphicEl(n), r = QA(o, e, l, s); o.setItemGraphicEl(e, i), uh(i, { shape: { points: r } }, t, e), gh(i), nk(i, o, e, u) })).remove((function (t) { var e = a.getItemGraphicEl(t); r.remove(e) })).execute(), !this._initialized) { this._initialized = !0; var h = function (t, e, n) { var i = t.model, r = t.getRect(), o = new Ps({ shape: { x: r.x, y: r.y, width: r.width, height: r.height } }), a = \"horizontal\" === i.get(\"layout\") ? \"width\" : \"height\"; return o.setShape(a, 0), hh(o, { shape: { width: r.width, height: r.height } }, e, n), o }(s, t, (function () { setTimeout((function () { r.removeClipPath() })) })); r.setClipPath(h) } this._data = o }, e.prototype.incrementalPrepareRender = function (t, e, n) { this._initialized = !0, this._data = null, this._dataGroup.removeAll() }, e.prototype.incrementalRender = function (t, e, n) { for (var i = e.getData(), r = e.coordinateSystem, o = r.dimensions, a = ek(e), s = this._progressiveEls = [], l = t.start; l < t.end; l++) { var u = tk(i, this._dataGroup, l, o, r); u.incremental = !0, nk(u, i, l, a), s.push(u) } }, e.prototype.remove = function () { this._dataGroup && this._dataGroup.removeAll(), this._data = null }, e.type = \"parallel\", e }(wg); function QA(t, e, n, i) { for (var r, o = [], a = 0; a < n.length; a++) { var s = n[a], l = t.get(t.mapDimension(s), e); r = l, (\"category\" === i.getAxis(s).type ? null == r : null == r || isNaN(r)) || o.push(i.dataToPoint(l, s)) } return o } function tk(t, e, n, i, r) { var o = QA(t, n, i, r), a = new Bu({ shape: { points: o }, z2: 10 }); return e.add(a), t.setItemGraphicEl(n, a), a } function ek(t) { var e = t.get(\"smooth\", !0); return !0 === e && (e = .3), nt(e = oo(e)) && (e = 0), { smooth: e } } function nk(t, e, n, i) { t.useStyle(e.getItemVisual(n, \"style\")), t.style.fill = null, t.setShape(\"smooth\", i.smooth); var r = e.getItemModel(n), o = r.getModel(\"emphasis\"); Hl(t, r, \"lineStyle\"), Bl(t, o.get(\"focus\"), o.get(\"blurScope\"), o.get(\"disabled\")) } var ik = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.visualStyleAccessPath = \"lineStyle\", n.visualDrawType = \"stroke\", n } return n(e, t), e.prototype.getInitialData = function (t, e) { return sx(null, this, { useEncodeDefaulter: W(rk, null, this) }) }, e.prototype.getRawIndicesByActiveState = function (t) { var e = this.coordinateSystem, n = this.getData(), i = []; return e.eachActiveState(n, (function (e, r) { t === e && i.push(n.getRawIndex(r)) })), i }, e.type = \"series.parallel\", e.dependencies = [\"parallel\"], e.defaultOption = { z: 2, coordinateSystem: \"parallel\", parallelIndex: 0, label: { show: !1 }, inactiveOpacity: .05, activeOpacity: 1, lineStyle: { width: 1, opacity: .45, type: \"solid\" }, emphasis: { label: { show: !1 } }, progressive: 500, smooth: !1, animationEasing: \"linear\" }, e }(hg); function rk(t) { var e = t.ecModel.getComponent(\"parallel\", t.get(\"parallelIndex\")); if (e) { var n = {}; return E(e.dimensions, (function (t) { var e = +t.replace(\"dim\", \"\"); n[t] = e })), n } } var ok = [\"lineStyle\", \"opacity\"], ak = { seriesType: \"parallel\", reset: function (t, e) { var n = t.coordinateSystem, i = { normal: t.get([\"lineStyle\", \"opacity\"]), active: t.get(\"activeOpacity\"), inactive: t.get(\"inactiveOpacity\") }; return { progress: function (t, e) { n.eachActiveState(e, (function (t, n) { var r = i[t]; if (\"normal\" === t && e.hasItemOption) { var o = e.getItemModel(n).get(ok, !0); null != o && (r = o) } e.ensureUniqueItemVisual(n, \"style\").opacity = r }), t.start, t.end) } } } }; function sk(t) { !function (t) { if (t.parallel) return; var e = !1; E(t.series, (function (t) { t && \"parallel\" === t.type && (e = !0) })), e && (t.parallel = [{}]) }(t), function (t) { E(yo(t.parallelAxis), (function (e) { if (q(e)) { var n = e.parallelIndex || 0, i = yo(t.parallel)[n]; i && i.parallelAxisDefault && C(e, i.parallelAxisDefault, !1) } })) }(t) } var lk = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { this._model = t, this._api = n, this._handlers || (this._handlers = {}, E(uk, (function (t, e) { n.getZr().on(e, this._handlers[e] = W(t, this)) }), this)), Pg(this, \"_throttledDispatchExpand\", t.get(\"axisExpandRate\"), \"fixRate\") }, e.prototype.dispose = function (t, e) { Og(this, \"_throttledDispatchExpand\"), E(this._handlers, (function (t, n) { e.getZr().off(n, t) })), this._handlers = null }, e.prototype._throttledDispatchExpand = function (t) { this._dispatchExpand(t) }, e.prototype._dispatchExpand = function (t) { t && this._api.dispatchAction(A({ type: \"parallelAxisExpand\" }, t)) }, e.type = \"parallel\", e }(mg), uk = { mousedown: function (t) { hk(this, \"click\") && (this._mouseDownPoint = [t.offsetX, t.offsetY]) }, mouseup: function (t) { var e = this._mouseDownPoint; if (hk(this, \"click\") && e) { var n = [t.offsetX, t.offsetY]; if (Math.pow(e[0] - n[0], 2) + Math.pow(e[1] - n[1], 2) > 5) return; var i = this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX, t.offsetY]); \"none\" !== i.behavior && this._dispatchExpand({ axisExpandWindow: i.axisExpandWindow }) } this._mouseDownPoint = null }, mousemove: function (t) { if (!this._mouseDownPoint && hk(this, \"mousemove\")) { var e = this._model, n = e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX, t.offsetY]), i = n.behavior; \"jump\" === i && this._throttledDispatchExpand.debounceNextCall(e.get(\"axisExpandDebounce\")), this._throttledDispatchExpand(\"none\" === i ? null : { axisExpandWindow: n.axisExpandWindow, animation: \"jump\" === i ? null : { duration: 0 } }) } } }; function hk(t, e) { var n = t._model; return n.get(\"axisExpandable\") && n.get(\"axisExpandTriggerOn\") === e } var ck = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function () { t.prototype.init.apply(this, arguments), this.mergeOption({}) }, e.prototype.mergeOption = function (t) { var e = this.option; t && C(e, t, !0), this._initDimensions() }, e.prototype.contains = function (t, e) { var n = t.get(\"parallelIndex\"); return null != n && e.getComponent(\"parallel\", n) === this }, e.prototype.setAxisExpand = function (t) { E([\"axisExpandable\", \"axisExpandCenter\", \"axisExpandCount\", \"axisExpandWidth\", \"axisExpandWindow\"], (function (e) { t.hasOwnProperty(e) && (this.option[e] = t[e]) }), this) }, e.prototype._initDimensions = function () { var t = this.dimensions = [], e = this.parallelAxisIndex = []; E(B(this.ecModel.queryComponents({ mainType: \"parallelAxis\" }), (function (t) { return (t.get(\"parallelIndex\") || 0) === this.componentIndex }), this), (function (n) { t.push(\"dim\" + n.get(\"dim\")), e.push(n.componentIndex) })) }, e.type = \"parallel\", e.dependencies = [\"parallelAxis\"], e.layoutMode = \"box\", e.defaultOption = { z: 0, left: 80, top: 60, right: 80, bottom: 60, layout: \"horizontal\", axisExpandable: !1, axisExpandCenter: null, axisExpandCount: 0, axisExpandWidth: 50, axisExpandRate: 17, axisExpandDebounce: 50, axisExpandSlideTriggerArea: [-.15, .05, .4], axisExpandTriggerOn: \"click\", parallelAxisDefault: null }, e }(Ap), pk = function (t) { function e(e, n, i, r, o) { var a = t.call(this, e, n, i) || this; return a.type = r || \"value\", a.axisIndex = o, a } return n(e, t), e.prototype.isHorizontal = function () { return \"horizontal\" !== this.coordinateSystem.getModel().get(\"layout\") }, e }(X_); function dk(t, e, n, i, r, o) { t = t || 0; var a = n[1] - n[0]; if (null != r && (r = gk(r, [0, a])), null != o && (o = Math.max(o, null != r ? r : 0)), \"all\" === i) { var s = Math.abs(e[1] - e[0]); s = gk(s, [0, a]), r = o = gk(s, [r, o]), i = 0 } e[0] = gk(e[0], n), e[1] = gk(e[1], n); var l = fk(e, i); e[i] += t; var u, h = r || 0, c = n.slice(); return l.sign < 0 ? c[0] += h : c[1] -= h, e[i] = gk(e[i], c), u = fk(e, i), null != r && (u.sign !== l.sign || u.span < r) && (e[1 - i] = e[i] + l.sign * r), u = fk(e, i), null != o && u.span > o && (e[1 - i] = e[i] + u.sign * o), e } function fk(t, e) { var n = t[e] - t[1 - e]; return { span: Math.abs(n), sign: n > 0 ? -1 : n < 0 ? 1 : e ? -1 : 1 } } function gk(t, e) { return Math.min(null != e[1] ? e[1] : 1 / 0, Math.max(null != e[0] ? e[0] : -1 / 0, t)) } var yk = E, vk = Math.min, mk = Math.max, xk = Math.floor, _k = Math.ceil, bk = Wr, wk = Math.PI, Sk = function () { function t(t, e, n) { this.type = \"parallel\", this._axesMap = ft(), this._axesLayout = {}, this.dimensions = t.dimensions, this._model = t, this._init(t, e, n) } return t.prototype._init = function (t, e, n) { var i = t.dimensions, r = t.parallelAxisIndex; yk(i, (function (t, n) { var i = r[n], o = e.getComponent(\"parallelAxis\", i), a = this._axesMap.set(t, new pk(t, l_(o), [0, 0], o.get(\"type\"), i)), s = \"category\" === a.type; a.onBand = s && o.get(\"boundaryGap\"), a.inverse = o.get(\"inverse\"), o.axis = a, a.model = o, a.coordinateSystem = o.coordinateSystem = this }), this) }, t.prototype.update = function (t, e) { this._updateAxesFromSeries(this._model, t) }, t.prototype.containPoint = function (t) { var e = this._makeLayoutInfo(), n = e.axisBase, i = e.layoutBase, r = e.pixelDimIndex, o = t[1 - r], a = t[r]; return o >= n && o <= n + e.axisLength && a >= i && a <= i + e.layoutLength }, t.prototype.getModel = function () { return this._model }, t.prototype._updateAxesFromSeries = function (t, e) { e.eachSeries((function (n) { if (t.contains(n, e)) { var i = n.getData(); yk(this.dimensions, (function (t) { var e = this._axesMap.get(t); e.scale.unionExtentFromData(i, i.mapDimension(t)), s_(e.scale, e.model) }), this) } }), this) }, t.prototype.resize = function (t, e) { this._rect = wp(t.getBoxLayoutParams(), { width: e.getWidth(), height: e.getHeight() }), this._layoutAxes() }, t.prototype.getRect = function () { return this._rect }, t.prototype._makeLayoutInfo = function () { var t, e = this._model, n = this._rect, i = [\"x\", \"y\"], r = [\"width\", \"height\"], o = e.get(\"layout\"), a = \"horizontal\" === o ? 0 : 1, s = n[r[a]], l = [0, s], u = this.dimensions.length, h = Mk(e.get(\"axisExpandWidth\"), l), c = Mk(e.get(\"axisExpandCount\") || 0, [0, u]), p = e.get(\"axisExpandable\") && u > 3 && u > c && c > 1 && h > 0 && s > 0, d = e.get(\"axisExpandWindow\"); d ? (t = Mk(d[1] - d[0], l), d[1] = d[0] + t) : (t = Mk(h * (c - 1), l), (d = [h * (e.get(\"axisExpandCenter\") || xk(u / 2)) - t / 2])[1] = d[0] + t); var f = (s - t) / (u - c); f < 3 && (f = 0); var g = [xk(bk(d[0] / h, 1)) + 1, _k(bk(d[1] / h, 1)) - 1], y = f / h * d[0]; return { layout: o, pixelDimIndex: a, layoutBase: n[i[a]], layoutLength: s, axisBase: n[i[1 - a]], axisLength: n[r[1 - a]], axisExpandable: p, axisExpandWidth: h, axisCollapseWidth: f, axisExpandWindow: d, axisCount: u, winInnerIndices: g, axisExpandWindow0Pos: y } }, t.prototype._layoutAxes = function () { var t = this._rect, e = this._axesMap, n = this.dimensions, i = this._makeLayoutInfo(), r = i.layout; e.each((function (t) { var e = [0, i.axisLength], n = t.inverse ? 1 : 0; t.setExtent(e[n], e[1 - n]) })), yk(n, (function (e, n) { var o = (i.axisExpandable ? Tk : Ik)(n, i), a = { horizontal: { x: o.position, y: i.axisLength }, vertical: { x: 0, y: o.position } }, s = { horizontal: wk / 2, vertical: 0 }, l = [a[r].x + t.x, a[r].y + t.y], u = s[r], h = [1, 0, 0, 1, 0, 0]; _e(h, h, u), xe(h, h, l), this._axesLayout[e] = { position: l, rotation: u, transform: h, axisNameAvailableWidth: o.axisNameAvailableWidth, axisLabelShow: o.axisLabelShow, nameTruncateMaxWidth: o.nameTruncateMaxWidth, tickDirection: 1, labelDirection: 1 } }), this) }, t.prototype.getAxis = function (t) { return this._axesMap.get(t) }, t.prototype.dataToPoint = function (t, e) { return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t), e) }, t.prototype.eachActiveState = function (t, e, n, i) { null == n && (n = 0), null == i && (i = t.count()); var r = this._axesMap, o = this.dimensions, a = [], s = []; E(o, (function (e) { a.push(t.mapDimension(e)), s.push(r.get(e).model) })); for (var l = this.hasAxisBrushed(), u = n; u < i; u++) { var h = void 0; if (l) { h = \"active\"; for (var c = t.getValues(a, u), p = 0, d = o.length; p < d; p++) { if (\"inactive\" === s[p].getActiveState(c[p])) { h = \"inactive\"; break } } } else h = \"normal\"; e(h, u) } }, t.prototype.hasAxisBrushed = function () { for (var t = this.dimensions, e = this._axesMap, n = !1, i = 0, r = t.length; i < r; i++)\"normal\" !== e.get(t[i]).model.getActiveState() && (n = !0); return n }, t.prototype.axisCoordToPoint = function (t, e) { return Ph([t, 0], this._axesLayout[e].transform) }, t.prototype.getAxisLayout = function (t) { return T(this._axesLayout[t]) }, t.prototype.getSlidedAxisExpandWindow = function (t) { var e = this._makeLayoutInfo(), n = e.pixelDimIndex, i = e.axisExpandWindow.slice(), r = i[1] - i[0], o = [0, e.axisExpandWidth * (e.axisCount - 1)]; if (!this.containPoint(t)) return { behavior: \"none\", axisExpandWindow: i }; var a, s = t[n] - e.layoutBase - e.axisExpandWindow0Pos, l = \"slide\", u = e.axisCollapseWidth, h = this._model.get(\"axisExpandSlideTriggerArea\"), c = null != h[0]; if (u) c && u && s < r * h[0] ? (l = \"jump\", a = s - r * h[2]) : c && u && s > r * (1 - h[0]) ? (l = \"jump\", a = s - r * (1 - h[2])) : (a = s - r * h[1]) >= 0 && (a = s - r * (1 - h[1])) <= 0 && (a = 0), (a *= e.axisExpandWidth / u) ? dk(a, i, o, \"all\") : l = \"none\"; else { var p = i[1] - i[0]; (i = [mk(0, o[1] * s / p - p / 2)])[1] = vk(o[1], i[0] + p), i[0] = i[1] - p } return { axisExpandWindow: i, behavior: l } }, t }(); function Mk(t, e) { return vk(mk(t, e[0]), e[1]) } function Ik(t, e) { var n = e.layoutLength / (e.axisCount - 1); return { position: n * t, axisNameAvailableWidth: n, axisLabelShow: !0 } } function Tk(t, e) { var n, i, r = e.layoutLength, o = e.axisExpandWidth, a = e.axisCount, s = e.axisCollapseWidth, l = e.winInnerIndices, u = s, h = !1; return t < l[0] ? (n = t * s, i = s) : t <= l[1] ? (n = e.axisExpandWindow0Pos + t * o - e.axisExpandWindow[0], u = o, h = !0) : (n = r - (a - 1 - t) * s, i = s), { position: n, axisNameAvailableWidth: u, axisLabelShow: h, nameTruncateMaxWidth: i } } var Ck = { create: function (t, e) { var n = []; return t.eachComponent(\"parallel\", (function (i, r) { var o = new Sk(i, t, e); o.name = \"parallel_\" + r, o.resize(i, e), i.coordinateSystem = o, o.model = i, n.push(o) })), t.eachSeries((function (t) { if (\"parallel\" === t.get(\"coordinateSystem\")) { var e = t.getReferringComponents(\"parallel\", Po).models[0]; t.coordinateSystem = e.coordinateSystem } })), n } }, Dk = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.activeIntervals = [], n } return n(e, t), e.prototype.getAreaSelectStyle = function () { return Zo([[\"fill\", \"color\"], [\"lineWidth\", \"borderWidth\"], [\"stroke\", \"borderColor\"], [\"width\", \"width\"], [\"opacity\", \"opacity\"]])(this.getModel(\"areaSelectStyle\")) }, e.prototype.setActiveIntervals = function (t) { var e = this.activeIntervals = T(t); if (e) for (var n = e.length - 1; n >= 0; n--)Hr(e[n]) }, e.prototype.getActiveState = function (t) { var e = this.activeIntervals; if (!e.length) return \"normal\"; if (null == t || isNaN(+t)) return \"inactive\"; if (1 === e.length) { var n = e[0]; if (n[0] <= t && t <= n[1]) return \"active\" } else for (var i = 0, r = e.length; i < r; i++)if (e[i][0] <= t && t <= e[i][1]) return \"active\"; return \"inactive\" }, e }(Ap); R(Dk, g_); var Ak = !0, kk = Math.min, Lk = Math.max, Pk = Math.pow, Ok = \"globalPan\", Rk = { w: [0, 0], e: [0, 1], n: [1, 0], s: [1, 1] }, Nk = { w: \"ew\", e: \"ew\", n: \"ns\", s: \"ns\", ne: \"nesw\", sw: \"nesw\", nw: \"nwse\", se: \"nwse\" }, Ek = { brushStyle: { lineWidth: 2, stroke: \"rgba(210,219,238,0.3)\", fill: \"#D2DBEE\" }, transformable: !0, brushMode: \"single\", removeOnClick: !1 }, zk = 0, Vk = function (t) { function e(e) { var n = t.call(this) || this; return n._track = [], n._covers = [], n._handlers = {}, n._zr = e, n.group = new Pr, n._uid = \"brushController_\" + zk++, E(cL, (function (t, e) { this._handlers[e] = W(t, this) }), n), n } return n(e, t), e.prototype.enableBrush = function (t) { return this._brushType && this._doDisableBrush(), t.brushType && this._doEnableBrush(t), this }, e.prototype._doEnableBrush = function (t) { var e = this._zr; this._enableGlobalPan || function (t, e, n) { PI(t)[e] = n }(e, Ok, this._uid), E(this._handlers, (function (t, n) { e.on(n, t) })), this._brushType = t.brushType, this._brushOption = C(T(Ek), t, !0) }, e.prototype._doDisableBrush = function () { var t = this._zr; !function (t, e, n) { var i = PI(t); i[e] === n && (i[e] = null) }(t, Ok, this._uid), E(this._handlers, (function (e, n) { t.off(n, e) })), this._brushType = this._brushOption = null }, e.prototype.setPanels = function (t) { if (t && t.length) { var e = this._panels = {}; E(t, (function (t) { e[t.panelId] = T(t) })) } else this._panels = null; return this }, e.prototype.mount = function (t) { t = t || {}, this._enableGlobalPan = t.enableGlobalPan; var e = this.group; return this._zr.add(e), e.attr({ x: t.x || 0, y: t.y || 0, rotation: t.rotation || 0, scaleX: t.scaleX || 1, scaleY: t.scaleY || 1 }), this._transform = e.getLocalTransform(), this }, e.prototype.updateCovers = function (t) { t = z(t, (function (t) { return C(T(Ek), t, !0) })); var e = this._covers, n = this._covers = [], i = this, r = this._creatingCover; return new Dm(e, t, (function (t, e) { return o(t.__brushOption, e) }), o).add(a).update(a).remove((function (t) { e[t] !== r && i.group.remove(e[t]) })).execute(), this; function o(t, e) { return (null != t.id ? t.id : \"\\0-brush-index-\" + e) + \"-\" + t.brushType } function a(o, a) { var s = t[o]; if (null != a && e[a] === r) n[o] = e[a]; else { var l = n[o] = null != a ? (e[a].__brushOption = s, e[a]) : Fk(i, Bk(i, s)); Hk(i, l) } } }, e.prototype.unmount = function () { return this.enableBrush(!1), Zk(this), this._zr.remove(this.group), this }, e.prototype.dispose = function () { this.unmount(), this.off() }, e }(Xt); function Bk(t, e) { var n = dL[e.brushType].createCover(t, e); return n.__brushOption = e, Wk(n, e), t.group.add(n), n } function Fk(t, e) { var n = Yk(e); return n.endCreating && (n.endCreating(t, e), Wk(e, e.__brushOption)), e } function Gk(t, e) { var n = e.__brushOption; Yk(e).updateCoverShape(t, e, n.range, n) } function Wk(t, e) { var n = e.z; null == n && (n = 1e4), t.traverse((function (t) { t.z = n, t.z2 = n })) } function Hk(t, e) { Yk(e).updateCommon(t, e), Gk(t, e) } function Yk(t) { return dL[t.__brushOption.brushType] } function Uk(t, e, n) { var i, r = t._panels; if (!r) return Ak; var o = t._transform; return E(r, (function (t) { t.isTargetByCursor(e, n, o) && (i = t) })), i } function Xk(t, e) { var n = t._panels; if (!n) return Ak; var i = e.__brushOption.panelId; return null != i ? n[i] : Ak } function Zk(t) { var e = t._covers, n = e.length; return E(e, (function (e) { t.group.remove(e) }), t), e.length = 0, !!n } function jk(t, e) { var n = z(t._covers, (function (t) { var e = t.__brushOption, n = T(e.range); return { brushType: e.brushType, panelId: e.panelId, range: n } })); t.trigger(\"brush\", { areas: n, isEnd: !!e.isEnd, removeOnClick: !!e.removeOnClick }) } function qk(t) { var e = t.length - 1; return e < 0 && (e = 0), [t[0], t[e]] } function Kk(t, e, n, i) { var r = new Pr; return r.add(new Ps({ name: \"main\", style: tL(n), silent: !0, draggable: !0, cursor: \"move\", drift: H(iL, t, e, r, [\"n\", \"s\", \"w\", \"e\"]), ondragend: H(jk, e, { isEnd: !0 }) })), E(i, (function (n) { r.add(new Ps({ name: n.join(\"\"), style: { opacity: 0 }, draggable: !0, silent: !0, invisible: !0, drift: H(iL, t, e, r, n), ondragend: H(jk, e, { isEnd: !0 }) })) })), r } function $k(t, e, n, i) { var r = i.brushStyle.lineWidth || 0, o = Lk(r, 6), a = n[0][0], s = n[1][0], l = a - r / 2, u = s - r / 2, h = n[0][1], c = n[1][1], p = h - o + r / 2, d = c - o + r / 2, f = h - a, g = c - s, y = f + r, v = g + r; Qk(t, e, \"main\", a, s, f, g), i.transformable && (Qk(t, e, \"w\", l, u, o, v), Qk(t, e, \"e\", p, u, o, v), Qk(t, e, \"n\", l, u, y, o), Qk(t, e, \"s\", l, d, y, o), Qk(t, e, \"nw\", l, u, o, o), Qk(t, e, \"ne\", p, u, o, o), Qk(t, e, \"sw\", l, d, o, o), Qk(t, e, \"se\", p, d, o, o)) } function Jk(t, e) { var n = e.__brushOption, i = n.transformable, r = e.childAt(0); r.useStyle(tL(n)), r.attr({ silent: !i, cursor: i ? \"move\" : \"default\" }), E([[\"w\"], [\"e\"], [\"n\"], [\"s\"], [\"s\", \"e\"], [\"s\", \"w\"], [\"n\", \"e\"], [\"n\", \"w\"]], (function (n) { var r = e.childOfName(n.join(\"\")), o = 1 === n.length ? nL(t, n[0]) : function (t, e) { var n = [nL(t, e[0]), nL(t, e[1])]; return (\"e\" === n[0] || \"w\" === n[0]) && n.reverse(), n.join(\"\") }(t, n); r && r.attr({ silent: !i, invisible: !i, cursor: i ? Nk[o] + \"-resize\" : null }) })) } function Qk(t, e, n, i, r, o, a) { var s = e.childOfName(n); s && s.setShape(function (t) { var e = kk(t[0][0], t[1][0]), n = kk(t[0][1], t[1][1]), i = Lk(t[0][0], t[1][0]), r = Lk(t[0][1], t[1][1]); return { x: e, y: n, width: i - e, height: r - n } }(aL(t, e, [[i, r], [i + o, r + a]]))) } function tL(t) { return k({ strokeNoScale: !0 }, t.brushStyle) } function eL(t, e, n, i) { var r = [kk(t, n), kk(e, i)], o = [Lk(t, n), Lk(e, i)]; return [[r[0], o[0]], [r[1], o[1]]] } function nL(t, e) { var n = Oh({ w: \"left\", e: \"right\", n: \"top\", s: \"bottom\" }[e], function (t) { return Lh(t.group) }(t)); return { left: \"w\", right: \"e\", top: \"n\", bottom: \"s\" }[n] } function iL(t, e, n, i, r, o) { var a = n.__brushOption, s = t.toRectRange(a.range), l = oL(e, r, o); E(i, (function (t) { var e = Rk[t]; s[e[0]][e[1]] += l[e[0]] })), a.range = t.fromRectRange(eL(s[0][0], s[1][0], s[0][1], s[1][1])), Hk(e, n), jk(e, { isEnd: !1 }) } function rL(t, e, n, i) { var r = e.__brushOption.range, o = oL(t, n, i); E(r, (function (t) { t[0] += o[0], t[1] += o[1] })), Hk(t, e), jk(t, { isEnd: !1 }) } function oL(t, e, n) { var i = t.group, r = i.transformCoordToLocal(e, n), o = i.transformCoordToLocal(0, 0); return [r[0] - o[0], r[1] - o[1]] } function aL(t, e, n) { var i = Xk(t, e); return i && i !== Ak ? i.clipPath(n, t._transform) : T(n) } function sL(t) { var e = t.event; e.preventDefault && e.preventDefault() } function lL(t, e, n) { return t.childOfName(\"main\").contain(e, n) } function uL(t, e, n, i) { var r, o = t._creatingCover, a = t._creatingPanel, s = t._brushOption; if (t._track.push(n.slice()), function (t) { var e = t._track; if (!e.length) return !1; var n = e[e.length - 1], i = e[0], r = n[0] - i[0], o = n[1] - i[1]; return Pk(r * r + o * o, .5) > 6 }(t) || o) { if (a && !o) { \"single\" === s.brushMode && Zk(t); var l = T(s); l.brushType = hL(l.brushType, a), l.panelId = a === Ak ? null : a.panelId, o = t._creatingCover = Bk(t, l), t._covers.push(o) } if (o) { var u = dL[hL(t._brushType, a)]; o.__brushOption.range = u.getCreatingRange(aL(t, o, t._track)), i && (Fk(t, o), u.updateCommon(t, o)), Gk(t, o), r = { isEnd: i } } } else i && \"single\" === s.brushMode && s.removeOnClick && Uk(t, e, n) && Zk(t) && (r = { isEnd: i, removeOnClick: !0 }); return r } function hL(t, e) { return \"auto\" === t ? e.defaultBrushType : t } var cL = { mousedown: function (t) { if (this._dragging) pL(this, t); else if (!t.target || !t.target.draggable) { sL(t); var e = this.group.transformCoordToLocal(t.offsetX, t.offsetY); this._creatingCover = null, (this._creatingPanel = Uk(this, t, e)) && (this._dragging = !0, this._track = [e.slice()]) } }, mousemove: function (t) { var e = t.offsetX, n = t.offsetY, i = this.group.transformCoordToLocal(e, n); if (function (t, e, n) { if (t._brushType && !function (t, e, n) { var i = t._zr; return e < 0 || e > i.getWidth() || n < 0 || n > i.getHeight() }(t, e.offsetX, e.offsetY)) { var i = t._zr, r = t._covers, o = Uk(t, e, n); if (!t._dragging) for (var a = 0; a < r.length; a++) { var s = r[a].__brushOption; if (o && (o === Ak || s.panelId === o.panelId) && dL[s.brushType].contain(r[a], n[0], n[1])) return } o && i.setCursorStyle(\"crosshair\") } }(this, t, i), this._dragging) { sL(t); var r = uL(this, t, i, !1); r && jk(this, r) } }, mouseup: function (t) { pL(this, t) } }; function pL(t, e) { if (t._dragging) { sL(e); var n = e.offsetX, i = e.offsetY, r = t.group.transformCoordToLocal(n, i), o = uL(t, e, r, !0); t._dragging = !1, t._track = [], t._creatingCover = null, o && jk(t, o) } } var dL = { lineX: fL(0), lineY: fL(1), rect: { createCover: function (t, e) { function n(t) { return t } return Kk({ toRectRange: n, fromRectRange: n }, t, e, [[\"w\"], [\"e\"], [\"n\"], [\"s\"], [\"s\", \"e\"], [\"s\", \"w\"], [\"n\", \"e\"], [\"n\", \"w\"]]) }, getCreatingRange: function (t) { var e = qk(t); return eL(e[1][0], e[1][1], e[0][0], e[0][1]) }, updateCoverShape: function (t, e, n, i) { $k(t, e, n, i) }, updateCommon: Jk, contain: lL }, polygon: { createCover: function (t, e) { var n = new Pr; return n.add(new Bu({ name: \"main\", style: tL(e), silent: !0 })), n }, getCreatingRange: function (t) { return t }, endCreating: function (t, e) { e.remove(e.childAt(0)), e.add(new zu({ name: \"main\", draggable: !0, drift: H(rL, t, e), ondragend: H(jk, t, { isEnd: !0 }) })) }, updateCoverShape: function (t, e, n, i) { e.childAt(0).setShape({ points: aL(t, e, n) }) }, updateCommon: Jk, contain: lL } }; function fL(t) { return { createCover: function (e, n) { return Kk({ toRectRange: function (e) { var n = [e, [0, 100]]; return t && n.reverse(), n }, fromRectRange: function (e) { return e[t] } }, e, n, [[[\"w\"], [\"e\"]], [[\"n\"], [\"s\"]]][t]) }, getCreatingRange: function (e) { var n = qk(e); return [kk(n[0][t], n[1][t]), Lk(n[0][t], n[1][t])] }, updateCoverShape: function (e, n, i, r) { var o, a = Xk(e, n); if (a !== Ak && a.getLinearBrushOtherExtent) o = a.getLinearBrushOtherExtent(t); else { var s = e._zr; o = [0, [s.getWidth(), s.getHeight()][1 - t]] } var l = [i, o]; t && l.reverse(), $k(e, n, l, r) }, updateCommon: Jk, contain: lL } } function gL(t) { return t = mL(t), function (e) { return Eh(e, t) } } function yL(t, e) { return t = mL(t), function (n) { var i = null != e ? e : n, r = i ? t.width : t.height, o = i ? t.x : t.y; return [o, o + (r || 0)] } } function vL(t, e, n) { var i = mL(t); return function (t, r) { return i.contain(r[0], r[1]) && !GI(t, e, n) } } function mL(t) { return Re.create(t) } var xL = [\"axisLine\", \"axisTickLabel\", \"axisName\"], _L = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (e, n) { t.prototype.init.apply(this, arguments), (this._brushController = new Vk(n.getZr())).on(\"brush\", W(this._onBrush, this)) }, e.prototype.render = function (t, e, n, i) { if (!function (t, e, n) { return n && \"axisAreaSelect\" === n.type && e.findComponents({ mainType: \"parallelAxis\", query: n })[0] === t }(t, e, i)) { this.axisModel = t, this.api = n, this.group.removeAll(); var r = this._axisGroup; if (this._axisGroup = new Pr, this.group.add(this._axisGroup), t.get(\"show\")) { var o = function (t, e) { return e.getComponent(\"parallel\", t.get(\"parallelIndex\")) }(t, e), a = o.coordinateSystem, s = t.getAreaSelectStyle(), l = s.width, u = t.axis.dim, h = A({ strokeContainThreshold: l }, a.getAxisLayout(u)), c = new YM(t, h); E(xL, c.add, c), this._axisGroup.add(c.getGroup()), this._refreshBrushController(h, s, t, o, l, n), Nh(r, this._axisGroup, t) } } }, e.prototype._refreshBrushController = function (t, e, n, i, r, o) { var a = n.axis.getExtent(), s = a[1] - a[0], l = Math.min(30, .1 * Math.abs(s)), u = Re.create({ x: a[0], y: -r / 2, width: s, height: r }); u.x -= l, u.width += 2 * l, this._brushController.mount({ enableGlobalPan: !0, rotation: t.rotation, x: t.position[0], y: t.position[1] }).setPanels([{ panelId: \"pl\", clipPath: gL(u), isTargetByCursor: vL(u, o, i), getLinearBrushOtherExtent: yL(u, 0) }]).enableBrush({ brushType: \"lineX\", brushStyle: e, removeOnClick: !0 }).updateCovers(function (t) { var e = t.axis; return z(t.activeIntervals, (function (t) { return { brushType: \"lineX\", panelId: \"pl\", range: [e.dataToCoord(t[0], !0), e.dataToCoord(t[1], !0)] } })) }(n)) }, e.prototype._onBrush = function (t) { var e = t.areas, n = this.axisModel, i = n.axis, r = z(e, (function (t) { return [i.coordToData(t.range[0], !0), i.coordToData(t.range[1], !0)] })); (!n.option.realtime === t.isEnd || t.removeOnClick) && this.api.dispatchAction({ type: \"axisAreaSelect\", parallelAxisId: n.id, intervals: r }) }, e.prototype.dispose = function () { this._brushController.dispose() }, e.type = \"parallelAxis\", e }(mg); var bL = { type: \"axisAreaSelect\", event: \"axisAreaSelected\" }; var wL = { type: \"value\", areaSelectStyle: { width: 20, borderWidth: 1, borderColor: \"rgba(160,197,232)\", color: \"rgba(160,197,232)\", opacity: .3 }, realtime: !0, z: 10 }; function SL(t) { t.registerComponentView(lk), t.registerComponentModel(ck), t.registerCoordinateSystem(\"parallel\", Ck), t.registerPreprocessor(sk), t.registerComponentModel(Dk), t.registerComponentView(_L), CM(t, \"parallel\", Dk, wL), function (t) { t.registerAction(bL, (function (t, e) { e.eachComponent({ mainType: \"parallelAxis\", query: t }, (function (e) { e.axis.model.setActiveIntervals(t.intervals) })) })), t.registerAction(\"parallelAxisExpand\", (function (t, e) { e.eachComponent({ mainType: \"parallel\", query: t }, (function (e) { e.setAxisExpand(t) })) })) }(t) } var ML = function () { this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.cpx1 = 0, this.cpy1 = 0, this.cpx2 = 0, this.cpy2 = 0, this.extent = 0 }, IL = function (t) { function e(e) { return t.call(this, e) || this } return n(e, t), e.prototype.getDefaultShape = function () { return new ML }, e.prototype.buildPath = function (t, e) { var n = e.extent; t.moveTo(e.x1, e.y1), t.bezierCurveTo(e.cpx1, e.cpy1, e.cpx2, e.cpy2, e.x2, e.y2), \"vertical\" === e.orient ? (t.lineTo(e.x2 + n, e.y2), t.bezierCurveTo(e.cpx2 + n, e.cpy2, e.cpx1 + n, e.cpy1, e.x1 + n, e.y1)) : (t.lineTo(e.x2, e.y2 + n), t.bezierCurveTo(e.cpx2, e.cpy2 + n, e.cpx1, e.cpy1 + n, e.x1, e.y1 + n)), t.closePath() }, e.prototype.highlight = function () { Il(this) }, e.prototype.downplay = function () { Tl(this) }, e }(_s), TL = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._focusAdjacencyDisabled = !1, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = this, r = t.getGraph(), o = this.group, a = t.layoutInfo, s = a.width, l = a.height, u = t.getData(), h = t.getData(\"edge\"), c = t.get(\"orient\"); this._model = t, o.removeAll(), o.x = a.x, o.y = a.y, r.eachEdge((function (e) { var n = new IL, i = js(n); i.dataIndex = e.dataIndex, i.seriesIndex = t.seriesIndex, i.dataType = \"edge\"; var r, a, u, p, d, f, g, y, v = e.getModel(), m = v.getModel(\"lineStyle\"), x = m.get(\"curveness\"), _ = e.node1.getLayout(), b = e.node1.getModel(), w = b.get(\"localX\"), S = b.get(\"localY\"), M = e.node2.getLayout(), I = e.node2.getModel(), T = I.get(\"localX\"), C = I.get(\"localY\"), D = e.getLayout(); switch (n.shape.extent = Math.max(1, D.dy), n.shape.orient = c, \"vertical\" === c ? (r = (null != w ? w * s : _.x) + D.sy, a = (null != S ? S * l : _.y) + _.dy, u = (null != T ? T * s : M.x) + D.ty, d = r, f = a * (1 - x) + (p = null != C ? C * l : M.y) * x, g = u, y = a * x + p * (1 - x)) : (r = (null != w ? w * s : _.x) + _.dx, a = (null != S ? S * l : _.y) + D.sy, d = r * (1 - x) + (u = null != T ? T * s : M.x) * x, f = a, g = r * x + u * (1 - x), y = p = (null != C ? C * l : M.y) + D.ty), n.setShape({ x1: r, y1: a, x2: u, y2: p, cpx1: d, cpy1: f, cpx2: g, cpy2: y }), n.useStyle(m.getItemStyle()), n.style.fill) { case \"source\": n.style.fill = e.node1.getVisual(\"color\"), n.style.decal = e.node1.getVisual(\"style\").decal; break; case \"target\": n.style.fill = e.node2.getVisual(\"color\"), n.style.decal = e.node2.getVisual(\"style\").decal; break; case \"gradient\": var A = e.node1.getVisual(\"color\"), k = e.node2.getVisual(\"color\"); X(A) && X(k) && (n.style.fill = new $u(0, 0, +(\"horizontal\" === c), +(\"vertical\" === c), [{ color: A, offset: 0 }, { color: k, offset: 1 }])) }var L = v.getModel(\"emphasis\"); Hl(n, v, \"lineStyle\", (function (t) { return t.getItemStyle() })), o.add(n), h.setItemGraphicEl(e.dataIndex, n); var P = L.get(\"focus\"); Bl(n, \"adjacency\" === P ? e.getAdjacentDataIndices() : P, L.get(\"blurScope\"), L.get(\"disabled\")), js(n).dataType = \"edge\" })), r.eachNode((function (e) { var n = e.getLayout(), i = e.getModel(), r = i.get(\"localX\"), a = i.get(\"localY\"), h = i.getModel(\"emphasis\"), c = new Ps({ shape: { x: null != r ? r * s : n.x, y: null != a ? a * l : n.y, width: n.dx, height: n.dy }, style: i.getModel(\"itemStyle\").getItemStyle(), z2: 10 }); qh(c, Kh(i), { labelFetcher: t, labelDataIndex: e.dataIndex, defaultText: e.id }), c.disableLabelAnimation = !0, c.setStyle(\"fill\", e.getVisual(\"color\")), c.setStyle(\"decal\", e.getVisual(\"style\").decal), Hl(c, i), o.add(c), u.setItemGraphicEl(e.dataIndex, c), js(c).dataType = \"node\"; var p = h.get(\"focus\"); Bl(c, \"adjacency\" === p ? e.getAdjacentDataIndices() : p, h.get(\"blurScope\"), h.get(\"disabled\")) })), u.eachItemGraphicEl((function (e, r) { u.getItemModel(r).get(\"draggable\") && (e.drift = function (e, o) { i._focusAdjacencyDisabled = !0, this.shape.x += e, this.shape.y += o, this.dirty(), n.dispatchAction({ type: \"dragNode\", seriesId: t.id, dataIndex: u.getRawIndex(r), localX: this.shape.x / s, localY: this.shape.y / l }) }, e.ondragend = function () { i._focusAdjacencyDisabled = !1 }, e.draggable = !0, e.cursor = \"move\") })), !this._data && t.isAnimationEnabled() && o.setClipPath(function (t, e, n) { var i = new Ps({ shape: { x: t.x - 10, y: t.y - 10, width: 0, height: t.height + 20 } }); return hh(i, { shape: { width: t.width + 20 } }, e, n), i }(o.getBoundingRect(), t, (function () { o.removeClipPath() }))), this._data = t.getData() }, e.prototype.dispose = function () { }, e.type = \"sankey\", e }(wg); var CL = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.getInitialData = function (t, e) { var n = t.edges || t.links, i = t.data || t.nodes, r = t.levels; this.levelModels = []; for (var o = this.levelModels, a = 0; a < r.length; a++)null != r[a].depth && r[a].depth >= 0 && (o[r[a].depth] = new xc(r[a], this, e)); if (i && n) { var s = BA(i, n, this, !0, (function (t, e) { t.wrapMethod(\"getItemModel\", (function (t, e) { var n = t.parentModel, i = n.getData().getItemLayout(e); if (i) { var r = i.depth, o = n.levelModels[r]; o && (t.parentModel = o) } return t })), e.wrapMethod(\"getItemModel\", (function (t, e) { var n = t.parentModel, i = n.getGraph().getEdgeByIndex(e).node1.getLayout(); if (i) { var r = i.depth, o = n.levelModels[r]; o && (t.parentModel = o) } return t })) })); return s.data } }, e.prototype.setNodePosition = function (t, e) { var n = (this.option.data || this.option.nodes)[t]; n.localX = e[0], n.localY = e[1] }, e.prototype.getGraph = function () { return this.getData().graph }, e.prototype.getEdgeData = function () { return this.getGraph().edgeData }, e.prototype.formatTooltip = function (t, e, n) { function i(t) { return isNaN(t) || null == t } if (\"edge\" === n) { var r = this.getDataParams(t, n), o = r.data, a = r.value; return qf(\"nameValue\", { name: o.source + \" -- \" + o.target, value: a, noValue: i(a) }) } var s = this.getGraph().getNodeByIndex(t).getLayout().value, l = this.getDataParams(t, n).data.name; return qf(\"nameValue\", { name: null != l ? l + \"\" : null, value: s, noValue: i(s) }) }, e.prototype.optionUpdated = function () { }, e.prototype.getDataParams = function (e, n) { var i = t.prototype.getDataParams.call(this, e, n); if (null == i.value && \"node\" === n) { var r = this.getGraph().getNodeByIndex(e).getLayout().value; i.value = r } return i }, e.type = \"series.sankey\", e.defaultOption = { z: 2, coordinateSystem: \"view\", left: \"5%\", top: \"5%\", right: \"20%\", bottom: \"5%\", orient: \"horizontal\", nodeWidth: 20, nodeGap: 8, draggable: !0, layoutIterations: 32, label: { show: !0, position: \"right\", fontSize: 12 }, levels: [], nodeAlign: \"justify\", lineStyle: { color: \"#314656\", opacity: .2, curveness: .5 }, emphasis: { label: { show: !0 }, lineStyle: { opacity: .5 } }, select: { itemStyle: { borderColor: \"#212121\" } }, animationEasing: \"linear\", animationDuration: 1e3 }, e }(hg); function DL(t, e) { t.eachSeriesByType(\"sankey\", (function (t) { var n = t.get(\"nodeWidth\"), i = t.get(\"nodeGap\"), r = function (t, e) { return wp(t.getBoxLayoutParams(), { width: e.getWidth(), height: e.getHeight() }) }(t, e); t.layoutInfo = r; var o = r.width, a = r.height, s = t.getGraph(), l = s.nodes, u = s.edges; !function (t) { E(t, (function (t) { var e = VL(t.outEdges, zL), n = VL(t.inEdges, zL), i = t.getValue() || 0, r = Math.max(e, n, i); t.setLayout({ value: r }, !0) })) }(l), function (t, e, n, i, r, o, a, s, l) { (function (t, e, n, i, r, o, a) { for (var s = [], l = [], u = [], h = [], c = 0, p = 0; p < e.length; p++)s[p] = 1; for (p = 0; p < t.length; p++)l[p] = t[p].inEdges.length, 0 === l[p] && u.push(t[p]); var d = -1; for (; u.length;) { for (var f = 0; f < u.length; f++) { var g = u[f], y = g.hostGraph.data.getRawDataItem(g.dataIndex), v = null != y.depth && y.depth >= 0; v && y.depth > d && (d = y.depth), g.setLayout({ depth: v ? y.depth : c }, !0), \"vertical\" === o ? g.setLayout({ dy: n }, !0) : g.setLayout({ dx: n }, !0); for (var m = 0; m < g.outEdges.length; m++) { var x = g.outEdges[m]; s[e.indexOf(x)] = 0; var _ = x.node2; 0 == --l[t.indexOf(_)] && h.indexOf(_) < 0 && h.push(_) } } ++c, u = h, h = [] } for (p = 0; p < s.length; p++)if (1 === s[p]) throw new Error(\"Sankey is a DAG, the original data has cycle!\"); var b = d > c - 1 ? d : c - 1; a && \"left\" !== a && function (t, e, n, i) { if (\"right\" === e) { for (var r = [], o = t, a = 0; o.length;) { for (var s = 0; s < o.length; s++) { var l = o[s]; l.setLayout({ skNodeHeight: a }, !0); for (var u = 0; u < l.inEdges.length; u++) { var h = l.inEdges[u]; r.indexOf(h.node1) < 0 && r.push(h.node1) } } o = r, r = [], ++a } E(t, (function (t) { AL(t) || t.setLayout({ depth: Math.max(0, i - t.getLayout().skNodeHeight) }, !0) })) } else \"justify\" === e && function (t, e) { E(t, (function (t) { AL(t) || t.outEdges.length || t.setLayout({ depth: e }, !0) })) }(t, i) }(t, a, 0, b); !function (t, e, n) { E(t, (function (t) { var i = t.getLayout().depth * e; \"vertical\" === n ? t.setLayout({ y: i }, !0) : t.setLayout({ x: i }, !0) })) }(t, \"vertical\" === o ? (r - n) / b : (i - n) / b, o) })(t, e, n, r, o, s, l), function (t, e, n, i, r, o, a) { var s = function (t, e) { var n = [], i = \"vertical\" === e ? \"y\" : \"x\", r = Eo(t, (function (t) { return t.getLayout()[i] })); return r.keys.sort((function (t, e) { return t - e })), E(r.keys, (function (t) { n.push(r.buckets.get(t)) })), n }(t, a); (function (t, e, n, i, r, o) { var a = 1 / 0; E(t, (function (t) { var e = t.length, s = 0; E(t, (function (t) { s += t.getLayout().value })); var l = \"vertical\" === o ? (i - (e - 1) * r) / s : (n - (e - 1) * r) / s; l < a && (a = l) })), E(t, (function (t) { E(t, (function (t, e) { var n = t.getLayout().value * a; \"vertical\" === o ? (t.setLayout({ x: e }, !0), t.setLayout({ dx: n }, !0)) : (t.setLayout({ y: e }, !0), t.setLayout({ dy: n }, !0)) })) })), E(e, (function (t) { var e = +t.getValue() * a; t.setLayout({ dy: e }, !0) })) })(s, e, n, i, r, a), kL(s, r, n, i, a); for (var l = 1; o > 0; o--)LL(s, l *= .99, a), kL(s, r, n, i, a), BL(s, l, a), kL(s, r, n, i, a) }(t, e, o, r, i, a, s), function (t, e) { var n = \"vertical\" === e ? \"x\" : \"y\"; E(t, (function (t) { t.outEdges.sort((function (t, e) { return t.node2.getLayout()[n] - e.node2.getLayout()[n] })), t.inEdges.sort((function (t, e) { return t.node1.getLayout()[n] - e.node1.getLayout()[n] })) })), E(t, (function (t) { var e = 0, n = 0; E(t.outEdges, (function (t) { t.setLayout({ sy: e }, !0), e += t.getLayout().dy })), E(t.inEdges, (function (t) { t.setLayout({ ty: n }, !0), n += t.getLayout().dy })) })) }(t, s) }(l, u, n, i, o, a, 0 !== B(l, (function (t) { return 0 === t.getLayout().value })).length ? 0 : t.get(\"layoutIterations\"), t.get(\"orient\"), t.get(\"nodeAlign\")) })) } function AL(t) { var e = t.hostGraph.data.getRawDataItem(t.dataIndex); return null != e.depth && e.depth >= 0 } function kL(t, e, n, i, r) { var o = \"vertical\" === r ? \"x\" : \"y\"; E(t, (function (t) { var a, s, l; t.sort((function (t, e) { return t.getLayout()[o] - e.getLayout()[o] })); for (var u = 0, h = t.length, c = \"vertical\" === r ? \"dx\" : \"dy\", p = 0; p < h; p++)(l = u - (s = t[p]).getLayout()[o]) > 0 && (a = s.getLayout()[o] + l, \"vertical\" === r ? s.setLayout({ x: a }, !0) : s.setLayout({ y: a }, !0)), u = s.getLayout()[o] + s.getLayout()[c] + e; if ((l = u - e - (\"vertical\" === r ? i : n)) > 0) { a = s.getLayout()[o] - l, \"vertical\" === r ? s.setLayout({ x: a }, !0) : s.setLayout({ y: a }, !0), u = a; for (p = h - 2; p >= 0; --p)(l = (s = t[p]).getLayout()[o] + s.getLayout()[c] + e - u) > 0 && (a = s.getLayout()[o] - l, \"vertical\" === r ? s.setLayout({ x: a }, !0) : s.setLayout({ y: a }, !0)), u = s.getLayout()[o] } })) } function LL(t, e, n) { E(t.slice().reverse(), (function (t) { E(t, (function (t) { if (t.outEdges.length) { var i = VL(t.outEdges, PL, n) / VL(t.outEdges, zL); if (isNaN(i)) { var r = t.outEdges.length; i = r ? VL(t.outEdges, OL, n) / r : 0 } if (\"vertical\" === n) { var o = t.getLayout().x + (i - EL(t, n)) * e; t.setLayout({ x: o }, !0) } else { var a = t.getLayout().y + (i - EL(t, n)) * e; t.setLayout({ y: a }, !0) } } })) })) } function PL(t, e) { return EL(t.node2, e) * t.getValue() } function OL(t, e) { return EL(t.node2, e) } function RL(t, e) { return EL(t.node1, e) * t.getValue() } function NL(t, e) { return EL(t.node1, e) } function EL(t, e) { return \"vertical\" === e ? t.getLayout().x + t.getLayout().dx / 2 : t.getLayout().y + t.getLayout().dy / 2 } function zL(t) { return t.getValue() } function VL(t, e, n) { for (var i = 0, r = t.length, o = -1; ++o < r;) { var a = +e(t[o], n); isNaN(a) || (i += a) } return i } function BL(t, e, n) { E(t, (function (t) { E(t, (function (t) { if (t.inEdges.length) { var i = VL(t.inEdges, RL, n) / VL(t.inEdges, zL); if (isNaN(i)) { var r = t.inEdges.length; i = r ? VL(t.inEdges, NL, n) / r : 0 } if (\"vertical\" === n) { var o = t.getLayout().x + (i - EL(t, n)) * e; t.setLayout({ x: o }, !0) } else { var a = t.getLayout().y + (i - EL(t, n)) * e; t.setLayout({ y: a }, !0) } } })) })) } function FL(t) { t.eachSeriesByType(\"sankey\", (function (t) { var e = t.getGraph().nodes; if (e.length) { var n = 1 / 0, i = -1 / 0; E(e, (function (t) { var e = t.getLayout().value; e < n && (n = e), e > i && (i = e) })), E(e, (function (e) { var r = new sD({ type: \"color\", mappingMethod: \"linear\", dataExtent: [n, i], visual: t.get(\"color\") }).mapValueToVisual(e.getLayout().value), o = e.getModel().get([\"itemStyle\", \"color\"]); null != o ? (e.setVisual(\"color\", o), e.setVisual(\"style\", { fill: o })) : (e.setVisual(\"color\", r), e.setVisual(\"style\", { fill: r })) })) } })) } var GL = function () { function t() { } return t.prototype.getInitialData = function (t, e) { var n, i, r = e.getComponent(\"xAxis\", this.get(\"xAxisIndex\")), o = e.getComponent(\"yAxis\", this.get(\"yAxisIndex\")), a = r.get(\"type\"), s = o.get(\"type\"); \"category\" === a ? (t.layout = \"horizontal\", n = r.getOrdinalMeta(), i = !0) : \"category\" === s ? (t.layout = \"vertical\", n = o.getOrdinalMeta(), i = !0) : t.layout = t.layout || \"horizontal\"; var l = [\"x\", \"y\"], u = \"horizontal\" === t.layout ? 0 : 1, h = this._baseAxisDim = l[u], c = l[1 - u], p = [r, o], d = p[u].get(\"type\"), f = p[1 - u].get(\"type\"), g = t.data; if (g && i) { var y = []; E(g, (function (t, e) { var n; Y(t) ? (n = t.slice(), t.unshift(e)) : Y(t.value) ? ((n = A({}, t)).value = n.value.slice(), t.value.unshift(e)) : n = t, y.push(n) })), t.data = y } var v = this.defaultValueDimensions, m = [{ name: h, type: Lm(d), ordinalMeta: n, otherDims: { tooltip: !1, itemName: 0 }, dimsDef: [\"base\"] }, { name: c, type: Lm(f), dimsDef: v.slice() }]; return pM(this, { coordDimensions: m, dimensionsCount: v.length + 1, encodeDefaulter: H(Xp, m, this) }) }, t.prototype.getBaseAxis = function () { var t = this._baseAxisDim; return this.ecModel.getComponent(t + \"Axis\", this.get(t + \"AxisIndex\")).axis }, t }(), WL = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.defaultValueDimensions = [{ name: \"min\", defaultTooltip: !0 }, { name: \"Q1\", defaultTooltip: !0 }, { name: \"median\", defaultTooltip: !0 }, { name: \"Q3\", defaultTooltip: !0 }, { name: \"max\", defaultTooltip: !0 }], n.visualDrawType = \"stroke\", n } return n(e, t), e.type = \"series.boxplot\", e.dependencies = [\"xAxis\", \"yAxis\", \"grid\"], e.defaultOption = { z: 2, coordinateSystem: \"cartesian2d\", legendHoverLink: !0, layout: null, boxWidth: [7, 50], itemStyle: { color: \"#fff\", borderWidth: 1 }, emphasis: { scale: !0, itemStyle: { borderWidth: 2, shadowBlur: 5, shadowOffsetX: 1, shadowOffsetY: 1, shadowColor: \"rgba(0,0,0,0.2)\" } }, animationDuration: 800 }, e }(hg); R(WL, GL, !0); var HL = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = t.getData(), r = this.group, o = this._data; this._data || r.removeAll(); var a = \"horizontal\" === t.get(\"layout\") ? 1 : 0; i.diff(o).add((function (t) { if (i.hasValue(t)) { var e = XL(i.getItemLayout(t), i, t, a, !0); i.setItemGraphicEl(t, e), r.add(e) } })).update((function (t, e) { var n = o.getItemGraphicEl(e); if (i.hasValue(t)) { var s = i.getItemLayout(t); n ? (gh(n), ZL(s, n, i, t)) : n = XL(s, i, t, a), r.add(n), i.setItemGraphicEl(t, n) } else r.remove(n) })).remove((function (t) { var e = o.getItemGraphicEl(t); e && r.remove(e) })).execute(), this._data = i }, e.prototype.remove = function (t) { var e = this.group, n = this._data; this._data = null, n && n.eachItemGraphicEl((function (t) { t && e.remove(t) })) }, e.type = \"boxplot\", e }(wg), YL = function () { }, UL = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"boxplotBoxPath\", n } return n(e, t), e.prototype.getDefaultShape = function () { return new YL }, e.prototype.buildPath = function (t, e) { var n = e.points, i = 0; for (t.moveTo(n[i][0], n[i][1]), i++; i < 4; i++)t.lineTo(n[i][0], n[i][1]); for (t.closePath(); i < n.length; i++)t.moveTo(n[i][0], n[i][1]), i++, t.lineTo(n[i][0], n[i][1]) }, e }(_s); function XL(t, e, n, i, r) { var o = t.ends, a = new UL({ shape: { points: r ? jL(o, i, t) : o } }); return ZL(t, a, e, n, r), a } function ZL(t, e, n, i, r) { var o = n.hostModel; (0, Uh[r ? \"initProps\" : \"updateProps\"])(e, { shape: { points: t.ends } }, o, i), e.useStyle(n.getItemVisual(i, \"style\")), e.style.strokeNoScale = !0, e.z2 = 100; var a = n.getItemModel(i), s = a.getModel(\"emphasis\"); Hl(e, a), Bl(e, s.get(\"focus\"), s.get(\"blurScope\"), s.get(\"disabled\")) } function jL(t, e, n) { return z(t, (function (t) { return (t = t.slice())[e] = n.initBaseline, t })) } function qL(t, e) { } var KL = E; function $L(t) { var e = function (t) { var e = [], n = []; return t.eachSeriesByType(\"boxplot\", (function (t) { var i = t.getBaseAxis(), r = P(n, i); r < 0 && (r = n.length, n[r] = i, e[r] = { axis: i, seriesModels: [] }), e[r].seriesModels.push(t) })), e }(t); KL(e, (function (t) { var e = t.seriesModels; e.length && (!function (t) { var e, n = t.axis, i = t.seriesModels, r = i.length, o = t.boxWidthList = [], a = t.boxOffsetList = [], s = []; if (\"category\" === n.type) e = n.getBandWidth(); else { var l = 0; KL(i, (function (t) { l = Math.max(l, t.getData().count()) })); var u = n.getExtent(); e = Math.abs(u[1] - u[0]) / l } KL(i, (function (t) { var n = t.get(\"boxWidth\"); Y(n) || (n = [n, n]), s.push([Gr(n[0], e) || 0, Gr(n[1], e) || 0]) })); var h = .8 * e - 2, c = h / r * .3, p = (h - c * (r - 1)) / r, d = p / 2 - h / 2; KL(i, (function (t, e) { a.push(d), d += c + p, o.push(Math.min(Math.max(p, s[e][0]), s[e][1])) })) }(t), KL(e, (function (e, n) { !function (t, e, n) { var i = t.coordinateSystem, r = t.getData(), o = n / 2, a = \"horizontal\" === t.get(\"layout\") ? 0 : 1, s = 1 - a, l = [\"x\", \"y\"], u = r.mapDimension(l[a]), h = r.mapDimensionsAll(l[s]); if (null == u || h.length < 5) return; for (var c = 0; c < r.count(); c++) { var p = r.get(u, c), d = x(p, h[2], c), f = x(p, h[0], c), g = x(p, h[1], c), y = x(p, h[3], c), v = x(p, h[4], c), m = []; _(m, g, !1), _(m, y, !0), m.push(f, g, v, y), b(m, f), b(m, v), b(m, d), r.setItemLayout(c, { initBaseline: d[s], ends: m }) } function x(t, n, o) { var l, u = r.get(n, o), h = []; return h[a] = t, h[s] = u, isNaN(t) || isNaN(u) ? l = [NaN, NaN] : (l = i.dataToPoint(h))[a] += e, l } function _(t, e, n) { var i = e.slice(), r = e.slice(); i[a] += o, r[a] -= o, n ? t.push(i, r) : t.push(r, i) } function b(t, e) { var n = e.slice(), i = e.slice(); n[a] -= o, i[a] += o, t.push(n, i) } }(e, t.boxOffsetList[n], t.boxWidthList[n]) }))) })) } var JL = { type: \"echarts:boxplot\", transform: function (t) { var e = t.upstream; if (e.sourceFormat !== Np) { var n = \"\"; 0, co(n) } var i = function (t, e) { for (var n = [], i = [], r = (e = e || {}).boundIQR, o = \"none\" === r || 0 === r, a = 0; a < t.length; a++) { var s = Hr(t[a].slice()), l = io(s, .25), u = io(s, .5), h = io(s, .75), c = s[0], p = s[s.length - 1], d = (null == r ? 1.5 : r) * (h - l), f = o ? c : Math.max(c, l - d), g = o ? p : Math.min(p, h + d), y = e.itemNameFormatter, v = U(y) ? y({ value: a }) : X(y) ? y.replace(\"{value}\", a + \"\") : a + \"\"; n.push([v, f, l, u, h, g]); for (var m = 0; m < s.length; m++) { var x = s[m]; if (x < f || x > g) { var _ = [v, x]; i.push(_) } } } return { boxData: n, outliers: i } }(e.getRawData(), t.config); return [{ dimensions: [\"ItemName\", \"Low\", \"Q1\", \"Q2\", \"Q3\", \"High\"], data: i.boxData }, { data: i.outliers }] } }; var QL = [\"color\", \"borderColor\"], tP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { this.group.removeClipPath(), this._progressiveEls = null, this._updateDrawMode(t), this._isLargeDraw ? this._renderLarge(t) : this._renderNormal(t) }, e.prototype.incrementalPrepareRender = function (t, e, n) { this._clear(), this._updateDrawMode(t) }, e.prototype.incrementalRender = function (t, e, n, i) { this._progressiveEls = [], this._isLargeDraw ? this._incrementalRenderLarge(t, e) : this._incrementalRenderNormal(t, e) }, e.prototype.eachRendered = function (t) { Yh(this._progressiveEls || this.group, t) }, e.prototype._updateDrawMode = function (t) { var e = t.pipelineContext.large; null != this._isLargeDraw && e === this._isLargeDraw || (this._isLargeDraw = e, this._clear()) }, e.prototype._renderNormal = function (t) { var e = t.getData(), n = this._data, i = this.group, r = e.getLayout(\"isSimpleBox\"), o = t.get(\"clip\", !0), a = t.coordinateSystem, s = a.getArea && a.getArea(); this._data || i.removeAll(), e.diff(n).add((function (n) { if (e.hasValue(n)) { var a = e.getItemLayout(n); if (o && rP(s, a)) return; var l = iP(a, n, !0); hh(l, { shape: { points: a.ends } }, t, n), oP(l, e, n, r), i.add(l), e.setItemGraphicEl(n, l) } })).update((function (a, l) { var u = n.getItemGraphicEl(l); if (e.hasValue(a)) { var h = e.getItemLayout(a); o && rP(s, h) ? i.remove(u) : (u ? (uh(u, { shape: { points: h.ends } }, t, a), gh(u)) : u = iP(h), oP(u, e, a, r), i.add(u), e.setItemGraphicEl(a, u)) } else i.remove(u) })).remove((function (t) { var e = n.getItemGraphicEl(t); e && i.remove(e) })).execute(), this._data = e }, e.prototype._renderLarge = function (t) { this._clear(), uP(t, this.group); var e = t.get(\"clip\", !0) ? cS(t.coordinateSystem, !1, t) : null; e ? this.group.setClipPath(e) : this.group.removeClipPath() }, e.prototype._incrementalRenderNormal = function (t, e) { for (var n, i = e.getData(), r = i.getLayout(\"isSimpleBox\"); null != (n = t.next());) { var o = iP(i.getItemLayout(n)); oP(o, i, n, r), o.incremental = !0, this.group.add(o), this._progressiveEls.push(o) } }, e.prototype._incrementalRenderLarge = function (t, e) { uP(e, this.group, this._progressiveEls, !0) }, e.prototype.remove = function (t) { this._clear() }, e.prototype._clear = function () { this.group.removeAll(), this._data = null }, e.type = \"candlestick\", e }(wg), eP = function () { }, nP = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"normalCandlestickBox\", n } return n(e, t), e.prototype.getDefaultShape = function () { return new eP }, e.prototype.buildPath = function (t, e) { var n = e.points; this.__simpleBox ? (t.moveTo(n[4][0], n[4][1]), t.lineTo(n[6][0], n[6][1])) : (t.moveTo(n[0][0], n[0][1]), t.lineTo(n[1][0], n[1][1]), t.lineTo(n[2][0], n[2][1]), t.lineTo(n[3][0], n[3][1]), t.closePath(), t.moveTo(n[4][0], n[4][1]), t.lineTo(n[5][0], n[5][1]), t.moveTo(n[6][0], n[6][1]), t.lineTo(n[7][0], n[7][1])) }, e }(_s); function iP(t, e, n) { var i = t.ends; return new nP({ shape: { points: n ? aP(i, t) : i }, z2: 100 }) } function rP(t, e) { for (var n = !0, i = 0; i < e.ends.length; i++)if (t.contain(e.ends[i][0], e.ends[i][1])) { n = !1; break } return n } function oP(t, e, n, i) { var r = e.getItemModel(n); t.useStyle(e.getItemVisual(n, \"style\")), t.style.strokeNoScale = !0, t.__simpleBox = i, Hl(t, r) } function aP(t, e) { return z(t, (function (t) { return (t = t.slice())[1] = e.initBaseline, t })) } var sP = function () { }, lP = function (t) { function e(e) { var n = t.call(this, e) || this; return n.type = \"largeCandlestickBox\", n } return n(e, t), e.prototype.getDefaultShape = function () { return new sP }, e.prototype.buildPath = function (t, e) { for (var n = e.points, i = 0; i < n.length;)if (this.__sign === n[i++]) { var r = n[i++]; t.moveTo(r, n[i++]), t.lineTo(r, n[i++]) } else i += 3 }, e }(_s); function uP(t, e, n, i) { var r = t.getData().getLayout(\"largePoints\"), o = new lP({ shape: { points: r }, __sign: 1, ignoreCoarsePointer: !0 }); e.add(o); var a = new lP({ shape: { points: r }, __sign: -1, ignoreCoarsePointer: !0 }); e.add(a), hP(1, o, t), hP(-1, a, t), i && (o.incremental = !0, a.incremental = !0), n && n.push(o, a) } function hP(t, e, n, i) { var r = n.get([\"itemStyle\", t > 0 ? \"borderColor\" : \"borderColor0\"]) || n.get([\"itemStyle\", t > 0 ? \"color\" : \"color0\"]), o = n.getModel(\"itemStyle\").getItemStyle(QL); e.useStyle(o), e.style.fill = null, e.style.stroke = r } var cP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.defaultValueDimensions = [{ name: \"open\", defaultTooltip: !0 }, { name: \"close\", defaultTooltip: !0 }, { name: \"lowest\", defaultTooltip: !0 }, { name: \"highest\", defaultTooltip: !0 }], n } return n(e, t), e.prototype.getShadowDim = function () { return \"open\" }, e.prototype.brushSelector = function (t, e, n) { var i = e.getItemLayout(t); return i && n.rect(i.brushRect) }, e.type = \"series.candlestick\", e.dependencies = [\"xAxis\", \"yAxis\", \"grid\"], e.defaultOption = { z: 2, coordinateSystem: \"cartesian2d\", legendHoverLink: !0, layout: null, clip: !0, itemStyle: { color: \"#eb5454\", color0: \"#47b262\", borderColor: \"#eb5454\", borderColor0: \"#47b262\", borderWidth: 1 }, emphasis: { scale: !0, itemStyle: { borderWidth: 2 } }, barMaxWidth: null, barMinWidth: null, barWidth: null, large: !0, largeThreshold: 600, progressive: 3e3, progressiveThreshold: 1e4, progressiveChunkMode: \"mod\", animationEasing: \"linear\", animationDuration: 300 }, e }(hg); function pP(t) { t && Y(t.series) && E(t.series, (function (t) { q(t) && \"k\" === t.type && (t.type = \"candlestick\") })) } R(cP, GL, !0); var dP = [\"itemStyle\", \"borderColor\"], fP = [\"itemStyle\", \"borderColor0\"], gP = [\"itemStyle\", \"color\"], yP = [\"itemStyle\", \"color0\"], vP = { seriesType: \"candlestick\", plan: xg(), performRawSeries: !0, reset: function (t, e) { function n(t, e) { return e.get(t > 0 ? gP : yP) } function i(t, e) { return e.get(t > 0 ? dP : fP) } if (!e.isSeriesFiltered(t)) return !t.pipelineContext.large && { progress: function (t, e) { for (var r; null != (r = t.next());) { var o = e.getItemModel(r), a = e.getItemLayout(r).sign, s = o.getItemStyle(); s.fill = n(a, o), s.stroke = i(a, o) || s.fill, A(e.ensureUniqueItemVisual(r, \"style\"), s) } } } } }, mP = { seriesType: \"candlestick\", plan: xg(), reset: function (t) { var e = t.coordinateSystem, n = t.getData(), i = function (t, e) { var n, i = t.getBaseAxis(), r = \"category\" === i.type ? i.getBandWidth() : (n = i.getExtent(), Math.abs(n[1] - n[0]) / e.count()), o = Gr(rt(t.get(\"barMaxWidth\"), r), r), a = Gr(rt(t.get(\"barMinWidth\"), 1), r), s = t.get(\"barWidth\"); return null != s ? Gr(s, r) : Math.max(Math.min(r / 2, o), a) }(t, n), r = [\"x\", \"y\"], o = n.getDimensionIndex(n.mapDimension(r[0])), a = z(n.mapDimensionsAll(r[1]), n.getDimensionIndex, n), s = a[0], l = a[1], u = a[2], h = a[3]; if (n.setLayout({ candleWidth: i, isSimpleBox: i <= 1.3 }), !(o < 0 || a.length < 4)) return { progress: t.pipelineContext.large ? function (t, n) { var i, r, a = Tx(4 * t.count), c = 0, p = [], d = [], f = n.getStore(); for (; null != (r = t.next());) { var g = f.get(o, r), y = f.get(s, r), v = f.get(l, r), m = f.get(u, r), x = f.get(h, r); isNaN(g) || isNaN(m) || isNaN(x) ? (a[c++] = NaN, c += 3) : (a[c++] = xP(f, r, y, v, l), p[0] = g, p[1] = m, i = e.dataToPoint(p, null, d), a[c++] = i ? i[0] : NaN, a[c++] = i ? i[1] : NaN, p[1] = x, i = e.dataToPoint(p, null, d), a[c++] = i ? i[1] : NaN) } n.setLayout(\"largePoints\", a) } : function (t, n) { var r, a = n.getStore(); for (; null != (r = t.next());) { var c = a.get(o, r), p = a.get(s, r), d = a.get(l, r), f = a.get(u, r), g = a.get(h, r), y = Math.min(p, d), v = Math.max(p, d), m = S(y, c), x = S(v, c), _ = S(f, c), b = S(g, c), w = []; M(w, x, 0), M(w, m, 1), w.push(T(b), T(x), T(_), T(m)), n.setItemLayout(r, { sign: xP(a, r, p, d, l), initBaseline: p > d ? x[1] : m[1], ends: w, brushRect: I(f, g, c) }) } function S(t, n) { var i = []; return i[0] = n, i[1] = t, isNaN(n) || isNaN(t) ? [NaN, NaN] : e.dataToPoint(i) } function M(t, e, n) { var r = e.slice(), o = e.slice(); r[0] = kh(r[0] + i / 2, 1, !1), o[0] = kh(o[0] - i / 2, 1, !0), n ? t.push(r, o) : t.push(o, r) } function I(t, e, n) { var r = S(t, n), o = S(e, n); return r[0] -= i / 2, o[0] -= i / 2, { x: r[0], y: r[1], width: i, height: o[1] - r[1] } } function T(t) { return t[0] = kh(t[0], 1), t } } } } }; function xP(t, e, n, i, r) { return n > i ? -1 : n < i ? 1 : e > 0 ? t.get(r, e - 1) <= i ? 1 : -1 : 1 } function _P(t, e) { var n = e.rippleEffectColor || e.color; t.eachChild((function (t) { t.attr({ z: e.z, zlevel: e.zlevel, style: { stroke: \"stroke\" === e.brushType ? n : null, fill: \"fill\" === e.brushType ? n : null } }) })) } var bP = function (t) { function e(e, n) { var i = t.call(this) || this, r = new Zw(e, n), o = new Pr; return i.add(r), i.add(o), i.updateData(e, n), i } return n(e, t), e.prototype.stopEffectAnimation = function () { this.childAt(1).removeAll() }, e.prototype.startEffectAnimation = function (t) { for (var e = t.symbolType, n = t.color, i = t.rippleNumber, r = this.childAt(1), o = 0; o < i; o++) { var a = Ry(e, -1, -1, 2, 2, n); a.attr({ style: { strokeNoScale: !0 }, z2: 99, silent: !0, scaleX: .5, scaleY: .5 }); var s = -o / i * t.period + t.effectOffset; a.animate(\"\", !0).when(t.period, { scaleX: t.rippleScale / 2, scaleY: t.rippleScale / 2 }).delay(s).start(), a.animateStyle(!0).when(t.period, { opacity: 0 }).delay(s).start(), r.add(a) } _P(r, t) }, e.prototype.updateEffectAnimation = function (t) { for (var e = this._effectCfg, n = this.childAt(1), i = [\"symbolType\", \"period\", \"rippleScale\", \"rippleNumber\"], r = 0; r < i.length; r++) { var o = i[r]; if (e[o] !== t[o]) return this.stopEffectAnimation(), void this.startEffectAnimation(t) } _P(n, t) }, e.prototype.highlight = function () { Il(this) }, e.prototype.downplay = function () { Tl(this) }, e.prototype.getSymbolType = function () { var t = this.childAt(0); return t && t.getSymbolType() }, e.prototype.updateData = function (t, e) { var n = this, i = t.hostModel; this.childAt(0).updateData(t, e); var r = this.childAt(1), o = t.getItemModel(e), a = t.getItemVisual(e, \"symbol\"), s = Ny(t.getItemVisual(e, \"symbolSize\")), l = t.getItemVisual(e, \"style\"), u = l && l.fill, h = o.getModel(\"emphasis\"); r.setScale(s), r.traverse((function (t) { t.setStyle(\"fill\", u) })); var c = Ey(t.getItemVisual(e, \"symbolOffset\"), s); c && (r.x = c[0], r.y = c[1]); var p = t.getItemVisual(e, \"symbolRotate\"); r.rotation = (p || 0) * Math.PI / 180 || 0; var d = {}; d.showEffectOn = i.get(\"showEffectOn\"), d.rippleScale = o.get([\"rippleEffect\", \"scale\"]), d.brushType = o.get([\"rippleEffect\", \"brushType\"]), d.period = 1e3 * o.get([\"rippleEffect\", \"period\"]), d.effectOffset = e / t.count(), d.z = i.getShallow(\"z\") || 0, d.zlevel = i.getShallow(\"zlevel\") || 0, d.symbolType = a, d.color = u, d.rippleEffectColor = o.get([\"rippleEffect\", \"color\"]), d.rippleNumber = o.get([\"rippleEffect\", \"number\"]), \"render\" === d.showEffectOn ? (this._effectCfg ? this.updateEffectAnimation(d) : this.startEffectAnimation(d), this._effectCfg = d) : (this._effectCfg = null, this.stopEffectAnimation(), this.onHoverStateChange = function (t) { \"emphasis\" === t ? \"render\" !== d.showEffectOn && n.startEffectAnimation(d) : \"normal\" === t && \"render\" !== d.showEffectOn && n.stopEffectAnimation() }), this._effectCfg = d, Bl(this, h.get(\"focus\"), h.get(\"blurScope\"), h.get(\"disabled\")) }, e.prototype.fadeOut = function (t) { t && t() }, e }(Pr), wP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function () { this._symbolDraw = new Jw(bP) }, e.prototype.render = function (t, e, n) { var i = t.getData(), r = this._symbolDraw; r.updateData(i, { clipShape: this._getClipShape(t) }), this.group.add(r.group) }, e.prototype._getClipShape = function (t) { var e = t.coordinateSystem, n = e && e.getArea && e.getArea(); return t.get(\"clip\", !0) ? n : null }, e.prototype.updateTransform = function (t, e, n) { var i = t.getData(); this.group.dirty(); var r = MS(\"\").reset(t, e, n); r.progress && r.progress({ start: 0, end: i.count(), count: i.count() }, i), this._symbolDraw.updateLayout() }, e.prototype._updateGroupTransform = function (t) { var e = t.coordinateSystem; e && e.getRoamTransform && (this.group.transform = Se(e.getRoamTransform()), this.group.decomposeTransform()) }, e.prototype.remove = function (t, e) { this._symbolDraw && this._symbolDraw.remove(!0) }, e.type = \"effectScatter\", e }(wg), SP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.hasSymbolVisual = !0, n } return n(e, t), e.prototype.getInitialData = function (t, e) { return sx(null, this, { useEncodeDefaulter: !0 }) }, e.prototype.brushSelector = function (t, e, n) { return n.point(e.getItemLayout(t)) }, e.type = \"series.effectScatter\", e.dependencies = [\"grid\", \"polar\"], e.defaultOption = { coordinateSystem: \"cartesian2d\", z: 2, legendHoverLink: !0, effectType: \"ripple\", progressive: 0, showEffectOn: \"render\", clip: !0, rippleEffect: { period: 4, scale: 2.5, brushType: \"fill\", number: 3 }, universalTransition: { divideShape: \"clone\" }, symbolSize: 10 }, e }(hg); var MP = function (t) { function e(e, n, i) { var r = t.call(this) || this; return r.add(r.createLine(e, n, i)), r._updateEffectSymbol(e, n), r } return n(e, t), e.prototype.createLine = function (t, e, n) { return new xA(t, e, n) }, e.prototype._updateEffectSymbol = function (t, e) { var n = t.getItemModel(e).getModel(\"effect\"), i = n.get(\"symbolSize\"), r = n.get(\"symbol\"); Y(i) || (i = [i, i]); var o = t.getItemVisual(e, \"style\"), a = n.get(\"color\") || o && o.stroke, s = this.childAt(1); this._symbolType !== r && (this.remove(s), (s = Ry(r, -.5, -.5, 1, 1, a)).z2 = 100, s.culling = !0, this.add(s)), s && (s.setStyle(\"shadowColor\", a), s.setStyle(n.getItemStyle([\"color\"])), s.scaleX = i[0], s.scaleY = i[1], s.setColor(a), this._symbolType = r, this._symbolScale = i, this._updateEffectAnimation(t, n, e)) }, e.prototype._updateEffectAnimation = function (t, e, n) { var i = this.childAt(1); if (i) { var r = t.getItemLayout(n), o = 1e3 * e.get(\"period\"), a = e.get(\"loop\"), s = e.get(\"roundTrip\"), l = e.get(\"constantSpeed\"), u = it(e.get(\"delay\"), (function (e) { return e / t.count() * o / 3 })); if (i.ignore = !0, this._updateAnimationPoints(i, r), l > 0 && (o = this._getLineLength(i) / l * 1e3), o !== this._period || a !== this._loop || s !== this._roundTrip) { i.stopAnimation(); var h = void 0; h = U(u) ? u(n) : u, i.__t > 0 && (h = -o * i.__t), this._animateSymbol(i, o, h, a, s) } this._period = o, this._loop = a, this._roundTrip = s } }, e.prototype._animateSymbol = function (t, e, n, i, r) { if (e > 0) { t.__t = 0; var o = this, a = t.animate(\"\", i).when(r ? 2 * e : e, { __t: r ? 2 : 1 }).delay(n).during((function () { o._updateSymbolPosition(t) })); i || a.done((function () { o.remove(t) })), a.start() } }, e.prototype._getLineLength = function (t) { return Et(t.__p1, t.__cp1) + Et(t.__cp1, t.__p2) }, e.prototype._updateAnimationPoints = function (t, e) { t.__p1 = e[0], t.__p2 = e[1], t.__cp1 = e[2] || [(e[0][0] + e[1][0]) / 2, (e[0][1] + e[1][1]) / 2] }, e.prototype.updateData = function (t, e, n) { this.childAt(0).updateData(t, e, n), this._updateEffectSymbol(t, e) }, e.prototype._updateSymbolPosition = function (t) { var e = t.__p1, n = t.__p2, i = t.__cp1, r = t.__t < 1 ? t.__t : 2 - t.__t, o = [t.x, t.y], a = o.slice(), s = wn, l = Sn; o[0] = s(e[0], i[0], n[0], r), o[1] = s(e[1], i[1], n[1], r); var u = t.__t < 1 ? l(e[0], i[0], n[0], r) : l(n[0], i[0], e[0], 1 - r), h = t.__t < 1 ? l(e[1], i[1], n[1], r) : l(n[1], i[1], e[1], 1 - r); t.rotation = -Math.atan2(h, u) - Math.PI / 2, \"line\" !== this._symbolType && \"rect\" !== this._symbolType && \"roundRect\" !== this._symbolType || (void 0 !== t.__lastT && t.__lastT < t.__t ? (t.scaleY = 1.05 * Et(a, o), 1 === r && (o[0] = a[0] + (o[0] - a[0]) / 2, o[1] = a[1] + (o[1] - a[1]) / 2)) : 1 === t.__lastT ? t.scaleY = 2 * Et(e, o) : t.scaleY = this._symbolScale[1]), t.__lastT = t.__t, t.ignore = !1, t.x = o[0], t.y = o[1] }, e.prototype.updateLayout = function (t, e) { this.childAt(0).updateLayout(t, e); var n = t.getItemModel(e).getModel(\"effect\"); this._updateEffectAnimation(t, n, e) }, e }(Pr), IP = function (t) { function e(e, n, i) { var r = t.call(this) || this; return r._createPolyline(e, n, i), r } return n(e, t), e.prototype._createPolyline = function (t, e, n) { var i = t.getItemLayout(e), r = new Bu({ shape: { points: i } }); this.add(r), this._updateCommonStl(t, e, n) }, e.prototype.updateData = function (t, e, n) { var i = t.hostModel; uh(this.childAt(0), { shape: { points: t.getItemLayout(e) } }, i, e), this._updateCommonStl(t, e, n) }, e.prototype._updateCommonStl = function (t, e, n) { var i = this.childAt(0), r = t.getItemModel(e), o = n && n.emphasisLineStyle, a = n && n.focus, s = n && n.blurScope, l = n && n.emphasisDisabled; if (!n || t.hasItemOption) { var u = r.getModel(\"emphasis\"); o = u.getModel(\"lineStyle\").getLineStyle(), l = u.get(\"disabled\"), a = u.get(\"focus\"), s = u.get(\"blurScope\") } i.useStyle(t.getItemVisual(e, \"style\")), i.style.fill = null, i.style.strokeNoScale = !0, i.ensureState(\"emphasis\").style = o, Bl(this, a, s, l) }, e.prototype.updateLayout = function (t, e) { this.childAt(0).setShape(\"points\", t.getItemLayout(e)) }, e }(Pr), TP = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e._lastFrame = 0, e._lastFramePercent = 0, e } return n(e, t), e.prototype.createLine = function (t, e, n) { return new IP(t, e, n) }, e.prototype._updateAnimationPoints = function (t, e) { this._points = e; for (var n = [0], i = 0, r = 1; r < e.length; r++) { var o = e[r - 1], a = e[r]; i += Et(o, a), n.push(i) } if (0 !== i) { for (r = 0; r < n.length; r++)n[r] /= i; this._offsets = n, this._length = i } else this._length = 0 }, e.prototype._getLineLength = function () { return this._length }, e.prototype._updateSymbolPosition = function (t) { var e = t.__t < 1 ? t.__t : 2 - t.__t, n = this._points, i = this._offsets, r = n.length; if (i) { var o, a = this._lastFrame; if (e < this._lastFramePercent) { for (o = Math.min(a + 1, r - 1); o >= 0 && !(i[o] <= e); o--); o = Math.min(o, r - 2) } else { for (o = a; o < r && !(i[o] > e); o++); o = Math.min(o - 1, r - 2) } var s = (e - i[o]) / (i[o + 1] - i[o]), l = n[o], u = n[o + 1]; t.x = l[0] * (1 - s) + s * u[0], t.y = l[1] * (1 - s) + s * u[1]; var h = t.__t < 1 ? u[0] - l[0] : l[0] - u[0], c = t.__t < 1 ? u[1] - l[1] : l[1] - u[1]; t.rotation = -Math.atan2(c, h) - Math.PI / 2, this._lastFrame = o, this._lastFramePercent = e, t.ignore = !1 } }, e }(MP), CP = function () { this.polyline = !1, this.curveness = 0, this.segs = [] }, DP = function (t) { function e(e) { var n = t.call(this, e) || this; return n._off = 0, n.hoverDataIdx = -1, n } return n(e, t), e.prototype.reset = function () { this.notClear = !1, this._off = 0 }, e.prototype.getDefaultStyle = function () { return { stroke: \"#000\", fill: null } }, e.prototype.getDefaultShape = function () { return new CP }, e.prototype.buildPath = function (t, e) { var n, i = e.segs, r = e.curveness; if (e.polyline) for (n = this._off; n < i.length;) { var o = i[n++]; if (o > 0) { t.moveTo(i[n++], i[n++]); for (var a = 1; a < o; a++)t.lineTo(i[n++], i[n++]) } } else for (n = this._off; n < i.length;) { var s = i[n++], l = i[n++], u = i[n++], h = i[n++]; if (t.moveTo(s, l), r > 0) { var c = (s + u) / 2 - (l - h) * r, p = (l + h) / 2 - (u - s) * r; t.quadraticCurveTo(c, p, u, h) } else t.lineTo(u, h) } this.incremental && (this._off = n, this.notClear = !0) }, e.prototype.findDataIndex = function (t, e) { var n = this.shape, i = n.segs, r = n.curveness, o = this.style.lineWidth; if (n.polyline) for (var a = 0, s = 0; s < i.length;) { var l = i[s++]; if (l > 0) for (var u = i[s++], h = i[s++], c = 1; c < l; c++) { if (es(u, h, p = i[s++], d = i[s++], o, t, e)) return a } a++ } else for (a = 0, s = 0; s < i.length;) { u = i[s++], h = i[s++]; var p = i[s++], d = i[s++]; if (r > 0) { if (is(u, h, (u + p) / 2 - (h - d) * r, (h + d) / 2 - (p - u) * r, p, d, o, t, e)) return a } else if (es(u, h, p, d, o, t, e)) return a; a++ } return -1 }, e.prototype.contain = function (t, e) { var n = this.transformCoordToLocal(t, e), i = this.getBoundingRect(); return t = n[0], e = n[1], i.contain(t, e) ? (this.hoverDataIdx = this.findDataIndex(t, e)) >= 0 : (this.hoverDataIdx = -1, !1) }, e.prototype.getBoundingRect = function () { var t = this._rect; if (!t) { for (var e = this.shape.segs, n = 1 / 0, i = 1 / 0, r = -1 / 0, o = -1 / 0, a = 0; a < e.length;) { var s = e[a++], l = e[a++]; n = Math.min(s, n), r = Math.max(s, r), i = Math.min(l, i), o = Math.max(l, o) } t = this._rect = new Re(n, i, r, o) } return t }, e }(_s), AP = function () { function t() { this.group = new Pr } return t.prototype.updateData = function (t) { this._clear(); var e = this._create(); e.setShape({ segs: t.getLayout(\"linesPoints\") }), this._setCommon(e, t) }, t.prototype.incrementalPrepareUpdate = function (t) { this.group.removeAll(), this._clear() }, t.prototype.incrementalUpdate = function (t, e) { var n = this._newAdded[0], i = e.getLayout(\"linesPoints\"), r = n && n.shape.segs; if (r && r.length < 2e4) { var o = r.length, a = new Float32Array(o + i.length); a.set(r), a.set(i, o), n.setShape({ segs: a }) } else { this._newAdded = []; var s = this._create(); s.incremental = !0, s.setShape({ segs: i }), this._setCommon(s, e), s.__startIndex = t.start } }, t.prototype.remove = function () { this._clear() }, t.prototype.eachRendered = function (t) { this._newAdded[0] && t(this._newAdded[0]) }, t.prototype._create = function () { var t = new DP({ cursor: \"default\", ignoreCoarsePointer: !0 }); return this._newAdded.push(t), this.group.add(t), t }, t.prototype._setCommon = function (t, e, n) { var i = e.hostModel; t.setShape({ polyline: i.get(\"polyline\"), curveness: i.get([\"lineStyle\", \"curveness\"]) }), t.useStyle(i.getModel(\"lineStyle\").getLineStyle()), t.style.strokeNoScale = !0; var r = e.getVisual(\"style\"); r && r.stroke && t.setStyle(\"stroke\", r.stroke), t.setStyle(\"fill\", null); var o = js(t); o.seriesIndex = i.seriesIndex, t.on(\"mousemove\", (function (e) { o.dataIndex = null; var n = t.hoverDataIdx; n > 0 && (o.dataIndex = n + t.__startIndex) })) }, t.prototype._clear = function () { this._newAdded = [], this.group.removeAll() }, t }(), kP = { seriesType: \"lines\", plan: xg(), reset: function (t) { var e = t.coordinateSystem; if (e) { var n = t.get(\"polyline\"), i = t.pipelineContext.large; return { progress: function (r, o) { var a = []; if (i) { var s = void 0, l = r.end - r.start; if (n) { for (var u = 0, h = r.start; h < r.end; h++)u += t.getLineCoordsCount(h); s = new Float32Array(l + 2 * u) } else s = new Float32Array(4 * l); var c = 0, p = []; for (h = r.start; h < r.end; h++) { var d = t.getLineCoords(h, a); n && (s[c++] = d); for (var f = 0; f < d; f++)p = e.dataToPoint(a[f], !1, p), s[c++] = p[0], s[c++] = p[1] } o.setLayout(\"linesPoints\", s) } else for (h = r.start; h < r.end; h++) { var g = o.getItemModel(h), y = (d = t.getLineCoords(h, a), []); if (n) for (var v = 0; v < d; v++)y.push(e.dataToPoint(a[v])); else { y[0] = e.dataToPoint(a[0]), y[1] = e.dataToPoint(a[1]); var m = g.get([\"lineStyle\", \"curveness\"]); +m && (y[2] = [(y[0][0] + y[1][0]) / 2 - (y[0][1] - y[1][1]) * m, (y[0][1] + y[1][1]) / 2 - (y[1][0] - y[0][0]) * m]) } o.setItemLayout(h, y) } } } } } }, LP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = t.getData(), r = this._updateLineDraw(i, t), o = t.get(\"zlevel\"), a = t.get([\"effect\", \"trailLength\"]), s = n.getZr(), l = \"svg\" === s.painter.getType(); l || s.painter.getLayer(o).clear(!0), null == this._lastZlevel || l || s.configLayer(this._lastZlevel, { motionBlur: !1 }), this._showEffect(t) && a > 0 && (l || s.configLayer(o, { motionBlur: !0, lastFrameAlpha: Math.max(Math.min(a / 10 + .9, 1), 0) })), r.updateData(i); var u = t.get(\"clip\", !0) && cS(t.coordinateSystem, !1, t); u ? this.group.setClipPath(u) : this.group.removeClipPath(), this._lastZlevel = o, this._finished = !0 }, e.prototype.incrementalPrepareRender = function (t, e, n) { var i = t.getData(); this._updateLineDraw(i, t).incrementalPrepareUpdate(i), this._clearLayer(n), this._finished = !1 }, e.prototype.incrementalRender = function (t, e, n) { this._lineDraw.incrementalUpdate(t, e.getData()), this._finished = t.end === e.getData().count() }, e.prototype.eachRendered = function (t) { this._lineDraw && this._lineDraw.eachRendered(t) }, e.prototype.updateTransform = function (t, e, n) { var i = t.getData(), r = t.pipelineContext; if (!this._finished || r.large || r.progressiveRender) return { update: !0 }; var o = kP.reset(t, e, n); o.progress && o.progress({ start: 0, end: i.count(), count: i.count() }, i), this._lineDraw.updateLayout(), this._clearLayer(n) }, e.prototype._updateLineDraw = function (t, e) { var n = this._lineDraw, i = this._showEffect(e), r = !!e.get(\"polyline\"), o = e.pipelineContext.large; return n && i === this._hasEffet && r === this._isPolyline && o === this._isLargeDraw || (n && n.remove(), n = this._lineDraw = o ? new AP : new _A(r ? i ? TP : IP : i ? MP : xA), this._hasEffet = i, this._isPolyline = r, this._isLargeDraw = o), this.group.add(n.group), n }, e.prototype._showEffect = function (t) { return !!t.get([\"effect\", \"show\"]) }, e.prototype._clearLayer = function (t) { var e = t.getZr(); \"svg\" === e.painter.getType() || null == this._lastZlevel || e.painter.getLayer(this._lastZlevel).clear(!0) }, e.prototype.remove = function (t, e) { this._lineDraw && this._lineDraw.remove(), this._lineDraw = null, this._clearLayer(e) }, e.prototype.dispose = function (t, e) { this.remove(t, e) }, e.type = \"lines\", e }(wg), PP = \"undefined\" == typeof Uint32Array ? Array : Uint32Array, OP = \"undefined\" == typeof Float64Array ? Array : Float64Array; function RP(t) { var e = t.data; e && e[0] && e[0][0] && e[0][0].coord && (t.data = z(e, (function (t) { var e = { coords: [t[0].coord, t[1].coord] }; return t[0].name && (e.fromName = t[0].name), t[1].name && (e.toName = t[1].name), D([e, t[0], t[1]]) }))) } var NP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.visualStyleAccessPath = \"lineStyle\", n.visualDrawType = \"stroke\", n } return n(e, t), e.prototype.init = function (e) { e.data = e.data || [], RP(e); var n = this._processFlatCoordsArray(e.data); this._flatCoords = n.flatCoords, this._flatCoordsOffset = n.flatCoordsOffset, n.flatCoords && (e.data = new Float32Array(n.count)), t.prototype.init.apply(this, arguments) }, e.prototype.mergeOption = function (e) { if (RP(e), e.data) { var n = this._processFlatCoordsArray(e.data); this._flatCoords = n.flatCoords, this._flatCoordsOffset = n.flatCoordsOffset, n.flatCoords && (e.data = new Float32Array(n.count)) } t.prototype.mergeOption.apply(this, arguments) }, e.prototype.appendData = function (t) { var e = this._processFlatCoordsArray(t.data); e.flatCoords && (this._flatCoords ? (this._flatCoords = gt(this._flatCoords, e.flatCoords), this._flatCoordsOffset = gt(this._flatCoordsOffset, e.flatCoordsOffset)) : (this._flatCoords = e.flatCoords, this._flatCoordsOffset = e.flatCoordsOffset), t.data = new Float32Array(e.count)), this.getRawData().appendData(t.data) }, e.prototype._getCoordsFromItemModel = function (t) { var e = this.getData().getItemModel(t), n = e.option instanceof Array ? e.option : e.getShallow(\"coords\"); return n }, e.prototype.getLineCoordsCount = function (t) { return this._flatCoordsOffset ? this._flatCoordsOffset[2 * t + 1] : this._getCoordsFromItemModel(t).length }, e.prototype.getLineCoords = function (t, e) { if (this._flatCoordsOffset) { for (var n = this._flatCoordsOffset[2 * t], i = this._flatCoordsOffset[2 * t + 1], r = 0; r < i; r++)e[r] = e[r] || [], e[r][0] = this._flatCoords[n + 2 * r], e[r][1] = this._flatCoords[n + 2 * r + 1]; return i } var o = this._getCoordsFromItemModel(t); for (r = 0; r < o.length; r++)e[r] = e[r] || [], e[r][0] = o[r][0], e[r][1] = o[r][1]; return o.length }, e.prototype._processFlatCoordsArray = function (t) { var e = 0; if (this._flatCoords && (e = this._flatCoords.length), j(t[0])) { for (var n = t.length, i = new PP(n), r = new OP(n), o = 0, a = 0, s = 0, l = 0; l < n;) { s++; var u = t[l++]; i[a++] = o + e, i[a++] = u; for (var h = 0; h < u; h++) { var c = t[l++], p = t[l++]; r[o++] = c, r[o++] = p } } return { flatCoordsOffset: new Uint32Array(i.buffer, 0, a), flatCoords: r, count: s } } return { flatCoordsOffset: null, flatCoords: null, count: t.length } }, e.prototype.getInitialData = function (t, e) { var n = new Jm([\"value\"], this); return n.hasItemOption = !1, n.initData(t.data, [], (function (t, e, i, r) { if (t instanceof Array) return NaN; n.hasItemOption = !0; var o = t.value; return null != o ? o instanceof Array ? o[r] : o : void 0 })), n }, e.prototype.formatTooltip = function (t, e, n) { var i = this.getData().getItemModel(t), r = i.get(\"name\"); if (r) return r; var o = i.get(\"fromName\"), a = i.get(\"toName\"), s = []; return null != o && s.push(o), null != a && s.push(a), qf(\"nameValue\", { name: s.join(\" > \") }) }, e.prototype.preventIncremental = function () { return !!this.get([\"effect\", \"show\"]) }, e.prototype.getProgressive = function () { var t = this.option.progressive; return null == t ? this.option.large ? 1e4 : this.get(\"progressive\") : t }, e.prototype.getProgressiveThreshold = function () { var t = this.option.progressiveThreshold; return null == t ? this.option.large ? 2e4 : this.get(\"progressiveThreshold\") : t }, e.prototype.getZLevelKey = function () { var t = this.getModel(\"effect\"), e = t.get(\"trailLength\"); return this.getData().count() > this.getProgressiveThreshold() ? this.id : t.get(\"show\") && e > 0 ? e + \"\" : \"\" }, e.type = \"series.lines\", e.dependencies = [\"grid\", \"polar\", \"geo\", \"calendar\"], e.defaultOption = { coordinateSystem: \"geo\", z: 2, legendHoverLink: !0, xAxisIndex: 0, yAxisIndex: 0, symbol: [\"none\", \"none\"], symbolSize: [10, 10], geoIndex: 0, effect: { show: !1, period: 4, constantSpeed: 0, symbol: \"circle\", symbolSize: 3, loop: !0, trailLength: .2 }, large: !1, largeThreshold: 2e3, polyline: !1, clip: !0, label: { show: !1, position: \"end\" }, lineStyle: { opacity: .5 } }, e }(hg); function EP(t) { return t instanceof Array || (t = [t, t]), t } var zP = { seriesType: \"lines\", reset: function (t) { var e = EP(t.get(\"symbol\")), n = EP(t.get(\"symbolSize\")), i = t.getData(); return i.setVisual(\"fromSymbol\", e && e[0]), i.setVisual(\"toSymbol\", e && e[1]), i.setVisual(\"fromSymbolSize\", n && n[0]), i.setVisual(\"toSymbolSize\", n && n[1]), { dataEach: i.hasItemOption ? function (t, e) { var n = t.getItemModel(e), i = EP(n.getShallow(\"symbol\", !0)), r = EP(n.getShallow(\"symbolSize\", !0)); i[0] && t.setItemVisual(e, \"fromSymbol\", i[0]), i[1] && t.setItemVisual(e, \"toSymbol\", i[1]), r[0] && t.setItemVisual(e, \"fromSymbolSize\", r[0]), r[1] && t.setItemVisual(e, \"toSymbolSize\", r[1]) } : null } } }; var VP = function () { function t() { this.blurSize = 30, this.pointSize = 20, this.maxOpacity = 1, this.minOpacity = 0, this._gradientPixels = { inRange: null, outOfRange: null }; var t = h.createCanvas(); this.canvas = t } return t.prototype.update = function (t, e, n, i, r, o) { var a = this._getBrush(), s = this._getGradient(r, \"inRange\"), l = this._getGradient(r, \"outOfRange\"), u = this.pointSize + this.blurSize, h = this.canvas, c = h.getContext(\"2d\"), p = t.length; h.width = e, h.height = n; for (var d = 0; d < p; ++d) { var f = t[d], g = f[0], y = f[1], v = i(f[2]); c.globalAlpha = v, c.drawImage(a, g - u, y - u) } if (!h.width || !h.height) return h; for (var m = c.getImageData(0, 0, h.width, h.height), x = m.data, _ = 0, b = x.length, w = this.minOpacity, S = this.maxOpacity - w; _ < b;) { v = x[_ + 3] / 256; var M = 4 * Math.floor(255 * v); if (v > 0) { var I = o(v) ? s : l; v > 0 && (v = v * S + w), x[_++] = I[M], x[_++] = I[M + 1], x[_++] = I[M + 2], x[_++] = I[M + 3] * v * 256 } else _ += 4 } return c.putImageData(m, 0, 0), h }, t.prototype._getBrush = function () { var t = this._brushCanvas || (this._brushCanvas = h.createCanvas()), e = this.pointSize + this.blurSize, n = 2 * e; t.width = n, t.height = n; var i = t.getContext(\"2d\"); return i.clearRect(0, 0, n, n), i.shadowOffsetX = n, i.shadowBlur = this.blurSize, i.shadowColor = \"#000\", i.beginPath(), i.arc(-e, e, this.pointSize, 0, 2 * Math.PI, !0), i.closePath(), i.fill(), t }, t.prototype._getGradient = function (t, e) { for (var n = this._gradientPixels, i = n[e] || (n[e] = new Uint8ClampedArray(1024)), r = [0, 0, 0, 0], o = 0, a = 0; a < 256; a++)t[e](a / 255, !0, r), i[o++] = r[0], i[o++] = r[1], i[o++] = r[2], i[o++] = r[3]; return i }, t }(); function BP(t) { var e = t.dimensions; return \"lng\" === e[0] && \"lat\" === e[1] } var FP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i; e.eachComponent(\"visualMap\", (function (e) { e.eachTargetSeries((function (n) { n === t && (i = e) })) })), this._progressiveEls = null, this.group.removeAll(); var r = t.coordinateSystem; \"cartesian2d\" === r.type || \"calendar\" === r.type ? this._renderOnCartesianAndCalendar(t, n, 0, t.getData().count()) : BP(r) && this._renderOnGeo(r, t, i, n) }, e.prototype.incrementalPrepareRender = function (t, e, n) { this.group.removeAll() }, e.prototype.incrementalRender = function (t, e, n, i) { var r = e.coordinateSystem; r && (BP(r) ? this.render(e, n, i) : (this._progressiveEls = [], this._renderOnCartesianAndCalendar(e, i, t.start, t.end, !0))) }, e.prototype.eachRendered = function (t) { Yh(this._progressiveEls || this.group, t) }, e.prototype._renderOnCartesianAndCalendar = function (t, e, n, i, r) { var o, a, s, l, u = t.coordinateSystem, h = pS(u, \"cartesian2d\"); if (h) { var c = u.getAxis(\"x\"), p = u.getAxis(\"y\"); 0, o = c.getBandWidth() + .5, a = p.getBandWidth() + .5, s = c.scale.getExtent(), l = p.scale.getExtent() } for (var d = this.group, f = t.getData(), g = t.getModel([\"emphasis\", \"itemStyle\"]).getItemStyle(), y = t.getModel([\"blur\", \"itemStyle\"]).getItemStyle(), v = t.getModel([\"select\", \"itemStyle\"]).getItemStyle(), m = t.get([\"itemStyle\", \"borderRadius\"]), x = Kh(t), _ = t.getModel(\"emphasis\"), b = _.get(\"focus\"), w = _.get(\"blurScope\"), S = _.get(\"disabled\"), M = h ? [f.mapDimension(\"x\"), f.mapDimension(\"y\"), f.mapDimension(\"value\")] : [f.mapDimension(\"time\"), f.mapDimension(\"value\")], I = n; I < i; I++) { var T = void 0, C = f.getItemVisual(I, \"style\"); if (h) { var D = f.get(M[0], I), A = f.get(M[1], I); if (isNaN(f.get(M[2], I)) || D < s[0] || D > s[1] || A < l[0] || A > l[1]) continue; var k = u.dataToPoint([D, A]); T = new Ps({ shape: { x: k[0] - o / 2, y: k[1] - a / 2, width: o, height: a }, style: C }) } else { if (isNaN(f.get(M[1], I))) continue; T = new Ps({ z2: 1, shape: u.dataToRect([f.get(M[0], I)]).contentShape, style: C }) } if (f.hasItemOption) { var L = f.getItemModel(I), P = L.getModel(\"emphasis\"); g = P.getModel(\"itemStyle\").getItemStyle(), y = L.getModel([\"blur\", \"itemStyle\"]).getItemStyle(), v = L.getModel([\"select\", \"itemStyle\"]).getItemStyle(), m = L.get([\"itemStyle\", \"borderRadius\"]), b = P.get(\"focus\"), w = P.get(\"blurScope\"), S = P.get(\"disabled\"), x = Kh(L) } T.shape.r = m; var O = t.getRawValue(I), R = \"-\"; O && null != O[2] && (R = O[2] + \"\"), qh(T, x, { labelFetcher: t, labelDataIndex: I, defaultOpacity: C.opacity, defaultText: R }), T.ensureState(\"emphasis\").style = g, T.ensureState(\"blur\").style = y, T.ensureState(\"select\").style = v, Bl(T, b, w, S), T.incremental = r, r && (T.states.emphasis.hoverLayer = !0), d.add(T), f.setItemGraphicEl(I, T), this._progressiveEls && this._progressiveEls.push(T) } }, e.prototype._renderOnGeo = function (t, e, n, i) { var r = n.targetVisuals.inRange, o = n.targetVisuals.outOfRange, a = e.getData(), s = this._hmLayer || this._hmLayer || new VP; s.blurSize = e.get(\"blurSize\"), s.pointSize = e.get(\"pointSize\"), s.minOpacity = e.get(\"minOpacity\"), s.maxOpacity = e.get(\"maxOpacity\"); var l = t.getViewRect().clone(), u = t.getRoamTransform(); l.applyTransform(u); var h = Math.max(l.x, 0), c = Math.max(l.y, 0), p = Math.min(l.width + l.x, i.getWidth()), d = Math.min(l.height + l.y, i.getHeight()), f = p - h, g = d - c, y = [a.mapDimension(\"lng\"), a.mapDimension(\"lat\"), a.mapDimension(\"value\")], v = a.mapArray(y, (function (e, n, i) { var r = t.dataToPoint([e, n]); return r[0] -= h, r[1] -= c, r.push(i), r })), m = n.getExtent(), x = \"visualMap.continuous\" === n.type ? function (t, e) { var n = t[1] - t[0]; return e = [(e[0] - t[0]) / n, (e[1] - t[0]) / n], function (t) { return t >= e[0] && t <= e[1] } }(m, n.option.range) : function (t, e, n) { var i = t[1] - t[0], r = (e = z(e, (function (e) { return { interval: [(e.interval[0] - t[0]) / i, (e.interval[1] - t[0]) / i] } }))).length, o = 0; return function (t) { var i; for (i = o; i < r; i++)if ((a = e[i].interval)[0] <= t && t <= a[1]) { o = i; break } if (i === r) for (i = o - 1; i >= 0; i--) { var a; if ((a = e[i].interval)[0] <= t && t <= a[1]) { o = i; break } } return i >= 0 && i < r && n[i] } }(m, n.getPieceList(), n.option.selected); s.update(v, f, g, r.color.getNormalizer(), { inRange: r.color.getColorMapper(), outOfRange: o.color.getColorMapper() }, x); var _ = new Is({ style: { width: f, height: g, x: h, y: c, image: s.canvas }, silent: !0 }); this.group.add(_) }, e.type = \"heatmap\", e }(wg), GP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.getInitialData = function (t, e) { return sx(null, this, { generateCoord: \"value\" }) }, e.prototype.preventIncremental = function () { var t = dd.get(this.get(\"coordinateSystem\")); if (t && t.dimensions) return \"lng\" === t.dimensions[0] && \"lat\" === t.dimensions[1] }, e.type = \"series.heatmap\", e.dependencies = [\"grid\", \"geo\", \"calendar\"], e.defaultOption = { coordinateSystem: \"cartesian2d\", z: 2, geoIndex: 0, blurSize: 30, pointSize: 20, maxOpacity: 1, minOpacity: 0, select: { itemStyle: { borderColor: \"#212121\" } } }, e }(hg); var WP = [\"itemStyle\", \"borderWidth\"], HP = [{ xy: \"x\", wh: \"width\", index: 0, posDesc: [\"left\", \"right\"] }, { xy: \"y\", wh: \"height\", index: 1, posDesc: [\"top\", \"bottom\"] }], YP = new gu, UP = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = this.group, r = t.getData(), o = this._data, a = t.coordinateSystem, s = a.getBaseAxis().isHorizontal(), l = a.master.getRect(), u = { ecSize: { width: n.getWidth(), height: n.getHeight() }, seriesModel: t, coordSys: a, coordSysExtent: [[l.x, l.x + l.width], [l.y, l.y + l.height]], isHorizontal: s, valueDim: HP[+s], categoryDim: HP[1 - +s] }; return r.diff(o).add((function (t) { if (r.hasValue(t)) { var e = QP(r, t), n = XP(r, t, e, u), o = nO(r, u, n); r.setItemGraphicEl(t, o), i.add(o), sO(o, u, n) } })).update((function (t, e) { var n = o.getItemGraphicEl(e); if (r.hasValue(t)) { var a = QP(r, t), s = XP(r, t, a, u), l = rO(r, s); n && l !== n.__pictorialShapeStr && (i.remove(n), r.setItemGraphicEl(t, null), n = null), n ? function (t, e, n) { var i = n.animationModel, r = n.dataIndex; uh(t.__pictorialBundle, { x: n.bundlePosition[0], y: n.bundlePosition[1] }, i, r), n.symbolRepeat ? qP(t, e, n, !0) : KP(t, e, n, !0); $P(t, n, !0), JP(t, e, n, !0) }(n, u, s) : n = nO(r, u, s, !0), r.setItemGraphicEl(t, n), n.__pictorialSymbolMeta = s, i.add(n), sO(n, u, s) } else i.remove(n) })).remove((function (t) { var e = o.getItemGraphicEl(t); e && iO(o, t, e.__pictorialSymbolMeta.animationModel, e) })).execute(), this._data = r, this.group }, e.prototype.remove = function (t, e) { var n = this.group, i = this._data; t.get(\"animation\") ? i && i.eachItemGraphicEl((function (e) { iO(i, js(e).dataIndex, t, e) })) : n.removeAll() }, e.type = \"pictorialBar\", e }(wg); function XP(t, e, n, i) { var r = t.getItemLayout(e), o = n.get(\"symbolRepeat\"), a = n.get(\"symbolClip\"), s = n.get(\"symbolPosition\") || \"start\", l = (n.get(\"symbolRotate\") || 0) * Math.PI / 180 || 0, u = n.get(\"symbolPatternSize\") || 2, h = n.isAnimationEnabled(), c = { dataIndex: e, layout: r, itemModel: n, symbolType: t.getItemVisual(e, \"symbol\") || \"circle\", style: t.getItemVisual(e, \"style\"), symbolClip: a, symbolRepeat: o, symbolRepeatDirection: n.get(\"symbolRepeatDirection\"), symbolPatternSize: u, rotation: l, animationModel: h ? n : null, hoverScale: h && n.get([\"emphasis\", \"scale\"]), z2: n.getShallow(\"z\", !0) || 0 }; !function (t, e, n, i, r) { var o, a = i.valueDim, s = t.get(\"symbolBoundingData\"), l = i.coordSys.getOtherAxis(i.coordSys.getBaseAxis()), u = l.toGlobalCoord(l.dataToCoord(0)), h = 1 - +(n[a.wh] <= 0); if (Y(s)) { var c = [ZP(l, s[0]) - u, ZP(l, s[1]) - u]; c[1] < c[0] && c.reverse(), o = c[h] } else o = null != s ? ZP(l, s) - u : e ? i.coordSysExtent[a.index][h] - u : n[a.wh]; r.boundingLength = o, e && (r.repeatCutLength = n[a.wh]); r.pxSign = o > 0 ? 1 : -1 }(n, o, r, i, c), function (t, e, n, i, r, o, a, s, l, u) { var h, c = l.valueDim, p = l.categoryDim, d = Math.abs(n[p.wh]), f = t.getItemVisual(e, \"symbolSize\"); h = Y(f) ? f.slice() : null == f ? [\"100%\", \"100%\"] : [f, f]; h[p.index] = Gr(h[p.index], d), h[c.index] = Gr(h[c.index], i ? d : Math.abs(o)), u.symbolSize = h, (u.symbolScale = [h[0] / s, h[1] / s])[c.index] *= (l.isHorizontal ? -1 : 1) * a }(t, e, r, o, 0, c.boundingLength, c.pxSign, u, i, c), function (t, e, n, i, r) { var o = t.get(WP) || 0; o && (YP.attr({ scaleX: e[0], scaleY: e[1], rotation: n }), YP.updateTransform(), o /= YP.getLineScale(), o *= e[i.valueDim.index]); r.valueLineWidth = o || 0 }(n, c.symbolScale, l, i, c); var p = c.symbolSize, d = Ey(n.get(\"symbolOffset\"), p); return function (t, e, n, i, r, o, a, s, l, u, h, c) { var p = h.categoryDim, d = h.valueDim, f = c.pxSign, g = Math.max(e[d.index] + s, 0), y = g; if (i) { var v = Math.abs(l), m = it(t.get(\"symbolMargin\"), \"15%\") + \"\", x = !1; m.lastIndexOf(\"!\") === m.length - 1 && (x = !0, m = m.slice(0, m.length - 1)); var _ = Gr(m, e[d.index]), b = Math.max(g + 2 * _, 0), w = x ? 0 : 2 * _, S = ao(i), M = S ? i : lO((v + w) / b); b = g + 2 * (_ = (v - M * g) / 2 / (x ? M : Math.max(M - 1, 1))), w = x ? 0 : 2 * _, S || \"fixed\" === i || (M = u ? lO((Math.abs(u) + w) / b) : 0), y = M * b - w, c.repeatTimes = M, c.symbolMargin = _ } var I = f * (y / 2), T = c.pathPosition = []; T[p.index] = n[p.wh] / 2, T[d.index] = \"start\" === a ? I : \"end\" === a ? l - I : l / 2, o && (T[0] += o[0], T[1] += o[1]); var C = c.bundlePosition = []; C[p.index] = n[p.xy], C[d.index] = n[d.xy]; var D = c.barRectShape = A({}, n); D[d.wh] = f * Math.max(Math.abs(n[d.wh]), Math.abs(T[d.index] + I)), D[p.wh] = n[p.wh]; var k = c.clipShape = {}; k[p.xy] = -n[p.xy], k[p.wh] = h.ecSize[p.wh], k[d.xy] = 0, k[d.wh] = n[d.wh] }(n, p, r, o, 0, d, s, c.valueLineWidth, c.boundingLength, c.repeatCutLength, i, c), c } function ZP(t, e) { return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e))) } function jP(t) { var e = t.symbolPatternSize, n = Ry(t.symbolType, -e / 2, -e / 2, e, e); return n.attr({ culling: !0 }), \"image\" !== n.type && n.setStyle({ strokeNoScale: !0 }), n } function qP(t, e, n, i) { var r = t.__pictorialBundle, o = n.symbolSize, a = n.valueLineWidth, s = n.pathPosition, l = e.valueDim, u = n.repeatTimes || 0, h = 0, c = o[e.valueDim.index] + a + 2 * n.symbolMargin; for (oO(t, (function (t) { t.__pictorialAnimationIndex = h, t.__pictorialRepeatTimes = u, h < u ? aO(t, null, f(h), n, i) : aO(t, null, { scaleX: 0, scaleY: 0 }, n, i, (function () { r.remove(t) })), h++ })); h < u; h++) { var p = jP(n); p.__pictorialAnimationIndex = h, p.__pictorialRepeatTimes = u, r.add(p); var d = f(h); aO(p, { x: d.x, y: d.y, scaleX: 0, scaleY: 0 }, { scaleX: d.scaleX, scaleY: d.scaleY, rotation: d.rotation }, n, i) } function f(t) { var e = s.slice(), i = n.pxSign, r = t; return (\"start\" === n.symbolRepeatDirection ? i > 0 : i < 0) && (r = u - 1 - t), e[l.index] = c * (r - u / 2 + .5) + s[l.index], { x: e[0], y: e[1], scaleX: n.symbolScale[0], scaleY: n.symbolScale[1], rotation: n.rotation } } } function KP(t, e, n, i) { var r = t.__pictorialBundle, o = t.__pictorialMainPath; o ? aO(o, null, { x: n.pathPosition[0], y: n.pathPosition[1], scaleX: n.symbolScale[0], scaleY: n.symbolScale[1], rotation: n.rotation }, n, i) : (o = t.__pictorialMainPath = jP(n), r.add(o), aO(o, { x: n.pathPosition[0], y: n.pathPosition[1], scaleX: 0, scaleY: 0, rotation: n.rotation }, { scaleX: n.symbolScale[0], scaleY: n.symbolScale[1] }, n, i)) } function $P(t, e, n) { var i = A({}, e.barRectShape), r = t.__pictorialBarRect; r ? aO(r, null, { shape: i }, e, n) : ((r = t.__pictorialBarRect = new Ps({ z2: 2, shape: i, silent: !0, style: { stroke: \"transparent\", fill: \"transparent\", lineWidth: 0 } })).disableMorphing = !0, t.add(r)) } function JP(t, e, n, i) { if (n.symbolClip) { var r = t.__pictorialClipPath, o = A({}, n.clipShape), a = e.valueDim, s = n.animationModel, l = n.dataIndex; if (r) uh(r, { shape: o }, s, l); else { o[a.wh] = 0, r = new Ps({ shape: o }), t.__pictorialBundle.setClipPath(r), t.__pictorialClipPath = r; var u = {}; u[a.wh] = n.clipShape[a.wh], Uh[i ? \"updateProps\" : \"initProps\"](r, { shape: u }, s, l) } } } function QP(t, e) { var n = t.getItemModel(e); return n.getAnimationDelayParams = tO, n.isAnimationEnabled = eO, n } function tO(t) { return { index: t.__pictorialAnimationIndex, count: t.__pictorialRepeatTimes } } function eO() { return this.parentModel.isAnimationEnabled() && !!this.getShallow(\"animation\") } function nO(t, e, n, i) { var r = new Pr, o = new Pr; return r.add(o), r.__pictorialBundle = o, o.x = n.bundlePosition[0], o.y = n.bundlePosition[1], n.symbolRepeat ? qP(r, e, n) : KP(r, 0, n), $P(r, n, i), JP(r, e, n, i), r.__pictorialShapeStr = rO(t, n), r.__pictorialSymbolMeta = n, r } function iO(t, e, n, i) { var r = i.__pictorialBarRect; r && r.removeTextContent(); var o = []; oO(i, (function (t) { o.push(t) })), i.__pictorialMainPath && o.push(i.__pictorialMainPath), i.__pictorialClipPath && (n = null), E(o, (function (t) { ph(t, { scaleX: 0, scaleY: 0 }, n, e, (function () { i.parent && i.parent.remove(i) })) })), t.setItemGraphicEl(e, null) } function rO(t, e) { return [t.getItemVisual(e.dataIndex, \"symbol\") || \"none\", !!e.symbolRepeat, !!e.symbolClip].join(\":\") } function oO(t, e, n) { E(t.__pictorialBundle.children(), (function (i) { i !== t.__pictorialBarRect && e.call(n, i) })) } function aO(t, e, n, i, r, o) { e && t.attr(e), i.symbolClip && !r ? n && t.attr(n) : n && Uh[r ? \"updateProps\" : \"initProps\"](t, n, i.animationModel, i.dataIndex, o) } function sO(t, e, n) { var i = n.dataIndex, r = n.itemModel, o = r.getModel(\"emphasis\"), a = o.getModel(\"itemStyle\").getItemStyle(), s = r.getModel([\"blur\", \"itemStyle\"]).getItemStyle(), l = r.getModel([\"select\", \"itemStyle\"]).getItemStyle(), u = r.getShallow(\"cursor\"), h = o.get(\"focus\"), c = o.get(\"blurScope\"), p = o.get(\"scale\"); oO(t, (function (t) { if (t instanceof Is) { var e = t.style; t.useStyle(A({ image: e.image, x: e.x, y: e.y, width: e.width, height: e.height }, n.style)) } else t.useStyle(n.style); var i = t.ensureState(\"emphasis\"); i.style = a, p && (i.scaleX = 1.1 * t.scaleX, i.scaleY = 1.1 * t.scaleY), t.ensureState(\"blur\").style = s, t.ensureState(\"select\").style = l, u && (t.cursor = u), t.z2 = n.z2 })); var d = e.valueDim.posDesc[+(n.boundingLength > 0)]; qh(t.__pictorialBarRect, Kh(r), { labelFetcher: e.seriesModel, labelDataIndex: i, defaultText: Uw(e.seriesModel.getData(), i), inheritColor: n.style.fill, defaultOpacity: n.style.opacity, defaultOutsidePosition: d }), Bl(t, h, c, o.get(\"disabled\")) } function lO(t) { var e = Math.round(t); return Math.abs(t - e) < 1e-4 ? e : Math.ceil(t) } var uO = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.hasSymbolVisual = !0, n.defaultSymbol = \"roundRect\", n } return n(e, t), e.prototype.getInitialData = function (e) { return e.stack = null, t.prototype.getInitialData.apply(this, arguments) }, e.type = \"series.pictorialBar\", e.dependencies = [\"grid\"], e.defaultOption = wc(DS.defaultOption, { symbol: \"circle\", symbolSize: null, symbolRotate: null, symbolPosition: null, symbolOffset: null, symbolMargin: null, symbolRepeat: !1, symbolRepeatDirection: \"end\", symbolClip: !1, symbolBoundingData: null, symbolPatternSize: 400, barGap: \"-100%\", progressive: 0, emphasis: { scale: !1 }, select: { itemStyle: { borderColor: \"#212121\" } } }), e }(DS); var hO = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._layers = [], n } return n(e, t), e.prototype.render = function (t, e, n) { var i = t.getData(), r = this, o = this.group, a = t.getLayerSeries(), s = i.getLayout(\"layoutInfo\"), l = s.rect, u = s.boundaryGap; function h(t) { return t.name } o.x = 0, o.y = l.y + u[0]; var c = new Dm(this._layersSeries || [], a, h, h), p = []; function d(e, n, s) { var l = r._layers; if (\"remove\" !== e) { for (var u, h, c = [], d = [], f = a[n].indices, g = 0; g < f.length; g++) { var y = i.getItemLayout(f[g]), v = y.x, m = y.y0, x = y.y; c.push(v, m), d.push(v, m + x), u = i.getItemVisual(f[g], \"style\") } var _ = i.getItemLayout(f[0]), b = t.getModel(\"label\").get(\"margin\"), w = t.getModel(\"emphasis\"); if (\"add\" === e) { var S = p[n] = new Pr; h = new lS({ shape: { points: c, stackedOnPoints: d, smooth: .4, stackedOnSmooth: .4, smoothConstraint: !1 }, z2: 0 }), S.add(h), o.add(S), t.isAnimationEnabled() && h.setClipPath(function (t, e, n) { var i = new Ps({ shape: { x: t.x - 10, y: t.y - 10, width: 0, height: t.height + 20 } }); return hh(i, { shape: { x: t.x - 50, width: t.width + 100, height: t.height + 20 } }, e, n), i }(h.getBoundingRect(), t, (function () { h.removeClipPath() }))) } else { S = l[s]; h = S.childAt(0), o.add(S), p[n] = S, uh(h, { shape: { points: c, stackedOnPoints: d } }, t), gh(h) } qh(h, Kh(t), { labelDataIndex: f[g - 1], defaultText: i.getName(f[g - 1]), inheritColor: u.fill }, { normal: { verticalAlign: \"middle\" } }), h.setTextConfig({ position: null, local: !0 }); var M = h.getTextContent(); M && (M.x = _.x - b, M.y = _.y0 + _.y / 2), h.useStyle(u), i.setItemGraphicEl(n, h), Hl(h, t), Bl(h, w.get(\"focus\"), w.get(\"blurScope\"), w.get(\"disabled\")) } else o.remove(l[n]) } c.add(W(d, this, \"add\")).update(W(d, this, \"update\")).remove(W(d, this, \"remove\")).execute(), this._layersSeries = a, this._layers = p }, e.type = \"themeRiver\", e }(wg); var cO = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (e) { t.prototype.init.apply(this, arguments), this.legendVisualProvider = new dM(W(this.getData, this), W(this.getRawData, this)) }, e.prototype.fixData = function (t) { var e = t.length, n = {}, i = Eo(t, (function (t) { return n.hasOwnProperty(t[0] + \"\") || (n[t[0] + \"\"] = -1), t[2] })), r = []; i.buckets.each((function (t, e) { r.push({ name: e, dataList: t }) })); for (var o = r.length, a = 0; a < o; ++a) { for (var s = r[a].name, l = 0; l < r[a].dataList.length; ++l) { var u = r[a].dataList[l][0] + \"\"; n[u] = a } for (var u in n) n.hasOwnProperty(u) && n[u] !== a && (n[u] = a, t[e] = [u, 0, s], e++) } return t }, e.prototype.getInitialData = function (t, e) { for (var n = this.getReferringComponents(\"singleAxis\", Po).models[0].get(\"type\"), i = B(t.data, (function (t) { return void 0 !== t[2] })), r = this.fixData(i || []), o = [], a = this.nameMap = ft(), s = 0, l = 0; l < r.length; ++l)o.push(r[l][2]), a.get(r[l][2]) || (a.set(r[l][2], s), s++); var u = Qm(r, { coordDimensions: [\"single\"], dimensionsDefine: [{ name: \"time\", type: Lm(n) }, { name: \"value\", type: \"float\" }, { name: \"name\", type: \"ordinal\" }], encodeDefine: { single: 0, value: 1, itemName: 2 } }).dimensions, h = new Jm(u, this); return h.initData(r), h }, e.prototype.getLayerSeries = function () { for (var t = this.getData(), e = t.count(), n = [], i = 0; i < e; ++i)n[i] = i; var r = t.mapDimension(\"single\"), o = Eo(n, (function (e) { return t.get(\"name\", e) })), a = []; return o.buckets.each((function (e, n) { e.sort((function (e, n) { return t.get(r, e) - t.get(r, n) })), a.push({ name: n, indices: e }) })), a }, e.prototype.getAxisTooltipData = function (t, e, n) { Y(t) || (t = t ? [t] : []); for (var i, r = this.getData(), o = this.getLayerSeries(), a = [], s = o.length, l = 0; l < s; ++l) { for (var u = Number.MAX_VALUE, h = -1, c = o[l].indices.length, p = 0; p < c; ++p) { var d = r.get(t[0], o[l].indices[p]), f = Math.abs(d - e); f <= u && (i = d, u = f, h = o[l].indices[p]) } a.push(h) } return { dataIndices: a, nestestValue: i } }, e.prototype.formatTooltip = function (t, e, n) { var i = this.getData(); return qf(\"nameValue\", { name: i.getName(t), value: i.get(i.mapDimension(\"value\"), t) }) }, e.type = \"series.themeRiver\", e.dependencies = [\"singleAxis\"], e.defaultOption = { z: 2, colorBy: \"data\", coordinateSystem: \"singleAxis\", boundaryGap: [\"10%\", \"10%\"], singleAxisIndex: 0, animationEasing: \"linear\", label: { margin: 4, show: !0, position: \"left\", fontSize: 11 }, emphasis: { label: { show: !0 } } }, e }(hg); function pO(t, e) { t.eachSeriesByType(\"themeRiver\", (function (t) { var e = t.getData(), n = t.coordinateSystem, i = {}, r = n.getRect(); i.rect = r; var o = t.get(\"boundaryGap\"), a = n.getAxis(); (i.boundaryGap = o, \"horizontal\" === a.orient) ? (o[0] = Gr(o[0], r.height), o[1] = Gr(o[1], r.height), dO(e, t, r.height - o[0] - o[1])) : (o[0] = Gr(o[0], r.width), o[1] = Gr(o[1], r.width), dO(e, t, r.width - o[0] - o[1])); e.setLayout(\"layoutInfo\", i) })) } function dO(t, e, n) { if (t.count()) for (var i, r = e.coordinateSystem, o = e.getLayerSeries(), a = t.mapDimension(\"single\"), s = t.mapDimension(\"value\"), l = z(o, (function (e) { return z(e.indices, (function (e) { var n = r.dataToPoint(t.get(a, e)); return n[1] = t.get(s, e), n })) })), u = function (t) { for (var e = t.length, n = t[0].length, i = [], r = [], o = 0, a = 0; a < n; ++a) { for (var s = 0, l = 0; l < e; ++l)s += t[l][a][1]; s > o && (o = s), i.push(s) } for (var u = 0; u < n; ++u)r[u] = (o - i[u]) / 2; o = 0; for (var h = 0; h < n; ++h) { var c = i[h] + r[h]; c > o && (o = c) } return { y0: r, max: o } }(l), h = u.y0, c = n / u.max, p = o.length, d = o[0].indices.length, f = 0; f < d; ++f) { i = h[f] * c, t.setItemLayout(o[0].indices[f], { layerIndex: 0, x: l[0][f][0], y0: i, y: l[0][f][1] * c }); for (var g = 1; g < p; ++g)i += l[g - 1][f][1] * c, t.setItemLayout(o[g].indices[f], { layerIndex: g, x: l[g][f][0], y0: i, y: l[g][f][1] * c }) } } var fO = function (t) { function e(e, n, i, r) { var o = t.call(this) || this; o.z2 = 2, o.textConfig = { inside: !0 }, js(o).seriesIndex = n.seriesIndex; var a = new Ns({ z2: 4, silent: e.getModel().get([\"label\", \"silent\"]) }); return o.setTextContent(a), o.updateData(!0, e, n, i, r), o } return n(e, t), e.prototype.updateData = function (t, e, n, i, r) { this.node = e, e.piece = this, n = n || this._seriesModel, i = i || this._ecModel; var o = this; js(o).dataIndex = e.dataIndex; var a = e.getModel(), s = a.getModel(\"emphasis\"), l = e.getLayout(), u = A({}, l); u.label = null; var h = e.getVisual(\"style\"); h.lineJoin = \"bevel\"; var c = e.getVisual(\"decal\"); c && (h.decal = sv(c, r)); var p = uM(a.getModel(\"itemStyle\"), u, !0); A(u, p), E(tl, (function (t) { var e = o.ensureState(t), n = a.getModel([t, \"itemStyle\"]); e.style = n.getItemStyle(); var i = uM(n, u); i && (e.shape = i) })), t ? (o.setShape(u), o.shape.r = l.r0, uh(o, { shape: { r: l.r } }, n, e.dataIndex)) : (uh(o, { shape: u }, n), gh(o)), o.useStyle(h), this._updateLabel(n); var d = a.getShallow(\"cursor\"); d && o.attr(\"cursor\", d), this._seriesModel = n || this._seriesModel, this._ecModel = i || this._ecModel; var f = s.get(\"focus\"); Bl(this, \"ancestor\" === f ? e.getAncestorsIndices() : \"descendant\" === f ? e.getDescendantIndices() : f, s.get(\"blurScope\"), s.get(\"disabled\")) }, e.prototype._updateLabel = function (t) { var e = this, n = this.node.getModel(), i = n.getModel(\"label\"), r = this.node.getLayout(), o = r.endAngle - r.startAngle, a = (r.startAngle + r.endAngle) / 2, s = Math.cos(a), l = Math.sin(a), u = this, h = u.getTextContent(), c = this.node.dataIndex, p = i.get(\"minAngle\") / 180 * Math.PI, d = i.get(\"show\") && !(null != p && Math.abs(o) < p); function f(t, e) { var n = t.get(e); return null == n ? i.get(e) : n } h.ignore = !d, E(el, (function (i) { var p = \"normal\" === i ? n.getModel(\"label\") : n.getModel([i, \"label\"]), d = \"normal\" === i, g = d ? h : h.ensureState(i), y = t.getFormattedLabel(c, i); d && (y = y || e.node.name), g.style = $h(p, {}, null, \"normal\" !== i, !0), y && (g.style.text = y); var v = p.get(\"show\"); null == v || d || (g.ignore = !v); var m, x = f(p, \"position\"), _ = d ? u : u.states[i], b = _.style.fill; _.textConfig = { outsideFill: \"inherit\" === p.get(\"color\") ? b : null, inside: \"outside\" !== x }; var w = f(p, \"distance\") || 0, S = f(p, \"align\"); \"outside\" === x ? (m = r.r + w, S = a > Math.PI / 2 ? \"right\" : \"left\") : S && \"center\" !== S ? \"left\" === S ? (m = r.r0 + w, a > Math.PI / 2 && (S = \"right\")) : \"right\" === S && (m = r.r - w, a > Math.PI / 2 && (S = \"left\")) : (m = o === 2 * Math.PI && 0 === r.r0 ? 0 : (r.r + r.r0) / 2, S = \"center\"), g.style.align = S, g.style.verticalAlign = f(p, \"verticalAlign\") || \"middle\", g.x = m * s + r.cx, g.y = m * l + r.cy; var M = f(p, \"rotate\"), I = 0; \"radial\" === M ? (I = -a) < -Math.PI / 2 && (I += Math.PI) : \"tangential\" === M ? (I = Math.PI / 2 - a) > Math.PI / 2 ? I -= Math.PI : I < -Math.PI / 2 && (I += Math.PI) : j(M) && (I = M * Math.PI / 180), g.rotation = I })), h.dirtyStyle() }, e }(Pu), gO = \"sunburstRootToNode\", yO = \"sunburstHighlight\"; var vO = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n, i) { var r = this; this.seriesModel = t, this.api = n, this.ecModel = e; var o = t.getData(), a = o.tree.root, s = t.getViewRoot(), l = this.group, u = t.get(\"renderLabelForZeroData\"), h = []; s.eachNode((function (t) { h.push(t) })); var c = this._oldChildren || []; !function (i, r) { if (0 === i.length && 0 === r.length) return; function s(t) { return t.getId() } function h(s, h) { !function (i, r) { u || !i || i.getValue() || (i = null); if (i !== a && r !== a) if (r && r.piece) i ? (r.piece.updateData(!1, i, t, e, n), o.setItemGraphicEl(i.dataIndex, r.piece)) : function (t) { if (!t) return; t.piece && (l.remove(t.piece), t.piece = null) }(r); else if (i) { var s = new fO(i, t, e, n); l.add(s), o.setItemGraphicEl(i.dataIndex, s) } }(null == s ? null : i[s], null == h ? null : r[h]) } new Dm(r, i, s, s).add(h).update(h).remove(H(h, null)).execute() }(h, c), function (i, o) { o.depth > 0 ? (r.virtualPiece ? r.virtualPiece.updateData(!1, i, t, e, n) : (r.virtualPiece = new fO(i, t, e, n), l.add(r.virtualPiece)), o.piece.off(\"click\"), r.virtualPiece.on(\"click\", (function (t) { r._rootToNode(o.parentNode) }))) : r.virtualPiece && (l.remove(r.virtualPiece), r.virtualPiece = null) }(a, s), this._initEvents(), this._oldChildren = h }, e.prototype._initEvents = function () { var t = this; this.group.off(\"click\"), this.group.on(\"click\", (function (e) { var n = !1; t.seriesModel.getViewRoot().eachNode((function (i) { if (!n && i.piece && i.piece === e.target) { var r = i.getModel().get(\"nodeClick\"); if (\"rootToNode\" === r) t._rootToNode(i); else if (\"link\" === r) { var o = i.getModel(), a = o.get(\"link\"); if (a) yp(a, o.get(\"target\", !0) || \"_blank\") } n = !0 } })) })) }, e.prototype._rootToNode = function (t) { t !== this.seriesModel.getViewRoot() && this.api.dispatchAction({ type: gO, from: this.uid, seriesId: this.seriesModel.id, targetNode: t }) }, e.prototype.containPoint = function (t, e) { var n = e.getData().getItemLayout(0); if (n) { var i = t[0] - n.cx, r = t[1] - n.cy, o = Math.sqrt(i * i + r * r); return o <= n.r && o >= n.r0 } }, e.type = \"sunburst\", e }(wg), mO = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.ignoreStyleOnData = !0, n } return n(e, t), e.prototype.getInitialData = function (t, e) { var n = { name: t.name, children: t.data }; xO(n); var i = this._levelModels = z(t.levels || [], (function (t) { return new xc(t, this, e) }), this), r = OC.createTree(n, this, (function (t) { t.wrapMethod(\"getItemModel\", (function (t, e) { var n = r.getNodeByDataIndex(e), o = i[n.depth]; return o && (t.parentModel = o), t })) })); return r.data }, e.prototype.optionUpdated = function () { this.resetViewRoot() }, e.prototype.getDataParams = function (e) { var n = t.prototype.getDataParams.apply(this, arguments), i = this.getData().tree.getNodeByDataIndex(e); return n.treePathInfo = zC(i, this), n }, e.prototype.getLevelModel = function (t) { return this._levelModels && this._levelModels[t.depth] }, e.prototype.getViewRoot = function () { return this._viewRoot }, e.prototype.resetViewRoot = function (t) { t ? this._viewRoot = t : t = this._viewRoot; var e = this.getRawData().tree.root; t && (t === e || e.contains(t)) || (this._viewRoot = e) }, e.prototype.enableAriaDecal = function () { HC(this) }, e.type = \"series.sunburst\", e.defaultOption = { z: 2, center: [\"50%\", \"50%\"], radius: [0, \"75%\"], clockwise: !0, startAngle: 90, minAngle: 0, stillShowZeroSum: !0, nodeClick: \"rootToNode\", renderLabelForZeroData: !1, label: { rotate: \"radial\", show: !0, opacity: 1, align: \"center\", position: \"inside\", distance: 5, silent: !0 }, itemStyle: { borderWidth: 1, borderColor: \"white\", borderType: \"solid\", shadowBlur: 0, shadowColor: \"rgba(0, 0, 0, 0.2)\", shadowOffsetX: 0, shadowOffsetY: 0, opacity: 1 }, emphasis: { focus: \"descendant\" }, blur: { itemStyle: { opacity: .2 }, label: { opacity: .1 } }, animationType: \"expansion\", animationDuration: 1e3, animationDurationUpdate: 500, data: [], sort: \"desc\" }, e }(hg); function xO(t) { var e = 0; E(t.children, (function (t) { xO(t); var n = t.value; Y(n) && (n = n[0]), e += n })); var n = t.value; Y(n) && (n = n[0]), (null == n || isNaN(n)) && (n = e), n < 0 && (n = 0), Y(t.value) ? t.value[0] = n : t.value = n } var _O = Math.PI / 180; function bO(t, e, n) { e.eachSeriesByType(t, (function (t) { var e = t.get(\"center\"), i = t.get(\"radius\"); Y(i) || (i = [0, i]), Y(e) || (e = [e, e]); var r = n.getWidth(), o = n.getHeight(), a = Math.min(r, o), s = Gr(e[0], r), l = Gr(e[1], o), u = Gr(i[0], a / 2), h = Gr(i[1], a / 2), c = -t.get(\"startAngle\") * _O, p = t.get(\"minAngle\") * _O, d = t.getData().tree.root, f = t.getViewRoot(), g = f.depth, y = t.get(\"sort\"); null != y && wO(f, y); var v = 0; E(f.children, (function (t) { !isNaN(t.getValue()) && v++ })); var m = f.getValue(), x = Math.PI / (m || v) * 2, _ = f.depth > 0, b = f.height - (_ ? -1 : 1), w = (h - u) / (b || 1), S = t.get(\"clockwise\"), M = t.get(\"stillShowZeroSum\"), I = S ? 1 : -1, T = function (e, n) { if (e) { var i = n; if (e !== d) { var r = e.getValue(), o = 0 === m && M ? x : r * x; o < p && (o = p), i = n + I * o; var h = e.depth - g - (_ ? -1 : 1), c = u + w * h, f = u + w * (h + 1), y = t.getLevelModel(e); if (y) { var v = y.get(\"r0\", !0), b = y.get(\"r\", !0), C = y.get(\"radius\", !0); null != C && (v = C[0], b = C[1]), null != v && (c = Gr(v, a / 2)), null != b && (f = Gr(b, a / 2)) } e.setLayout({ angle: o, startAngle: n, endAngle: i, clockwise: S, cx: s, cy: l, r0: c, r: f }) } if (e.children && e.children.length) { var D = 0; E(e.children, (function (t) { D += T(t, n + D) })) } return i - n } }; if (_) { var C = u, D = u + w, A = 2 * Math.PI; d.setLayout({ angle: A, startAngle: c, endAngle: c + A, clockwise: S, cx: s, cy: l, r0: C, r: D }) } T(f, c) })) } function wO(t, e) { var n = t.children || []; t.children = function (t, e) { if (U(e)) { var n = z(t, (function (t, e) { var n = t.getValue(); return { params: { depth: t.depth, height: t.height, dataIndex: t.dataIndex, getValue: function () { return n } }, index: e } })); return n.sort((function (t, n) { return e(t.params, n.params) })), z(n, (function (e) { return t[e.index] })) } var i = \"asc\" === e; return t.sort((function (t, e) { var n = (t.getValue() - e.getValue()) * (i ? 1 : -1); return 0 === n ? (t.dataIndex - e.dataIndex) * (i ? -1 : 1) : n })) }(n, e), n.length && E(t.children, (function (t) { wO(t, e) })) } function SO(t) { var e = {}; t.eachSeriesByType(\"sunburst\", (function (t) { var n = t.getData(), i = n.tree; i.eachNode((function (r) { var o = r.getModel().getModel(\"itemStyle\").getItemStyle(); o.fill || (o.fill = function (t, n, i) { for (var r = t; r && r.depth > 1;)r = r.parentNode; var o = n.getColorFromPalette(r.name || r.dataIndex + \"\", e); return t.depth > 1 && X(o) && (o = jn(o, (t.depth - 1) / (i - 1) * .5)), o }(r, t, i.root.height)), A(n.ensureUniqueItemVisual(r.dataIndex, \"style\"), o) })) })) } var MO = { color: \"fill\", borderColor: \"stroke\" }, IO = { symbol: 1, symbolSize: 1, symbolKeepAspect: 1, legendIcon: 1, visualMeta: 1, liftZ: 1, decal: 1 }, TO = Do(), CO = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.optionUpdated = function () { this.currentZLevel = this.get(\"zlevel\", !0), this.currentZ = this.get(\"z\", !0) }, e.prototype.getInitialData = function (t, e) { return sx(null, this) }, e.prototype.getDataParams = function (e, n, i) { var r = t.prototype.getDataParams.call(this, e, n); return i && (r.info = TO(i).info), r }, e.type = \"series.custom\", e.dependencies = [\"grid\", \"polar\", \"geo\", \"singleAxis\", \"calendar\"], e.defaultOption = { coordinateSystem: \"cartesian2d\", z: 2, legendHoverLink: !0, clip: !1 }, e }(hg); function DO(t, e) { return e = e || [0, 0], z([\"x\", \"y\"], (function (n, i) { var r = this.getAxis(n), o = e[i], a = t[i] / 2; return \"category\" === r.type ? r.getBandWidth() : Math.abs(r.dataToCoord(o - a) - r.dataToCoord(o + a)) }), this) } function AO(t, e) { return e = e || [0, 0], z([0, 1], (function (n) { var i = e[n], r = t[n] / 2, o = [], a = []; return o[n] = i - r, a[n] = i + r, o[1 - n] = a[1 - n] = e[1 - n], Math.abs(this.dataToPoint(o)[n] - this.dataToPoint(a)[n]) }), this) } function kO(t, e) { var n = this.getAxis(), i = e instanceof Array ? e[0] : e, r = (t instanceof Array ? t[0] : t) / 2; return \"category\" === n.type ? n.getBandWidth() : Math.abs(n.dataToCoord(i - r) - n.dataToCoord(i + r)) } function LO(t, e) { return e = e || [0, 0], z([\"Radius\", \"Angle\"], (function (n, i) { var r = this[\"get\" + n + \"Axis\"](), o = e[i], a = t[i] / 2, s = \"category\" === r.type ? r.getBandWidth() : Math.abs(r.dataToCoord(o - a) - r.dataToCoord(o + a)); return \"Angle\" === n && (s = s * Math.PI / 180), s }), this) } function PO(t, e, n, i) { return t && (t.legacy || !1 !== t.legacy && !n && !i && \"tspan\" !== e && (\"text\" === e || mt(t, \"text\"))) } function OO(t, e, n) { var i, r, o, a = t; if (\"text\" === e) o = a; else { o = {}, mt(a, \"text\") && (o.text = a.text), mt(a, \"rich\") && (o.rich = a.rich), mt(a, \"textFill\") && (o.fill = a.textFill), mt(a, \"textStroke\") && (o.stroke = a.textStroke), mt(a, \"fontFamily\") && (o.fontFamily = a.fontFamily), mt(a, \"fontSize\") && (o.fontSize = a.fontSize), mt(a, \"fontStyle\") && (o.fontStyle = a.fontStyle), mt(a, \"fontWeight\") && (o.fontWeight = a.fontWeight), r = { type: \"text\", style: o, silent: !0 }, i = {}; var s = mt(a, \"textPosition\"); n ? i.position = s ? a.textPosition : \"inside\" : s && (i.position = a.textPosition), mt(a, \"textPosition\") && (i.position = a.textPosition), mt(a, \"textOffset\") && (i.offset = a.textOffset), mt(a, \"textRotation\") && (i.rotation = a.textRotation), mt(a, \"textDistance\") && (i.distance = a.textDistance) } return RO(o, t), E(o.rich, (function (t) { RO(t, t) })), { textConfig: i, textContent: r } } function RO(t, e) { e && (e.font = e.textFont || e.font, mt(e, \"textStrokeWidth\") && (t.lineWidth = e.textStrokeWidth), mt(e, \"textAlign\") && (t.align = e.textAlign), mt(e, \"textVerticalAlign\") && (t.verticalAlign = e.textVerticalAlign), mt(e, \"textLineHeight\") && (t.lineHeight = e.textLineHeight), mt(e, \"textWidth\") && (t.width = e.textWidth), mt(e, \"textHeight\") && (t.height = e.textHeight), mt(e, \"textBackgroundColor\") && (t.backgroundColor = e.textBackgroundColor), mt(e, \"textPadding\") && (t.padding = e.textPadding), mt(e, \"textBorderColor\") && (t.borderColor = e.textBorderColor), mt(e, \"textBorderWidth\") && (t.borderWidth = e.textBorderWidth), mt(e, \"textBorderRadius\") && (t.borderRadius = e.textBorderRadius), mt(e, \"textBoxShadowColor\") && (t.shadowColor = e.textBoxShadowColor), mt(e, \"textBoxShadowBlur\") && (t.shadowBlur = e.textBoxShadowBlur), mt(e, \"textBoxShadowOffsetX\") && (t.shadowOffsetX = e.textBoxShadowOffsetX), mt(e, \"textBoxShadowOffsetY\") && (t.shadowOffsetY = e.textBoxShadowOffsetY)) } function NO(t, e, n) { var i = t; i.textPosition = i.textPosition || n.position || \"inside\", null != n.offset && (i.textOffset = n.offset), null != n.rotation && (i.textRotation = n.rotation), null != n.distance && (i.textDistance = n.distance); var r = i.textPosition.indexOf(\"inside\") >= 0, o = t.fill || \"#000\"; EO(i, e); var a = null == i.textFill; return r ? a && (i.textFill = n.insideFill || \"#fff\", !i.textStroke && n.insideStroke && (i.textStroke = n.insideStroke), !i.textStroke && (i.textStroke = o), null == i.textStrokeWidth && (i.textStrokeWidth = 2)) : (a && (i.textFill = t.fill || n.outsideFill || \"#000\"), !i.textStroke && n.outsideStroke && (i.textStroke = n.outsideStroke)), i.text = e.text, i.rich = e.rich, E(e.rich, (function (t) { EO(t, t) })), i } function EO(t, e) { e && (mt(e, \"fill\") && (t.textFill = e.fill), mt(e, \"stroke\") && (t.textStroke = e.fill), mt(e, \"lineWidth\") && (t.textStrokeWidth = e.lineWidth), mt(e, \"font\") && (t.font = e.font), mt(e, \"fontStyle\") && (t.fontStyle = e.fontStyle), mt(e, \"fontWeight\") && (t.fontWeight = e.fontWeight), mt(e, \"fontSize\") && (t.fontSize = e.fontSize), mt(e, \"fontFamily\") && (t.fontFamily = e.fontFamily), mt(e, \"align\") && (t.textAlign = e.align), mt(e, \"verticalAlign\") && (t.textVerticalAlign = e.verticalAlign), mt(e, \"lineHeight\") && (t.textLineHeight = e.lineHeight), mt(e, \"width\") && (t.textWidth = e.width), mt(e, \"height\") && (t.textHeight = e.height), mt(e, \"backgroundColor\") && (t.textBackgroundColor = e.backgroundColor), mt(e, \"padding\") && (t.textPadding = e.padding), mt(e, \"borderColor\") && (t.textBorderColor = e.borderColor), mt(e, \"borderWidth\") && (t.textBorderWidth = e.borderWidth), mt(e, \"borderRadius\") && (t.textBorderRadius = e.borderRadius), mt(e, \"shadowColor\") && (t.textBoxShadowColor = e.shadowColor), mt(e, \"shadowBlur\") && (t.textBoxShadowBlur = e.shadowBlur), mt(e, \"shadowOffsetX\") && (t.textBoxShadowOffsetX = e.shadowOffsetX), mt(e, \"shadowOffsetY\") && (t.textBoxShadowOffsetY = e.shadowOffsetY), mt(e, \"textShadowColor\") && (t.textShadowColor = e.textShadowColor), mt(e, \"textShadowBlur\") && (t.textShadowBlur = e.textShadowBlur), mt(e, \"textShadowOffsetX\") && (t.textShadowOffsetX = e.textShadowOffsetX), mt(e, \"textShadowOffsetY\") && (t.textShadowOffsetY = e.textShadowOffsetY)) } var zO = { position: [\"x\", \"y\"], scale: [\"scaleX\", \"scaleY\"], origin: [\"originX\", \"originY\"] }, VO = G(zO), BO = (V(cr, (function (t, e) { return t[e] = 1, t }), {}), cr.join(\", \"), [\"\", \"style\", \"shape\", \"extra\"]), FO = Do(); function GO(t, e, n, i, r) { var o = t + \"Animation\", a = sh(t, i, r) || {}, s = FO(e).userDuring; return a.duration > 0 && (a.during = s ? W(jO, { el: e, userDuring: s }) : null, a.setToFinal = !0, a.scope = t), A(a, n[o]), a } function WO(t, e, n, i) { var r = (i = i || {}).dataIndex, o = i.isInit, a = i.clearStyle, s = n.isAnimationEnabled(), l = FO(t), u = e.style; l.userDuring = e.during; var h = {}, c = {}; if (function (t, e, n) { for (var i = 0; i < VO.length; i++) { var r = VO[i], o = zO[r], a = e[r]; a && (n[o[0]] = a[0], n[o[1]] = a[1]) } for (i = 0; i < cr.length; i++) { var s = cr[i]; null != e[s] && (n[s] = e[s]) } }(0, e, c), KO(\"shape\", e, c), KO(\"extra\", e, c), !o && s && (function (t, e, n) { for (var i = e.transition, r = UO(i) ? cr : yo(i || []), o = 0; o < r.length; o++) { var a = r[o]; if (\"style\" !== a && \"shape\" !== a && \"extra\" !== a) { var s = t[a]; 0, n[a] = s } } }(t, e, h), qO(\"shape\", t, e, h), qO(\"extra\", t, e, h), function (t, e, n, i) { if (!n) return; var r, o = t.style; if (o) { var a = n.transition, s = e.transition; if (a && !UO(a)) { var l = yo(a); !r && (r = i.style = {}); for (var u = 0; u < l.length; u++) { var h = o[f = l[u]]; r[f] = h } } else if (t.getAnimationStyleProps && (UO(s) || UO(a) || P(s, \"style\") >= 0)) { var c = t.getAnimationStyleProps(), p = c ? c.style : null; if (p) { !r && (r = i.style = {}); var d = G(n); for (u = 0; u < d.length; u++) { var f; if (p[f = d[u]]) { h = o[f]; r[f] = h } } } } } }(t, e, u, h)), c.style = u, function (t, e, n) { var i = e.style; if (!t.isGroup && i) { if (n) { t.useStyle({}); for (var r = t.animators, o = 0; o < r.length; o++) { var a = r[o]; \"style\" === a.targetName && a.changeTarget(t.style) } } t.setStyle(i) } e && (e.style = null, e && t.attr(e), e.style = i) }(t, c, a), function (t, e) { mt(e, \"silent\") && (t.silent = e.silent), mt(e, \"ignore\") && (t.ignore = e.ignore), t instanceof ma && mt(e, \"invisible\") && (t.invisible = e.invisible); t instanceof _s && mt(e, \"autoBatch\") && (t.autoBatch = e.autoBatch) }(t, e), s) if (o) { var p = {}; E(BO, (function (t) { var n = t ? e[t] : e; n && n.enterFrom && (t && (p[t] = p[t] || {}), A(t ? p[t] : p, n.enterFrom)) })); var d = GO(\"enter\", t, e, n, r); d.duration > 0 && t.animateFrom(p, d) } else !function (t, e, n, i, r) { if (r) { var o = GO(\"update\", t, e, i, n); o.duration > 0 && t.animateFrom(r, o) } }(t, e, r || 0, n, h); HO(t, e), u ? t.dirty() : t.markRedraw() } function HO(t, e) { for (var n = FO(t).leaveToProps, i = 0; i < BO.length; i++) { var r = BO[i], o = r ? e[r] : e; o && o.leaveTo && (n || (n = FO(t).leaveToProps = {}), r && (n[r] = n[r] || {}), A(r ? n[r] : n, o.leaveTo)) } } function YO(t, e, n, i) { if (t) { var r = t.parent, o = FO(t).leaveToProps; if (o) { var a = GO(\"update\", t, e, n, 0); a.done = function () { r.remove(t), i && i() }, t.animateTo(o, a) } else r.remove(t), i && i() } } function UO(t) { return \"all\" === t } var XO = {}, ZO = { setTransform: function (t, e) { return XO.el[t] = e, this }, getTransform: function (t) { return XO.el[t] }, setShape: function (t, e) { var n = XO.el; return (n.shape || (n.shape = {}))[t] = e, n.dirtyShape && n.dirtyShape(), this }, getShape: function (t) { var e = XO.el.shape; if (e) return e[t] }, setStyle: function (t, e) { var n = XO.el, i = n.style; return i && (i[t] = e, n.dirtyStyle && n.dirtyStyle()), this }, getStyle: function (t) { var e = XO.el.style; if (e) return e[t] }, setExtra: function (t, e) { return (XO.el.extra || (XO.el.extra = {}))[t] = e, this }, getExtra: function (t) { var e = XO.el.extra; if (e) return e[t] } }; function jO() { var t = this, e = t.el; if (e) { var n = FO(e).userDuring, i = t.userDuring; n === i ? (XO.el = e, i(ZO)) : t.el = t.userDuring = null } } function qO(t, e, n, i) { var r = n[t]; if (r) { var o, a = e[t]; if (a) { var s = n.transition, l = r.transition; if (l) if (!o && (o = i[t] = {}), UO(l)) A(o, a); else for (var u = yo(l), h = 0; h < u.length; h++) { var c = a[d = u[h]]; o[d] = c } else if (UO(s) || P(s, t) >= 0) { !o && (o = i[t] = {}); var p = G(a); for (h = 0; h < p.length; h++) { var d; c = a[d = p[h]]; $O(r[d], c) && (o[d] = c) } } } } } function KO(t, e, n) { var i = e[t]; if (i) for (var r = n[t] = {}, o = G(i), a = 0; a < o.length; a++) { var s = o[a]; r[s] = Ii(i[s]) } } function $O(t, e) { return N(t) ? t !== e : null != t && isFinite(t) } var JO = Do(), QO = [\"percent\", \"easing\", \"shape\", \"style\", \"extra\"]; function tR(t) { t.stopAnimation(\"keyframe\"), t.attr(JO(t)) } function eR(t, e, n) { if (n.isAnimationEnabled() && e) if (Y(e)) E(e, (function (e) { eR(t, e, n) })); else { var i = e.keyframes, r = e.duration; if (n && null == r) { var o = sh(\"enter\", n, 0); r = o && o.duration } if (i && r) { var a = JO(t); E(BO, (function (n) { if (!n || t[n]) { var o; i.sort((function (t, e) { return t.percent - e.percent })), E(i, (function (i) { var s = t.animators, l = n ? i[n] : i; if (l) { var u = G(l); if (n || (u = B(u, (function (t) { return P(QO, t) < 0 }))), u.length) { o || ((o = t.animate(n, e.loop, !0)).scope = \"keyframe\"); for (var h = 0; h < s.length; h++)s[h] !== o && s[h].targetName === o.targetName && s[h].stopTracks(u); n && (a[n] = a[n] || {}); var c = n ? a[n] : a; E(u, (function (e) { c[e] = ((n ? t[n] : t) || {})[e] })), o.whenWithKeys(r * i.percent, l, u, i.easing) } } })), o && o.delay(e.delay || 0).duration(r).start(e.easing) } })) } } } var nR = \"emphasis\", iR = \"normal\", rR = \"blur\", oR = \"select\", aR = [iR, nR, rR, oR], sR = { normal: [\"itemStyle\"], emphasis: [nR, \"itemStyle\"], blur: [rR, \"itemStyle\"], select: [oR, \"itemStyle\"] }, lR = { normal: [\"label\"], emphasis: [nR, \"label\"], blur: [rR, \"label\"], select: [oR, \"label\"] }, uR = [\"x\", \"y\"], hR = { normal: {}, emphasis: {}, blur: {}, select: {} }, cR = { cartesian2d: function (t) { var e = t.master.getRect(); return { coordSys: { type: \"cartesian2d\", x: e.x, y: e.y, width: e.width, height: e.height }, api: { coord: function (e) { return t.dataToPoint(e) }, size: W(DO, t) } } }, geo: function (t) { var e = t.getBoundingRect(); return { coordSys: { type: \"geo\", x: e.x, y: e.y, width: e.width, height: e.height, zoom: t.getZoom() }, api: { coord: function (e) { return t.dataToPoint(e) }, size: W(AO, t) } } }, single: function (t) { var e = t.getRect(); return { coordSys: { type: \"singleAxis\", x: e.x, y: e.y, width: e.width, height: e.height }, api: { coord: function (e) { return t.dataToPoint(e) }, size: W(kO, t) } } }, polar: function (t) { var e = t.getRadiusAxis(), n = t.getAngleAxis(), i = e.getExtent(); return i[0] > i[1] && i.reverse(), { coordSys: { type: \"polar\", cx: t.cx, cy: t.cy, r: i[1], r0: i[0] }, api: { coord: function (i) { var r = e.dataToRadius(i[0]), o = n.dataToAngle(i[1]), a = t.coordToPoint([r, o]); return a.push(r, o * Math.PI / 180), a }, size: W(LO, t) } } }, calendar: function (t) { var e = t.getRect(), n = t.getRangeInfo(); return { coordSys: { type: \"calendar\", x: e.x, y: e.y, width: e.width, height: e.height, cellWidth: t.getCellWidth(), cellHeight: t.getCellHeight(), rangeInfo: { start: n.start, end: n.end, weeks: n.weeks, dayCount: n.allDay } }, api: { coord: function (e, n) { return t.dataToPoint(e, n) } } } } }; function pR(t) { return t instanceof _s } function dR(t) { return t instanceof ma } var fR = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n, i) { this._progressiveEls = null; var r = this._data, o = t.getData(), a = this.group, s = xR(t, o, e, n); r || a.removeAll(), o.diff(r).add((function (e) { bR(n, null, e, s(e, i), t, a, o) })).remove((function (e) { var n = r.getItemGraphicEl(e); n && YO(n, TO(n).option, t) })).update((function (e, l) { var u = r.getItemGraphicEl(l); bR(n, u, e, s(e, i), t, a, o) })).execute(); var l = t.get(\"clip\", !0) ? cS(t.coordinateSystem, !1, t) : null; l ? a.setClipPath(l) : a.removeClipPath(), this._data = o }, e.prototype.incrementalPrepareRender = function (t, e, n) { this.group.removeAll(), this._data = null }, e.prototype.incrementalRender = function (t, e, n, i, r) { var o = e.getData(), a = xR(e, o, n, i), s = this._progressiveEls = []; function l(t) { t.isGroup || (t.incremental = !0, t.ensureState(\"emphasis\").hoverLayer = !0) } for (var u = t.start; u < t.end; u++) { var h = bR(null, null, u, a(u, r), e, this.group, o); h && (h.traverse(l), s.push(h)) } }, e.prototype.eachRendered = function (t) { Yh(this._progressiveEls || this.group, t) }, e.prototype.filterForExposedEvent = function (t, e, n, i) { var r = e.element; if (null == r || n.name === r) return !0; for (; (n = n.__hostTarget || n.parent) && n !== this.group;)if (n.name === r) return !0; return !1 }, e.type = \"custom\", e }(wg); function gR(t) { var e, n = t.type; if (\"path\" === n) { var i = t.shape, r = null != i.width && null != i.height ? { x: i.x || 0, y: i.y || 0, width: i.width, height: i.height } : null, o = LR(i); e = Mh(o, null, r, i.layout || \"center\"), TO(e).customPathData = o } else if (\"image\" === n) e = new Is({}), TO(e).customImagePath = t.style.image; else if (\"text\" === n) e = new Ns({}); else if (\"group\" === n) e = new Pr; else { if (\"compoundPath\" === n) throw new Error('\"compoundPath\" is not supported yet.'); var a = Sh(n); if (!a) { var s = \"\"; 0, co(s) } e = new a } return TO(e).customGraphicType = n, e.name = t.name, e.z2EmphasisLift = 1, e.z2SelectLift = 1, e } function yR(t, e, n, i, r, o, a) { tR(e); var s = r && r.normal.cfg; s && e.setTextConfig(s), i && null == i.transition && (i.transition = uR); var l = i && i.style; if (l) { if (\"text\" === e.type) { var u = l; mt(u, \"textFill\") && (u.fill = u.textFill), mt(u, \"textStroke\") && (u.stroke = u.textStroke) } var h = void 0, c = pR(e) ? l.decal : null; t && c && (c.dirty = !0, h = sv(c, t)), l.__decalPattern = h } dR(e) && (l && (h = l.__decalPattern) && (l.decal = h)); WO(e, i, o, { dataIndex: n, isInit: a, clearStyle: !0 }), eR(e, i.keyframeAnimation, o) } function vR(t, e, n, i, r) { var o = e.isGroup ? null : e, a = r && r[t].cfg; if (o) { var s = o.ensureState(t); if (!1 === i) { var l = o.getState(t); l && (l.style = null) } else s.style = i || null; a && (s.textConfig = a), wl(o) } } function mR(t, e, n) { var i = n === iR, r = i ? e : IR(e, n), o = r ? r.z2 : null; null != o && ((i ? t : t.ensureState(n)).z2 = o || 0) } function xR(t, e, n, i) { var r = t.get(\"renderItem\"), o = t.coordinateSystem, a = {}; o && (a = o.prepareCustoms ? o.prepareCustoms(o) : cR[o.type](o)); for (var s, l, u = k({ getWidth: i.getWidth, getHeight: i.getHeight, getZr: i.getZr, getDevicePixelRatio: i.getDevicePixelRatio, value: function (t, n) { return null == n && (n = s), e.getStore().get(e.getDimensionIndex(t || 0), n) }, style: function (n, i) { 0; null == i && (i = s); var r = e.getItemVisual(i, \"style\"), o = r && r.fill, a = r && r.opacity, l = m(i, iR).getItemStyle(); null != o && (l.fill = o), null != a && (l.opacity = a); var u = { inheritColor: X(o) ? o : \"#000\" }, h = x(i, iR), c = $h(h, null, u, !1, !0); c.text = h.getShallow(\"show\") ? rt(t.getFormattedLabel(i, iR), Uw(e, i)) : null; var p = Jh(h, u, !1); return b(n, l), l = NO(l, c, p), n && _(l, n), l.legacy = !0, l }, ordinalRawValue: function (t, n) { null == n && (n = s), t = t || 0; var i = e.getDimensionInfo(t); if (!i) { var r = e.getDimensionIndex(t); return r >= 0 ? e.getStore().get(r, n) : void 0 } var o = e.get(i.name, n), a = i && i.ordinalMeta; return a ? a.categories[o] : o }, styleEmphasis: function (n, i) { 0; null == i && (i = s); var r = m(i, nR).getItemStyle(), o = x(i, nR), a = $h(o, null, null, !0, !0); a.text = o.getShallow(\"show\") ? ot(t.getFormattedLabel(i, nR), t.getFormattedLabel(i, iR), Uw(e, i)) : null; var l = Jh(o, null, !0); return b(n, r), r = NO(r, a, l), n && _(r, n), r.legacy = !0, r }, visual: function (t, n) { if (null == n && (n = s), mt(MO, t)) { var i = e.getItemVisual(n, \"style\"); return i ? i[MO[t]] : null } if (mt(IO, t)) return e.getItemVisual(n, t) }, barLayout: function (t) { if (\"cartesian2d\" === o.type) { return function (t) { var e = [], n = t.axis, i = \"axis0\"; if (\"category\" === n.type) { for (var r = n.getBandWidth(), o = 0; o < t.count; o++)e.push(k({ bandWidth: r, axisKey: i, stackId: Cx + o }, t)); var a = Px(e), s = []; for (o = 0; o < t.count; o++) { var l = a.axis0[Cx + o]; l.offsetCenter = l.offset + l.width / 2, s.push(l) } return s } }(k({ axis: o.getBaseAxis() }, t)) } }, currentSeriesIndices: function () { return n.getCurrentSeriesIndices() }, font: function (t) { return ic(t, n) } }, a.api || {}), h = { context: {}, seriesId: t.id, seriesName: t.name, seriesIndex: t.seriesIndex, coordSys: a.coordSys, dataInsideLength: e.count(), encode: _R(t.getData()) }, c = {}, p = {}, d = {}, f = {}, g = 0; g < aR.length; g++) { var y = aR[g]; d[y] = t.getModel(sR[y]), f[y] = t.getModel(lR[y]) } function v(t) { return t === s ? l || (l = e.getItemModel(t)) : e.getItemModel(t) } function m(t, n) { return e.hasItemOption ? t === s ? c[n] || (c[n] = v(t).getModel(sR[n])) : v(t).getModel(sR[n]) : d[n] } function x(t, n) { return e.hasItemOption ? t === s ? p[n] || (p[n] = v(t).getModel(lR[n])) : v(t).getModel(lR[n]) : f[n] } return function (t, n) { return s = t, l = null, c = {}, p = {}, r && r(k({ dataIndexInside: t, dataIndex: e.getRawIndex(t), actionType: n ? n.type : null }, h), u) }; function _(t, e) { for (var n in e) mt(e, n) && (t[n] = e[n]) } function b(t, e) { t && (t.textFill && (e.textFill = t.textFill), t.textPosition && (e.textPosition = t.textPosition)) } } function _R(t) { var e = {}; return E(t.dimensions, (function (n) { var i = t.getDimensionInfo(n); if (!i.isExtraCoord) { var r = i.coordDim; (e[r] = e[r] || [])[i.coordDimIndex] = t.getDimensionIndex(n) } })), e } function bR(t, e, n, i, r, o, a) { if (i) { var s = wR(t, e, n, i, r, o); return s && a.setItemGraphicEl(n, s), s && Bl(s, i.focus, i.blurScope, i.emphasisDisabled), s } o.remove(e) } function wR(t, e, n, i, r, o) { var a = -1, s = e; e && SR(e, i, r) && (a = P(o.childrenRef(), e), e = null); var l, u, h = !e, c = e; c ? c.clearStates() : (c = gR(i), s && (l = s, (u = c).copyTransform(l), dR(u) && dR(l) && (u.setStyle(l.style), u.z = l.z, u.z2 = l.z2, u.zlevel = l.zlevel, u.invisible = l.invisible, u.ignore = l.ignore, pR(u) && pR(l) && u.setShape(l.shape)))), !1 === i.morph ? c.disableMorphing = !0 : c.disableMorphing && (c.disableMorphing = !1), hR.normal.cfg = hR.normal.conOpt = hR.emphasis.cfg = hR.emphasis.conOpt = hR.blur.cfg = hR.blur.conOpt = hR.select.cfg = hR.select.conOpt = null, hR.isLegacy = !1, function (t, e, n, i, r, o) { if (t.isGroup) return; MR(n, null, o), MR(n, nR, o); var a = o.normal.conOpt, s = o.emphasis.conOpt, l = o.blur.conOpt, u = o.select.conOpt; if (null != a || null != s || null != u || null != l) { var h = t.getTextContent(); if (!1 === a) h && t.removeTextContent(); else { a = o.normal.conOpt = a || { type: \"text\" }, h ? h.clearStates() : (h = gR(a), t.setTextContent(h)), yR(null, h, e, a, null, i, r); for (var c = a && a.style, p = 0; p < aR.length; p++) { var d = aR[p]; if (d !== iR) { var f = o[d].conOpt; vR(d, h, 0, TR(a, f, d), null) } } c ? h.dirty() : h.markRedraw() } } }(c, n, i, r, h, hR), function (t, e, n, i, r) { var o = n.clipPath; if (!1 === o) t && t.getClipPath() && t.removeClipPath(); else if (o) { var a = t.getClipPath(); a && SR(a, o, i) && (a = null), a || (a = gR(o), t.setClipPath(a)), yR(null, a, e, o, null, i, r) } }(c, n, i, r, h), yR(t, c, n, i, hR, r, h), mt(i, \"info\") && (TO(c).info = i.info); for (var p = 0; p < aR.length; p++) { var d = aR[p]; if (d !== iR) { var f = IR(i, d); vR(d, c, 0, TR(i, f, d), hR) } } return function (t, e, n) { if (!t.isGroup) { var i = t, r = n.currentZ, o = n.currentZLevel; i.z = r, i.zlevel = o; var a = e.z2; null != a && (i.z2 = a || 0); for (var s = 0; s < aR.length; s++)mR(i, e, aR[s]) } }(c, i, r), \"group\" === i.type && function (t, e, n, i, r) { var o = i.children, a = o ? o.length : 0, s = i.$mergeChildren, l = \"byName\" === s || i.diffChildrenByName, u = !1 === s; if (!a && !l && !u) return; if (l) return h = { api: t, oldChildren: e.children() || [], newChildren: o || [], dataIndex: n, seriesModel: r, group: e }, void new Dm(h.oldChildren, h.newChildren, DR, DR, h).add(AR).update(AR).remove(kR).execute(); var h; u && e.removeAll(); for (var c = 0; c < a; c++) { var p = o[c], d = e.childAt(c); p ? (null == p.ignore && (p.ignore = !1), wR(t, d, n, p, r, e)) : d.ignore = !0 } for (var f = e.childCount() - 1; f >= c; f--) { var g = e.childAt(f); CR(e, g, r) } }(t, c, n, i, r), a >= 0 ? o.replaceAt(c, a) : o.add(c), c } function SR(t, e, n) { var i, r = TO(t), o = e.type, a = e.shape, s = e.style; return n.isUniversalTransitionEnabled() || null != o && o !== r.customGraphicType || \"path\" === o && ((i = a) && (mt(i, \"pathData\") || mt(i, \"d\"))) && LR(a) !== r.customPathData || \"image\" === o && mt(s, \"image\") && s.image !== r.customImagePath } function MR(t, e, n) { var i = e ? IR(t, e) : t, r = e ? TR(t, i, nR) : t.style, o = t.type, a = i ? i.textConfig : null, s = t.textContent, l = s ? e ? IR(s, e) : s : null; if (r && (n.isLegacy || PO(r, o, !!a, !!l))) { n.isLegacy = !0; var u = OO(r, o, !e); !a && u.textConfig && (a = u.textConfig), !l && u.textContent && (l = u.textContent) } if (!e && l) { var h = l; !h.type && (h.type = \"text\") } var c = e ? n[e] : n.normal; c.cfg = a, c.conOpt = l } function IR(t, e) { return e ? t ? t[e] : null : t } function TR(t, e, n) { var i = e && e.style; return null == i && n === nR && t && (i = t.styleEmphasis), i } function CR(t, e, n) { e && YO(e, TO(t).option, n) } function DR(t, e) { var n = t && t.name; return null != n ? n : \"e\\0\\0\" + e } function AR(t, e) { var n = this.context, i = null != t ? n.newChildren[t] : null, r = null != e ? n.oldChildren[e] : null; wR(n.api, r, n.dataIndex, i, n.seriesModel, n.group) } function kR(t) { var e = this.context, n = e.oldChildren[t]; n && YO(n, TO(n).option, e.seriesModel) } function LR(t) { return t && (t.pathData || t.d) } var PR = Do(), OR = T, RR = W, NR = function () { function t() { this._dragging = !1, this.animationThreshold = 15 } return t.prototype.render = function (t, e, n, i) { var r = e.get(\"value\"), o = e.get(\"status\"); if (this._axisModel = t, this._axisPointerModel = e, this._api = n, i || this._lastValue !== r || this._lastStatus !== o) { this._lastValue = r, this._lastStatus = o; var a = this._group, s = this._handle; if (!o || \"hide\" === o) return a && a.hide(), void (s && s.hide()); a && a.show(), s && s.show(); var l = {}; this.makeElOption(l, r, t, e, n); var u = l.graphicKey; u !== this._lastGraphicKey && this.clear(n), this._lastGraphicKey = u; var h = this._moveAnimation = this.determineAnimation(t, e); if (a) { var c = H(ER, e, h); this.updatePointerEl(a, l, c), this.updateLabelEl(a, l, c, e) } else a = this._group = new Pr, this.createPointerEl(a, l, t, e), this.createLabelEl(a, l, t, e), n.getZr().add(a); FR(a, e, !0), this._renderHandle(r) } }, t.prototype.remove = function (t) { this.clear(t) }, t.prototype.dispose = function (t) { this.clear(t) }, t.prototype.determineAnimation = function (t, e) { var n = e.get(\"animation\"), i = t.axis, r = \"category\" === i.type, o = e.get(\"snap\"); if (!o && !r) return !1; if (\"auto\" === n || null == n) { var a = this.animationThreshold; if (r && i.getBandWidth() > a) return !0; if (o) { var s = QM(t).seriesDataCount, l = i.getExtent(); return Math.abs(l[0] - l[1]) / s > a } return !1 } return !0 === n }, t.prototype.makeElOption = function (t, e, n, i, r) { }, t.prototype.createPointerEl = function (t, e, n, i) { var r = e.pointer; if (r) { var o = PR(t).pointerEl = new Uh[r.type](OR(e.pointer)); t.add(o) } }, t.prototype.createLabelEl = function (t, e, n, i) { if (e.label) { var r = PR(t).labelEl = new Ns(OR(e.label)); t.add(r), VR(r, i) } }, t.prototype.updatePointerEl = function (t, e, n) { var i = PR(t).pointerEl; i && e.pointer && (i.setStyle(e.pointer.style), n(i, { shape: e.pointer.shape })) }, t.prototype.updateLabelEl = function (t, e, n, i) { var r = PR(t).labelEl; r && (r.setStyle(e.label.style), n(r, { x: e.label.x, y: e.label.y }), VR(r, i)) }, t.prototype._renderHandle = function (t) { if (!this._dragging && this.updateHandleTransform) { var e, n = this._axisPointerModel, i = this._api.getZr(), r = this._handle, o = n.getModel(\"handle\"), a = n.get(\"status\"); if (!o.get(\"show\") || !a || \"hide\" === a) return r && i.remove(r), void (this._handle = null); this._handle || (e = !0, r = this._handle = Vh(o.get(\"icon\"), { cursor: \"move\", draggable: !0, onmousemove: function (t) { he(t.event) }, onmousedown: RR(this._onHandleDragMove, this, 0, 0), drift: RR(this._onHandleDragMove, this), ondragend: RR(this._onHandleDragEnd, this) }), i.add(r)), FR(r, n, !1), r.setStyle(o.getItemStyle(null, [\"color\", \"borderColor\", \"borderWidth\", \"opacity\", \"shadowColor\", \"shadowBlur\", \"shadowOffsetX\", \"shadowOffsetY\"])); var s = o.get(\"size\"); Y(s) || (s = [s, s]), r.scaleX = s[0] / 2, r.scaleY = s[1] / 2, Pg(this, \"_doDispatchAxisPointer\", o.get(\"throttle\") || 0, \"fixRate\"), this._moveHandleToValue(t, e) } }, t.prototype._moveHandleToValue = function (t, e) { ER(this._axisPointerModel, !e && this._moveAnimation, this._handle, BR(this.getHandleTransform(t, this._axisModel, this._axisPointerModel))) }, t.prototype._onHandleDragMove = function (t, e) { var n = this._handle; if (n) { this._dragging = !0; var i = this.updateHandleTransform(BR(n), [t, e], this._axisModel, this._axisPointerModel); this._payloadInfo = i, n.stopAnimation(), n.attr(BR(i)), PR(n).lastProp = null, this._doDispatchAxisPointer() } }, t.prototype._doDispatchAxisPointer = function () { if (this._handle) { var t = this._payloadInfo, e = this._axisModel; this._api.dispatchAction({ type: \"updateAxisPointer\", x: t.cursorPoint[0], y: t.cursorPoint[1], tooltipOption: t.tooltipOption, axesInfo: [{ axisDim: e.axis.dim, axisIndex: e.componentIndex }] }) } }, t.prototype._onHandleDragEnd = function () { if (this._dragging = !1, this._handle) { var t = this._axisPointerModel.get(\"value\"); this._moveHandleToValue(t), this._api.dispatchAction({ type: \"hideTip\" }) } }, t.prototype.clear = function (t) { this._lastValue = null, this._lastStatus = null; var e = t.getZr(), n = this._group, i = this._handle; e && n && (this._lastGraphicKey = null, n && e.remove(n), i && e.remove(i), this._group = null, this._handle = null, this._payloadInfo = null), Og(this, \"_doDispatchAxisPointer\") }, t.prototype.doClear = function () { }, t.prototype.buildLabel = function (t, e, n) { return { x: t[n = n || 0], y: t[1 - n], width: e[n], height: e[1 - n] } }, t }(); function ER(t, e, n, i) { zR(PR(n).lastProp, i) || (PR(n).lastProp = i, e ? uh(n, i, t) : (n.stopAnimation(), n.attr(i))) } function zR(t, e) { if (q(t) && q(e)) { var n = !0; return E(e, (function (e, i) { n = n && zR(t[i], e) })), !!n } return t === e } function VR(t, e) { t[e.get([\"label\", \"show\"]) ? \"show\" : \"hide\"]() } function BR(t) { return { x: t.x || 0, y: t.y || 0, rotation: t.rotation || 0 } } function FR(t, e, n) { var i = e.get(\"z\"), r = e.get(\"zlevel\"); t && t.traverse((function (t) { \"group\" !== t.type && (null != i && (t.z = i), null != r && (t.zlevel = r), t.silent = n) })) } function GR(t) { var e, n = t.get(\"type\"), i = t.getModel(n + \"Style\"); return \"line\" === n ? (e = i.getLineStyle()).fill = null : \"shadow\" === n && ((e = i.getAreaStyle()).stroke = null), e } function WR(t, e, n, i, r) { var o = HR(n.get(\"value\"), e.axis, e.ecModel, n.get(\"seriesDataIndices\"), { precision: n.get([\"label\", \"precision\"]), formatter: n.get([\"label\", \"formatter\"]) }), a = n.getModel(\"label\"), s = up(a.get(\"padding\") || 0), l = a.getFont(), u = yr(o, l), h = r.position, c = u.width + s[1] + s[3], p = u.height + s[0] + s[2], d = r.align; \"right\" === d && (h[0] -= c), \"center\" === d && (h[0] -= c / 2); var f = r.verticalAlign; \"bottom\" === f && (h[1] -= p), \"middle\" === f && (h[1] -= p / 2), function (t, e, n, i) { var r = i.getWidth(), o = i.getHeight(); t[0] = Math.min(t[0] + e, r) - e, t[1] = Math.min(t[1] + n, o) - n, t[0] = Math.max(t[0], 0), t[1] = Math.max(t[1], 0) }(h, c, p, i); var g = a.get(\"backgroundColor\"); g && \"auto\" !== g || (g = e.get([\"axisLine\", \"lineStyle\", \"color\"])), t.label = { x: h[0], y: h[1], style: $h(a, { text: o, font: l, fill: a.getTextColor(), padding: s, backgroundColor: g }), z2: 10 } } function HR(t, e, n, i, r) { t = e.scale.parse(t); var o = e.scale.getLabel({ value: t }, { precision: r.precision }), a = r.formatter; if (a) { var s = { value: h_(e, { value: t }), axisDimension: e.dim, axisIndex: e.index, seriesData: [] }; E(i, (function (t) { var e = n.getSeriesByIndex(t.seriesIndex), i = t.dataIndexInside, r = e && e.getDataParams(i); r && s.seriesData.push(r) })), X(a) ? o = a.replace(\"{value}\", o) : U(a) && (o = a(s)) } return o } function YR(t, e, n) { var i = [1, 0, 0, 1, 0, 0]; return _e(i, i, n.rotation), xe(i, i, n.position), Ph([t.dataToCoord(e), (n.labelOffset || 0) + (n.labelDirection || 1) * (n.labelMargin || 0)], i) } function UR(t, e, n, i, r, o) { var a = YM.innerTextLayout(n.rotation, 0, n.labelDirection); n.labelMargin = r.get([\"label\", \"margin\"]), WR(e, i, r, o, { position: YR(i.axis, t, n), align: a.textAlign, verticalAlign: a.textVerticalAlign }) } function XR(t, e, n) { return { x1: t[n = n || 0], y1: t[1 - n], x2: e[n], y2: e[1 - n] } } function ZR(t, e, n) { return { x: t[n = n || 0], y: t[1 - n], width: e[n], height: e[1 - n] } } function jR(t, e, n, i, r, o) { return { cx: t, cy: e, r0: n, r: i, startAngle: r, endAngle: o, clockwise: !0 } } var qR = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.makeElOption = function (t, e, n, i, r) { var o = n.axis, a = o.grid, s = i.get(\"type\"), l = KR(a, o).getOtherAxis(o).getGlobalExtent(), u = o.toGlobalCoord(o.dataToCoord(e, !0)); if (s && \"none\" !== s) { var h = GR(i), c = $R[s](o, u, l); c.style = h, t.graphicKey = c.type, t.pointer = c } UR(e, t, RM(a.model, n), n, i, r) }, e.prototype.getHandleTransform = function (t, e, n) { var i = RM(e.axis.grid.model, e, { labelInside: !1 }); i.labelMargin = n.get([\"handle\", \"margin\"]); var r = YR(e.axis, t, i); return { x: r[0], y: r[1], rotation: i.rotation + (i.labelDirection < 0 ? Math.PI : 0) } }, e.prototype.updateHandleTransform = function (t, e, n, i) { var r = n.axis, o = r.grid, a = r.getGlobalExtent(!0), s = KR(o, r).getOtherAxis(r).getGlobalExtent(), l = \"x\" === r.dim ? 0 : 1, u = [t.x, t.y]; u[l] += e[l], u[l] = Math.min(a[1], u[l]), u[l] = Math.max(a[0], u[l]); var h = (s[1] + s[0]) / 2, c = [h, h]; c[l] = u[l]; return { x: u[0], y: u[1], rotation: t.rotation, cursorPoint: c, tooltipOption: [{ verticalAlign: \"middle\" }, { align: \"center\" }][l] } }, e }(NR); function KR(t, e) { var n = {}; return n[e.dim + \"AxisIndex\"] = e.index, t.getCartesian(n) } var $R = { line: function (t, e, n) { return { type: \"Line\", subPixelOptimize: !0, shape: XR([e, n[0]], [e, n[1]], JR(t)) } }, shadow: function (t, e, n) { var i = Math.max(1, t.getBandWidth()), r = n[1] - n[0]; return { type: \"Rect\", shape: ZR([e - i / 2, n[0]], [i, r], JR(t)) } } }; function JR(t) { return \"x\" === t.dim ? 0 : 1 } var QR = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"axisPointer\", e.defaultOption = { show: \"auto\", z: 50, type: \"line\", snap: !1, triggerTooltip: !0, value: null, status: null, link: [], animation: null, animationDurationUpdate: 200, lineStyle: { color: \"#B9BEC9\", width: 1, type: \"dashed\" }, shadowStyle: { color: \"rgba(210,219,238,0.2)\" }, label: { show: !0, formatter: null, precision: \"auto\", margin: 3, color: \"#fff\", padding: [5, 7, 5, 7], backgroundColor: \"auto\", borderColor: null, borderWidth: 0, borderRadius: 3 }, handle: { show: !1, icon: \"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z\", size: 45, margin: 50, color: \"#333\", shadowBlur: 3, shadowColor: \"#aaa\", shadowOffsetX: 0, shadowOffsetY: 2, throttle: 40 } }, e }(Ap), tN = Do(), eN = E; function nN(t, e, n) { if (!r.node) { var i = e.getZr(); tN(i).records || (tN(i).records = {}), function (t, e) { if (tN(t).initialized) return; function n(n, i) { t.on(n, (function (n) { var r = function (t) { var e = { showTip: [], hideTip: [] }, n = function (i) { var r = e[i.type]; r ? r.push(i) : (i.dispatchAction = n, t.dispatchAction(i)) }; return { dispatchAction: n, pendings: e } }(e); eN(tN(t).records, (function (t) { t && i(t, n, r.dispatchAction) })), function (t, e) { var n, i = t.showTip.length, r = t.hideTip.length; i ? n = t.showTip[i - 1] : r && (n = t.hideTip[r - 1]); n && (n.dispatchAction = null, e.dispatchAction(n)) }(r.pendings, e) })) } tN(t).initialized = !0, n(\"click\", H(rN, \"click\")), n(\"mousemove\", H(rN, \"mousemove\")), n(\"globalout\", iN) }(i, e), (tN(i).records[t] || (tN(i).records[t] = {})).handler = n } } function iN(t, e, n) { t.handler(\"leave\", null, n) } function rN(t, e, n, i) { e.handler(t, n, i) } function oN(t, e) { if (!r.node) { var n = e.getZr(); (tN(n).records || {})[t] && (tN(n).records[t] = null) } } var aN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = e.getComponent(\"tooltip\"), r = t.get(\"triggerOn\") || i && i.get(\"triggerOn\") || \"mousemove|click\"; nN(\"axisPointer\", n, (function (t, e, n) { \"none\" !== r && (\"leave\" === t || r.indexOf(t) >= 0) && n({ type: \"updateAxisPointer\", currTrigger: t, x: e && e.offsetX, y: e && e.offsetY }) })) }, e.prototype.remove = function (t, e) { oN(\"axisPointer\", e) }, e.prototype.dispose = function (t, e) { oN(\"axisPointer\", e) }, e.type = \"axisPointer\", e }(mg); function sN(t, e) { var n, i = [], r = t.seriesIndex; if (null == r || !(n = e.getSeriesByIndex(r))) return { point: [] }; var o = n.getData(), a = Co(o, t); if (null == a || a < 0 || Y(a)) return { point: [] }; var s = o.getItemGraphicEl(a), l = n.coordinateSystem; if (n.getTooltipPosition) i = n.getTooltipPosition(a) || []; else if (l && l.dataToPoint) if (t.isStacked) { var u = l.getBaseAxis(), h = l.getOtherAxis(u).dim, c = u.dim, p = \"x\" === h || \"radius\" === h ? 1 : 0, d = o.mapDimension(c), f = []; f[p] = o.get(d, a), f[1 - p] = o.get(o.getCalculationInfo(\"stackResultDimension\"), a), i = l.dataToPoint(f) || [] } else i = l.dataToPoint(o.getValues(z(l.dimensions, (function (t) { return o.mapDimension(t) })), a)) || []; else if (s) { var g = s.getBoundingRect().clone(); g.applyTransform(s.transform), i = [g.x + g.width / 2, g.y + g.height / 2] } return { point: i, el: s } } var lN = Do(); function uN(t, e, n) { var i = t.currTrigger, r = [t.x, t.y], o = t, a = t.dispatchAction || W(n.dispatchAction, n), s = e.getComponent(\"axisPointer\").coordSysAxesInfo; if (s) { fN(r) && (r = sN({ seriesIndex: o.seriesIndex, dataIndex: o.dataIndex }, e).point); var l = fN(r), u = o.axesInfo, h = s.axesInfo, c = \"leave\" === i || fN(r), p = {}, d = {}, f = { list: [], map: {} }, g = { showPointer: H(cN, d), showTooltip: H(pN, f) }; E(s.coordSysMap, (function (t, e) { var n = l || t.containPoint(r); E(s.coordSysAxesInfo[e], (function (t, e) { var i = t.axis, o = function (t, e) { for (var n = 0; n < (t || []).length; n++) { var i = t[n]; if (e.axis.dim === i.axisDim && e.axis.model.componentIndex === i.axisIndex) return i } }(u, t); if (!c && n && (!u || o)) { var a = o && o.value; null != a || l || (a = i.pointToData(r)), null != a && hN(t, a, g, !1, p) } })) })); var y = {}; return E(h, (function (t, e) { var n = t.linkGroup; n && !d[e] && E(n.axesInfo, (function (e, i) { var r = d[i]; if (e !== t && r) { var o = r.value; n.mapper && (o = t.axis.scale.parse(n.mapper(o, dN(e), dN(t)))), y[t.key] = o } })) })), E(y, (function (t, e) { hN(h[e], t, g, !0, p) })), function (t, e, n) { var i = n.axesInfo = []; E(e, (function (e, n) { var r = e.axisPointerModel.option, o = t[n]; o ? (!e.useHandle && (r.status = \"show\"), r.value = o.value, r.seriesDataIndices = (o.payloadBatch || []).slice()) : !e.useHandle && (r.status = \"hide\"), \"show\" === r.status && i.push({ axisDim: e.axis.dim, axisIndex: e.axis.model.componentIndex, value: r.value }) })) }(d, h, p), function (t, e, n, i) { if (fN(e) || !t.list.length) return void i({ type: \"hideTip\" }); var r = ((t.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; i({ type: \"showTip\", escapeConnect: !0, x: e[0], y: e[1], tooltipOption: n.tooltipOption, position: n.position, dataIndexInside: r.dataIndexInside, dataIndex: r.dataIndex, seriesIndex: r.seriesIndex, dataByCoordSys: t.list }) }(f, r, t, a), function (t, e, n) { var i = n.getZr(), r = \"axisPointerLastHighlights\", o = lN(i)[r] || {}, a = lN(i)[r] = {}; E(t, (function (t, e) { var n = t.axisPointerModel.option; \"show\" === n.status && E(n.seriesDataIndices, (function (t) { var e = t.seriesIndex + \" | \" + t.dataIndex; a[e] = t })) })); var s = [], l = []; E(o, (function (t, e) { !a[e] && l.push(t) })), E(a, (function (t, e) { !o[e] && s.push(t) })), l.length && n.dispatchAction({ type: \"downplay\", escapeConnect: !0, notBlur: !0, batch: l }), s.length && n.dispatchAction({ type: \"highlight\", escapeConnect: !0, notBlur: !0, batch: s }) }(h, 0, n), p } } function hN(t, e, n, i, r) { var o = t.axis; if (!o.scale.isBlank() && o.containData(e)) if (t.involveSeries) { var a = function (t, e) { var n = e.axis, i = n.dim, r = t, o = [], a = Number.MAX_VALUE, s = -1; return E(e.seriesModels, (function (e, l) { var u, h, c = e.getData().mapDimensionsAll(i); if (e.getAxisTooltipData) { var p = e.getAxisTooltipData(c, t, n); h = p.dataIndices, u = p.nestestValue } else { if (!(h = e.getData().indicesOfNearest(c[0], t, \"category\" === n.type ? .5 : null)).length) return; u = e.getData().get(c[0], h[0]) } if (null != u && isFinite(u)) { var d = t - u, f = Math.abs(d); f <= a && ((f < a || d >= 0 && s < 0) && (a = f, s = d, r = u, o.length = 0), E(h, (function (t) { o.push({ seriesIndex: e.seriesIndex, dataIndexInside: t, dataIndex: e.getData().getRawIndex(t) }) }))) } })), { payloadBatch: o, snapToValue: r } }(e, t), s = a.payloadBatch, l = a.snapToValue; s[0] && null == r.seriesIndex && A(r, s[0]), !i && t.snap && o.containData(l) && null != l && (e = l), n.showPointer(t, e, s), n.showTooltip(t, a, l) } else n.showPointer(t, e) } function cN(t, e, n, i) { t[e.key] = { value: n, payloadBatch: i } } function pN(t, e, n, i) { var r = n.payloadBatch, o = e.axis, a = o.model, s = e.axisPointerModel; if (e.triggerTooltip && r.length) { var l = e.coordSys.model, u = eI(l), h = t.map[u]; h || (h = t.map[u] = { coordSysId: l.id, coordSysIndex: l.componentIndex, coordSysType: l.type, coordSysMainType: l.mainType, dataByAxis: [] }, t.list.push(h)), h.dataByAxis.push({ axisDim: o.dim, axisIndex: a.componentIndex, axisType: a.type, axisId: a.id, value: i, valueLabelOpt: { precision: s.get([\"label\", \"precision\"]), formatter: s.get([\"label\", \"formatter\"]) }, seriesDataIndices: r.slice() }) } } function dN(t) { var e = t.axis.model, n = {}, i = n.axisDim = t.axis.dim; return n.axisIndex = n[i + \"AxisIndex\"] = e.componentIndex, n.axisName = n[i + \"AxisName\"] = e.name, n.axisId = n[i + \"AxisId\"] = e.id, n } function fN(t) { return !t || null == t[0] || isNaN(t[0]) || null == t[1] || isNaN(t[1]) } function gN(t) { iI.registerAxisPointerClass(\"CartesianAxisPointer\", qR), t.registerComponentModel(QR), t.registerComponentView(aN), t.registerPreprocessor((function (t) { if (t) { (!t.axisPointer || 0 === t.axisPointer.length) && (t.axisPointer = {}); var e = t.axisPointer.link; e && !Y(e) && (t.axisPointer.link = [e]) } })), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, (function (t, e) { t.getComponent(\"axisPointer\").coordSysAxesInfo = KM(t, e) })), t.registerAction({ type: \"updateAxisPointer\", event: \"updateAxisPointer\", update: \":updateAxisPointer\" }, uN) } var yN = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.makeElOption = function (t, e, n, i, r) { var o = n.axis; \"angle\" === o.dim && (this.animationThreshold = Math.PI / 18); var a = o.polar, s = a.getOtherAxis(o).getExtent(), l = o.dataToCoord(e), u = i.get(\"type\"); if (u && \"none\" !== u) { var h = GR(i), c = vN[u](o, a, l, s); c.style = h, t.graphicKey = c.type, t.pointer = c } var p = function (t, e, n, i, r) { var o = e.axis, a = o.dataToCoord(t), s = i.getAngleAxis().getExtent()[0]; s = s / 180 * Math.PI; var l, u, h, c = i.getRadiusAxis().getExtent(); if (\"radius\" === o.dim) { var p = [1, 0, 0, 1, 0, 0]; _e(p, p, s), xe(p, p, [i.cx, i.cy]), l = Ph([a, -r], p); var d = e.getModel(\"axisLabel\").get(\"rotate\") || 0, f = YM.innerTextLayout(s, d * Math.PI / 180, -1); u = f.textAlign, h = f.textVerticalAlign } else { var g = c[1]; l = i.coordToPoint([g + r, a]); var y = i.cx, v = i.cy; u = Math.abs(l[0] - y) / g < .3 ? \"center\" : l[0] > y ? \"left\" : \"right\", h = Math.abs(l[1] - v) / g < .3 ? \"middle\" : l[1] > v ? \"top\" : \"bottom\" } return { position: l, align: u, verticalAlign: h } }(e, n, 0, a, i.get([\"label\", \"margin\"])); WR(t, n, i, r, p) }, e }(NR); var vN = { line: function (t, e, n, i) { return \"angle\" === t.dim ? { type: \"Line\", shape: XR(e.coordToPoint([i[0], n]), e.coordToPoint([i[1], n])) } : { type: \"Circle\", shape: { cx: e.cx, cy: e.cy, r: n } } }, shadow: function (t, e, n, i) { var r = Math.max(1, t.getBandWidth()), o = Math.PI / 180; return \"angle\" === t.dim ? { type: \"Sector\", shape: jR(e.cx, e.cy, i[0], i[1], (-n - r / 2) * o, (r / 2 - n) * o) } : { type: \"Sector\", shape: jR(e.cx, e.cy, n - r / 2, n + r / 2, 0, 2 * Math.PI) } } }, mN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.findAxisModel = function (t) { var e; return this.ecModel.eachComponent(t, (function (t) { t.getCoordSysModel() === this && (e = t) }), this), e }, e.type = \"polar\", e.dependencies = [\"radiusAxis\", \"angleAxis\"], e.defaultOption = { z: 0, center: [\"50%\", \"50%\"], radius: \"80%\" }, e }(Ap), xN = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.getCoordSysModel = function () { return this.getReferringComponents(\"polar\", Po).models[0] }, e.type = \"polarAxis\", e }(Ap); R(xN, g_); var _N = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"angleAxis\", e }(xN), bN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"radiusAxis\", e }(xN), wN = function (t) { function e(e, n) { return t.call(this, \"radius\", e, n) || this } return n(e, t), e.prototype.pointToData = function (t, e) { return this.polar.pointToData(t, e)[\"radius\" === this.dim ? 0 : 1] }, e }(X_); wN.prototype.dataToRadius = X_.prototype.dataToCoord, wN.prototype.radiusToData = X_.prototype.coordToData; var SN = Do(), MN = function (t) { function e(e, n) { return t.call(this, \"angle\", e, n || [0, 360]) || this } return n(e, t), e.prototype.pointToData = function (t, e) { return this.polar.pointToData(t, e)[\"radius\" === this.dim ? 0 : 1] }, e.prototype.calculateCategoryInterval = function () { var t = this, e = t.getLabelModel(), n = t.scale, i = n.getExtent(), r = n.count(); if (i[1] - i[0] < 1) return 0; var o = i[0], a = t.dataToCoord(o + 1) - t.dataToCoord(o), s = Math.abs(a), l = yr(null == o ? \"\" : o + \"\", e.getFont(), \"center\", \"top\"), u = Math.max(l.height, 7) / s; isNaN(u) && (u = 1 / 0); var h = Math.max(0, Math.floor(u)), c = SN(t.model), p = c.lastAutoInterval, d = c.lastTickCount; return null != p && null != d && Math.abs(p - h) <= 1 && Math.abs(d - r) <= 1 && p > h ? h = p : (c.lastTickCount = r, c.lastAutoInterval = h), h }, e }(X_); MN.prototype.dataToAngle = X_.prototype.dataToCoord, MN.prototype.angleToData = X_.prototype.coordToData; var IN = [\"radius\", \"angle\"], TN = function () { function t(t) { this.dimensions = IN, this.type = \"polar\", this.cx = 0, this.cy = 0, this._radiusAxis = new wN, this._angleAxis = new MN, this.axisPointerEnabled = !0, this.name = t || \"\", this._radiusAxis.polar = this._angleAxis.polar = this } return t.prototype.containPoint = function (t) { var e = this.pointToCoord(t); return this._radiusAxis.contain(e[0]) && this._angleAxis.contain(e[1]) }, t.prototype.containData = function (t) { return this._radiusAxis.containData(t[0]) && this._angleAxis.containData(t[1]) }, t.prototype.getAxis = function (t) { return this[\"_\" + t + \"Axis\"] }, t.prototype.getAxes = function () { return [this._radiusAxis, this._angleAxis] }, t.prototype.getAxesByScale = function (t) { var e = [], n = this._angleAxis, i = this._radiusAxis; return n.scale.type === t && e.push(n), i.scale.type === t && e.push(i), e }, t.prototype.getAngleAxis = function () { return this._angleAxis }, t.prototype.getRadiusAxis = function () { return this._radiusAxis }, t.prototype.getOtherAxis = function (t) { var e = this._angleAxis; return t === e ? this._radiusAxis : e }, t.prototype.getBaseAxis = function () { return this.getAxesByScale(\"ordinal\")[0] || this.getAxesByScale(\"time\")[0] || this.getAngleAxis() }, t.prototype.getTooltipAxes = function (t) { var e = null != t && \"auto\" !== t ? this.getAxis(t) : this.getBaseAxis(); return { baseAxes: [e], otherAxes: [this.getOtherAxis(e)] } }, t.prototype.dataToPoint = function (t, e) { return this.coordToPoint([this._radiusAxis.dataToRadius(t[0], e), this._angleAxis.dataToAngle(t[1], e)]) }, t.prototype.pointToData = function (t, e) { var n = this.pointToCoord(t); return [this._radiusAxis.radiusToData(n[0], e), this._angleAxis.angleToData(n[1], e)] }, t.prototype.pointToCoord = function (t) { var e = t[0] - this.cx, n = t[1] - this.cy, i = this.getAngleAxis(), r = i.getExtent(), o = Math.min(r[0], r[1]), a = Math.max(r[0], r[1]); i.inverse ? o = a - 360 : a = o + 360; var s = Math.sqrt(e * e + n * n); e /= s, n /= s; for (var l = Math.atan2(-n, e) / Math.PI * 180, u = l < o ? 1 : -1; l < o || l > a;)l += 360 * u; return [s, l] }, t.prototype.coordToPoint = function (t) { var e = t[0], n = t[1] / 180 * Math.PI; return [Math.cos(n) * e + this.cx, -Math.sin(n) * e + this.cy] }, t.prototype.getArea = function () { var t = this.getAngleAxis(), e = this.getRadiusAxis().getExtent().slice(); e[0] > e[1] && e.reverse(); var n = t.getExtent(), i = Math.PI / 180; return { cx: this.cx, cy: this.cy, r0: e[0], r: e[1], startAngle: -n[0] * i, endAngle: -n[1] * i, clockwise: t.inverse, contain: function (t, e) { var n = t - this.cx, i = e - this.cy, r = n * n + i * i - 1e-4, o = this.r, a = this.r0; return r <= o * o && r >= a * a } } }, t.prototype.convertToPixel = function (t, e, n) { return CN(e) === this ? this.dataToPoint(n) : null }, t.prototype.convertFromPixel = function (t, e, n) { return CN(e) === this ? this.pointToData(n) : null }, t }(); function CN(t) { var e = t.seriesModel, n = t.polarModel; return n && n.coordinateSystem || e && e.coordinateSystem } function DN(t, e) { var n = this, i = n.getAngleAxis(), r = n.getRadiusAxis(); if (i.scale.setExtent(1 / 0, -1 / 0), r.scale.setExtent(1 / 0, -1 / 0), t.eachSeries((function (t) { if (t.coordinateSystem === n) { var e = t.getData(); E(f_(e, \"radius\"), (function (t) { r.scale.unionExtentFromData(e, t) })), E(f_(e, \"angle\"), (function (t) { i.scale.unionExtentFromData(e, t) })) } })), s_(i.scale, i.model), s_(r.scale, r.model), \"category\" === i.type && !i.onBand) { var o = i.getExtent(), a = 360 / i.scale.count(); i.inverse ? o[1] += a : o[1] -= a, i.setExtent(o[0], o[1]) } } function AN(t, e) { if (t.type = e.get(\"type\"), t.scale = l_(e), t.onBand = e.get(\"boundaryGap\") && \"category\" === t.type, t.inverse = e.get(\"inverse\"), function (t) { return \"angleAxis\" === t.mainType }(e)) { t.inverse = t.inverse !== e.get(\"clockwise\"); var n = e.get(\"startAngle\"); t.setExtent(n, n + (t.inverse ? -360 : 360)) } e.axis = t, t.model = e } var kN = { dimensions: IN, create: function (t, e) { var n = []; return t.eachComponent(\"polar\", (function (t, i) { var r = new TN(i + \"\"); r.update = DN; var o = r.getRadiusAxis(), a = r.getAngleAxis(), s = t.findAxisModel(\"radiusAxis\"), l = t.findAxisModel(\"angleAxis\"); AN(o, s), AN(a, l), function (t, e, n) { var i = e.get(\"center\"), r = n.getWidth(), o = n.getHeight(); t.cx = Gr(i[0], r), t.cy = Gr(i[1], o); var a = t.getRadiusAxis(), s = Math.min(r, o) / 2, l = e.get(\"radius\"); null == l ? l = [0, \"100%\"] : Y(l) || (l = [0, l]); var u = [Gr(l[0], s), Gr(l[1], s)]; a.inverse ? a.setExtent(u[1], u[0]) : a.setExtent(u[0], u[1]) }(r, t, e), n.push(r), t.coordinateSystem = r, r.model = t })), t.eachSeries((function (t) { if (\"polar\" === t.get(\"coordinateSystem\")) { var e = t.getReferringComponents(\"polar\", Po).models[0]; 0, t.coordinateSystem = e.coordinateSystem } })), n } }, LN = [\"axisLine\", \"axisLabel\", \"axisTick\", \"minorTick\", \"splitLine\", \"minorSplitLine\", \"splitArea\"]; function PN(t, e, n) { e[1] > e[0] && (e = e.slice().reverse()); var i = t.coordToPoint([e[0], n]), r = t.coordToPoint([e[1], n]); return { x1: i[0], y1: i[1], x2: r[0], y2: r[1] } } function ON(t) { return t.getRadiusAxis().inverse ? 0 : 1 } function RN(t) { var e = t[0], n = t[t.length - 1]; e && n && Math.abs(Math.abs(e.coord - n.coord) - 360) < 1e-4 && t.pop() } var NN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.axisPointerClass = \"PolarAxisPointer\", n } return n(e, t), e.prototype.render = function (t, e) { if (this.group.removeAll(), t.get(\"show\")) { var n = t.axis, i = n.polar, r = i.getRadiusAxis().getExtent(), o = n.getTicksCoords(), a = n.getMinorTicksCoords(), s = z(n.getViewLabels(), (function (t) { t = T(t); var e = n.scale, i = \"ordinal\" === e.type ? e.getRawOrdinalNumber(t.tickValue) : t.tickValue; return t.coord = n.dataToCoord(i), t })); RN(s), RN(o), E(LN, (function (e) { !t.get([e, \"show\"]) || n.scale.isBlank() && \"axisLine\" !== e || EN[e](this.group, t, i, o, a, r, s) }), this) } }, e.type = \"angleAxis\", e }(iI), EN = { axisLine: function (t, e, n, i, r, o) { var a, s = e.getModel([\"axisLine\", \"lineStyle\"]), l = ON(n), u = l ? 0 : 1; (a = 0 === o[u] ? new gu({ shape: { cx: n.cx, cy: n.cy, r: o[l] }, style: s.getLineStyle(), z2: 1, silent: !0 }) : new Ru({ shape: { cx: n.cx, cy: n.cy, r: o[l], r0: o[u] }, style: s.getLineStyle(), z2: 1, silent: !0 })).style.fill = null, t.add(a) }, axisTick: function (t, e, n, i, r, o) { var a = e.getModel(\"axisTick\"), s = (a.get(\"inside\") ? -1 : 1) * a.get(\"length\"), l = o[ON(n)], u = z(i, (function (t) { return new Wu({ shape: PN(n, [l, l + s], t.coord) }) })); t.add(Ch(u, { style: k(a.getModel(\"lineStyle\").getLineStyle(), { stroke: e.get([\"axisLine\", \"lineStyle\", \"color\"]) }) })) }, minorTick: function (t, e, n, i, r, o) { if (r.length) { for (var a = e.getModel(\"axisTick\"), s = e.getModel(\"minorTick\"), l = (a.get(\"inside\") ? -1 : 1) * s.get(\"length\"), u = o[ON(n)], h = [], c = 0; c < r.length; c++)for (var p = 0; p < r[c].length; p++)h.push(new Wu({ shape: PN(n, [u, u + l], r[c][p].coord) })); t.add(Ch(h, { style: k(s.getModel(\"lineStyle\").getLineStyle(), k(a.getLineStyle(), { stroke: e.get([\"axisLine\", \"lineStyle\", \"color\"]) })) })) } }, axisLabel: function (t, e, n, i, r, o, a) { var s = e.getCategories(!0), l = e.getModel(\"axisLabel\"), u = l.get(\"margin\"), h = e.get(\"triggerEvent\"); E(a, (function (i, r) { var a = l, c = i.tickValue, p = o[ON(n)], d = n.coordToPoint([p + u, i.coord]), f = n.cx, g = n.cy, y = Math.abs(d[0] - f) / p < .3 ? \"center\" : d[0] > f ? \"left\" : \"right\", v = Math.abs(d[1] - g) / p < .3 ? \"middle\" : d[1] > g ? \"top\" : \"bottom\"; if (s && s[c]) { var m = s[c]; q(m) && m.textStyle && (a = new xc(m.textStyle, l, l.ecModel)) } var x = new Ns({ silent: YM.isLabelSilent(e), style: $h(a, { x: d[0], y: d[1], fill: a.getTextColor() || e.get([\"axisLine\", \"lineStyle\", \"color\"]), text: i.formattedLabel, align: y, verticalAlign: v }) }); if (t.add(x), h) { var _ = YM.makeAxisEventDataBase(e); _.targetType = \"axisLabel\", _.value = i.rawLabel, js(x).eventData = _ } }), this) }, splitLine: function (t, e, n, i, r, o) { var a = e.getModel(\"splitLine\").getModel(\"lineStyle\"), s = a.get(\"color\"), l = 0; s = s instanceof Array ? s : [s]; for (var u = [], h = 0; h < i.length; h++) { var c = l++ % s.length; u[c] = u[c] || [], u[c].push(new Wu({ shape: PN(n, o, i[h].coord) })) } for (h = 0; h < u.length; h++)t.add(Ch(u[h], { style: k({ stroke: s[h % s.length] }, a.getLineStyle()), silent: !0, z: e.get(\"z\") })) }, minorSplitLine: function (t, e, n, i, r, o) { if (r.length) { for (var a = e.getModel(\"minorSplitLine\").getModel(\"lineStyle\"), s = [], l = 0; l < r.length; l++)for (var u = 0; u < r[l].length; u++)s.push(new Wu({ shape: PN(n, o, r[l][u].coord) })); t.add(Ch(s, { style: a.getLineStyle(), silent: !0, z: e.get(\"z\") })) } }, splitArea: function (t, e, n, i, r, o) { if (i.length) { var a = e.getModel(\"splitArea\").getModel(\"areaStyle\"), s = a.get(\"color\"), l = 0; s = s instanceof Array ? s : [s]; for (var u = [], h = Math.PI / 180, c = -i[0].coord * h, p = Math.min(o[0], o[1]), d = Math.max(o[0], o[1]), f = e.get(\"clockwise\"), g = 1, y = i.length; g <= y; g++) { var v = g === y ? i[0].coord : i[g].coord, m = l++ % s.length; u[m] = u[m] || [], u[m].push(new Pu({ shape: { cx: n.cx, cy: n.cy, r0: p, r: d, startAngle: c, endAngle: -v * h, clockwise: f }, silent: !0 })), c = -v * h } for (g = 0; g < u.length; g++)t.add(Ch(u[g], { style: k({ fill: s[g % s.length] }, a.getAreaStyle()), silent: !0 })) } } }, zN = [\"axisLine\", \"axisTickLabel\", \"axisName\"], VN = [\"splitLine\", \"splitArea\", \"minorSplitLine\"], BN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.axisPointerClass = \"PolarAxisPointer\", n } return n(e, t), e.prototype.render = function (t, e) { if (this.group.removeAll(), t.get(\"show\")) { var n = this._axisGroup, i = this._axisGroup = new Pr; this.group.add(i); var r = t.axis, o = r.polar, a = o.getAngleAxis(), s = r.getTicksCoords(), l = r.getMinorTicksCoords(), u = a.getExtent()[0], h = r.getExtent(), c = function (t, e, n) { return { position: [t.cx, t.cy], rotation: n / 180 * Math.PI, labelDirection: -1, tickDirection: -1, nameDirection: 1, labelRotate: e.getModel(\"axisLabel\").get(\"rotate\"), z2: 1 } }(o, t, u), p = new YM(t, c); E(zN, p.add, p), i.add(p.getGroup()), Nh(n, i, t), E(VN, (function (e) { t.get([e, \"show\"]) && !r.scale.isBlank() && FN[e](this.group, t, o, u, h, s, l) }), this) } }, e.type = \"radiusAxis\", e }(iI), FN = { splitLine: function (t, e, n, i, r, o) { var a = e.getModel(\"splitLine\").getModel(\"lineStyle\"), s = a.get(\"color\"), l = 0; s = s instanceof Array ? s : [s]; for (var u = [], h = 0; h < o.length; h++) { var c = l++ % s.length; u[c] = u[c] || [], u[c].push(new gu({ shape: { cx: n.cx, cy: n.cy, r: Math.max(o[h].coord, 0) } })) } for (h = 0; h < u.length; h++)t.add(Ch(u[h], { style: k({ stroke: s[h % s.length], fill: null }, a.getLineStyle()), silent: !0 })) }, minorSplitLine: function (t, e, n, i, r, o, a) { if (a.length) { for (var s = e.getModel(\"minorSplitLine\").getModel(\"lineStyle\"), l = [], u = 0; u < a.length; u++)for (var h = 0; h < a[u].length; h++)l.push(new gu({ shape: { cx: n.cx, cy: n.cy, r: a[u][h].coord } })); t.add(Ch(l, { style: k({ fill: null }, s.getLineStyle()), silent: !0 })) } }, splitArea: function (t, e, n, i, r, o) { if (o.length) { var a = e.getModel(\"splitArea\").getModel(\"areaStyle\"), s = a.get(\"color\"), l = 0; s = s instanceof Array ? s : [s]; for (var u = [], h = o[0].coord, c = 1; c < o.length; c++) { var p = l++ % s.length; u[p] = u[p] || [], u[p].push(new Pu({ shape: { cx: n.cx, cy: n.cy, r0: h, r: o[c].coord, startAngle: 0, endAngle: 2 * Math.PI }, silent: !0 })), h = o[c].coord } for (c = 0; c < u.length; c++)t.add(Ch(u[c], { style: k({ fill: s[c % s.length] }, a.getAreaStyle()), silent: !0 })) } } }; function GN(t) { return t.get(\"stack\") || \"__ec_stack_\" + t.seriesIndex } function WN(t, e) { return e.dim + t.model.componentIndex } function HN(t, e, n) { var i = {}, r = function (t) { var e = {}; E(t, (function (t, n) { var i = t.getData(), r = t.coordinateSystem, o = r.getBaseAxis(), a = WN(r, o), s = o.getExtent(), l = \"category\" === o.type ? o.getBandWidth() : Math.abs(s[1] - s[0]) / i.count(), u = e[a] || { bandWidth: l, remainedWidth: l, autoWidthCount: 0, categoryGap: \"20%\", gap: \"30%\", stacks: {} }, h = u.stacks; e[a] = u; var c = GN(t); h[c] || u.autoWidthCount++, h[c] = h[c] || { width: 0, maxWidth: 0 }; var p = Gr(t.get(\"barWidth\"), l), d = Gr(t.get(\"barMaxWidth\"), l), f = t.get(\"barGap\"), g = t.get(\"barCategoryGap\"); p && !h[c].width && (p = Math.min(u.remainedWidth, p), h[c].width = p, u.remainedWidth -= p), d && (h[c].maxWidth = d), null != f && (u.gap = f), null != g && (u.categoryGap = g) })); var n = {}; return E(e, (function (t, e) { n[e] = {}; var i = t.stacks, r = t.bandWidth, o = Gr(t.categoryGap, r), a = Gr(t.gap, 1), s = t.remainedWidth, l = t.autoWidthCount, u = (s - o) / (l + (l - 1) * a); u = Math.max(u, 0), E(i, (function (t, e) { var n = t.maxWidth; n && n < u && (n = Math.min(n, s), t.width && (n = Math.min(n, t.width)), s -= n, t.width = n, l--) })), u = (s - o) / (l + (l - 1) * a), u = Math.max(u, 0); var h, c = 0; E(i, (function (t, e) { t.width || (t.width = u), h = t, c += t.width * (1 + a) })), h && (c -= h.width * a); var p = -c / 2; E(i, (function (t, i) { n[e][i] = n[e][i] || { offset: p, width: t.width }, p += t.width * (1 + a) })) })), n }(B(e.getSeriesByType(t), (function (t) { return !e.isSeriesFiltered(t) && t.coordinateSystem && \"polar\" === t.coordinateSystem.type }))); e.eachSeriesByType(t, (function (t) { if (\"polar\" === t.coordinateSystem.type) { var e = t.getData(), n = t.coordinateSystem, o = n.getBaseAxis(), a = WN(n, o), s = GN(t), l = r[a][s], u = l.offset, h = l.width, c = n.getOtherAxis(o), p = t.coordinateSystem.cx, d = t.coordinateSystem.cy, f = t.get(\"barMinHeight\") || 0, g = t.get(\"barMinAngle\") || 0; i[s] = i[s] || []; for (var y = e.mapDimension(c.dim), v = e.mapDimension(o.dim), m = ox(e, y), x = \"radius\" !== o.dim || !t.get(\"roundCap\", !0), _ = c.dataToCoord(0), b = 0, w = e.count(); b < w; b++) { var S = e.get(y, b), M = e.get(v, b), I = S >= 0 ? \"p\" : \"n\", T = _; m && (i[s][M] || (i[s][M] = { p: _, n: _ }), T = i[s][M][I]); var C = void 0, D = void 0, A = void 0, k = void 0; if (\"radius\" === c.dim) { var L = c.dataToCoord(S) - _, P = o.dataToCoord(M); Math.abs(L) < f && (L = (L < 0 ? -1 : 1) * f), C = T, D = T + L, k = (A = P - u) - h, m && (i[s][M][I] = D) } else { var O = c.dataToCoord(S, x) - _, R = o.dataToCoord(M); Math.abs(O) < g && (O = (O < 0 ? -1 : 1) * g), D = (C = R + u) + h, A = T, k = T + O, m && (i[s][M][I] = k) } e.setItemLayout(b, { cx: p, cy: d, r0: C, r: D, startAngle: -A * Math.PI / 180, endAngle: -k * Math.PI / 180, clockwise: A >= k }) } } })) } var YN = { startAngle: 90, clockwise: !0, splitNumber: 12, axisLabel: { rotate: 0 } }, UN = { splitNumber: 5 }, XN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"polar\", e }(mg); function ZN(t, e) { e = e || {}; var n = t.coordinateSystem, i = t.axis, r = {}, o = i.position, a = i.orient, s = n.getRect(), l = [s.x, s.x + s.width, s.y, s.y + s.height], u = { horizontal: { top: l[2], bottom: l[3] }, vertical: { left: l[0], right: l[1] } }; r.position = [\"vertical\" === a ? u.vertical[o] : l[0], \"horizontal\" === a ? u.horizontal[o] : l[3]]; r.rotation = Math.PI / 2 * { horizontal: 0, vertical: 1 }[a]; r.labelDirection = r.tickDirection = r.nameDirection = { top: -1, bottom: 1, right: 1, left: -1 }[o], t.get([\"axisTick\", \"inside\"]) && (r.tickDirection = -r.tickDirection), it(e.labelInside, t.get([\"axisLabel\", \"inside\"])) && (r.labelDirection = -r.labelDirection); var h = e.rotate; return null == h && (h = t.get([\"axisLabel\", \"rotate\"])), r.labelRotation = \"top\" === o ? -h : h, r.z2 = 1, r } var jN = [\"axisLine\", \"axisTickLabel\", \"axisName\"], qN = [\"splitArea\", \"splitLine\"], KN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.axisPointerClass = \"SingleAxisPointer\", n } return n(e, t), e.prototype.render = function (e, n, i, r) { var o = this.group; o.removeAll(); var a = this._axisGroup; this._axisGroup = new Pr; var s = ZN(e), l = new YM(e, s); E(jN, l.add, l), o.add(this._axisGroup), o.add(l.getGroup()), E(qN, (function (t) { e.get([t, \"show\"]) && $N[t](this, this.group, this._axisGroup, e) }), this), Nh(a, this._axisGroup, e), t.prototype.render.call(this, e, n, i, r) }, e.prototype.remove = function () { aI(this) }, e.type = \"singleAxis\", e }(iI), $N = { splitLine: function (t, e, n, i) { var r = i.axis; if (!r.scale.isBlank()) { var o = i.getModel(\"splitLine\"), a = o.getModel(\"lineStyle\"), s = a.get(\"color\"); s = s instanceof Array ? s : [s]; for (var l = a.get(\"width\"), u = i.coordinateSystem.getRect(), h = r.isHorizontal(), c = [], p = 0, d = r.getTicksCoords({ tickModel: o }), f = [], g = [], y = 0; y < d.length; ++y) { var v = r.toGlobalCoord(d[y].coord); h ? (f[0] = v, f[1] = u.y, g[0] = v, g[1] = u.y + u.height) : (f[0] = u.x, f[1] = v, g[0] = u.x + u.width, g[1] = v); var m = new Wu({ shape: { x1: f[0], y1: f[1], x2: g[0], y2: g[1] }, silent: !0 }); Ah(m.shape, l); var x = p++ % s.length; c[x] = c[x] || [], c[x].push(m) } var _ = a.getLineStyle([\"color\"]); for (y = 0; y < c.length; ++y)e.add(Ch(c[y], { style: k({ stroke: s[y % s.length] }, _), silent: !0 })) } }, splitArea: function (t, e, n, i) { oI(t, n, i, i) } }, JN = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.getCoordSysModel = function () { return this }, e.type = \"singleAxis\", e.layoutMode = \"box\", e.defaultOption = { left: \"5%\", top: \"5%\", right: \"5%\", bottom: \"5%\", type: \"value\", position: \"bottom\", orient: \"horizontal\", axisLine: { show: !0, lineStyle: { width: 1, type: \"solid\" } }, tooltip: { show: !0 }, axisTick: { show: !0, length: 6, lineStyle: { width: 1 } }, axisLabel: { show: !0, interval: \"auto\" }, splitLine: { show: !0, lineStyle: { type: \"dashed\", opacity: .2 } } }, e }(Ap); R(JN, g_.prototype); var QN = function (t) { function e(e, n, i, r, o) { var a = t.call(this, e, n, i) || this; return a.type = r || \"value\", a.position = o || \"bottom\", a } return n(e, t), e.prototype.isHorizontal = function () { var t = this.position; return \"top\" === t || \"bottom\" === t }, e.prototype.pointToData = function (t, e) { return this.coordinateSystem.pointToData(t)[0] }, e }(X_), tE = [\"single\"], eE = function () { function t(t, e, n) { this.type = \"single\", this.dimension = \"single\", this.dimensions = tE, this.axisPointerEnabled = !0, this.model = t, this._init(t, e, n) } return t.prototype._init = function (t, e, n) { var i = this.dimension, r = new QN(i, l_(t), [0, 0], t.get(\"type\"), t.get(\"position\")), o = \"category\" === r.type; r.onBand = o && t.get(\"boundaryGap\"), r.inverse = t.get(\"inverse\"), r.orient = t.get(\"orient\"), t.axis = r, r.model = t, r.coordinateSystem = this, this._axis = r }, t.prototype.update = function (t, e) { t.eachSeries((function (t) { if (t.coordinateSystem === this) { var e = t.getData(); E(e.mapDimensionsAll(this.dimension), (function (t) { this._axis.scale.unionExtentFromData(e, t) }), this), s_(this._axis.scale, this._axis.model) } }), this) }, t.prototype.resize = function (t, e) { this._rect = wp({ left: t.get(\"left\"), top: t.get(\"top\"), right: t.get(\"right\"), bottom: t.get(\"bottom\"), width: t.get(\"width\"), height: t.get(\"height\") }, { width: e.getWidth(), height: e.getHeight() }), this._adjustAxis() }, t.prototype.getRect = function () { return this._rect }, t.prototype._adjustAxis = function () { var t = this._rect, e = this._axis, n = e.isHorizontal(), i = n ? [0, t.width] : [0, t.height], r = e.inverse ? 1 : 0; e.setExtent(i[r], i[1 - r]), this._updateAxisTransform(e, n ? t.x : t.y) }, t.prototype._updateAxisTransform = function (t, e) { var n = t.getExtent(), i = n[0] + n[1], r = t.isHorizontal(); t.toGlobalCoord = r ? function (t) { return t + e } : function (t) { return i - t + e }, t.toLocalCoord = r ? function (t) { return t - e } : function (t) { return i - t + e } }, t.prototype.getAxis = function () { return this._axis }, t.prototype.getBaseAxis = function () { return this._axis }, t.prototype.getAxes = function () { return [this._axis] }, t.prototype.getTooltipAxes = function () { return { baseAxes: [this.getAxis()], otherAxes: [] } }, t.prototype.containPoint = function (t) { var e = this.getRect(), n = this.getAxis(); return \"horizontal\" === n.orient ? n.contain(n.toLocalCoord(t[0])) && t[1] >= e.y && t[1] <= e.y + e.height : n.contain(n.toLocalCoord(t[1])) && t[0] >= e.y && t[0] <= e.y + e.height }, t.prototype.pointToData = function (t) { var e = this.getAxis(); return [e.coordToData(e.toLocalCoord(t[\"horizontal\" === e.orient ? 0 : 1]))] }, t.prototype.dataToPoint = function (t) { var e = this.getAxis(), n = this.getRect(), i = [], r = \"horizontal\" === e.orient ? 0 : 1; return t instanceof Array && (t = t[0]), i[r] = e.toGlobalCoord(e.dataToCoord(+t)), i[1 - r] = 0 === r ? n.y + n.height / 2 : n.x + n.width / 2, i }, t.prototype.convertToPixel = function (t, e, n) { return nE(e) === this ? this.dataToPoint(n) : null }, t.prototype.convertFromPixel = function (t, e, n) { return nE(e) === this ? this.pointToData(n) : null }, t }(); function nE(t) { var e = t.seriesModel, n = t.singleAxisModel; return n && n.coordinateSystem || e && e.coordinateSystem } var iE = { create: function (t, e) { var n = []; return t.eachComponent(\"singleAxis\", (function (i, r) { var o = new eE(i, t, e); o.name = \"single_\" + r, o.resize(i, e), i.coordinateSystem = o, n.push(o) })), t.eachSeries((function (t) { if (\"singleAxis\" === t.get(\"coordinateSystem\")) { var e = t.getReferringComponents(\"singleAxis\", Po).models[0]; t.coordinateSystem = e && e.coordinateSystem } })), n }, dimensions: tE }, rE = [\"x\", \"y\"], oE = [\"width\", \"height\"], aE = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.makeElOption = function (t, e, n, i, r) { var o = n.axis, a = o.coordinateSystem, s = uE(a, 1 - lE(o)), l = a.dataToPoint(e)[0], u = i.get(\"type\"); if (u && \"none\" !== u) { var h = GR(i), c = sE[u](o, l, s); c.style = h, t.graphicKey = c.type, t.pointer = c } UR(e, t, ZN(n), n, i, r) }, e.prototype.getHandleTransform = function (t, e, n) { var i = ZN(e, { labelInside: !1 }); i.labelMargin = n.get([\"handle\", \"margin\"]); var r = YR(e.axis, t, i); return { x: r[0], y: r[1], rotation: i.rotation + (i.labelDirection < 0 ? Math.PI : 0) } }, e.prototype.updateHandleTransform = function (t, e, n, i) { var r = n.axis, o = r.coordinateSystem, a = lE(r), s = uE(o, a), l = [t.x, t.y]; l[a] += e[a], l[a] = Math.min(s[1], l[a]), l[a] = Math.max(s[0], l[a]); var u = uE(o, 1 - a), h = (u[1] + u[0]) / 2, c = [h, h]; return c[a] = l[a], { x: l[0], y: l[1], rotation: t.rotation, cursorPoint: c, tooltipOption: { verticalAlign: \"middle\" } } }, e }(NR), sE = { line: function (t, e, n) { return { type: \"Line\", subPixelOptimize: !0, shape: XR([e, n[0]], [e, n[1]], lE(t)) } }, shadow: function (t, e, n) { var i = t.getBandWidth(), r = n[1] - n[0]; return { type: \"Rect\", shape: ZR([e - i / 2, n[0]], [i, r], lE(t)) } } }; function lE(t) { return t.isHorizontal() ? 0 : 1 } function uE(t, e) { var n = t.getRect(); return [n[rE[e]], n[rE[e]] + n[oE[e]]] } var hE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"single\", e }(mg); var cE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (e, n, i) { var r = Tp(e); t.prototype.init.apply(this, arguments), pE(e, r) }, e.prototype.mergeOption = function (e) { t.prototype.mergeOption.apply(this, arguments), pE(this.option, e) }, e.prototype.getCellSize = function () { return this.option.cellSize }, e.type = \"calendar\", e.defaultOption = { z: 2, left: 80, top: 60, cellSize: 20, orient: \"horizontal\", splitLine: { show: !0, lineStyle: { color: \"#000\", width: 1, type: \"solid\" } }, itemStyle: { color: \"#fff\", borderWidth: 1, borderColor: \"#ccc\" }, dayLabel: { show: !0, firstDay: 0, position: \"start\", margin: \"50%\", color: \"#000\" }, monthLabel: { show: !0, position: \"start\", margin: 5, align: \"center\", formatter: null, color: \"#000\" }, yearLabel: { show: !0, position: null, margin: 30, formatter: null, color: \"#ccc\", fontFamily: \"sans-serif\", fontWeight: \"bolder\", fontSize: 20 } }, e }(Ap); function pE(t, e) { var n, i = t.cellSize; 1 === (n = Y(i) ? i : t.cellSize = [i, i]).length && (n[1] = n[0]); var r = z([0, 1], (function (t) { return function (t, e) { return null != t[xp[e][0]] || null != t[xp[e][1]] && null != t[xp[e][2]] }(e, t) && (n[t] = \"auto\"), null != n[t] && \"auto\" !== n[t] })); Ip(t, e, { type: \"box\", ignoreSize: r }) } var dE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { var i = this.group; i.removeAll(); var r = t.coordinateSystem, o = r.getRangeInfo(), a = r.getOrient(), s = e.getLocaleModel(); this._renderDayRect(t, o, i), this._renderLines(t, o, a, i), this._renderYearText(t, o, a, i), this._renderMonthText(t, s, a, i), this._renderWeekText(t, s, o, a, i) }, e.prototype._renderDayRect = function (t, e, n) { for (var i = t.coordinateSystem, r = t.getModel(\"itemStyle\").getItemStyle(), o = i.getCellWidth(), a = i.getCellHeight(), s = e.start.time; s <= e.end.time; s = i.getNextNDay(s, 1).time) { var l = i.dataToRect([s], !1).tl, u = new Ps({ shape: { x: l[0], y: l[1], width: o, height: a }, cursor: \"default\", style: r }); n.add(u) } }, e.prototype._renderLines = function (t, e, n, i) { var r = this, o = t.coordinateSystem, a = t.getModel([\"splitLine\", \"lineStyle\"]).getLineStyle(), s = t.get([\"splitLine\", \"show\"]), l = a.lineWidth; this._tlpoints = [], this._blpoints = [], this._firstDayOfMonth = [], this._firstDayPoints = []; for (var u = e.start, h = 0; u.time <= e.end.time; h++) { p(u.formatedDate), 0 === h && (u = o.getDateInfo(e.start.y + \"-\" + e.start.m)); var c = u.date; c.setMonth(c.getMonth() + 1), u = o.getDateInfo(c) } function p(e) { r._firstDayOfMonth.push(o.getDateInfo(e)), r._firstDayPoints.push(o.dataToRect([e], !1).tl); var l = r._getLinePointsOfOneWeek(t, e, n); r._tlpoints.push(l[0]), r._blpoints.push(l[l.length - 1]), s && r._drawSplitline(l, a, i) } p(o.getNextNDay(e.end.time, 1).formatedDate), s && this._drawSplitline(r._getEdgesPoints(r._tlpoints, l, n), a, i), s && this._drawSplitline(r._getEdgesPoints(r._blpoints, l, n), a, i) }, e.prototype._getEdgesPoints = function (t, e, n) { var i = [t[0].slice(), t[t.length - 1].slice()], r = \"horizontal\" === n ? 0 : 1; return i[0][r] = i[0][r] - e / 2, i[1][r] = i[1][r] + e / 2, i }, e.prototype._drawSplitline = function (t, e, n) { var i = new Bu({ z2: 20, shape: { points: t }, style: e }); n.add(i) }, e.prototype._getLinePointsOfOneWeek = function (t, e, n) { for (var i = t.coordinateSystem, r = i.getDateInfo(e), o = [], a = 0; a < 7; a++) { var s = i.getNextNDay(r.time, a), l = i.dataToRect([s.time], !1); o[2 * s.day] = l.tl, o[2 * s.day + 1] = l[\"horizontal\" === n ? \"bl\" : \"tr\"] } return o }, e.prototype._formatterLabel = function (t, e) { return X(t) && t ? (n = t, E(e, (function (t, e) { n = n.replace(\"{\" + e + \"}\", i ? ee(t) : t) })), n) : U(t) ? t(e) : e.nameMap; var n, i }, e.prototype._yearTextPositionControl = function (t, e, n, i, r) { var o = e[0], a = e[1], s = [\"center\", \"bottom\"]; \"bottom\" === i ? (a += r, s = [\"center\", \"top\"]) : \"left\" === i ? o -= r : \"right\" === i ? (o += r, s = [\"center\", \"top\"]) : a -= r; var l = 0; return \"left\" !== i && \"right\" !== i || (l = Math.PI / 2), { rotation: l, x: o, y: a, style: { align: s[0], verticalAlign: s[1] } } }, e.prototype._renderYearText = function (t, e, n, i) { var r = t.getModel(\"yearLabel\"); if (r.get(\"show\")) { var o = r.get(\"margin\"), a = r.get(\"position\"); a || (a = \"horizontal\" !== n ? \"top\" : \"left\"); var s = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]], l = (s[0][0] + s[1][0]) / 2, u = (s[0][1] + s[1][1]) / 2, h = \"horizontal\" === n ? 0 : 1, c = { top: [l, s[h][1]], bottom: [l, s[1 - h][1]], left: [s[1 - h][0], u], right: [s[h][0], u] }, p = e.start.y; +e.end.y > +e.start.y && (p = p + \"-\" + e.end.y); var d = r.get(\"formatter\"), f = { start: e.start.y, end: e.end.y, nameMap: p }, g = this._formatterLabel(d, f), y = new Ns({ z2: 30, style: $h(r, { text: g }) }); y.attr(this._yearTextPositionControl(y, c[a], n, a, o)), i.add(y) } }, e.prototype._monthTextPositionControl = function (t, e, n, i, r) { var o = \"left\", a = \"top\", s = t[0], l = t[1]; return \"horizontal\" === n ? (l += r, e && (o = \"center\"), \"start\" === i && (a = \"bottom\")) : (s += r, e && (a = \"middle\"), \"start\" === i && (o = \"right\")), { x: s, y: l, align: o, verticalAlign: a } }, e.prototype._renderMonthText = function (t, e, n, i) { var r = t.getModel(\"monthLabel\"); if (r.get(\"show\")) { var o = r.get(\"nameMap\"), a = r.get(\"margin\"), s = r.get(\"position\"), l = r.get(\"align\"), u = [this._tlpoints, this._blpoints]; o && !X(o) || (o && (e = kc(o) || e), o = e.get([\"time\", \"monthAbbr\"]) || []); var h = \"start\" === s ? 0 : 1, c = \"horizontal\" === n ? 0 : 1; a = \"start\" === s ? -a : a; for (var p = \"center\" === l, d = 0; d < u[h].length - 1; d++) { var f = u[h][d].slice(), g = this._firstDayOfMonth[d]; if (p) { var y = this._firstDayPoints[d]; f[c] = (y[c] + u[0][d + 1][c]) / 2 } var v = r.get(\"formatter\"), m = o[+g.m - 1], x = { yyyy: g.y, yy: (g.y + \"\").slice(2), MM: g.m, M: +g.m, nameMap: m }, _ = this._formatterLabel(v, x), b = new Ns({ z2: 30, style: A($h(r, { text: _ }), this._monthTextPositionControl(f, p, n, s, a)) }); i.add(b) } } }, e.prototype._weekTextPositionControl = function (t, e, n, i, r) { var o = \"center\", a = \"middle\", s = t[0], l = t[1], u = \"start\" === n; return \"horizontal\" === e ? (s = s + i + (u ? 1 : -1) * r[0] / 2, o = u ? \"right\" : \"left\") : (l = l + i + (u ? 1 : -1) * r[1] / 2, a = u ? \"bottom\" : \"top\"), { x: s, y: l, align: o, verticalAlign: a } }, e.prototype._renderWeekText = function (t, e, n, i, r) { var o = t.getModel(\"dayLabel\"); if (o.get(\"show\")) { var a = t.coordinateSystem, s = o.get(\"position\"), l = o.get(\"nameMap\"), u = o.get(\"margin\"), h = a.getFirstDayOfWeek(); if (!l || X(l)) l && (e = kc(l) || e), l = e.get([\"time\", \"dayOfWeekShort\"]) || z(e.get([\"time\", \"dayOfWeekAbbr\"]), (function (t) { return t[0] })); var c = a.getNextNDay(n.end.time, 7 - n.lweek).time, p = [a.getCellWidth(), a.getCellHeight()]; u = Gr(u, Math.min(p[1], p[0])), \"start\" === s && (c = a.getNextNDay(n.start.time, -(7 + n.fweek)).time, u = -u); for (var d = 0; d < 7; d++) { var f, g = a.getNextNDay(c, d), y = a.dataToRect([g.time], !1).center; f = Math.abs((d + h) % 7); var v = new Ns({ z2: 30, style: A($h(o, { text: l[f] }), this._weekTextPositionControl(y, i, s, u, p)) }); r.add(v) } } }, e.type = \"calendar\", e }(mg), fE = 864e5, gE = function () { function t(e, n, i) { this.type = \"calendar\", this.dimensions = t.dimensions, this.getDimensionsInfo = t.getDimensionsInfo, this._model = e } return t.getDimensionsInfo = function () { return [{ name: \"time\", type: \"time\" }, \"value\"] }, t.prototype.getRangeInfo = function () { return this._rangeInfo }, t.prototype.getModel = function () { return this._model }, t.prototype.getRect = function () { return this._rect }, t.prototype.getCellWidth = function () { return this._sw }, t.prototype.getCellHeight = function () { return this._sh }, t.prototype.getOrient = function () { return this._orient }, t.prototype.getFirstDayOfWeek = function () { return this._firstDayOfWeek }, t.prototype.getDateInfo = function (t) { var e = (t = Qr(t)).getFullYear(), n = t.getMonth() + 1, i = n < 10 ? \"0\" + n : \"\" + n, r = t.getDate(), o = r < 10 ? \"0\" + r : \"\" + r, a = t.getDay(); return { y: e + \"\", m: i, d: o, day: a = Math.abs((a + 7 - this.getFirstDayOfWeek()) % 7), time: t.getTime(), formatedDate: e + \"-\" + i + \"-\" + o, date: t } }, t.prototype.getNextNDay = function (t, e) { return 0 === (e = e || 0) || (t = new Date(this.getDateInfo(t).time)).setDate(t.getDate() + e), this.getDateInfo(t) }, t.prototype.update = function (t, e) { this._firstDayOfWeek = +this._model.getModel(\"dayLabel\").get(\"firstDay\"), this._orient = this._model.get(\"orient\"), this._lineWidth = this._model.getModel(\"itemStyle\").getItemStyle().lineWidth || 0, this._rangeInfo = this._getRangeInfo(this._initRangeOption()); var n = this._rangeInfo.weeks || 1, i = [\"width\", \"height\"], r = this._model.getCellSize().slice(), o = this._model.getBoxLayoutParams(), a = \"horizontal\" === this._orient ? [n, 7] : [7, n]; E([0, 1], (function (t) { u(r, t) && (o[i[t]] = r[t] * a[t]) })); var s = { width: e.getWidth(), height: e.getHeight() }, l = this._rect = wp(o, s); function u(t, e) { return null != t[e] && \"auto\" !== t[e] } E([0, 1], (function (t) { u(r, t) || (r[t] = l[i[t]] / a[t]) })), this._sw = r[0], this._sh = r[1] }, t.prototype.dataToPoint = function (t, e) { Y(t) && (t = t[0]), null == e && (e = !0); var n = this.getDateInfo(t), i = this._rangeInfo, r = n.formatedDate; if (e && !(n.time >= i.start.time && n.time < i.end.time + fE)) return [NaN, NaN]; var o = n.day, a = this._getRangeInfo([i.start.time, r]).nthWeek; return \"vertical\" === this._orient ? [this._rect.x + o * this._sw + this._sw / 2, this._rect.y + a * this._sh + this._sh / 2] : [this._rect.x + a * this._sw + this._sw / 2, this._rect.y + o * this._sh + this._sh / 2] }, t.prototype.pointToData = function (t) { var e = this.pointToDate(t); return e && e.time }, t.prototype.dataToRect = function (t, e) { var n = this.dataToPoint(t, e); return { contentShape: { x: n[0] - (this._sw - this._lineWidth) / 2, y: n[1] - (this._sh - this._lineWidth) / 2, width: this._sw - this._lineWidth, height: this._sh - this._lineWidth }, center: n, tl: [n[0] - this._sw / 2, n[1] - this._sh / 2], tr: [n[0] + this._sw / 2, n[1] - this._sh / 2], br: [n[0] + this._sw / 2, n[1] + this._sh / 2], bl: [n[0] - this._sw / 2, n[1] + this._sh / 2] } }, t.prototype.pointToDate = function (t) { var e = Math.floor((t[0] - this._rect.x) / this._sw) + 1, n = Math.floor((t[1] - this._rect.y) / this._sh) + 1, i = this._rangeInfo.range; return \"vertical\" === this._orient ? this._getDateByWeeksAndDay(n, e - 1, i) : this._getDateByWeeksAndDay(e, n - 1, i) }, t.prototype.convertToPixel = function (t, e, n) { var i = yE(e); return i === this ? i.dataToPoint(n) : null }, t.prototype.convertFromPixel = function (t, e, n) { var i = yE(e); return i === this ? i.pointToData(n) : null }, t.prototype.containPoint = function (t) { return console.warn(\"Not implemented.\"), !1 }, t.prototype._initRangeOption = function () { var t, e = this._model.get(\"range\"); if (Y(e) && 1 === e.length && (e = e[0]), Y(e)) t = e; else { var n = e.toString(); if (/^\\d{4}$/.test(n) && (t = [n + \"-01-01\", n + \"-12-31\"]), /^\\d{4}[\\/|-]\\d{1,2}$/.test(n)) { var i = this.getDateInfo(n), r = i.date; r.setMonth(r.getMonth() + 1); var o = this.getNextNDay(r, -1); t = [i.formatedDate, o.formatedDate] } /^\\d{4}[\\/|-]\\d{1,2}[\\/|-]\\d{1,2}$/.test(n) && (t = [n, n]) } if (!t) return e; var a = this._getRangeInfo(t); return a.start.time > a.end.time && t.reverse(), t }, t.prototype._getRangeInfo = function (t) { var e, n = [this.getDateInfo(t[0]), this.getDateInfo(t[1])]; n[0].time > n[1].time && (e = !0, n.reverse()); var i = Math.floor(n[1].time / fE) - Math.floor(n[0].time / fE) + 1, r = new Date(n[0].time), o = r.getDate(), a = n[1].date.getDate(); r.setDate(o + i - 1); var s = r.getDate(); if (s !== a) for (var l = r.getTime() - n[1].time > 0 ? 1 : -1; (s = r.getDate()) !== a && (r.getTime() - n[1].time) * l > 0;)i -= l, r.setDate(s - l); var u = Math.floor((i + n[0].day + 6) / 7), h = e ? 1 - u : u - 1; return e && n.reverse(), { range: [n[0].formatedDate, n[1].formatedDate], start: n[0], end: n[1], allDay: i, weeks: u, nthWeek: h, fweek: n[0].day, lweek: n[1].day } }, t.prototype._getDateByWeeksAndDay = function (t, e, n) { var i = this._getRangeInfo(n); if (t > i.weeks || 0 === t && e < i.fweek || t === i.weeks && e > i.lweek) return null; var r = 7 * (t - 1) - i.fweek + e, o = new Date(i.start.time); return o.setDate(+i.start.d + r), this.getDateInfo(o) }, t.create = function (e, n) { var i = []; return e.eachComponent(\"calendar\", (function (r) { var o = new t(r, e, n); i.push(o), r.coordinateSystem = o })), e.eachSeries((function (t) { \"calendar\" === t.get(\"coordinateSystem\") && (t.coordinateSystem = i[t.get(\"calendarIndex\") || 0]) })), i }, t.dimensions = [\"time\", \"value\"], t }(); function yE(t) { var e = t.calendarModel, n = t.seriesModel; return e ? e.coordinateSystem : n ? n.coordinateSystem : null } function vE(t, e) { var n; return E(e, (function (e) { null != t[e] && \"auto\" !== t[e] && (n = !0) })), n } var mE = [\"transition\", \"enterFrom\", \"leaveTo\"], xE = mE.concat([\"enterAnimation\", \"updateAnimation\", \"leaveAnimation\"]); function _E(t, e, n) { if (n && (!t[n] && e[n] && (t[n] = {}), t = t[n], e = e[n]), t && e) for (var i = n ? mE : xE, r = 0; r < i.length; r++) { var o = i[r]; null == t[o] && null != e[o] && (t[o] = e[o]) } } var bE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.preventAutoZ = !0, n } return n(e, t), e.prototype.mergeOption = function (e, n) { var i = this.option.elements; this.option.elements = null, t.prototype.mergeOption.call(this, e, n), this.option.elements = i }, e.prototype.optionUpdated = function (t, e) { var n = this.option, i = (e ? n : t).elements, r = n.elements = e ? [] : n.elements, o = []; this._flatten(i, o, null); var a = bo(r, o, \"normalMerge\"), s = this._elOptionsToUpdate = []; E(a, (function (t, e) { var n = t.newOption; n && (s.push(n), function (t, e) { var n = t.existing; if (e.id = t.keyInfo.id, !e.type && n && (e.type = n.type), null == e.parentId) { var i = e.parentOption; i ? e.parentId = i.id : n && (e.parentId = n.parentId) } e.parentOption = null }(t, n), function (t, e, n) { var i = A({}, n), r = t[e], o = n.$action || \"merge\"; \"merge\" === o ? r ? (C(r, i, !0), Ip(r, i, { ignoreSize: !0 }), Cp(n, r), _E(n, r), _E(n, r, \"shape\"), _E(n, r, \"style\"), _E(n, r, \"extra\"), n.clipPath = r.clipPath) : t[e] = i : \"replace\" === o ? t[e] = i : \"remove\" === o && r && (t[e] = null) }(r, e, n), function (t, e) { if (t && (t.hv = e.hv = [vE(e, [\"left\", \"right\"]), vE(e, [\"top\", \"bottom\"])], \"group\" === t.type)) { var n = t, i = e; null == n.width && (n.width = i.width = 0), null == n.height && (n.height = i.height = 0) } }(r[e], n)) }), this), n.elements = B(r, (function (t) { return t && delete t.$action, null != t })) }, e.prototype._flatten = function (t, e, n) { E(t, (function (t) { if (t) { n && (t.parentOption = n), e.push(t); var i = t.children; i && i.length && this._flatten(i, e, t), delete t.children } }), this) }, e.prototype.useElOptionsToUpdate = function () { var t = this._elOptionsToUpdate; return this._elOptionsToUpdate = null, t }, e.type = \"graphic\", e.defaultOption = { elements: [] }, e }(Ap), wE = { path: null, compoundPath: null, group: Pr, image: Is, text: Ns }, SE = Do(), ME = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function () { this._elMap = ft() }, e.prototype.render = function (t, e, n) { t !== this._lastGraphicModel && this._clear(), this._lastGraphicModel = t, this._updateElements(t), this._relocate(t, n) }, e.prototype._updateElements = function (t) { var e = t.useElOptionsToUpdate(); if (e) { var n = this._elMap, i = this.group, r = t.get(\"z\"), o = t.get(\"zlevel\"); E(e, (function (e) { var a = Mo(e.id, null), s = null != a ? n.get(a) : null, l = Mo(e.parentId, null), u = null != l ? n.get(l) : i, h = e.type, c = e.style; \"text\" === h && c && e.hv && e.hv[1] && (c.textVerticalAlign = c.textBaseline = c.verticalAlign = c.align = null); var p = e.textContent, d = e.textConfig; if (c && PO(c, h, !!d, !!p)) { var f = OO(c, h, !0); !d && f.textConfig && (d = e.textConfig = f.textConfig), !p && f.textContent && (p = f.textContent) } var g = function (t) { return t = A({}, t), E([\"id\", \"parentId\", \"$action\", \"hv\", \"bounding\", \"textContent\", \"clipPath\"].concat(mp), (function (e) { delete t[e] })), t }(e); var y = e.$action || \"merge\", v = \"merge\" === y, m = \"replace\" === y; if (v) { var x = s; (T = !s) ? x = TE(a, u, e.type, n) : (x && (SE(x).isNew = !1), tR(x)), x && (WO(x, g, t, { isInit: T }), DE(x, e, r, o)) } else if (m) { CE(s, e, n, t); var _ = TE(a, u, e.type, n); _ && (WO(_, g, t, { isInit: !0 }), DE(_, e, r, o)) } else \"remove\" === y && (HO(s, e), CE(s, e, n, t)); var b = n.get(a); if (b && p) if (v) { var w = b.getTextContent(); w ? w.attr(p) : b.setTextContent(new Ns(p)) } else m && b.setTextContent(new Ns(p)); if (b) { var S = e.clipPath; if (S) { var M = S.type, I = void 0, T = !1; if (v) { var C = b.getClipPath(); I = (T = !C || SE(C).type !== M) ? IE(M) : C } else m && (T = !0, I = IE(M)); b.setClipPath(I), WO(I, S, t, { isInit: T }), eR(I, S.keyframeAnimation, t) } var D = SE(b); b.setTextConfig(d), D.option = e, function (t, e, n) { var i = js(t).eventData; t.silent || t.ignore || i || (i = js(t).eventData = { componentType: \"graphic\", componentIndex: e.componentIndex, name: t.name }); i && (i.info = n.info) }(b, t, e), Wh({ el: b, componentModel: t, itemName: b.name, itemTooltipOption: e.tooltip }), eR(b, e.keyframeAnimation, t) } })) } }, e.prototype._relocate = function (t, e) { for (var n = t.option.elements, i = this.group, r = this._elMap, o = e.getWidth(), a = e.getHeight(), s = [\"x\", \"y\"], l = 0; l < n.length; l++) { if ((f = null != (d = Mo((p = n[l]).id, null)) ? r.get(d) : null) && f.isGroup) { var u = (g = f.parent) === i, h = SE(f), c = SE(g); h.width = Gr(h.option.width, u ? o : c.width) || 0, h.height = Gr(h.option.height, u ? a : c.height) || 0 } } for (l = n.length - 1; l >= 0; l--) { var p, d, f; if (f = null != (d = Mo((p = n[l]).id, null)) ? r.get(d) : null) { var g = f.parent, y = (c = SE(g), {}), v = Sp(f, p, g === i ? { width: o, height: a } : { width: c.width, height: c.height }, null, { hv: p.hv, boundingMode: p.bounding }, y); if (!SE(f).isNew && v) { for (var m = p.transition, x = {}, _ = 0; _ < s.length; _++) { var b = s[_], w = y[b]; m && (UO(m) || P(m, b) >= 0) ? x[b] = w : f[b] = w } uh(f, x, t, 0) } else f.attr(y) } } }, e.prototype._clear = function () { var t = this, e = this._elMap; e.each((function (n) { CE(n, SE(n).option, e, t._lastGraphicModel) })), this._elMap = ft() }, e.prototype.dispose = function () { this._clear() }, e.type = \"graphic\", e }(mg); function IE(t) { var e = mt(wE, t) ? wE[t] : Sh(t); var n = new e({}); return SE(n).type = t, n } function TE(t, e, n, i) { var r = IE(n); return e.add(r), i.set(t, r), SE(r).id = t, SE(r).isNew = !0, r } function CE(t, e, n, i) { t && t.parent && (\"group\" === t.type && t.traverse((function (t) { CE(t, e, n, i) })), YO(t, e, i), n.removeKey(SE(t).id)) } function DE(t, e, n, i) { t.isGroup || E([[\"cursor\", ma.prototype.cursor], [\"zlevel\", i || 0], [\"z\", n || 0], [\"z2\", 0]], (function (n) { var i = n[0]; mt(e, i) ? t[i] = rt(e[i], n[1]) : null == t[i] && (t[i] = n[1]) })), E(G(e), (function (n) { if (0 === n.indexOf(\"on\")) { var i = e[n]; t[n] = U(i) ? i : null } })), mt(e, \"draggable\") && (t.draggable = e.draggable), null != e.name && (t.name = e.name), null != e.id && (t.id = e.id) } var AE = [\"x\", \"y\", \"radius\", \"angle\", \"single\"], kE = [\"cartesian2d\", \"polar\", \"singleAxis\"]; function LE(t) { return t + \"Axis\" } function PE(t, e) { var n, i = ft(), r = [], o = ft(); t.eachComponent({ mainType: \"dataZoom\", query: e }, (function (t) { o.get(t.uid) || s(t) })); do { n = !1, t.eachComponent(\"dataZoom\", a) } while (n); function a(t) { !o.get(t.uid) && function (t) { var e = !1; return t.eachTargetAxis((function (t, n) { var r = i.get(t); r && r[n] && (e = !0) })), e }(t) && (s(t), n = !0) } function s(t) { o.set(t.uid, !0), r.push(t), t.eachTargetAxis((function (t, e) { (i.get(t) || i.set(t, []))[e] = !0 })) } return r } function OE(t) { var e = t.ecModel, n = { infoList: [], infoMap: ft() }; return t.eachTargetAxis((function (t, i) { var r = e.getComponent(LE(t), i); if (r) { var o = r.getCoordSysModel(); if (o) { var a = o.uid, s = n.infoMap.get(a); s || (s = { model: o, axisModels: [] }, n.infoList.push(s), n.infoMap.set(a, s)), s.axisModels.push(r) } } })), n } var RE = function () { function t() { this.indexList = [], this.indexMap = [] } return t.prototype.add = function (t) { this.indexMap[t] || (this.indexList.push(t), this.indexMap[t] = !0) }, t }(), NE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._autoThrottle = !0, n._noTarget = !0, n._rangePropMode = [\"percent\", \"percent\"], n } return n(e, t), e.prototype.init = function (t, e, n) { var i = EE(t); this.settledOption = i, this.mergeDefaultAndTheme(t, n), this._doInit(i) }, e.prototype.mergeOption = function (t) { var e = EE(t); C(this.option, t, !0), C(this.settledOption, e, !0), this._doInit(e) }, e.prototype._doInit = function (t) { var e = this.option; this._setDefaultThrottle(t), this._updateRangeUse(t); var n = this.settledOption; E([[\"start\", \"startValue\"], [\"end\", \"endValue\"]], (function (t, i) { \"value\" === this._rangePropMode[i] && (e[t[0]] = n[t[0]] = null) }), this), this._resetTarget() }, e.prototype._resetTarget = function () { var t = this.get(\"orient\", !0), e = this._targetAxisInfoMap = ft(); this._fillSpecifiedTargetAxis(e) ? this._orient = t || this._makeAutoOrientByTargetAxis() : (this._orient = t || \"horizontal\", this._fillAutoTargetAxisByOrient(e, this._orient)), this._noTarget = !0, e.each((function (t) { t.indexList.length && (this._noTarget = !1) }), this) }, e.prototype._fillSpecifiedTargetAxis = function (t) { var e = !1; return E(AE, (function (n) { var i = this.getReferringComponents(LE(n), Oo); if (i.specified) { e = !0; var r = new RE; E(i.models, (function (t) { r.add(t.componentIndex) })), t.set(n, r) } }), this), e }, e.prototype._fillAutoTargetAxisByOrient = function (t, e) { var n = this.ecModel, i = !0; if (i) { var r = \"vertical\" === e ? \"y\" : \"x\"; o(n.findComponents({ mainType: r + \"Axis\" }), r) } i && o(n.findComponents({ mainType: \"singleAxis\", filter: function (t) { return t.get(\"orient\", !0) === e } }), \"single\"); function o(e, n) { var r = e[0]; if (r) { var o = new RE; if (o.add(r.componentIndex), t.set(n, o), i = !1, \"x\" === n || \"y\" === n) { var a = r.getReferringComponents(\"grid\", Po).models[0]; a && E(e, (function (t) { r.componentIndex !== t.componentIndex && a === t.getReferringComponents(\"grid\", Po).models[0] && o.add(t.componentIndex) })) } } } i && E(AE, (function (e) { if (i) { var r = n.findComponents({ mainType: LE(e), filter: function (t) { return \"category\" === t.get(\"type\", !0) } }); if (r[0]) { var o = new RE; o.add(r[0].componentIndex), t.set(e, o), i = !1 } } }), this) }, e.prototype._makeAutoOrientByTargetAxis = function () { var t; return this.eachTargetAxis((function (e) { !t && (t = e) }), this), \"y\" === t ? \"vertical\" : \"horizontal\" }, e.prototype._setDefaultThrottle = function (t) { if (t.hasOwnProperty(\"throttle\") && (this._autoThrottle = !1), this._autoThrottle) { var e = this.ecModel.option; this.option.throttle = e.animation && e.animationDurationUpdate > 0 ? 100 : 20 } }, e.prototype._updateRangeUse = function (t) { var e = this._rangePropMode, n = this.get(\"rangeMode\"); E([[\"start\", \"startValue\"], [\"end\", \"endValue\"]], (function (i, r) { var o = null != t[i[0]], a = null != t[i[1]]; o && !a ? e[r] = \"percent\" : !o && a ? e[r] = \"value\" : n ? e[r] = n[r] : o && (e[r] = \"percent\") })) }, e.prototype.noTarget = function () { return this._noTarget }, e.prototype.getFirstTargetAxisModel = function () { var t; return this.eachTargetAxis((function (e, n) { null == t && (t = this.ecModel.getComponent(LE(e), n)) }), this), t }, e.prototype.eachTargetAxis = function (t, e) { this._targetAxisInfoMap.each((function (n, i) { E(n.indexList, (function (n) { t.call(e, i, n) })) })) }, e.prototype.getAxisProxy = function (t, e) { var n = this.getAxisModel(t, e); if (n) return n.__dzAxisProxy }, e.prototype.getAxisModel = function (t, e) { var n = this._targetAxisInfoMap.get(t); if (n && n.indexMap[e]) return this.ecModel.getComponent(LE(t), e) }, e.prototype.setRawRange = function (t) { var e = this.option, n = this.settledOption; E([[\"start\", \"startValue\"], [\"end\", \"endValue\"]], (function (i) { null == t[i[0]] && null == t[i[1]] || (e[i[0]] = n[i[0]] = t[i[0]], e[i[1]] = n[i[1]] = t[i[1]]) }), this), this._updateRangeUse(t) }, e.prototype.setCalculatedRange = function (t) { var e = this.option; E([\"start\", \"startValue\", \"end\", \"endValue\"], (function (n) { e[n] = t[n] })) }, e.prototype.getPercentRange = function () { var t = this.findRepresentativeAxisProxy(); if (t) return t.getDataPercentWindow() }, e.prototype.getValueRange = function (t, e) { if (null != t || null != e) return this.getAxisProxy(t, e).getDataValueWindow(); var n = this.findRepresentativeAxisProxy(); return n ? n.getDataValueWindow() : void 0 }, e.prototype.findRepresentativeAxisProxy = function (t) { if (t) return t.__dzAxisProxy; for (var e, n = this._targetAxisInfoMap.keys(), i = 0; i < n.length; i++)for (var r = n[i], o = this._targetAxisInfoMap.get(r), a = 0; a < o.indexList.length; a++) { var s = this.getAxisProxy(r, o.indexList[a]); if (s.hostedBy(this)) return s; e || (e = s) } return e }, e.prototype.getRangePropMode = function () { return this._rangePropMode.slice() }, e.prototype.getOrient = function () { return this._orient }, e.type = \"dataZoom\", e.dependencies = [\"xAxis\", \"yAxis\", \"radiusAxis\", \"angleAxis\", \"singleAxis\", \"series\", \"toolbox\"], e.defaultOption = { z: 4, filterMode: \"filter\", start: 0, end: 100 }, e }(Ap); function EE(t) { var e = {}; return E([\"start\", \"end\", \"startValue\", \"endValue\", \"throttle\"], (function (n) { t.hasOwnProperty(n) && (e[n] = t[n]) })), e } var zE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"dataZoom.select\", e }(NE), VE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n, i) { this.dataZoomModel = t, this.ecModel = e, this.api = n }, e.type = \"dataZoom\", e }(mg), BE = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"dataZoom.select\", e }(VE), FE = E, GE = Hr, WE = function () { function t(t, e, n, i) { this._dimName = t, this._axisIndex = e, this.ecModel = i, this._dataZoomModel = n } return t.prototype.hostedBy = function (t) { return this._dataZoomModel === t }, t.prototype.getDataValueWindow = function () { return this._valueWindow.slice() }, t.prototype.getDataPercentWindow = function () { return this._percentWindow.slice() }, t.prototype.getTargetSeriesModels = function () { var t = []; return this.ecModel.eachSeries((function (e) { if (function (t) { var e = t.get(\"coordinateSystem\"); return P(kE, e) >= 0 }(e)) { var n = LE(this._dimName), i = e.getReferringComponents(n, Po).models[0]; i && this._axisIndex === i.componentIndex && t.push(e) } }), this), t }, t.prototype.getAxisModel = function () { return this.ecModel.getComponent(this._dimName + \"Axis\", this._axisIndex) }, t.prototype.getMinMaxSpan = function () { return T(this._minMaxSpan) }, t.prototype.calculateDataWindow = function (t) { var e, n = this._dataExtent, i = this.getAxisModel().axis.scale, r = this._dataZoomModel.getRangePropMode(), o = [0, 100], a = [], s = []; FE([\"start\", \"end\"], (function (l, u) { var h = t[l], c = t[l + \"Value\"]; \"percent\" === r[u] ? (null == h && (h = o[u]), c = i.parse(Fr(h, o, n))) : (e = !0, h = Fr(c = null == c ? n[u] : i.parse(c), n, o)), s[u] = c, a[u] = h })), GE(s), GE(a); var l = this._minMaxSpan; function u(t, e, n, r, o) { var a = o ? \"Span\" : \"ValueSpan\"; dk(0, t, n, \"all\", l[\"min\" + a], l[\"max\" + a]); for (var s = 0; s < 2; s++)e[s] = Fr(t[s], n, r, !0), o && (e[s] = i.parse(e[s])) } return e ? u(s, a, n, o, !1) : u(a, s, o, n, !0), { valueWindow: s, percentWindow: a } }, t.prototype.reset = function (t) { if (t === this._dataZoomModel) { var e = this.getTargetSeriesModels(); this._dataExtent = function (t, e, n) { var i = [1 / 0, -1 / 0]; FE(n, (function (t) { !function (t, e, n) { e && E(f_(e, n), (function (n) { var i = e.getApproximateExtent(n); i[0] < t[0] && (t[0] = i[0]), i[1] > t[1] && (t[1] = i[1]) })) }(i, t.getData(), e) })); var r = t.getAxisModel(), o = r_(r.axis.scale, r, i).calculate(); return [o.min, o.max] }(this, this._dimName, e), this._updateMinMaxSpan(); var n = this.calculateDataWindow(t.settledOption); this._valueWindow = n.valueWindow, this._percentWindow = n.percentWindow, this._setAxisModel() } }, t.prototype.filterData = function (t, e) { if (t === this._dataZoomModel) { var n = this._dimName, i = this.getTargetSeriesModels(), r = t.get(\"filterMode\"), o = this._valueWindow; \"none\" !== r && FE(i, (function (t) { var e = t.getData(), i = e.mapDimensionsAll(n); if (i.length) { if (\"weakFilter\" === r) { var a = e.getStore(), s = z(i, (function (t) { return e.getDimensionIndex(t) }), e); e.filterSelf((function (t) { for (var e, n, r, l = 0; l < i.length; l++) { var u = a.get(s[l], t), h = !isNaN(u), c = u < o[0], p = u > o[1]; if (h && !c && !p) return !0; h && (r = !0), c && (e = !0), p && (n = !0) } return r && e && n })) } else FE(i, (function (n) { if (\"empty\" === r) t.setData(e = e.map(n, (function (t) { return function (t) { return t >= o[0] && t <= o[1] }(t) ? t : NaN }))); else { var i = {}; i[n] = o, e.selectRange(i) } })); FE(i, (function (t) { e.setApproximateExtent(o, t) })) } })) } }, t.prototype._updateMinMaxSpan = function () { var t = this._minMaxSpan = {}, e = this._dataZoomModel, n = this._dataExtent; FE([\"min\", \"max\"], (function (i) { var r = e.get(i + \"Span\"), o = e.get(i + \"ValueSpan\"); null != o && (o = this.getAxisModel().axis.scale.parse(o)), null != o ? r = Fr(n[0] + o, n, [0, 100], !0) : null != r && (o = Fr(r, [0, 100], n, !0) - n[0]), t[i + \"Span\"] = r, t[i + \"ValueSpan\"] = o }), this) }, t.prototype._setAxisModel = function () { var t = this.getAxisModel(), e = this._percentWindow, n = this._valueWindow; if (e) { var i = Xr(n, [0, 500]); i = Math.min(i, 20); var r = t.axis.scale.rawExtentInfo; 0 !== e[0] && r.setDeterminedMinMax(\"min\", +n[0].toFixed(i)), 100 !== e[1] && r.setDeterminedMinMax(\"max\", +n[1].toFixed(i)), r.freeze() } }, t }(); var HE = { getTargetSeries: function (t) { function e(e) { t.eachComponent(\"dataZoom\", (function (n) { n.eachTargetAxis((function (i, r) { var o = t.getComponent(LE(i), r); e(i, r, o, n) })) })) } e((function (t, e, n, i) { n.__dzAxisProxy = null })); var n = []; e((function (e, i, r, o) { r.__dzAxisProxy || (r.__dzAxisProxy = new WE(e, i, o, t), n.push(r.__dzAxisProxy)) })); var i = ft(); return E(n, (function (t) { E(t.getTargetSeriesModels(), (function (t) { i.set(t.uid, t) })) })), i }, overallReset: function (t, e) { t.eachComponent(\"dataZoom\", (function (t) { t.eachTargetAxis((function (e, n) { t.getAxisProxy(e, n).reset(t) })), t.eachTargetAxis((function (n, i) { t.getAxisProxy(n, i).filterData(t, e) })) })), t.eachComponent(\"dataZoom\", (function (t) { var e = t.findRepresentativeAxisProxy(); if (e) { var n = e.getDataPercentWindow(), i = e.getDataValueWindow(); t.setCalculatedRange({ start: n[0], end: n[1], startValue: i[0], endValue: i[1] }) } })) } }; var YE = !1; function UE(t) { YE || (YE = !0, t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER, HE), function (t) { t.registerAction(\"dataZoom\", (function (t, e) { E(PE(e, t), (function (e) { e.setRawRange({ start: t.start, end: t.end, startValue: t.startValue, endValue: t.endValue }) })) })) }(t), t.registerSubTypeDefaulter(\"dataZoom\", (function () { return \"slider\" }))) } function XE(t) { t.registerComponentModel(zE), t.registerComponentView(BE), UE(t) } var ZE = function () { }, jE = {}; function qE(t, e) { jE[t] = e } function KE(t) { return jE[t] } var $E = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.optionUpdated = function () { t.prototype.optionUpdated.apply(this, arguments); var e = this.ecModel; E(this.option.feature, (function (t, n) { var i = KE(n); i && (i.getDefaultOption && (i.defaultOption = i.getDefaultOption(e)), C(t, i.defaultOption)) })) }, e.type = \"toolbox\", e.layoutMode = { type: \"box\", ignoreSize: !0 }, e.defaultOption = { show: !0, z: 6, orient: \"horizontal\", left: \"right\", top: \"top\", backgroundColor: \"transparent\", borderColor: \"#ccc\", borderRadius: 0, borderWidth: 0, padding: 5, itemSize: 15, itemGap: 8, showTitle: !0, iconStyle: { borderColor: \"#666\", color: \"none\" }, emphasis: { iconStyle: { borderColor: \"#3E98C5\" } }, tooltip: { show: !1, position: \"bottom\" } }, e }(Ap); function JE(t, e) { var n = up(e.get(\"padding\")), i = e.getItemStyle([\"color\", \"opacity\"]); return i.fill = e.get(\"backgroundColor\"), t = new Ps({ shape: { x: t.x - n[3], y: t.y - n[0], width: t.width + n[1] + n[3], height: t.height + n[0] + n[2], r: e.get(\"borderRadius\") }, style: i, silent: !0, z2: -1 }) } var QE = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.render = function (t, e, n, i) { var r = this.group; if (r.removeAll(), t.get(\"show\")) { var o = +t.get(\"itemSize\"), a = \"vertical\" === t.get(\"orient\"), s = t.get(\"feature\") || {}, l = this._features || (this._features = {}), u = []; E(s, (function (t, e) { u.push(e) })), new Dm(this._featureNames || [], u).add(h).update(h).remove(H(h, null)).execute(), this._featureNames = u, function (t, e, n) { var i = e.getBoxLayoutParams(), r = e.get(\"padding\"), o = { width: n.getWidth(), height: n.getHeight() }, a = wp(i, o, r); bp(e.get(\"orient\"), t, e.get(\"itemGap\"), a.width, a.height), Sp(t, i, o, r) }(r, t, n), r.add(JE(r.getBoundingRect(), t)), a || r.eachChild((function (t) { var e = t.__title, i = t.ensureState(\"emphasis\"), a = i.textConfig || (i.textConfig = {}), s = t.getTextContent(), l = s && s.ensureState(\"emphasis\"); if (l && !U(l) && e) { var u = l.style || (l.style = {}), h = yr(e, Ns.makeFont(u)), c = t.x + r.x, p = !1; t.y + r.y + o + h.height > n.getHeight() && (a.position = \"top\", p = !0); var d = p ? -5 - h.height : o + 10; c + h.width / 2 > n.getWidth() ? (a.position = [\"100%\", d], u.align = \"right\") : c - h.width / 2 < 0 && (a.position = [0, d], u.align = \"left\") } })) } function h(h, c) { var p, d = u[h], f = u[c], g = s[d], y = new xc(g, t, t.ecModel); if (i && null != i.newTitle && i.featureName === d && (g.title = i.newTitle), d && !f) { if (function (t) { return 0 === t.indexOf(\"my\") }(d)) p = { onclick: y.option.onclick, featureName: d }; else { var v = KE(d); if (!v) return; p = new v } l[d] = p } else if (!(p = l[f])) return; p.uid = bc(\"toolbox-feature\"), p.model = y, p.ecModel = e, p.api = n; var m = p instanceof ZE; d || !f ? !y.get(\"show\") || m && p.unusable ? m && p.remove && p.remove(e, n) : (!function (i, s, l) { var u, h, c = i.getModel(\"iconStyle\"), p = i.getModel([\"emphasis\", \"iconStyle\"]), d = s instanceof ZE && s.getIcons ? s.getIcons() : i.get(\"icon\"), f = i.get(\"title\") || {}; X(d) ? (u = {})[l] = d : u = d; X(f) ? (h = {})[l] = f : h = f; var g = i.iconPaths = {}; E(u, (function (l, u) { var d = Vh(l, {}, { x: -o / 2, y: -o / 2, width: o, height: o }); d.setStyle(c.getItemStyle()), d.ensureState(\"emphasis\").style = p.getItemStyle(); var f = new Ns({ style: { text: h[u], align: p.get(\"textAlign\"), borderRadius: p.get(\"textBorderRadius\"), padding: p.get(\"textPadding\"), fill: null }, ignore: !0 }); d.setTextContent(f), Wh({ el: d, componentModel: t, itemName: u, formatterParamsExtra: { title: h[u] } }), d.__title = h[u], d.on(\"mouseover\", (function () { var e = p.getItemStyle(), i = a ? null == t.get(\"right\") && \"right\" !== t.get(\"left\") ? \"right\" : \"left\" : null == t.get(\"bottom\") && \"bottom\" !== t.get(\"top\") ? \"bottom\" : \"top\"; f.setStyle({ fill: p.get(\"textFill\") || e.fill || e.stroke || \"#000\", backgroundColor: p.get(\"textBackgroundColor\") }), d.setTextConfig({ position: p.get(\"textPosition\") || i }), f.ignore = !t.get(\"showTitle\"), n.enterEmphasis(this) })).on(\"mouseout\", (function () { \"emphasis\" !== i.get([\"iconStatus\", u]) && n.leaveEmphasis(this), f.hide() })), (\"emphasis\" === i.get([\"iconStatus\", u]) ? Il : Tl)(d), r.add(d), d.on(\"click\", W(s.onclick, s, e, n, u)), g[u] = d })) }(y, p, d), y.setIconStatus = function (t, e) { var n = this.option, i = this.iconPaths; n.iconStatus = n.iconStatus || {}, n.iconStatus[t] = e, i[t] && (\"emphasis\" === e ? Il : Tl)(i[t]) }, p instanceof ZE && p.render && p.render(y, e, n, i)) : m && p.dispose && p.dispose(e, n) } }, e.prototype.updateView = function (t, e, n, i) { E(this._features, (function (t) { t instanceof ZE && t.updateView && t.updateView(t.model, e, n, i) })) }, e.prototype.remove = function (t, e) { E(this._features, (function (n) { n instanceof ZE && n.remove && n.remove(t, e) })), this.group.removeAll() }, e.prototype.dispose = function (t, e) { E(this._features, (function (n) { n instanceof ZE && n.dispose && n.dispose(t, e) })) }, e.type = \"toolbox\", e }(mg); var tz = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.onclick = function (t, e) { var n = this.model, i = n.get(\"name\") || t.get(\"title.0.text\") || \"echarts\", o = \"svg\" === e.getZr().painter.getType(), a = o ? \"svg\" : n.get(\"type\", !0) || \"png\", s = e.getConnectedDataURL({ type: a, backgroundColor: n.get(\"backgroundColor\", !0) || t.get(\"backgroundColor\") || \"#fff\", connectedBackgroundColor: n.get(\"connectedBackgroundColor\"), excludeComponents: n.get(\"excludeComponents\"), pixelRatio: n.get(\"pixelRatio\") }), l = r.browser; if (U(MouseEvent) && (l.newEdge || !l.ie && !l.edge)) { var u = document.createElement(\"a\"); u.download = i + \".\" + a, u.target = \"_blank\", u.href = s; var h = new MouseEvent(\"click\", { view: document.defaultView, bubbles: !0, cancelable: !1 }); u.dispatchEvent(h) } else if (window.navigator.msSaveOrOpenBlob || o) { var c = s.split(\",\"), p = c[0].indexOf(\"base64\") > -1, d = o ? decodeURIComponent(c[1]) : c[1]; p && (d = window.atob(d)); var f = i + \".\" + a; if (window.navigator.msSaveOrOpenBlob) { for (var g = d.length, y = new Uint8Array(g); g--;)y[g] = d.charCodeAt(g); var v = new Blob([y]); window.navigator.msSaveOrOpenBlob(v, f) } else { var m = document.createElement(\"iframe\"); document.body.appendChild(m); var x = m.contentWindow, _ = x.document; _.open(\"image/svg+xml\", \"replace\"), _.write(d), _.close(), x.focus(), _.execCommand(\"SaveAs\", !0, f), document.body.removeChild(m) } } else { var b = n.get(\"lang\"), w = '<body style=\"margin:0;\"><img src=\"' + s + '\" style=\"max-width:100%;\" title=\"' + (b && b[0] || \"\") + '\" /></body>', S = window.open(); S.document.write(w), S.document.title = i } }, e.getDefaultOption = function (t) { return { show: !0, icon: \"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0\", title: t.getLocaleModel().get([\"toolbox\", \"saveAsImage\", \"title\"]), type: \"png\", connectedBackgroundColor: \"#fff\", name: \"\", excludeComponents: [\"toolbox\"], lang: t.getLocaleModel().get([\"toolbox\", \"saveAsImage\", \"lang\"]) } }, e }(ZE), ez = \"__ec_magicType_stack__\", nz = [[\"line\", \"bar\"], [\"stack\"]], iz = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.getIcons = function () { var t = this.model, e = t.get(\"icon\"), n = {}; return E(t.get(\"type\"), (function (t) { e[t] && (n[t] = e[t]) })), n }, e.getDefaultOption = function (t) { return { show: !0, type: [], icon: { line: \"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4\", bar: \"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7\", stack: \"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z\" }, title: t.getLocaleModel().get([\"toolbox\", \"magicType\", \"title\"]), option: {}, seriesIndex: {} } }, e.prototype.onclick = function (t, e, n) { var i = this.model, r = i.get([\"seriesIndex\", n]); if (rz[n]) { var o, a = { series: [] }; E(nz, (function (t) { P(t, n) >= 0 && E(t, (function (t) { i.setIconStatus(t, \"normal\") })) })), i.setIconStatus(n, \"emphasis\"), t.eachComponent({ mainType: \"series\", query: null == r ? null : { seriesIndex: r } }, (function (t) { var e = t.subType, r = t.id, o = rz[n](e, r, t, i); o && (k(o, t.option), a.series.push(o)); var s = t.coordinateSystem; if (s && \"cartesian2d\" === s.type && (\"line\" === n || \"bar\" === n)) { var l = s.getAxesByScale(\"ordinal\")[0]; if (l) { var u = l.dim + \"Axis\", h = t.getReferringComponents(u, Po).models[0].componentIndex; a[u] = a[u] || []; for (var c = 0; c <= h; c++)a[u][h] = a[u][h] || {}; a[u][h].boundaryGap = \"bar\" === n } } })); var s = n; \"stack\" === n && (o = C({ stack: i.option.title.tiled, tiled: i.option.title.stack }, i.option.title), \"emphasis\" !== i.get([\"iconStatus\", n]) && (s = \"tiled\")), e.dispatchAction({ type: \"changeMagicType\", currentType: s, newOption: a, newTitle: o, featureName: \"magicType\" }) } }, e }(ZE), rz = { line: function (t, e, n, i) { if (\"bar\" === t) return C({ id: e, type: \"line\", data: n.get(\"data\"), stack: n.get(\"stack\"), markPoint: n.get(\"markPoint\"), markLine: n.get(\"markLine\") }, i.get([\"option\", \"line\"]) || {}, !0) }, bar: function (t, e, n, i) { if (\"line\" === t) return C({ id: e, type: \"bar\", data: n.get(\"data\"), stack: n.get(\"stack\"), markPoint: n.get(\"markPoint\"), markLine: n.get(\"markLine\") }, i.get([\"option\", \"bar\"]) || {}, !0) }, stack: function (t, e, n, i) { var r = n.get(\"stack\") === ez; if (\"line\" === t || \"bar\" === t) return i.setIconStatus(\"stack\", r ? \"normal\" : \"emphasis\"), C({ id: e, stack: r ? \"\" : ez }, i.get([\"option\", \"stack\"]) || {}, !0) } }; fm({ type: \"changeMagicType\", event: \"magicTypeChanged\", update: \"prepareAndUpdate\" }, (function (t, e) { e.mergeOption(t.newOption) })); var oz = new Array(60).join(\"-\"), az = \"\\t\"; function sz(t) { return t.replace(/^\\s\\s*/, \"\").replace(/\\s\\s*$/, \"\") } var lz = new RegExp(\"[\\t]+\", \"g\"); function uz(t, e) { var n = t.split(new RegExp(\"\\n*\" + oz + \"\\n*\", \"g\")), i = { series: [] }; return E(n, (function (t, n) { if (function (t) { if (t.slice(0, t.indexOf(\"\\n\")).indexOf(az) >= 0) return !0 }(t)) { var r = function (t) { for (var e = t.split(/\\n+/g), n = [], i = z(sz(e.shift()).split(lz), (function (t) { return { name: t, data: [] } })), r = 0; r < e.length; r++) { var o = sz(e[r]).split(lz); n.push(o.shift()); for (var a = 0; a < o.length; a++)i[a] && (i[a].data[r] = o[a]) } return { series: i, categories: n } }(t), o = e[n], a = o.axisDim + \"Axis\"; o && (i[a] = i[a] || [], i[a][o.axisIndex] = { data: r.categories }, i.series = i.series.concat(r.series)) } else { r = function (t) { for (var e = t.split(/\\n+/g), n = sz(e.shift()), i = [], r = 0; r < e.length; r++) { var o = sz(e[r]); if (o) { var a = o.split(lz), s = \"\", l = void 0, u = !1; isNaN(a[0]) ? (u = !0, s = a[0], a = a.slice(1), i[r] = { name: s, value: [] }, l = i[r].value) : l = i[r] = []; for (var h = 0; h < a.length; h++)l.push(+a[h]); 1 === l.length && (u ? i[r].value = l[0] : i[r] = l[0]) } } return { name: n, data: i } }(t); i.series.push(r) } })), i } var hz = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.onclick = function (t, e) { setTimeout((function () { e.dispatchAction({ type: \"hideTip\" }) })); var n = e.getDom(), i = this.model; this._dom && n.removeChild(this._dom); var r = document.createElement(\"div\"); r.style.cssText = \"position:absolute;top:0;bottom:0;left:0;right:0;padding:5px\", r.style.backgroundColor = i.get(\"backgroundColor\") || \"#fff\"; var o = document.createElement(\"h4\"), a = i.get(\"lang\") || []; o.innerHTML = a[0] || i.get(\"title\"), o.style.cssText = \"margin:10px 20px\", o.style.color = i.get(\"textColor\"); var s = document.createElement(\"div\"), l = document.createElement(\"textarea\"); s.style.cssText = \"overflow:auto\"; var u = i.get(\"optionToContent\"), h = i.get(\"contentToOption\"), c = function (t) { var e, n, i, r = function (t) { var e = {}, n = [], i = []; return t.eachRawSeries((function (t) { var r = t.coordinateSystem; if (!r || \"cartesian2d\" !== r.type && \"polar\" !== r.type) n.push(t); else { var o = r.getBaseAxis(); if (\"category\" === o.type) { var a = o.dim + \"_\" + o.index; e[a] || (e[a] = { categoryAxis: o, valueAxis: r.getOtherAxis(o), series: [] }, i.push({ axisDim: o.dim, axisIndex: o.index })), e[a].series.push(t) } else n.push(t) } })), { seriesGroupByCategoryAxis: e, other: n, meta: i } }(t); return { value: B([(n = r.seriesGroupByCategoryAxis, i = [], E(n, (function (t, e) { var n = t.categoryAxis, r = t.valueAxis.dim, o = [\" \"].concat(z(t.series, (function (t) { return t.name }))), a = [n.model.getCategories()]; E(t.series, (function (t) { var e = t.getRawData(); a.push(t.getRawData().mapArray(e.mapDimension(r), (function (t) { return t }))) })); for (var s = [o.join(az)], l = 0; l < a[0].length; l++) { for (var u = [], h = 0; h < a.length; h++)u.push(a[h][l]); s.push(u.join(az)) } i.push(s.join(\"\\n\")) })), i.join(\"\\n\\n\" + oz + \"\\n\\n\")), (e = r.other, z(e, (function (t) { var e = t.getRawData(), n = [t.name], i = []; return e.each(e.dimensions, (function () { for (var t = arguments.length, r = arguments[t - 1], o = e.getName(r), a = 0; a < t - 1; a++)i[a] = arguments[a]; n.push((o ? o + az : \"\") + i.join(az)) })), n.join(\"\\n\") })).join(\"\\n\\n\" + oz + \"\\n\\n\"))], (function (t) { return !!t.replace(/[\\n\\t\\s]/g, \"\") })).join(\"\\n\\n\" + oz + \"\\n\\n\"), meta: r.meta } }(t); if (U(u)) { var p = u(e.getOption()); X(p) ? s.innerHTML = p : J(p) && s.appendChild(p) } else { l.readOnly = i.get(\"readOnly\"); var d = l.style; d.cssText = \"display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none\", d.color = i.get(\"textColor\"), d.borderColor = i.get(\"textareaBorderColor\"), d.backgroundColor = i.get(\"textareaColor\"), l.value = c.value, s.appendChild(l) } var f = c.meta, g = document.createElement(\"div\"); g.style.cssText = \"position:absolute;bottom:5px;left:0;right:0\"; var y = \"float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px\", v = document.createElement(\"div\"), m = document.createElement(\"div\"); y += \";background-color:\" + i.get(\"buttonColor\"), y += \";color:\" + i.get(\"buttonTextColor\"); var x = this; function _() { n.removeChild(r), x._dom = null } ue(v, \"click\", _), ue(m, \"click\", (function () { if (null == h && null != u || null != h && null == u) _(); else { var t; try { t = U(h) ? h(s, e.getOption()) : uz(l.value, f) } catch (t) { throw _(), new Error(\"Data view format error \" + t) } t && e.dispatchAction({ type: \"changeDataView\", newOption: t }), _() } })), v.innerHTML = a[1], m.innerHTML = a[2], m.style.cssText = v.style.cssText = y, !i.get(\"readOnly\") && g.appendChild(m), g.appendChild(v), r.appendChild(o), r.appendChild(s), r.appendChild(g), s.style.height = n.clientHeight - 80 + \"px\", n.appendChild(r), this._dom = r }, e.prototype.remove = function (t, e) { this._dom && e.getDom().removeChild(this._dom) }, e.prototype.dispose = function (t, e) { this.remove(t, e) }, e.getDefaultOption = function (t) { return { show: !0, readOnly: !1, optionToContent: null, contentToOption: null, icon: \"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28\", title: t.getLocaleModel().get([\"toolbox\", \"dataView\", \"title\"]), lang: t.getLocaleModel().get([\"toolbox\", \"dataView\", \"lang\"]), backgroundColor: \"#fff\", textColor: \"#000\", textareaColor: \"#fff\", textareaBorderColor: \"#333\", buttonColor: \"#c23531\", buttonTextColor: \"#fff\" } }, e }(ZE); function cz(t, e) { return z(t, (function (t, n) { var i = e && e[n]; if (q(i) && !Y(i)) { q(t) && !Y(t) || (t = { value: t }); var r = null != i.name && null == t.name; return t = k(t, i), r && delete t.name, t } return t })) } fm({ type: \"changeDataView\", event: \"dataViewChanged\", update: \"prepareAndUpdate\" }, (function (t, e) { var n = []; E(t.newOption.series, (function (t) { var i = e.getSeriesByName(t.name)[0]; if (i) { var r = i.get(\"data\"); n.push({ name: t.name, data: cz(t.data, r) }) } else n.push(A({ type: \"scatter\" }, t)) })), e.mergeOption(k({ series: n }, t.newOption)) })); var pz = E, dz = Do(); function fz(t) { var e = dz(t); return e.snapshots || (e.snapshots = [{}]), e.snapshots } var gz = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.onclick = function (t, e) { !function (t) { dz(t).snapshots = null }(t), e.dispatchAction({ type: \"restore\", from: this.uid }) }, e.getDefaultOption = function (t) { return { show: !0, icon: \"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5\", title: t.getLocaleModel().get([\"toolbox\", \"restore\", \"title\"]) } }, e }(ZE); fm({ type: \"restore\", event: \"restore\", update: \"prepareAndUpdate\" }, (function (t, e) { e.resetOption(\"recreate\") })); var yz = [\"grid\", \"xAxis\", \"yAxis\", \"geo\", \"graph\", \"polar\", \"radiusAxis\", \"angleAxis\", \"bmap\"], vz = function () { function t(t, e, n) { var i = this; this._targetInfoList = []; var r = xz(e, t); E(_z, (function (t, e) { (!n || !n.include || P(n.include, e) >= 0) && t(r, i._targetInfoList) })) } return t.prototype.setOutputRanges = function (t, e) { return this.matchOutputRanges(t, e, (function (t, e, n) { if ((t.coordRanges || (t.coordRanges = [])).push(e), !t.coordRange) { t.coordRange = e; var i = Sz[t.brushType](0, n, e); t.__rangeOffset = { offset: Iz[t.brushType](i.values, t.range, [1, 1]), xyMinMax: i.xyMinMax } } })), t }, t.prototype.matchOutputRanges = function (t, e, n) { E(t, (function (t) { var i = this.findTargetInfo(t, e); i && !0 !== i && E(i.coordSyses, (function (i) { var r = Sz[t.brushType](1, i, t.range, !0); n(t, r.values, i, e) })) }), this) }, t.prototype.setInputRanges = function (t, e) { E(t, (function (t) { var n, i, r, o, a, s = this.findTargetInfo(t, e); if (t.range = t.range || [], s && !0 !== s) { t.panelId = s.panelId; var l = Sz[t.brushType](0, s.coordSys, t.coordRange), u = t.__rangeOffset; t.range = u ? Iz[t.brushType](l.values, u.offset, (n = l.xyMinMax, i = u.xyMinMax, r = Cz(n), o = Cz(i), a = [r[0] / o[0], r[1] / o[1]], isNaN(a[0]) && (a[0] = 1), isNaN(a[1]) && (a[1] = 1), a)) : l.values } }), this) }, t.prototype.makePanelOpts = function (t, e) { return z(this._targetInfoList, (function (n) { var i = n.getPanelRect(); return { panelId: n.panelId, defaultBrushType: e ? e(n) : null, clipPath: gL(i), isTargetByCursor: vL(i, t, n.coordSysModel), getLinearBrushOtherExtent: yL(i) } })) }, t.prototype.controlSeries = function (t, e, n) { var i = this.findTargetInfo(t, n); return !0 === i || i && P(i.coordSyses, e.coordinateSystem) >= 0 }, t.prototype.findTargetInfo = function (t, e) { for (var n = this._targetInfoList, i = xz(e, t), r = 0; r < n.length; r++) { var o = n[r], a = t.panelId; if (a) { if (o.panelId === a) return o } else for (var s = 0; s < bz.length; s++)if (bz[s](i, o)) return o } return !0 }, t }(); function mz(t) { return t[0] > t[1] && t.reverse(), t } function xz(t, e) { return ko(t, e, { includeMainTypes: yz }) } var _z = { grid: function (t, e) { var n = t.xAxisModels, i = t.yAxisModels, r = t.gridModels, o = ft(), a = {}, s = {}; (n || i || r) && (E(n, (function (t) { var e = t.axis.grid.model; o.set(e.id, e), a[e.id] = !0 })), E(i, (function (t) { var e = t.axis.grid.model; o.set(e.id, e), s[e.id] = !0 })), E(r, (function (t) { o.set(t.id, t), a[t.id] = !0, s[t.id] = !0 })), o.each((function (t) { var r = t.coordinateSystem, o = []; E(r.getCartesians(), (function (t, e) { (P(n, t.getAxis(\"x\").model) >= 0 || P(i, t.getAxis(\"y\").model) >= 0) && o.push(t) })), e.push({ panelId: \"grid--\" + t.id, gridModel: t, coordSysModel: t, coordSys: o[0], coordSyses: o, getPanelRect: wz.grid, xAxisDeclared: a[t.id], yAxisDeclared: s[t.id] }) }))) }, geo: function (t, e) { E(t.geoModels, (function (t) { var n = t.coordinateSystem; e.push({ panelId: \"geo--\" + t.id, geoModel: t, coordSysModel: t, coordSys: n, coordSyses: [n], getPanelRect: wz.geo }) })) } }, bz = [function (t, e) { var n = t.xAxisModel, i = t.yAxisModel, r = t.gridModel; return !r && n && (r = n.axis.grid.model), !r && i && (r = i.axis.grid.model), r && r === e.gridModel }, function (t, e) { var n = t.geoModel; return n && n === e.geoModel }], wz = { grid: function () { return this.coordSys.master.getRect().clone() }, geo: function () { var t = this.coordSys, e = t.getBoundingRect().clone(); return e.applyTransform(Lh(t)), e } }, Sz = { lineX: H(Mz, 0), lineY: H(Mz, 1), rect: function (t, e, n, i) { var r = t ? e.pointToData([n[0][0], n[1][0]], i) : e.dataToPoint([n[0][0], n[1][0]], i), o = t ? e.pointToData([n[0][1], n[1][1]], i) : e.dataToPoint([n[0][1], n[1][1]], i), a = [mz([r[0], o[0]]), mz([r[1], o[1]])]; return { values: a, xyMinMax: a } }, polygon: function (t, e, n, i) { var r = [[1 / 0, -1 / 0], [1 / 0, -1 / 0]]; return { values: z(n, (function (n) { var o = t ? e.pointToData(n, i) : e.dataToPoint(n, i); return r[0][0] = Math.min(r[0][0], o[0]), r[1][0] = Math.min(r[1][0], o[1]), r[0][1] = Math.max(r[0][1], o[0]), r[1][1] = Math.max(r[1][1], o[1]), o })), xyMinMax: r } } }; function Mz(t, e, n, i) { var r = n.getAxis([\"x\", \"y\"][t]), o = mz(z([0, 1], (function (t) { return e ? r.coordToData(r.toLocalCoord(i[t]), !0) : r.toGlobalCoord(r.dataToCoord(i[t])) }))), a = []; return a[t] = o, a[1 - t] = [NaN, NaN], { values: o, xyMinMax: a } } var Iz = { lineX: H(Tz, 0), lineY: H(Tz, 1), rect: function (t, e, n) { return [[t[0][0] - n[0] * e[0][0], t[0][1] - n[0] * e[0][1]], [t[1][0] - n[1] * e[1][0], t[1][1] - n[1] * e[1][1]]] }, polygon: function (t, e, n) { return z(t, (function (t, i) { return [t[0] - n[0] * e[i][0], t[1] - n[1] * e[i][1]] })) } }; function Tz(t, e, n, i) { return [e[0] - i[t] * n[0], e[1] - i[t] * n[1]] } function Cz(t) { return t ? [t[0][1] - t[0][0], t[1][1] - t[1][0]] : [NaN, NaN] } var Dz, Az, kz = E, Lz = go + \"toolbox-dataZoom_\", Pz = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.render = function (t, e, n, i) { this._brushController || (this._brushController = new Vk(n.getZr()), this._brushController.on(\"brush\", W(this._onBrush, this)).mount()), function (t, e, n, i, r) { var o = n._isZoomActive; i && \"takeGlobalCursor\" === i.type && (o = \"dataZoomSelect\" === i.key && i.dataZoomSelectActive); n._isZoomActive = o, t.setIconStatus(\"zoom\", o ? \"emphasis\" : \"normal\"); var a = new vz(Rz(t), e, { include: [\"grid\"] }).makePanelOpts(r, (function (t) { return t.xAxisDeclared && !t.yAxisDeclared ? \"lineX\" : !t.xAxisDeclared && t.yAxisDeclared ? \"lineY\" : \"rect\" })); n._brushController.setPanels(a).enableBrush(!(!o || !a.length) && { brushType: \"auto\", brushStyle: t.getModel(\"brushStyle\").getItemStyle() }) }(t, e, this, i, n), function (t, e) { t.setIconStatus(\"back\", function (t) { return fz(t).length }(e) > 1 ? \"emphasis\" : \"normal\") }(t, e) }, e.prototype.onclick = function (t, e, n) { Oz[n].call(this) }, e.prototype.remove = function (t, e) { this._brushController && this._brushController.unmount() }, e.prototype.dispose = function (t, e) { this._brushController && this._brushController.dispose() }, e.prototype._onBrush = function (t) { var e = t.areas; if (t.isEnd && e.length) { var n = {}, i = this.ecModel; this._brushController.updateCovers([]), new vz(Rz(this.model), i, { include: [\"grid\"] }).matchOutputRanges(e, i, (function (t, e, n) { if (\"cartesian2d\" === n.type) { var i = t.brushType; \"rect\" === i ? (r(\"x\", n, e[0]), r(\"y\", n, e[1])) : r({ lineX: \"x\", lineY: \"y\" }[i], n, e) } })), function (t, e) { var n = fz(t); pz(e, (function (e, i) { for (var r = n.length - 1; r >= 0 && !n[r][i]; r--); if (r < 0) { var o = t.queryComponents({ mainType: \"dataZoom\", subType: \"select\", id: i })[0]; if (o) { var a = o.getPercentRange(); n[0][i] = { dataZoomId: i, start: a[0], end: a[1] } } } })), n.push(e) }(i, n), this._dispatchZoomAction(n) } function r(t, e, r) { var o = e.getAxis(t), a = o.model, s = function (t, e, n) { var i; return n.eachComponent({ mainType: \"dataZoom\", subType: \"select\" }, (function (n) { n.getAxisModel(t, e.componentIndex) && (i = n) })), i }(t, a, i), l = s.findRepresentativeAxisProxy(a).getMinMaxSpan(); null == l.minValueSpan && null == l.maxValueSpan || (r = dk(0, r.slice(), o.scale.getExtent(), 0, l.minValueSpan, l.maxValueSpan)), s && (n[s.id] = { dataZoomId: s.id, startValue: r[0], endValue: r[1] }) } }, e.prototype._dispatchZoomAction = function (t) { var e = []; kz(t, (function (t, n) { e.push(T(t)) })), e.length && this.api.dispatchAction({ type: \"dataZoom\", from: this.uid, batch: e }) }, e.getDefaultOption = function (t) { return { show: !0, filterMode: \"filter\", icon: { zoom: \"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1\", back: \"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26\" }, title: t.getLocaleModel().get([\"toolbox\", \"dataZoom\", \"title\"]), brushStyle: { borderWidth: 0, color: \"rgba(210,219,238,0.2)\" } } }, e }(ZE), Oz = { zoom: function () { var t = !this._isZoomActive; this.api.dispatchAction({ type: \"takeGlobalCursor\", key: \"dataZoomSelect\", dataZoomSelectActive: t }) }, back: function () { this._dispatchZoomAction(function (t) { var e = fz(t), n = e[e.length - 1]; e.length > 1 && e.pop(); var i = {}; return pz(n, (function (t, n) { for (var r = e.length - 1; r >= 0; r--)if (t = e[r][n]) { i[n] = t; break } })), i }(this.ecModel)) } }; function Rz(t) { var e = { xAxisIndex: t.get(\"xAxisIndex\", !0), yAxisIndex: t.get(\"yAxisIndex\", !0), xAxisId: t.get(\"xAxisId\", !0), yAxisId: t.get(\"yAxisId\", !0) }; return null == e.xAxisIndex && null == e.xAxisId && (e.xAxisIndex = \"all\"), null == e.yAxisIndex && null == e.yAxisId && (e.yAxisIndex = \"all\"), e } Dz = \"dataZoom\", Az = function (t) { var e = t.getComponent(\"toolbox\", 0), n = [\"feature\", \"dataZoom\"]; if (e && null != e.get(n)) { var i = e.getModel(n), r = [], o = ko(t, Rz(i)); return kz(o.xAxisModels, (function (t) { return a(t, \"xAxis\", \"xAxisIndex\") })), kz(o.yAxisModels, (function (t) { return a(t, \"yAxis\", \"yAxisIndex\") })), r } function a(t, e, n) { var o = t.componentIndex, a = { type: \"select\", $fromToolbox: !0, filterMode: i.get(\"filterMode\", !0) || \"filter\", id: Lz + e + o }; a[n] = o, r.push(a) } }, lt(null == $p.get(Dz) && Az), $p.set(Dz, Az); var Nz = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"tooltip\", e.dependencies = [\"axisPointer\"], e.defaultOption = { z: 60, show: !0, showContent: !0, trigger: \"item\", triggerOn: \"mousemove|click\", alwaysShowContent: !1, displayMode: \"single\", renderMode: \"auto\", confine: null, showDelay: 0, hideDelay: 100, transitionDuration: .4, enterable: !1, backgroundColor: \"#fff\", shadowBlur: 10, shadowColor: \"rgba(0, 0, 0, .2)\", shadowOffsetX: 1, shadowOffsetY: 2, borderRadius: 4, borderWidth: 1, padding: null, extraCssText: \"\", axisPointer: { type: \"line\", axis: \"auto\", animation: \"auto\", animationDurationUpdate: 200, animationEasingUpdate: \"exponentialOut\", crossStyle: { color: \"#999\", width: 1, type: \"dashed\", textStyle: {} } }, textStyle: { color: \"#666\", fontSize: 14 } }, e }(Ap); function Ez(t) { var e = t.get(\"confine\"); return null != e ? !!e : \"richText\" === t.get(\"renderMode\") } function zz(t) { if (r.domSupported) for (var e = document.documentElement.style, n = 0, i = t.length; n < i; n++)if (t[n] in e) return t[n] } var Vz = zz([\"transform\", \"webkitTransform\", \"OTransform\", \"MozTransform\", \"msTransform\"]); function Bz(t, e) { if (!t) return e; e = lp(e, !0); var n = t.indexOf(e); return (t = -1 === n ? e : \"-\" + t.slice(0, n) + \"-\" + e).toLowerCase() } var Fz = Bz(zz([\"webkitTransition\", \"transition\", \"OTransition\", \"MozTransition\", \"msTransition\"]), \"transition\"), Gz = Bz(Vz, \"transform\"), Wz = \"position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;\" + (r.transform3dSupported ? \"will-change:transform;\" : \"\"); function Hz(t, e, n) { var i = t.toFixed(0) + \"px\", o = e.toFixed(0) + \"px\"; if (!r.transformSupported) return n ? \"top:\" + o + \";left:\" + i + \";\" : [[\"top\", o], [\"left\", i]]; var a = r.transform3dSupported, s = \"translate\" + (a ? \"3d\" : \"\") + \"(\" + i + \",\" + o + (a ? \",0\" : \"\") + \")\"; return n ? \"top:0;left:0;\" + Gz + \":\" + s + \";\" : [[\"top\", 0], [\"left\", 0], [Vz, s]] } function Yz(t, e, n) { var i = [], o = t.get(\"transitionDuration\"), a = t.get(\"backgroundColor\"), s = t.get(\"shadowBlur\"), l = t.get(\"shadowColor\"), u = t.get(\"shadowOffsetX\"), h = t.get(\"shadowOffsetY\"), c = t.getModel(\"textStyle\"), p = og(t, \"html\"), d = u + \"px \" + h + \"px \" + s + \"px \" + l; return i.push(\"box-shadow:\" + d), e && o && i.push(function (t, e) { var n = \"cubic-bezier(0.23,1,0.32,1)\", i = \" \" + t / 2 + \"s \" + n, o = \"opacity\" + i + \",visibility\" + i; return e || (i = \" \" + t + \"s \" + n, o += r.transformSupported ? \",\" + Gz + i : \",left\" + i + \",top\" + i), Fz + \":\" + o }(o, n)), a && i.push(\"background-color:\" + a), E([\"width\", \"color\", \"radius\"], (function (e) { var n = \"border-\" + e, r = lp(n), o = t.get(r); null != o && i.push(n + \":\" + o + (\"color\" === e ? \"\" : \"px\")) })), i.push(function (t) { var e = [], n = t.get(\"fontSize\"), i = t.getTextColor(); i && e.push(\"color:\" + i), e.push(\"font:\" + t.getFont()), n && e.push(\"line-height:\" + Math.round(3 * n / 2) + \"px\"); var r = t.get(\"textShadowColor\"), o = t.get(\"textShadowBlur\") || 0, a = t.get(\"textShadowOffsetX\") || 0, s = t.get(\"textShadowOffsetY\") || 0; return r && o && e.push(\"text-shadow:\" + a + \"px \" + s + \"px \" + o + \"px \" + r), E([\"decoration\", \"align\"], (function (n) { var i = t.get(n); i && e.push(\"text-\" + n + \":\" + i) })), e.join(\";\") }(c)), null != p && i.push(\"padding:\" + up(p).join(\"px \") + \"px\"), i.join(\";\") + \";\" } function Uz(t, e, n, i, r) { var o = e && e.painter; if (n) { var a = o && o.getViewportRoot(); a && function (t, e, n, i, r) { $t(Kt, e, i, r, !0) && $t(t, n, Kt[0], Kt[1]) }(t, a, document.body, i, r) } else { t[0] = i, t[1] = r; var s = o && o.getViewportRootOffset(); s && (t[0] += s.offsetLeft, t[1] += s.offsetTop) } t[2] = t[0] / e.getWidth(), t[3] = t[1] / e.getHeight() } var Xz = function () { function t(t, e, n) { if (this._show = !1, this._styleCoord = [0, 0, 0, 0], this._enterable = !0, this._firstShow = !0, this._longHide = !0, r.wxa) return null; var i = document.createElement(\"div\"); i.domBelongToZr = !0, this.el = i; var o = this._zr = e.getZr(), a = this._appendToBody = n && n.appendToBody; Uz(this._styleCoord, o, a, e.getWidth() / 2, e.getHeight() / 2), a ? document.body.appendChild(i) : t.appendChild(i), this._container = t; var s = this; i.onmouseenter = function () { s._enterable && (clearTimeout(s._hideTimeout), s._show = !0), s._inContent = !0 }, i.onmousemove = function (t) { if (t = t || window.event, !s._enterable) { var e = o.handler; le(o.painter.getViewportRoot(), t, !0), e.dispatch(\"mousemove\", t) } }, i.onmouseleave = function () { s._inContent = !1, s._enterable && s._show && s.hideLater(s._hideDelay) } } return t.prototype.update = function (t) { var e, n, i, r = this._container, o = (n = \"position\", (i = (e = r).currentStyle || document.defaultView && document.defaultView.getComputedStyle(e)) ? n ? i[n] : i : null), a = r.style; \"absolute\" !== a.position && \"absolute\" !== o && (a.position = \"relative\"), t.get(\"alwaysShowContent\") && this._moveIfResized(), this.el.className = t.get(\"className\") || \"\" }, t.prototype.show = function (t, e) { clearTimeout(this._hideTimeout), clearTimeout(this._longHideTimeout); var n = this.el, i = n.style, r = this._styleCoord; n.innerHTML ? i.cssText = Wz + Yz(t, !this._firstShow, this._longHide) + Hz(r[0], r[1], !0) + \"border-color:\" + gp(e) + \";\" + (t.get(\"extraCssText\") || \"\") + \";pointer-events:\" + (this._enterable ? \"auto\" : \"none\") : i.display = \"none\", this._show = !0, this._firstShow = !1, this._longHide = !1 }, t.prototype.setContent = function (t, e, n, i, r) { var o = this.el; if (null != t) { var a = \"\"; if (X(r) && \"item\" === n.get(\"trigger\") && !Ez(n) && (a = function (t, e, n) { if (!X(n) || \"inside\" === n) return \"\"; var i = t.get(\"backgroundColor\"), r = t.get(\"borderWidth\"); e = gp(e); var o, a, s = \"left\" === (o = n) ? \"right\" : \"right\" === o ? \"left\" : \"top\" === o ? \"bottom\" : \"top\", l = Math.max(1.5 * Math.round(r), 6), u = \"\", h = Gz + \":\"; P([\"left\", \"right\"], s) > -1 ? (u += \"top:50%\", h += \"translateY(-50%) rotate(\" + (a = \"left\" === s ? -225 : -45) + \"deg)\") : (u += \"left:50%\", h += \"translateX(-50%) rotate(\" + (a = \"top\" === s ? 225 : 45) + \"deg)\"); var c = a * Math.PI / 180, p = l + r, d = p * Math.abs(Math.cos(c)) + p * Math.abs(Math.sin(c)), f = e + \" solid \" + r + \"px;\"; return '<div style=\"' + [\"position:absolute;width:\" + l + \"px;height:\" + l + \"px;\", (u += \";\" + s + \":-\" + Math.round(100 * ((d - Math.SQRT2 * r) / 2 + Math.SQRT2 * r - (d - p) / 2)) / 100 + \"px\") + \";\" + h + \";\", \"border-bottom:\" + f, \"border-right:\" + f, \"background-color:\" + i + \";\"].join(\"\") + '\"></div>' }(n, i, r)), X(t)) o.innerHTML = t + a; else if (t) { o.innerHTML = \"\", Y(t) || (t = [t]); for (var s = 0; s < t.length; s++)J(t[s]) && t[s].parentNode !== o && o.appendChild(t[s]); if (a && o.childNodes.length) { var l = document.createElement(\"div\"); l.innerHTML = a, o.appendChild(l) } } } else o.innerHTML = \"\" }, t.prototype.setEnterable = function (t) { this._enterable = t }, t.prototype.getSize = function () { var t = this.el; return [t.offsetWidth, t.offsetHeight] }, t.prototype.moveTo = function (t, e) { var n = this._styleCoord; if (Uz(n, this._zr, this._appendToBody, t, e), null != n[0] && null != n[1]) { var i = this.el.style; E(Hz(n[0], n[1]), (function (t) { i[t[0]] = t[1] })) } }, t.prototype._moveIfResized = function () { var t = this._styleCoord[2], e = this._styleCoord[3]; this.moveTo(t * this._zr.getWidth(), e * this._zr.getHeight()) }, t.prototype.hide = function () { var t = this, e = this.el.style; e.visibility = \"hidden\", e.opacity = \"0\", r.transform3dSupported && (e.willChange = \"\"), this._show = !1, this._longHideTimeout = setTimeout((function () { return t._longHide = !0 }), 500) }, t.prototype.hideLater = function (t) { !this._show || this._inContent && this._enterable || (t ? (this._hideDelay = t, this._show = !1, this._hideTimeout = setTimeout(W(this.hide, this), t)) : this.hide()) }, t.prototype.isShow = function () { return this._show }, t.prototype.dispose = function () { this.el.parentNode.removeChild(this.el) }, t }(), Zz = function () { function t(t) { this._show = !1, this._styleCoord = [0, 0, 0, 0], this._enterable = !0, this._zr = t.getZr(), Kz(this._styleCoord, this._zr, t.getWidth() / 2, t.getHeight() / 2) } return t.prototype.update = function (t) { t.get(\"alwaysShowContent\") && this._moveIfResized() }, t.prototype.show = function () { this._hideTimeout && clearTimeout(this._hideTimeout), this.el.show(), this._show = !0 }, t.prototype.setContent = function (t, e, n, i, r) { var o = this; q(t) && co(\"\"), this.el && this._zr.remove(this.el); var a = n.getModel(\"textStyle\"); this.el = new Ns({ style: { rich: e.richTextStyles, text: t, lineHeight: 22, borderWidth: 1, borderColor: i, textShadowColor: a.get(\"textShadowColor\"), fill: n.get([\"textStyle\", \"color\"]), padding: og(n, \"richText\"), verticalAlign: \"top\", align: \"left\" }, z: n.get(\"z\") }), E([\"backgroundColor\", \"borderRadius\", \"shadowColor\", \"shadowBlur\", \"shadowOffsetX\", \"shadowOffsetY\"], (function (t) { o.el.style[t] = n.get(t) })), E([\"textShadowBlur\", \"textShadowOffsetX\", \"textShadowOffsetY\"], (function (t) { o.el.style[t] = a.get(t) || 0 })), this._zr.add(this.el); var s = this; this.el.on(\"mouseover\", (function () { s._enterable && (clearTimeout(s._hideTimeout), s._show = !0), s._inContent = !0 })), this.el.on(\"mouseout\", (function () { s._enterable && s._show && s.hideLater(s._hideDelay), s._inContent = !1 })) }, t.prototype.setEnterable = function (t) { this._enterable = t }, t.prototype.getSize = function () { var t = this.el, e = this.el.getBoundingRect(), n = qz(t.style); return [e.width + n.left + n.right, e.height + n.top + n.bottom] }, t.prototype.moveTo = function (t, e) { var n = this.el; if (n) { var i = this._styleCoord; Kz(i, this._zr, t, e), t = i[0], e = i[1]; var r = n.style, o = jz(r.borderWidth || 0), a = qz(r); n.x = t + o + a.left, n.y = e + o + a.top, n.markRedraw() } }, t.prototype._moveIfResized = function () { var t = this._styleCoord[2], e = this._styleCoord[3]; this.moveTo(t * this._zr.getWidth(), e * this._zr.getHeight()) }, t.prototype.hide = function () { this.el && this.el.hide(), this._show = !1 }, t.prototype.hideLater = function (t) { !this._show || this._inContent && this._enterable || (t ? (this._hideDelay = t, this._show = !1, this._hideTimeout = setTimeout(W(this.hide, this), t)) : this.hide()) }, t.prototype.isShow = function () { return this._show }, t.prototype.dispose = function () { this._zr.remove(this.el) }, t }(); function jz(t) { return Math.max(0, t) } function qz(t) { var e = jz(t.shadowBlur || 0), n = jz(t.shadowOffsetX || 0), i = jz(t.shadowOffsetY || 0); return { left: jz(e - n), right: jz(e + n), top: jz(e - i), bottom: jz(e + i) } } function Kz(t, e, n, i) { t[0] = n, t[1] = i, t[2] = t[0] / e.getWidth(), t[3] = t[1] / e.getHeight() } var $z = new Ps({ shape: { x: -1, y: -1, width: 2, height: 2 } }), Jz = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (t, e) { if (!r.node && e.getDom()) { var n, i = t.getComponent(\"tooltip\"), o = this._renderMode = \"auto\" === (n = i.get(\"renderMode\")) ? r.domSupported ? \"html\" : \"richText\" : n || \"html\"; this._tooltipContent = \"richText\" === o ? new Zz(e) : new Xz(e.getDom(), e, { appendToBody: i.get(\"appendToBody\", !0) }) } }, e.prototype.render = function (t, e, n) { if (!r.node && n.getDom()) { this.group.removeAll(), this._tooltipModel = t, this._ecModel = e, this._api = n, this._alwaysShowContent = t.get(\"alwaysShowContent\"); var i = this._tooltipContent; i.update(t), i.setEnterable(t.get(\"enterable\")), this._initGlobalListener(), this._keepShow(), \"richText\" !== this._renderMode && t.get(\"transitionDuration\") ? Pg(this, \"_updatePosition\", 50, \"fixRate\") : Og(this, \"_updatePosition\") } }, e.prototype._initGlobalListener = function () { var t = this._tooltipModel.get(\"triggerOn\"); nN(\"itemTooltip\", this._api, W((function (e, n, i) { \"none\" !== t && (t.indexOf(e) >= 0 ? this._tryShow(n, i) : \"leave\" === e && this._hide(i)) }), this)) }, e.prototype._keepShow = function () { var t = this._tooltipModel, e = this._ecModel, n = this._api, i = t.get(\"triggerOn\"); if (null != this._lastX && null != this._lastY && \"none\" !== i && \"click\" !== i) { var r = this; clearTimeout(this._refreshUpdateTimeout), this._refreshUpdateTimeout = setTimeout((function () { !n.isDisposed() && r.manuallyShowTip(t, e, n, { x: r._lastX, y: r._lastY, dataByCoordSys: r._lastDataByCoordSys }) })) } }, e.prototype.manuallyShowTip = function (t, e, n, i) { if (i.from !== this.uid && !r.node && n.getDom()) { var o = tV(i, n); this._ticket = \"\"; var a = i.dataByCoordSys, s = function (t, e, n) { var i = Lo(t).queryOptionMap, r = i.keys()[0]; if (!r || \"series\" === r) return; var o, a = Ro(e, r, i.get(r), { useDefault: !1, enableAll: !1, enableNone: !1 }).models[0]; if (!a) return; if (n.getViewOfComponentModel(a).group.traverse((function (e) { var n = js(e).tooltipConfig; if (n && n.name === t.name) return o = e, !0 })), o) return { componentMainType: r, componentIndex: a.componentIndex, el: o } }(i, e, n); if (s) { var l = s.el.getBoundingRect().clone(); l.applyTransform(s.el.transform), this._tryShow({ offsetX: l.x + l.width / 2, offsetY: l.y + l.height / 2, target: s.el, position: i.position, positionDefault: \"bottom\" }, o) } else if (i.tooltip && null != i.x && null != i.y) { var u = $z; u.x = i.x, u.y = i.y, u.update(), js(u).tooltipConfig = { name: null, option: i.tooltip }, this._tryShow({ offsetX: i.x, offsetY: i.y, target: u }, o) } else if (a) this._tryShow({ offsetX: i.x, offsetY: i.y, position: i.position, dataByCoordSys: a, tooltipOption: i.tooltipOption }, o); else if (null != i.seriesIndex) { if (this._manuallyAxisShowTip(t, e, n, i)) return; var h = sN(i, e), c = h.point[0], p = h.point[1]; null != c && null != p && this._tryShow({ offsetX: c, offsetY: p, target: h.el, position: i.position, positionDefault: \"bottom\" }, o) } else null != i.x && null != i.y && (n.dispatchAction({ type: \"updateAxisPointer\", x: i.x, y: i.y }), this._tryShow({ offsetX: i.x, offsetY: i.y, position: i.position, target: n.getZr().findHover(i.x, i.y).target }, o)) } }, e.prototype.manuallyHideTip = function (t, e, n, i) { var r = this._tooltipContent; !this._alwaysShowContent && this._tooltipModel && r.hideLater(this._tooltipModel.get(\"hideDelay\")), this._lastX = this._lastY = this._lastDataByCoordSys = null, i.from !== this.uid && this._hide(tV(i, n)) }, e.prototype._manuallyAxisShowTip = function (t, e, n, i) { var r = i.seriesIndex, o = i.dataIndex, a = e.getComponent(\"axisPointer\").coordSysAxesInfo; if (null != r && null != o && null != a) { var s = e.getSeriesByIndex(r); if (s) if (\"axis\" === Qz([s.getData().getItemModel(o), s, (s.coordinateSystem || {}).model], this._tooltipModel).get(\"trigger\")) return n.dispatchAction({ type: \"updateAxisPointer\", seriesIndex: r, dataIndex: o, position: i.position }), !0 } }, e.prototype._tryShow = function (t, e) { var n = t.target; if (this._tooltipModel) { this._lastX = t.offsetX, this._lastY = t.offsetY; var i = t.dataByCoordSys; if (i && i.length) this._showAxisTooltip(i, t); else if (n) { var r, o; this._lastDataByCoordSys = null, wy(n, (function (t) { return null != js(t).dataIndex ? (r = t, !0) : null != js(t).tooltipConfig ? (o = t, !0) : void 0 }), !0), r ? this._showSeriesItemTooltip(t, r, e) : o ? this._showComponentItemTooltip(t, o, e) : this._hide(e) } else this._lastDataByCoordSys = null, this._hide(e) } }, e.prototype._showOrMove = function (t, e) { var n = t.get(\"showDelay\"); e = W(e, this), clearTimeout(this._showTimout), n > 0 ? this._showTimout = setTimeout(e, n) : e() }, e.prototype._showAxisTooltip = function (t, e) { var n = this._ecModel, i = this._tooltipModel, r = [e.offsetX, e.offsetY], o = Qz([e.tooltipOption], i), a = this._renderMode, s = [], l = qf(\"section\", { blocks: [], noHeader: !0 }), u = [], h = new ag; E(t, (function (t) { E(t.dataByAxis, (function (t) { var e = n.getComponent(t.axisDim + \"Axis\", t.axisIndex), r = t.value; if (e && null != r) { var o = HR(r, e.axis, n, t.seriesDataIndices, t.valueLabelOpt), c = qf(\"section\", { header: o, noHeader: !ut(o), sortBlocks: !0, blocks: [] }); l.blocks.push(c), E(t.seriesDataIndices, (function (l) { var p = n.getSeriesByIndex(l.seriesIndex), d = l.dataIndexInside, f = p.getDataParams(d); if (!(f.dataIndex < 0)) { f.axisDim = t.axisDim, f.axisIndex = t.axisIndex, f.axisType = t.axisType, f.axisId = t.axisId, f.axisValue = h_(e.axis, { value: r }), f.axisValueLabel = o, f.marker = h.makeTooltipMarker(\"item\", gp(f.color), a); var g = pf(p.formatTooltip(d, !0, null)), y = g.frag; if (y) { var v = Qz([p], i).get(\"valueFormatter\"); c.blocks.push(v ? A({ valueFormatter: v }, y) : y) } g.text && u.push(g.text), s.push(f) } })) } })) })), l.blocks.reverse(), u.reverse(); var c = e.position, p = o.get(\"order\"), d = eg(l, h, a, p, n.get(\"useUTC\"), o.get(\"textStyle\")); d && u.unshift(d); var f = \"richText\" === a ? \"\\n\\n\" : \"<br/>\", g = u.join(f); this._showOrMove(o, (function () { this._updateContentNotChangedOnAxis(t, s) ? this._updatePosition(o, c, r[0], r[1], this._tooltipContent, s) : this._showTooltipContent(o, g, s, Math.random() + \"\", r[0], r[1], c, null, h) })) }, e.prototype._showSeriesItemTooltip = function (t, e, n) { var i = this._ecModel, r = js(e), o = r.seriesIndex, a = i.getSeriesByIndex(o), s = r.dataModel || a, l = r.dataIndex, u = r.dataType, h = s.getData(u), c = this._renderMode, p = t.positionDefault, d = Qz([h.getItemModel(l), s, a && (a.coordinateSystem || {}).model], this._tooltipModel, p ? { position: p } : null), f = d.get(\"trigger\"); if (null == f || \"item\" === f) { var g = s.getDataParams(l, u), y = new ag; g.marker = y.makeTooltipMarker(\"item\", gp(g.color), c); var v = pf(s.formatTooltip(l, !1, u)), m = d.get(\"order\"), x = d.get(\"valueFormatter\"), _ = v.frag, b = _ ? eg(x ? A({ valueFormatter: x }, _) : _, y, c, m, i.get(\"useUTC\"), d.get(\"textStyle\")) : v.text, w = \"item_\" + s.name + \"_\" + l; this._showOrMove(d, (function () { this._showTooltipContent(d, b, g, w, t.offsetX, t.offsetY, t.position, t.target, y) })), n({ type: \"showTip\", dataIndexInside: l, dataIndex: h.getRawIndex(l), seriesIndex: o, from: this.uid }) } }, e.prototype._showComponentItemTooltip = function (t, e, n) { var i = js(e), r = i.tooltipConfig.option || {}; if (X(r)) { r = { content: r, formatter: r } } var o = [r], a = this._ecModel.getComponent(i.componentMainType, i.componentIndex); a && o.push(a), o.push({ formatter: r.content }); var s = t.positionDefault, l = Qz(o, this._tooltipModel, s ? { position: s } : null), u = l.get(\"content\"), h = Math.random() + \"\", c = new ag; this._showOrMove(l, (function () { var n = T(l.get(\"formatterParams\") || {}); this._showTooltipContent(l, u, n, h, t.offsetX, t.offsetY, t.position, e, c) })), n({ type: \"showTip\", from: this.uid }) }, e.prototype._showTooltipContent = function (t, e, n, i, r, o, a, s, l) { if (this._ticket = \"\", t.get(\"showContent\") && t.get(\"show\")) { var u = this._tooltipContent; u.setEnterable(t.get(\"enterable\")); var h = t.get(\"formatter\"); a = a || t.get(\"position\"); var c = e, p = this._getNearestPoint([r, o], n, t.get(\"trigger\"), t.get(\"borderColor\")).color; if (h) if (X(h)) { var d = t.ecModel.get(\"useUTC\"), f = Y(n) ? n[0] : n; c = h, f && f.axisType && f.axisType.indexOf(\"time\") >= 0 && (c = Yc(f.axisValue, c, d)), c = dp(c, n, !0) } else if (U(h)) { var g = W((function (e, i) { e === this._ticket && (u.setContent(i, l, t, p, a), this._updatePosition(t, a, r, o, u, n, s)) }), this); this._ticket = i, c = h(n, i, g) } else c = h; u.setContent(c, l, t, p, a), u.show(t, p), this._updatePosition(t, a, r, o, u, n, s) } }, e.prototype._getNearestPoint = function (t, e, n, i) { return \"axis\" === n || Y(e) ? { color: i || (\"html\" === this._renderMode ? \"#fff\" : \"none\") } : Y(e) ? void 0 : { color: i || e.color || e.borderColor } }, e.prototype._updatePosition = function (t, e, n, i, r, o, a) { var s = this._api.getWidth(), l = this._api.getHeight(); e = e || t.get(\"position\"); var u = r.getSize(), h = t.get(\"align\"), c = t.get(\"verticalAlign\"), p = a && a.getBoundingRect().clone(); if (a && p.applyTransform(a.transform), U(e) && (e = e([n, i], o, r.el, p, { viewSize: [s, l], contentSize: u.slice() })), Y(e)) n = Gr(e[0], s), i = Gr(e[1], l); else if (q(e)) { var d = e; d.width = u[0], d.height = u[1]; var f = wp(d, { width: s, height: l }); n = f.x, i = f.y, h = null, c = null } else if (X(e) && a) { var g = function (t, e, n, i) { var r = n[0], o = n[1], a = Math.ceil(Math.SQRT2 * i) + 8, s = 0, l = 0, u = e.width, h = e.height; switch (t) { case \"inside\": s = e.x + u / 2 - r / 2, l = e.y + h / 2 - o / 2; break; case \"top\": s = e.x + u / 2 - r / 2, l = e.y - o - a; break; case \"bottom\": s = e.x + u / 2 - r / 2, l = e.y + h + a; break; case \"left\": s = e.x - r - a, l = e.y + h / 2 - o / 2; break; case \"right\": s = e.x + u + a, l = e.y + h / 2 - o / 2 }return [s, l] }(e, p, u, t.get(\"borderWidth\")); n = g[0], i = g[1] } else { g = function (t, e, n, i, r, o, a) { var s = n.getSize(), l = s[0], u = s[1]; null != o && (t + l + o + 2 > i ? t -= l + o : t += o); null != a && (e + u + a > r ? e -= u + a : e += a); return [t, e] }(n, i, r, s, l, h ? null : 20, c ? null : 20); n = g[0], i = g[1] } if (h && (n -= eV(h) ? u[0] / 2 : \"right\" === h ? u[0] : 0), c && (i -= eV(c) ? u[1] / 2 : \"bottom\" === c ? u[1] : 0), Ez(t)) { g = function (t, e, n, i, r) { var o = n.getSize(), a = o[0], s = o[1]; return t = Math.min(t + a, i) - a, e = Math.min(e + s, r) - s, t = Math.max(t, 0), e = Math.max(e, 0), [t, e] }(n, i, r, s, l); n = g[0], i = g[1] } r.moveTo(n, i) }, e.prototype._updateContentNotChangedOnAxis = function (t, e) { var n = this._lastDataByCoordSys, i = this._cbParamsList, r = !!n && n.length === t.length; return r && E(n, (function (n, o) { var a = n.dataByAxis || [], s = (t[o] || {}).dataByAxis || []; (r = r && a.length === s.length) && E(a, (function (t, n) { var o = s[n] || {}, a = t.seriesDataIndices || [], l = o.seriesDataIndices || []; (r = r && t.value === o.value && t.axisType === o.axisType && t.axisId === o.axisId && a.length === l.length) && E(a, (function (t, e) { var n = l[e]; r = r && t.seriesIndex === n.seriesIndex && t.dataIndex === n.dataIndex })), i && E(t.seriesDataIndices, (function (t) { var n = t.seriesIndex, o = e[n], a = i[n]; o && a && a.data !== o.data && (r = !1) })) })) })), this._lastDataByCoordSys = t, this._cbParamsList = e, !!r }, e.prototype._hide = function (t) { this._lastDataByCoordSys = null, t({ type: \"hideTip\", from: this.uid }) }, e.prototype.dispose = function (t, e) { !r.node && e.getDom() && (Og(this, \"_updatePosition\"), this._tooltipContent.dispose(), oN(\"itemTooltip\", e)) }, e.type = \"tooltip\", e }(mg); function Qz(t, e, n) { var i, r = e.ecModel; n ? (i = new xc(n, r, r), i = new xc(e.option, i, r)) : i = e; for (var o = t.length - 1; o >= 0; o--) { var a = t[o]; a && (a instanceof xc && (a = a.get(\"tooltip\", !0)), X(a) && (a = { formatter: a }), a && (i = new xc(a, i, r))) } return i } function tV(t, e) { return t.dispatchAction || W(e.dispatchAction, e) } function eV(t) { return \"center\" === t || \"middle\" === t } var nV = [\"rect\", \"polygon\", \"keep\", \"clear\"]; function iV(t, e) { var n = yo(t ? t.brush : []); if (n.length) { var i = []; E(n, (function (t) { var e = t.hasOwnProperty(\"toolbox\") ? t.toolbox : []; e instanceof Array && (i = i.concat(e)) })); var r = t && t.toolbox; Y(r) && (r = r[0]), r || (r = { feature: {} }, t.toolbox = [r]); var o = r.feature || (r.feature = {}), a = o.brush || (o.brush = {}), s = a.type || (a.type = []); s.push.apply(s, i), function (t) { var e = {}; E(t, (function (t) { e[t] = 1 })), t.length = 0, E(e, (function (e, n) { t.push(n) })) }(s), e && !s.length && s.push.apply(s, nV) } } var rV = E; function oV(t) { if (t) for (var e in t) if (t.hasOwnProperty(e)) return !0 } function aV(t, e, n) { var i = {}; return rV(e, (function (e) { var r, o = i[e] = ((r = function () { }).prototype.__hidden = r.prototype, new r); rV(t[e], (function (t, i) { if (sD.isValidType(i)) { var r = { type: i, visual: t }; n && n(r, e), o[i] = new sD(r), \"opacity\" === i && ((r = T(r)).type = \"colorAlpha\", o.__hidden.__alphaForOpacity = new sD(r)) } })) })), i } function sV(t, e, n) { var i; E(n, (function (t) { e.hasOwnProperty(t) && oV(e[t]) && (i = !0) })), i && E(n, (function (n) { e.hasOwnProperty(n) && oV(e[n]) ? t[n] = T(e[n]) : delete t[n] })) } var lV = { lineX: uV(0), lineY: uV(1), rect: { point: function (t, e, n) { return t && n.boundingRect.contain(t[0], t[1]) }, rect: function (t, e, n) { return t && n.boundingRect.intersect(t) } }, polygon: { point: function (t, e, n) { return t && n.boundingRect.contain(t[0], t[1]) && x_(n.range, t[0], t[1]) }, rect: function (t, e, n) { var i = n.range; if (!t || i.length <= 1) return !1; var r = t.x, o = t.y, a = t.width, s = t.height, l = i[0]; return !!(x_(i, r, o) || x_(i, r + a, o) || x_(i, r, o + s) || x_(i, r + a, o + s) || Re.create(t).contain(l[0], l[1]) || Bh(r, o, r + a, o, i) || Bh(r, o, r, o + s, i) || Bh(r + a, o, r + a, o + s, i) || Bh(r, o + s, r + a, o + s, i)) || void 0 } } }; function uV(t) { var e = [\"x\", \"y\"], n = [\"width\", \"height\"]; return { point: function (e, n, i) { if (e) { var r = i.range; return hV(e[t], r) } }, rect: function (i, r, o) { if (i) { var a = o.range, s = [i[e[t]], i[e[t]] + i[n[t]]]; return s[1] < s[0] && s.reverse(), hV(s[0], a) || hV(s[1], a) || hV(a[0], s) || hV(a[1], s) } } } } function hV(t, e) { return e[0] <= t && t <= e[1] } var cV = [\"inBrush\", \"outOfBrush\"], pV = \"__ecBrushSelect\", dV = \"__ecInBrushSelectEvent\"; function fV(t) { t.eachComponent({ mainType: \"brush\" }, (function (e) { (e.brushTargetManager = new vz(e.option, t)).setInputRanges(e.areas, t) })) } function gV(t, e, n) { var i, r, o = []; t.eachComponent({ mainType: \"brush\" }, (function (t) { n && \"takeGlobalCursor\" === n.type && t.setBrushOption(\"brush\" === n.key ? n.brushOption : { brushType: !1 }) })), fV(t), t.eachComponent({ mainType: \"brush\" }, (function (e, n) { var a = { brushId: e.id, brushIndex: n, brushName: e.name, areas: T(e.areas), selected: [] }; o.push(a); var s = e.option, l = s.brushLink, u = [], h = [], c = [], p = !1; n || (i = s.throttleType, r = s.throttleDelay); var d = z(e.areas, (function (t) { var e = mV[t.brushType], n = k({ boundingRect: e ? e(t) : void 0 }, t); return n.selectors = function (t) { var e = t.brushType, n = { point: function (i) { return lV[e].point(i, n, t) }, rect: function (i) { return lV[e].rect(i, n, t) } }; return n }(n), n })), f = aV(e.option, cV, (function (t) { t.mappingMethod = \"fixed\" })); function g(t) { return \"all\" === l || !!u[t] } function y(t) { return !!t.length } Y(l) && E(l, (function (t) { u[t] = 1 })), t.eachSeries((function (n, i) { var r = c[i] = []; \"parallel\" === n.subType ? function (t, e) { var n = t.coordinateSystem; p = p || n.hasAxisBrushed(), g(e) && n.eachActiveState(t.getData(), (function (t, e) { \"active\" === t && (h[e] = 1) })) }(n, i) : function (n, i, r) { if (!n.brushSelector || function (t, e) { var n = t.option.seriesIndex; return null != n && \"all\" !== n && (Y(n) ? P(n, e) < 0 : e !== n) }(e, i)) return; if (E(d, (function (i) { e.brushTargetManager.controlSeries(i, n, t) && r.push(i), p = p || y(r) })), g(i) && y(r)) { var o = n.getData(); o.each((function (t) { vV(n, r, o, t) && (h[t] = 1) })) } }(n, i, r) })), t.eachSeries((function (t, e) { var n = { seriesId: t.id, seriesIndex: e, seriesName: t.name, dataIndex: [] }; a.selected.push(n); var i = c[e], r = t.getData(), o = g(e) ? function (t) { return h[t] ? (n.dataIndex.push(r.getRawIndex(t)), \"inBrush\") : \"outOfBrush\" } : function (e) { return vV(t, i, r, e) ? (n.dataIndex.push(r.getRawIndex(e)), \"inBrush\") : \"outOfBrush\" }; (g(e) ? p : y(i)) && function (t, e, n, i, r, o) { var a, s = {}; function l(t) { return vy(n, a, t) } function u(t, e) { xy(n, a, t, e) } function h(t, h) { a = null == o ? t : h; var c = n.getRawDataItem(a); if (!c || !1 !== c.visualMap) for (var p = i.call(r, t), d = e[p], f = s[p], g = 0, y = f.length; g < y; g++) { var v = f[g]; d[v] && d[v].applyVisual(t, l, u) } } E(t, (function (t) { var n = sD.prepareVisualTypes(e[t]); s[t] = n })), null == o ? n.each(h) : n.each([o], h) }(cV, f, r, o) })) })), function (t, e, n, i, r) { if (!r) return; var o = t.getZr(); if (o[dV]) return; o.__ecBrushSelect || (o.__ecBrushSelect = yV); Pg(o, pV, n, e)(t, i) }(e, i, r, o, n) } function yV(t, e) { if (!t.isDisposed()) { var n = t.getZr(); n[dV] = !0, t.dispatchAction({ type: \"brushSelect\", batch: e }), n[dV] = !1 } } function vV(t, e, n, i) { for (var r = 0, o = e.length; r < o; r++) { var a = e[r]; if (t.brushSelector(i, n, a.selectors, a)) return !0 } } var mV = { rect: function (t) { return xV(t.range) }, polygon: function (t) { for (var e, n = t.range, i = 0, r = n.length; i < r; i++) { e = e || [[1 / 0, -1 / 0], [1 / 0, -1 / 0]]; var o = n[i]; o[0] < e[0][0] && (e[0][0] = o[0]), o[0] > e[0][1] && (e[0][1] = o[0]), o[1] < e[1][0] && (e[1][0] = o[1]), o[1] > e[1][1] && (e[1][1] = o[1]) } return e && xV(e) } }; function xV(t) { return new Re(t[0][0], t[1][0], t[0][1] - t[0][0], t[1][1] - t[1][0]) } var _V = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (t, e) { this.ecModel = t, this.api = e, this.model, (this._brushController = new Vk(e.getZr())).on(\"brush\", W(this._onBrush, this)).mount() }, e.prototype.render = function (t, e, n, i) { this.model = t, this._updateController(t, e, n, i) }, e.prototype.updateTransform = function (t, e, n, i) { fV(e), this._updateController(t, e, n, i) }, e.prototype.updateVisual = function (t, e, n, i) { this.updateTransform(t, e, n, i) }, e.prototype.updateView = function (t, e, n, i) { this._updateController(t, e, n, i) }, e.prototype._updateController = function (t, e, n, i) { (!i || i.$from !== t.id) && this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice()) }, e.prototype.dispose = function () { this._brushController.dispose() }, e.prototype._onBrush = function (t) { var e = this.model.id, n = this.model.brushTargetManager.setOutputRanges(t.areas, this.ecModel); (!t.isEnd || t.removeOnClick) && this.api.dispatchAction({ type: \"brush\", brushId: e, areas: T(n), $from: e }), t.isEnd && this.api.dispatchAction({ type: \"brushEnd\", brushId: e, areas: T(n), $from: e }) }, e.type = \"brush\", e }(mg), bV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.areas = [], n.brushOption = {}, n } return n(e, t), e.prototype.optionUpdated = function (t, e) { var n = this.option; !e && sV(n, t, [\"inBrush\", \"outOfBrush\"]); var i = n.inBrush = n.inBrush || {}; n.outOfBrush = n.outOfBrush || { color: \"#ddd\" }, i.hasOwnProperty(\"liftZ\") || (i.liftZ = 5) }, e.prototype.setAreas = function (t) { t && (this.areas = z(t, (function (t) { return wV(this.option, t) }), this)) }, e.prototype.setBrushOption = function (t) { this.brushOption = wV(this.option, t), this.brushType = this.brushOption.brushType }, e.type = \"brush\", e.dependencies = [\"geo\", \"grid\", \"xAxis\", \"yAxis\", \"parallel\", \"series\"], e.defaultOption = { seriesIndex: \"all\", brushType: \"rect\", brushMode: \"single\", transformable: !0, brushStyle: { borderWidth: 1, color: \"rgba(210,219,238,0.3)\", borderColor: \"#D2DBEE\" }, throttleType: \"fixRate\", throttleDelay: 0, removeOnClick: !0, z: 1e4 }, e }(Ap); function wV(t, e) { return C({ brushType: t.brushType, brushMode: t.brushMode, transformable: t.transformable, brushStyle: new xc(t.brushStyle).getItemStyle(), removeOnClick: t.removeOnClick, z: t.z }, e, !0) } var SV = [\"rect\", \"polygon\", \"lineX\", \"lineY\", \"keep\", \"clear\"], MV = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return n(e, t), e.prototype.render = function (t, e, n) { var i, r, o; e.eachComponent({ mainType: \"brush\" }, (function (t) { i = t.brushType, r = t.brushOption.brushMode || \"single\", o = o || !!t.areas.length })), this._brushType = i, this._brushMode = r, E(t.get(\"type\", !0), (function (e) { t.setIconStatus(e, (\"keep\" === e ? \"multiple\" === r : \"clear\" === e ? o : e === i) ? \"emphasis\" : \"normal\") })) }, e.prototype.updateView = function (t, e, n) { this.render(t, e, n) }, e.prototype.getIcons = function () { var t = this.model, e = t.get(\"icon\", !0), n = {}; return E(t.get(\"type\", !0), (function (t) { e[t] && (n[t] = e[t]) })), n }, e.prototype.onclick = function (t, e, n) { var i = this._brushType, r = this._brushMode; \"clear\" === n ? (e.dispatchAction({ type: \"axisAreaSelect\", intervals: [] }), e.dispatchAction({ type: \"brush\", command: \"clear\", areas: [] })) : e.dispatchAction({ type: \"takeGlobalCursor\", key: \"brush\", brushOption: { brushType: \"keep\" === n ? i : i !== n && n, brushMode: \"keep\" === n ? \"multiple\" === r ? \"single\" : \"multiple\" : r } }) }, e.getDefaultOption = function (t) { return { show: !0, type: SV.slice(), icon: { rect: \"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13\", polygon: \"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2\", lineX: \"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4\", lineY: \"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4\", keep: \"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z\", clear: \"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2\" }, title: t.getLocaleModel().get([\"toolbox\", \"brush\", \"title\"]) } }, e }(ZE); var IV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.layoutMode = { type: \"box\", ignoreSize: !0 }, n } return n(e, t), e.type = \"title\", e.defaultOption = { z: 6, show: !0, text: \"\", target: \"blank\", subtext: \"\", subtarget: \"blank\", left: 0, top: 0, backgroundColor: \"rgba(0,0,0,0)\", borderColor: \"#ccc\", borderWidth: 0, padding: 5, itemGap: 10, textStyle: { fontSize: 18, fontWeight: \"bold\", color: \"#464646\" }, subtextStyle: { fontSize: 12, color: \"#6E7079\" } }, e }(Ap), TV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.render = function (t, e, n) { if (this.group.removeAll(), t.get(\"show\")) { var i = this.group, r = t.getModel(\"textStyle\"), o = t.getModel(\"subtextStyle\"), a = t.get(\"textAlign\"), s = rt(t.get(\"textBaseline\"), t.get(\"textVerticalAlign\")), l = new Ns({ style: $h(r, { text: t.get(\"text\"), fill: r.getTextColor() }, { disableBox: !0 }), z2: 10 }), u = l.getBoundingRect(), h = t.get(\"subtext\"), c = new Ns({ style: $h(o, { text: h, fill: o.getTextColor(), y: u.height + t.get(\"itemGap\"), verticalAlign: \"top\" }, { disableBox: !0 }), z2: 10 }), p = t.get(\"link\"), d = t.get(\"sublink\"), f = t.get(\"triggerEvent\", !0); l.silent = !p && !f, c.silent = !d && !f, p && l.on(\"click\", (function () { yp(p, \"_\" + t.get(\"target\")) })), d && c.on(\"click\", (function () { yp(d, \"_\" + t.get(\"subtarget\")) })), js(l).eventData = js(c).eventData = f ? { componentType: \"title\", componentIndex: t.componentIndex } : null, i.add(l), h && i.add(c); var g = i.getBoundingRect(), y = t.getBoxLayoutParams(); y.width = g.width, y.height = g.height; var v = wp(y, { width: n.getWidth(), height: n.getHeight() }, t.get(\"padding\")); a || (\"middle\" === (a = t.get(\"left\") || t.get(\"right\")) && (a = \"center\"), \"right\" === a ? v.x += v.width : \"center\" === a && (v.x += v.width / 2)), s || (\"center\" === (s = t.get(\"top\") || t.get(\"bottom\")) && (s = \"middle\"), \"bottom\" === s ? v.y += v.height : \"middle\" === s && (v.y += v.height / 2), s = s || \"top\"), i.x = v.x, i.y = v.y, i.markRedraw(); var m = { align: a, verticalAlign: s }; l.setStyle(m), c.setStyle(m), g = i.getBoundingRect(); var x = v.margin, _ = t.getItemStyle([\"color\", \"opacity\"]); _.fill = t.get(\"backgroundColor\"); var b = new Ps({ shape: { x: g.x - x[3], y: g.y - x[0], width: g.width + x[1] + x[3], height: g.height + x[0] + x[2], r: t.get(\"borderRadius\") }, style: _, subPixelOptimize: !0, silent: !0 }); i.add(b) } }, e.type = \"title\", e }(mg); var CV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.layoutMode = \"box\", n } return n(e, t), e.prototype.init = function (t, e, n) { this.mergeDefaultAndTheme(t, n), this._initData() }, e.prototype.mergeOption = function (e) { t.prototype.mergeOption.apply(this, arguments), this._initData() }, e.prototype.setCurrentIndex = function (t) { null == t && (t = this.option.currentIndex); var e = this._data.count(); this.option.loop ? t = (t % e + e) % e : (t >= e && (t = e - 1), t < 0 && (t = 0)), this.option.currentIndex = t }, e.prototype.getCurrentIndex = function () { return this.option.currentIndex }, e.prototype.isIndexMax = function () { return this.getCurrentIndex() >= this._data.count() - 1 }, e.prototype.setPlayState = function (t) { this.option.autoPlay = !!t }, e.prototype.getPlayState = function () { return !!this.option.autoPlay }, e.prototype._initData = function () { var t, e = this.option, n = e.data || [], i = e.axisType, r = this._names = []; \"category\" === i ? (t = [], E(n, (function (e, n) { var i, o = Mo(xo(e), \"\"); q(e) ? (i = T(e)).value = n : i = n, t.push(i), r.push(o) }))) : t = n; var o = { category: \"ordinal\", time: \"time\", value: \"number\" }[i] || \"number\"; (this._data = new Jm([{ name: \"value\", type: o }], this)).initData(t, r) }, e.prototype.getData = function () { return this._data }, e.prototype.getCategories = function () { if (\"category\" === this.get(\"axisType\")) return this._names.slice() }, e.type = \"timeline\", e.defaultOption = { z: 4, show: !0, axisType: \"time\", realtime: !0, left: \"20%\", top: null, right: \"20%\", bottom: 0, width: null, height: 40, padding: 5, controlPosition: \"left\", autoPlay: !1, rewind: !1, loop: !0, playInterval: 2e3, currentIndex: 0, itemStyle: {}, label: { color: \"#000\" }, data: [] }, e }(Ap), DV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"timeline.slider\", e.defaultOption = wc(CV.defaultOption, { backgroundColor: \"rgba(0,0,0,0)\", borderColor: \"#ccc\", borderWidth: 0, orient: \"horizontal\", inverse: !1, tooltip: { trigger: \"item\" }, symbol: \"circle\", symbolSize: 12, lineStyle: { show: !0, width: 2, color: \"#DAE1F5\" }, label: { position: \"auto\", show: !0, interval: \"auto\", rotate: 0, color: \"#A4B1D7\" }, itemStyle: { color: \"#A4B1D7\", borderWidth: 1 }, checkpointStyle: { symbol: \"circle\", symbolSize: 15, color: \"#316bf3\", borderColor: \"#fff\", borderWidth: 2, shadowBlur: 2, shadowOffsetX: 1, shadowOffsetY: 1, shadowColor: \"rgba(0, 0, 0, 0.3)\", animation: !0, animationDuration: 300, animationEasing: \"quinticInOut\" }, controlStyle: { show: !0, showPlayBtn: !0, showPrevBtn: !0, showNextBtn: !0, itemSize: 24, itemGap: 12, position: \"left\", playIcon: \"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z\", stopIcon: \"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z\", nextIcon: \"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z\", prevIcon: \"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z\", prevBtnSize: 18, nextBtnSize: 18, color: \"#A4B1D7\", borderColor: \"#A4B1D7\", borderWidth: 1 }, emphasis: { label: { show: !0, color: \"#6f778d\" }, itemStyle: { color: \"#316BF3\" }, controlStyle: { color: \"#316BF3\", borderColor: \"#316BF3\", borderWidth: 2 } }, progress: { lineStyle: { color: \"#316BF3\" }, itemStyle: { color: \"#316BF3\" }, label: { color: \"#6f778d\" } }, data: [] }), e }(CV); R(DV, cf.prototype); var AV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"timeline\", e }(mg), kV = function (t) { function e(e, n, i, r) { var o = t.call(this, e, n, i) || this; return o.type = r || \"value\", o } return n(e, t), e.prototype.getLabelModel = function () { return this.model.getModel(\"label\") }, e.prototype.isHorizontal = function () { return \"horizontal\" === this.model.get(\"orient\") }, e }(X_), LV = Math.PI, PV = Do(), OV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function (t, e) { this.api = e }, e.prototype.render = function (t, e, n) { if (this.model = t, this.api = n, this.ecModel = e, this.group.removeAll(), t.get(\"show\", !0)) { var i = this._layout(t, n), r = this._createGroup(\"_mainGroup\"), o = this._createGroup(\"_labelGroup\"), a = this._axis = this._createAxis(i, t); t.formatTooltip = function (t) { return qf(\"nameValue\", { noName: !0, value: a.scale.getLabel({ value: t }) }) }, E([\"AxisLine\", \"AxisTick\", \"Control\", \"CurrentPointer\"], (function (e) { this[\"_render\" + e](i, r, a, t) }), this), this._renderAxisLabel(i, o, a, t), this._position(i, t) } this._doPlayStop(), this._updateTicksStatus() }, e.prototype.remove = function () { this._clearTimer(), this.group.removeAll() }, e.prototype.dispose = function () { this._clearTimer() }, e.prototype._layout = function (t, e) { var n, i, r, o, a = t.get([\"label\", \"position\"]), s = t.get(\"orient\"), l = function (t, e) { return wp(t.getBoxLayoutParams(), { width: e.getWidth(), height: e.getHeight() }, t.get(\"padding\")) }(t, e), u = { horizontal: \"center\", vertical: (n = null == a || \"auto\" === a ? \"horizontal\" === s ? l.y + l.height / 2 < e.getHeight() / 2 ? \"-\" : \"+\" : l.x + l.width / 2 < e.getWidth() / 2 ? \"+\" : \"-\" : X(a) ? { horizontal: { top: \"-\", bottom: \"+\" }, vertical: { left: \"-\", right: \"+\" } }[s][a] : a) >= 0 || \"+\" === n ? \"left\" : \"right\" }, h = { horizontal: n >= 0 || \"+\" === n ? \"top\" : \"bottom\", vertical: \"middle\" }, c = { horizontal: 0, vertical: LV / 2 }, p = \"vertical\" === s ? l.height : l.width, d = t.getModel(\"controlStyle\"), f = d.get(\"show\", !0), g = f ? d.get(\"itemSize\") : 0, y = f ? d.get(\"itemGap\") : 0, v = g + y, m = t.get([\"label\", \"rotate\"]) || 0; m = m * LV / 180; var x = d.get(\"position\", !0), _ = f && d.get(\"showPlayBtn\", !0), b = f && d.get(\"showPrevBtn\", !0), w = f && d.get(\"showNextBtn\", !0), S = 0, M = p; \"left\" === x || \"bottom\" === x ? (_ && (i = [0, 0], S += v), b && (r = [S, 0], S += v), w && (o = [M - g, 0], M -= v)) : (_ && (i = [M - g, 0], M -= v), b && (r = [0, 0], S += v), w && (o = [M - g, 0], M -= v)); var I = [S, M]; return t.get(\"inverse\") && I.reverse(), { viewRect: l, mainLength: p, orient: s, rotation: c[s], labelRotation: m, labelPosOpt: n, labelAlign: t.get([\"label\", \"align\"]) || u[s], labelBaseline: t.get([\"label\", \"verticalAlign\"]) || t.get([\"label\", \"baseline\"]) || h[s], playPosition: i, prevBtnPosition: r, nextBtnPosition: o, axisExtent: I, controlSize: g, controlGap: y } }, e.prototype._position = function (t, e) { var n = this._mainGroup, i = this._labelGroup, r = t.viewRect; if (\"vertical\" === t.orient) { var o = [1, 0, 0, 1, 0, 0], a = r.x, s = r.y + r.height; xe(o, o, [-a, -s]), _e(o, o, -LV / 2), xe(o, o, [a, s]), (r = r.clone()).applyTransform(o) } var l = y(r), u = y(n.getBoundingRect()), h = y(i.getBoundingRect()), c = [n.x, n.y], p = [i.x, i.y]; p[0] = c[0] = l[0][0]; var d, f = t.labelPosOpt; null == f || X(f) ? (v(c, u, l, 1, d = \"+\" === f ? 0 : 1), v(p, h, l, 1, 1 - d)) : (v(c, u, l, 1, d = f >= 0 ? 0 : 1), p[1] = c[1] + f); function g(t) { t.originX = l[0][0] - t.x, t.originY = l[1][0] - t.y } function y(t) { return [[t.x, t.x + t.width], [t.y, t.y + t.height]] } function v(t, e, n, i, r) { t[i] += n[i][r] - e[i][r] } n.setPosition(c), i.setPosition(p), n.rotation = i.rotation = t.rotation, g(n), g(i) }, e.prototype._createAxis = function (t, e) { var n = e.getData(), i = e.get(\"axisType\"), r = function (t, e) { if (e = e || t.get(\"type\")) switch (e) { case \"category\": return new _x({ ordinalMeta: t.getCategories(), extent: [1 / 0, -1 / 0] }); case \"time\": return new zx({ locale: t.ecModel.getLocaleModel(), useUTC: t.ecModel.get(\"useUTC\") }); default: return new Sx } }(e, i); r.getTicks = function () { return n.mapArray([\"value\"], (function (t) { return { value: t } })) }; var o = n.getDataExtent(\"value\"); r.setExtent(o[0], o[1]), r.calcNiceTicks(); var a = new kV(\"value\", r, t.axisExtent, i); return a.model = e, a }, e.prototype._createGroup = function (t) { var e = this[t] = new Pr; return this.group.add(e), e }, e.prototype._renderAxisLine = function (t, e, n, i) { var r = n.getExtent(); if (i.get([\"lineStyle\", \"show\"])) { var o = new Wu({ shape: { x1: r[0], y1: 0, x2: r[1], y2: 0 }, style: A({ lineCap: \"round\" }, i.getModel(\"lineStyle\").getLineStyle()), silent: !0, z2: 1 }); e.add(o); var a = this._progressLine = new Wu({ shape: { x1: r[0], x2: this._currentPointer ? this._currentPointer.x : r[0], y1: 0, y2: 0 }, style: k({ lineCap: \"round\", lineWidth: o.style.lineWidth }, i.getModel([\"progress\", \"lineStyle\"]).getLineStyle()), silent: !0, z2: 1 }); e.add(a) } }, e.prototype._renderAxisTick = function (t, e, n, i) { var r = this, o = i.getData(), a = n.scale.getTicks(); this._tickSymbols = [], E(a, (function (t) { var a = n.dataToCoord(t.value), s = o.getItemModel(t.value), l = s.getModel(\"itemStyle\"), u = s.getModel([\"emphasis\", \"itemStyle\"]), h = s.getModel([\"progress\", \"itemStyle\"]), c = { x: a, y: 0, onclick: W(r._changeTimeline, r, t.value) }, p = RV(s, l, e, c); p.ensureState(\"emphasis\").style = u.getItemStyle(), p.ensureState(\"progress\").style = h.getItemStyle(), Vl(p); var d = js(p); s.get(\"tooltip\") ? (d.dataIndex = t.value, d.dataModel = i) : d.dataIndex = d.dataModel = null, r._tickSymbols.push(p) })) }, e.prototype._renderAxisLabel = function (t, e, n, i) { var r = this; if (n.getLabelModel().get(\"show\")) { var o = i.getData(), a = n.getViewLabels(); this._tickLabels = [], E(a, (function (i) { var a = i.tickValue, s = o.getItemModel(a), l = s.getModel(\"label\"), u = s.getModel([\"emphasis\", \"label\"]), h = s.getModel([\"progress\", \"label\"]), c = n.dataToCoord(i.tickValue), p = new Ns({ x: c, y: 0, rotation: t.labelRotation - t.rotation, onclick: W(r._changeTimeline, r, a), silent: !1, style: $h(l, { text: i.formattedLabel, align: t.labelAlign, verticalAlign: t.labelBaseline }) }); p.ensureState(\"emphasis\").style = $h(u), p.ensureState(\"progress\").style = $h(h), e.add(p), Vl(p), PV(p).dataIndex = a, r._tickLabels.push(p) })) } }, e.prototype._renderControl = function (t, e, n, i) { var r = t.controlSize, o = t.rotation, a = i.getModel(\"controlStyle\").getItemStyle(), s = i.getModel([\"emphasis\", \"controlStyle\"]).getItemStyle(), l = i.getPlayState(), u = i.get(\"inverse\", !0); function h(t, n, l, u) { if (t) { var h = _r(rt(i.get([\"controlStyle\", n + \"BtnSize\"]), r), r), c = function (t, e, n, i) { var r = i.style, o = Vh(t.get([\"controlStyle\", e]), i || {}, new Re(n[0], n[1], n[2], n[3])); r && o.setStyle(r); return o }(i, n + \"Icon\", [0, -h / 2, h, h], { x: t[0], y: t[1], originX: r / 2, originY: 0, rotation: u ? -o : 0, rectHover: !0, style: a, onclick: l }); c.ensureState(\"emphasis\").style = s, e.add(c), Vl(c) } } h(t.nextBtnPosition, \"next\", W(this._changeTimeline, this, u ? \"-\" : \"+\")), h(t.prevBtnPosition, \"prev\", W(this._changeTimeline, this, u ? \"+\" : \"-\")), h(t.playPosition, l ? \"stop\" : \"play\", W(this._handlePlayClick, this, !l), !0) }, e.prototype._renderCurrentPointer = function (t, e, n, i) { var r = i.getData(), o = i.getCurrentIndex(), a = r.getItemModel(o).getModel(\"checkpointStyle\"), s = this, l = { onCreate: function (t) { t.draggable = !0, t.drift = W(s._handlePointerDrag, s), t.ondragend = W(s._handlePointerDragend, s), NV(t, s._progressLine, o, n, i, !0) }, onUpdate: function (t) { NV(t, s._progressLine, o, n, i) } }; this._currentPointer = RV(a, a, this._mainGroup, {}, this._currentPointer, l) }, e.prototype._handlePlayClick = function (t) { this._clearTimer(), this.api.dispatchAction({ type: \"timelinePlayChange\", playState: t, from: this.uid }) }, e.prototype._handlePointerDrag = function (t, e, n) { this._clearTimer(), this._pointerChangeTimeline([n.offsetX, n.offsetY]) }, e.prototype._handlePointerDragend = function (t) { this._pointerChangeTimeline([t.offsetX, t.offsetY], !0) }, e.prototype._pointerChangeTimeline = function (t, e) { var n = this._toAxisCoord(t)[0], i = Hr(this._axis.getExtent().slice()); n > i[1] && (n = i[1]), n < i[0] && (n = i[0]), this._currentPointer.x = n, this._currentPointer.markRedraw(), this._progressLine.shape.x2 = n, this._progressLine.dirty(); var r = this._findNearestTick(n), o = this.model; (e || r !== o.getCurrentIndex() && o.get(\"realtime\")) && this._changeTimeline(r) }, e.prototype._doPlayStop = function () { var t = this; this._clearTimer(), this.model.getPlayState() && (this._timer = setTimeout((function () { var e = t.model; t._changeTimeline(e.getCurrentIndex() + (e.get(\"rewind\", !0) ? -1 : 1)) }), this.model.get(\"playInterval\"))) }, e.prototype._toAxisCoord = function (t) { return Ph(t, this._mainGroup.getLocalTransform(), !0) }, e.prototype._findNearestTick = function (t) { var e, n = this.model.getData(), i = 1 / 0, r = this._axis; return n.each([\"value\"], (function (n, o) { var a = r.dataToCoord(n), s = Math.abs(a - t); s < i && (i = s, e = o) })), e }, e.prototype._clearTimer = function () { this._timer && (clearTimeout(this._timer), this._timer = null) }, e.prototype._changeTimeline = function (t) { var e = this.model.getCurrentIndex(); \"+\" === t ? t = e + 1 : \"-\" === t && (t = e - 1), this.api.dispatchAction({ type: \"timelineChange\", currentIndex: t, from: this.uid }) }, e.prototype._updateTicksStatus = function () { var t = this.model.getCurrentIndex(), e = this._tickSymbols, n = this._tickLabels; if (e) for (var i = 0; i < e.length; i++)e && e[i] && e[i].toggleState(\"progress\", i < t); if (n) for (i = 0; i < n.length; i++)n && n[i] && n[i].toggleState(\"progress\", PV(n[i]).dataIndex <= t) }, e.type = \"timeline.slider\", e }(AV); function RV(t, e, n, i, r, o) { var a = e.get(\"color\"); r ? (r.setColor(a), n.add(r), o && o.onUpdate(r)) : ((r = Ry(t.get(\"symbol\"), -1, -1, 2, 2, a)).setStyle(\"strokeNoScale\", !0), n.add(r), o && o.onCreate(r)); var s = e.getItemStyle([\"color\"]); r.setStyle(s), i = C({ rectHover: !0, z2: 100 }, i, !0); var l = Ny(t.get(\"symbolSize\")); i.scaleX = l[0] / 2, i.scaleY = l[1] / 2; var u = Ey(t.get(\"symbolOffset\"), l); u && (i.x = (i.x || 0) + u[0], i.y = (i.y || 0) + u[1]); var h = t.get(\"symbolRotate\"); return i.rotation = (h || 0) * Math.PI / 180 || 0, r.attr(i), r.updateTransform(), r } function NV(t, e, n, i, r, o) { if (!t.dragging) { var a = r.getModel(\"checkpointStyle\"), s = i.dataToCoord(r.getData().get(\"value\", n)); if (o || !a.get(\"animation\", !0)) t.attr({ x: s, y: 0 }), e && e.attr({ shape: { x2: s } }); else { var l = { duration: a.get(\"animationDuration\", !0), easing: a.get(\"animationEasing\", !0) }; t.stopAnimation(null, !0), t.animateTo({ x: s, y: 0 }, l), e && e.animateTo({ shape: { x2: s } }, l) } } } function EV(t) { var e = t && t.timeline; Y(e) || (e = e ? [e] : []), E(e, (function (t) { t && function (t) { var e = t.type, n = { number: \"value\", time: \"time\" }; n[e] && (t.axisType = n[e], delete t.type); if (zV(t), VV(t, \"controlPosition\")) { var i = t.controlStyle || (t.controlStyle = {}); VV(i, \"position\") || (i.position = t.controlPosition), \"none\" !== i.position || VV(i, \"show\") || (i.show = !1, delete i.position), delete t.controlPosition } E(t.data || [], (function (t) { q(t) && !Y(t) && (!VV(t, \"value\") && VV(t, \"name\") && (t.value = t.name), zV(t)) })) }(t) })) } function zV(t) { var e = t.itemStyle || (t.itemStyle = {}), n = e.emphasis || (e.emphasis = {}), i = t.label || t.label || {}, r = i.normal || (i.normal = {}), o = { normal: 1, emphasis: 1 }; E(i, (function (t, e) { o[e] || VV(r, e) || (r[e] = t) })), n.label && !VV(i, \"emphasis\") && (i.emphasis = n.label, delete n.label) } function VV(t, e) { return t.hasOwnProperty(e) } function BV(t, e) { if (!t) return !1; for (var n = Y(t) ? t : [t], i = 0; i < n.length; i++)if (n[i] && n[i][e]) return !0; return !1 } function FV(t) { vo(t, \"label\", [\"show\"]) } var GV = Do(), WV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.createdBySelf = !1, n } return n(e, t), e.prototype.init = function (t, e, n) { this.mergeDefaultAndTheme(t, n), this._mergeOption(t, n, !1, !0) }, e.prototype.isAnimationEnabled = function () { if (r.node) return !1; var t = this.__hostSeries; return this.getShallow(\"animation\") && t && t.isAnimationEnabled() }, e.prototype.mergeOption = function (t, e) { this._mergeOption(t, e, !1, !1) }, e.prototype._mergeOption = function (t, e, n, i) { var r = this.mainType; n || e.eachSeries((function (t) { var n = t.get(this.mainType, !0), o = GV(t)[r]; n && n.data ? (o ? o._mergeOption(n, e, !0) : (i && FV(n), E(n.data, (function (t) { t instanceof Array ? (FV(t[0]), FV(t[1])) : FV(t) })), A(o = this.createMarkerModelFromSeries(n, this, e), { mainType: this.mainType, seriesIndex: t.seriesIndex, name: t.name, createdBySelf: !0 }), o.__hostSeries = t), GV(t)[r] = o) : GV(t)[r] = null }), this) }, e.prototype.formatTooltip = function (t, e, n) { var i = this.getData(), r = this.getRawValue(t), o = i.getName(t); return qf(\"section\", { header: this.name, blocks: [qf(\"nameValue\", { name: o, value: r, noName: !o, noValue: null == r })] }) }, e.prototype.getData = function () { return this._data }, e.prototype.setData = function (t) { this._data = t }, e.getMarkerModelFromSeries = function (t, e) { return GV(t)[e] }, e.type = \"marker\", e.dependencies = [\"series\", \"grid\", \"polar\", \"geo\"], e }(Ap); R(WV, cf.prototype); var HV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.createMarkerModelFromSeries = function (t, n, i) { return new e(t, n, i) }, e.type = \"markPoint\", e.defaultOption = { z: 5, symbol: \"pin\", symbolSize: 50, tooltip: { trigger: \"item\" }, label: { show: !0, position: \"inside\" }, itemStyle: { borderWidth: 2 }, emphasis: { label: { show: !0 } } }, e }(WV); function YV(t) { return !(isNaN(parseFloat(t.x)) && isNaN(parseFloat(t.y))) } function UV(t, e, n, i, r, o) { var a = [], s = ox(e, i) ? e.getCalculationInfo(\"stackResultDimension\") : i, l = $V(e, s, t), u = e.indicesOfNearest(s, l)[0]; a[r] = e.get(n, u), a[o] = e.get(s, u); var h = e.get(i, u), c = Yr(e.get(i, u)); return (c = Math.min(c, 20)) >= 0 && (a[o] = +a[o].toFixed(c)), [a, h] } var XV = { min: H(UV, \"min\"), max: H(UV, \"max\"), average: H(UV, \"average\"), median: H(UV, \"median\") }; function ZV(t, e) { var n = t.getData(), i = t.coordinateSystem; if (e && !function (t) { return !isNaN(parseFloat(t.x)) && !isNaN(parseFloat(t.y)) }(e) && !Y(e.coord) && i) { var r = i.dimensions, o = jV(e, n, i, t); if ((e = T(e)).type && XV[e.type] && o.baseAxis && o.valueAxis) { var a = P(r, o.baseAxis.dim), s = P(r, o.valueAxis.dim), l = XV[e.type](n, o.baseDataDim, o.valueDataDim, a, s); e.coord = l[0], e.value = l[1] } else { for (var u = [null != e.xAxis ? e.xAxis : e.radiusAxis, null != e.yAxis ? e.yAxis : e.angleAxis], h = 0; h < 2; h++)XV[u[h]] && (u[h] = $V(n, n.mapDimension(r[h]), u[h])); e.coord = u } } return e } function jV(t, e, n, i) { var r = {}; return null != t.valueIndex || null != t.valueDim ? (r.valueDataDim = null != t.valueIndex ? e.getDimension(t.valueIndex) : t.valueDim, r.valueAxis = n.getAxis(function (t, e) { var n = t.getData().getDimensionInfo(e); return n && n.coordDim }(i, r.valueDataDim)), r.baseAxis = n.getOtherAxis(r.valueAxis), r.baseDataDim = e.mapDimension(r.baseAxis.dim)) : (r.baseAxis = i.getBaseAxis(), r.valueAxis = n.getOtherAxis(r.baseAxis), r.baseDataDim = e.mapDimension(r.baseAxis.dim), r.valueDataDim = e.mapDimension(r.valueAxis.dim)), r } function qV(t, e) { return !(t && t.containData && e.coord && !YV(e)) || t.containData(e.coord) } function KV(t, e) { return t ? function (t, n, i, r) { return yf(r < 2 ? t.coord && t.coord[r] : t.value, e[r]) } : function (t, n, i, r) { return yf(t.value, e[r]) } } function $V(t, e, n) { if (\"average\" === n) { var i = 0, r = 0; return t.each(e, (function (t, e) { isNaN(t) || (i += t, r++) })), i / r } return \"median\" === n ? t.getMedian(e) : t.getDataExtent(e)[\"max\" === n ? 1 : 0] } var JV = Do(), QV = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.init = function () { this.markerGroupMap = ft() }, e.prototype.render = function (t, e, n) { var i = this, r = this.markerGroupMap; r.each((function (t) { JV(t).keep = !1 })), e.eachSeries((function (t) { var r = WV.getMarkerModelFromSeries(t, i.type); r && i.renderSeries(t, r, e, n) })), r.each((function (t) { !JV(t).keep && i.group.remove(t.group) })) }, e.prototype.markKeep = function (t) { JV(t).keep = !0 }, e.prototype.toggleBlurSeries = function (t, e) { var n = this; E(t, (function (t) { var i = WV.getMarkerModelFromSeries(t, n.type); i && i.getData().eachItemGraphicEl((function (t) { t && (e ? Cl(t) : Dl(t)) })) })) }, e.type = \"marker\", e }(mg); function tB(t, e, n) { var i = e.coordinateSystem; t.each((function (r) { var o, a = t.getItemModel(r), s = Gr(a.get(\"x\"), n.getWidth()), l = Gr(a.get(\"y\"), n.getHeight()); if (isNaN(s) || isNaN(l)) { if (e.getMarkerPosition) o = e.getMarkerPosition(t.getValues(t.dimensions, r)); else if (i) { var u = t.get(i.dimensions[0], r), h = t.get(i.dimensions[1], r); o = i.dataToPoint([u, h]) } } else o = [s, l]; isNaN(s) || (o[0] = s), isNaN(l) || (o[1] = l), t.setItemLayout(r, o) })) } var eB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.updateTransform = function (t, e, n) { e.eachSeries((function (t) { var e = WV.getMarkerModelFromSeries(t, \"markPoint\"); e && (tB(e.getData(), t, n), this.markerGroupMap.get(t.id).updateLayout()) }), this) }, e.prototype.renderSeries = function (t, e, n, i) { var r = t.coordinateSystem, o = t.id, a = t.getData(), s = this.markerGroupMap, l = s.get(o) || s.set(o, new Jw), u = function (t, e, n) { var i; i = t ? z(t && t.dimensions, (function (t) { return A(A({}, e.getData().getDimensionInfo(e.getData().mapDimension(t)) || {}), { name: t, ordinalMeta: null }) })) : [{ name: \"value\", type: \"float\" }]; var r = new Jm(i, n), o = z(n.get(\"data\"), H(ZV, e)); t && (o = B(o, H(qV, t))); var a = KV(!!t, i); return r.initData(o, null, a), r }(r, t, e); e.setData(u), tB(e.getData(), t, i), u.each((function (t) { var n = u.getItemModel(t), i = n.getShallow(\"symbol\"), r = n.getShallow(\"symbolSize\"), o = n.getShallow(\"symbolRotate\"), s = n.getShallow(\"symbolOffset\"), l = n.getShallow(\"symbolKeepAspect\"); if (U(i) || U(r) || U(o) || U(s)) { var h = e.getRawValue(t), c = e.getDataParams(t); U(i) && (i = i(h, c)), U(r) && (r = r(h, c)), U(o) && (o = o(h, c)), U(s) && (s = s(h, c)) } var p = n.getModel(\"itemStyle\").getItemStyle(), d = my(a, \"color\"); p.fill || (p.fill = d), u.setItemVisual(t, { symbol: i, symbolSize: r, symbolRotate: o, symbolOffset: s, symbolKeepAspect: l, style: p }) })), l.updateData(u), this.group.add(l.group), u.eachItemGraphicEl((function (t) { t.traverse((function (t) { js(t).dataModel = e })) })), this.markKeep(l), l.group.silent = e.get(\"silent\") || t.get(\"silent\") }, e.type = \"markPoint\", e }(QV); var nB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.createMarkerModelFromSeries = function (t, n, i) { return new e(t, n, i) }, e.type = \"markLine\", e.defaultOption = { z: 5, symbol: [\"circle\", \"arrow\"], symbolSize: [8, 16], symbolOffset: 0, precision: 2, tooltip: { trigger: \"item\" }, label: { show: !0, position: \"end\", distance: 5 }, lineStyle: { type: \"dashed\" }, emphasis: { label: { show: !0 }, lineStyle: { width: 3 } }, animationEasing: \"linear\" }, e }(WV), iB = Do(), rB = function (t, e, n, i) { var r, o = t.getData(); if (Y(i)) r = i; else { var a = i.type; if (\"min\" === a || \"max\" === a || \"average\" === a || \"median\" === a || null != i.xAxis || null != i.yAxis) { var s = void 0, l = void 0; if (null != i.yAxis || null != i.xAxis) s = e.getAxis(null != i.yAxis ? \"y\" : \"x\"), l = it(i.yAxis, i.xAxis); else { var u = jV(i, o, e, t); s = u.valueAxis, l = $V(o, ax(o, u.valueDataDim), a) } var h = \"x\" === s.dim ? 0 : 1, c = 1 - h, p = T(i), d = { coord: [] }; p.type = null, p.coord = [], p.coord[c] = -1 / 0, d.coord[c] = 1 / 0; var f = n.get(\"precision\"); f >= 0 && j(l) && (l = +l.toFixed(Math.min(f, 20))), p.coord[h] = d.coord[h] = l, r = [p, d, { type: a, valueIndex: i.valueIndex, value: l }] } else r = [] } var g = [ZV(t, r[0]), ZV(t, r[1]), A({}, r[2])]; return g[2].type = g[2].type || null, C(g[2], g[0]), C(g[2], g[1]), g }; function oB(t) { return !isNaN(t) && !isFinite(t) } function aB(t, e, n, i) { var r = 1 - t, o = i.dimensions[t]; return oB(e[r]) && oB(n[r]) && e[t] === n[t] && i.getAxis(o).containData(e[t]) } function sB(t, e) { if (\"cartesian2d\" === t.type) { var n = e[0].coord, i = e[1].coord; if (n && i && (aB(1, n, i, t) || aB(0, n, i, t))) return !0 } return qV(t, e[0]) && qV(t, e[1]) } function lB(t, e, n, i, r) { var o, a = i.coordinateSystem, s = t.getItemModel(e), l = Gr(s.get(\"x\"), r.getWidth()), u = Gr(s.get(\"y\"), r.getHeight()); if (isNaN(l) || isNaN(u)) { if (i.getMarkerPosition) o = i.getMarkerPosition(t.getValues(t.dimensions, e)); else { var h = a.dimensions, c = t.get(h[0], e), p = t.get(h[1], e); o = a.dataToPoint([c, p]) } if (pS(a, \"cartesian2d\")) { var d = a.getAxis(\"x\"), f = a.getAxis(\"y\"); h = a.dimensions; oB(t.get(h[0], e)) ? o[0] = d.toGlobalCoord(d.getExtent()[n ? 0 : 1]) : oB(t.get(h[1], e)) && (o[1] = f.toGlobalCoord(f.getExtent()[n ? 0 : 1])) } isNaN(l) || (o[0] = l), isNaN(u) || (o[1] = u) } else o = [l, u]; t.setItemLayout(e, o) } var uB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.updateTransform = function (t, e, n) { e.eachSeries((function (t) { var e = WV.getMarkerModelFromSeries(t, \"markLine\"); if (e) { var i = e.getData(), r = iB(e).from, o = iB(e).to; r.each((function (e) { lB(r, e, !0, t, n), lB(o, e, !1, t, n) })), i.each((function (t) { i.setItemLayout(t, [r.getItemLayout(t), o.getItemLayout(t)]) })), this.markerGroupMap.get(t.id).updateLayout() } }), this) }, e.prototype.renderSeries = function (t, e, n, i) { var r = t.coordinateSystem, o = t.id, a = t.getData(), s = this.markerGroupMap, l = s.get(o) || s.set(o, new _A); this.group.add(l.group); var u = function (t, e, n) { var i; i = t ? z(t && t.dimensions, (function (t) { return A(A({}, e.getData().getDimensionInfo(e.getData().mapDimension(t)) || {}), { name: t, ordinalMeta: null }) })) : [{ name: \"value\", type: \"float\" }]; var r = new Jm(i, n), o = new Jm(i, n), a = new Jm([], n), s = z(n.get(\"data\"), H(rB, e, t, n)); t && (s = B(s, H(sB, t))); var l = KV(!!t, i); return r.initData(z(s, (function (t) { return t[0] })), null, l), o.initData(z(s, (function (t) { return t[1] })), null, l), a.initData(z(s, (function (t) { return t[2] }))), a.hasItemOption = !0, { from: r, to: o, line: a } }(r, t, e), h = u.from, c = u.to, p = u.line; iB(e).from = h, iB(e).to = c, e.setData(p); var d = e.get(\"symbol\"), f = e.get(\"symbolSize\"), g = e.get(\"symbolRotate\"), y = e.get(\"symbolOffset\"); function v(e, n, r) { var o = e.getItemModel(n); lB(e, n, r, t, i); var s = o.getModel(\"itemStyle\").getItemStyle(); null == s.fill && (s.fill = my(a, \"color\")), e.setItemVisual(n, { symbolKeepAspect: o.get(\"symbolKeepAspect\"), symbolOffset: rt(o.get(\"symbolOffset\", !0), y[r ? 0 : 1]), symbolRotate: rt(o.get(\"symbolRotate\", !0), g[r ? 0 : 1]), symbolSize: rt(o.get(\"symbolSize\"), f[r ? 0 : 1]), symbol: rt(o.get(\"symbol\", !0), d[r ? 0 : 1]), style: s }) } Y(d) || (d = [d, d]), Y(f) || (f = [f, f]), Y(g) || (g = [g, g]), Y(y) || (y = [y, y]), u.from.each((function (t) { v(h, t, !0), v(c, t, !1) })), p.each((function (t) { var e = p.getItemModel(t).getModel(\"lineStyle\").getLineStyle(); p.setItemLayout(t, [h.getItemLayout(t), c.getItemLayout(t)]), null == e.stroke && (e.stroke = h.getItemVisual(t, \"style\").fill), p.setItemVisual(t, { fromSymbolKeepAspect: h.getItemVisual(t, \"symbolKeepAspect\"), fromSymbolOffset: h.getItemVisual(t, \"symbolOffset\"), fromSymbolRotate: h.getItemVisual(t, \"symbolRotate\"), fromSymbolSize: h.getItemVisual(t, \"symbolSize\"), fromSymbol: h.getItemVisual(t, \"symbol\"), toSymbolKeepAspect: c.getItemVisual(t, \"symbolKeepAspect\"), toSymbolOffset: c.getItemVisual(t, \"symbolOffset\"), toSymbolRotate: c.getItemVisual(t, \"symbolRotate\"), toSymbolSize: c.getItemVisual(t, \"symbolSize\"), toSymbol: c.getItemVisual(t, \"symbol\"), style: e }) })), l.updateData(p), u.line.eachItemGraphicEl((function (t) { js(t).dataModel = e, t.traverse((function (t) { js(t).dataModel = e })) })), this.markKeep(l), l.group.silent = e.get(\"silent\") || t.get(\"silent\") }, e.type = \"markLine\", e }(QV); var hB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.createMarkerModelFromSeries = function (t, n, i) { return new e(t, n, i) }, e.type = \"markArea\", e.defaultOption = { z: 1, tooltip: { trigger: \"item\" }, animation: !1, label: { show: !0, position: \"top\" }, itemStyle: { borderWidth: 0 }, emphasis: { label: { show: !0, position: \"top\" } } }, e }(WV), cB = Do(), pB = function (t, e, n, i) { var r = ZV(t, i[0]), o = ZV(t, i[1]), a = r.coord, s = o.coord; a[0] = it(a[0], -1 / 0), a[1] = it(a[1], -1 / 0), s[0] = it(s[0], 1 / 0), s[1] = it(s[1], 1 / 0); var l = D([{}, r, o]); return l.coord = [r.coord, o.coord], l.x0 = r.x, l.y0 = r.y, l.x1 = o.x, l.y1 = o.y, l }; function dB(t) { return !isNaN(t) && !isFinite(t) } function fB(t, e, n, i) { var r = 1 - t; return dB(e[r]) && dB(n[r]) } function gB(t, e) { var n = e.coord[0], i = e.coord[1], r = { coord: n, x: e.x0, y: e.y0 }, o = { coord: i, x: e.x1, y: e.y1 }; return pS(t, \"cartesian2d\") ? !(!n || !i || !fB(1, n, i) && !fB(0, n, i)) || function (t, e, n) { return !(t && t.containZone && e.coord && n.coord && !YV(e) && !YV(n)) || t.containZone(e.coord, n.coord) }(t, r, o) : qV(t, r) || qV(t, o) } function yB(t, e, n, i, r) { var o, a = i.coordinateSystem, s = t.getItemModel(e), l = Gr(s.get(n[0]), r.getWidth()), u = Gr(s.get(n[1]), r.getHeight()); if (isNaN(l) || isNaN(u)) { if (i.getMarkerPosition) o = i.getMarkerPosition(t.getValues(n, e)); else { var h = [d = t.get(n[0], e), f = t.get(n[1], e)]; a.clampData && a.clampData(h, h), o = a.dataToPoint(h, !0) } if (pS(a, \"cartesian2d\")) { var c = a.getAxis(\"x\"), p = a.getAxis(\"y\"), d = t.get(n[0], e), f = t.get(n[1], e); dB(d) ? o[0] = c.toGlobalCoord(c.getExtent()[\"x0\" === n[0] ? 0 : 1]) : dB(f) && (o[1] = p.toGlobalCoord(p.getExtent()[\"y0\" === n[1] ? 0 : 1])) } isNaN(l) || (o[0] = l), isNaN(u) || (o[1] = u) } else o = [l, u]; return o } var vB = [[\"x0\", \"y0\"], [\"x1\", \"y0\"], [\"x1\", \"y1\"], [\"x0\", \"y1\"]], mB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.updateTransform = function (t, e, n) { e.eachSeries((function (t) { var e = WV.getMarkerModelFromSeries(t, \"markArea\"); if (e) { var i = e.getData(); i.each((function (e) { var r = z(vB, (function (r) { return yB(i, e, r, t, n) })); i.setItemLayout(e, r), i.getItemGraphicEl(e).setShape(\"points\", r) })) } }), this) }, e.prototype.renderSeries = function (t, e, n, i) { var r = t.coordinateSystem, o = t.id, a = t.getData(), s = this.markerGroupMap, l = s.get(o) || s.set(o, { group: new Pr }); this.group.add(l.group), this.markKeep(l); var u = function (t, e, n) { var i, r, o = [\"x0\", \"y0\", \"x1\", \"y1\"]; if (t) { var a = z(t && t.dimensions, (function (t) { var n = e.getData(); return A(A({}, n.getDimensionInfo(n.mapDimension(t)) || {}), { name: t, ordinalMeta: null }) })); r = z(o, (function (t, e) { return { name: t, type: a[e % 2].type } })), i = new Jm(r, n) } else i = new Jm(r = [{ name: \"value\", type: \"float\" }], n); var s = z(n.get(\"data\"), H(pB, e, t, n)); t && (s = B(s, H(gB, t))); var l = t ? function (t, e, n, i) { return yf(t.coord[Math.floor(i / 2)][i % 2], r[i]) } : function (t, e, n, i) { return yf(t.value, r[i]) }; return i.initData(s, null, l), i.hasItemOption = !0, i }(r, t, e); e.setData(u), u.each((function (e) { var n = z(vB, (function (n) { return yB(u, e, n, t, i) })), o = r.getAxis(\"x\").scale, s = r.getAxis(\"y\").scale, l = o.getExtent(), h = s.getExtent(), c = [o.parse(u.get(\"x0\", e)), o.parse(u.get(\"x1\", e))], p = [s.parse(u.get(\"y0\", e)), s.parse(u.get(\"y1\", e))]; Hr(c), Hr(p); var d = !!(l[0] > c[1] || l[1] < c[0] || h[0] > p[1] || h[1] < p[0]); u.setItemLayout(e, { points: n, allClipped: d }); var f = u.getItemModel(e).getModel(\"itemStyle\").getItemStyle(), g = my(a, \"color\"); f.fill || (f.fill = g, X(f.fill) && (f.fill = ti(f.fill, .4))), f.stroke || (f.stroke = g), u.setItemVisual(e, \"style\", f) })), u.diff(cB(l).data).add((function (t) { var e = u.getItemLayout(t); if (!e.allClipped) { var n = new zu({ shape: { points: e.points } }); u.setItemGraphicEl(t, n), l.group.add(n) } })).update((function (t, n) { var i = cB(l).data.getItemGraphicEl(n), r = u.getItemLayout(t); r.allClipped ? i && l.group.remove(i) : (i ? uh(i, { shape: { points: r.points } }, e, t) : i = new zu({ shape: { points: r.points } }), u.setItemGraphicEl(t, i), l.group.add(i)) })).remove((function (t) { var e = cB(l).data.getItemGraphicEl(t); l.group.remove(e) })).execute(), u.eachItemGraphicEl((function (t, n) { var i = u.getItemModel(n), r = u.getItemVisual(n, \"style\"); t.useStyle(u.getItemVisual(n, \"style\")), qh(t, Kh(i), { labelFetcher: e, labelDataIndex: n, defaultText: u.getName(n) || \"\", inheritColor: X(r.fill) ? ti(r.fill, 1) : \"#000\" }), Hl(t, i), Bl(t, null, null, i.get([\"emphasis\", \"disabled\"])), js(t).dataModel = e })), cB(l).data = u, l.group.silent = e.get(\"silent\") || t.get(\"silent\") }, e.type = \"markArea\", e }(QV); var xB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.layoutMode = { type: \"box\", ignoreSize: !0 }, n } return n(e, t), e.prototype.init = function (t, e, n) { this.mergeDefaultAndTheme(t, n), t.selected = t.selected || {}, this._updateSelector(t) }, e.prototype.mergeOption = function (e, n) { t.prototype.mergeOption.call(this, e, n), this._updateSelector(e) }, e.prototype._updateSelector = function (t) { var e = t.selector, n = this.ecModel; !0 === e && (e = t.selector = [\"all\", \"inverse\"]), Y(e) && E(e, (function (t, i) { X(t) && (t = { type: t }), e[i] = C(t, function (t, e) { return \"all\" === e ? { type: \"all\", title: t.getLocaleModel().get([\"legend\", \"selector\", \"all\"]) } : \"inverse\" === e ? { type: \"inverse\", title: t.getLocaleModel().get([\"legend\", \"selector\", \"inverse\"]) } : void 0 }(n, t.type)) })) }, e.prototype.optionUpdated = function () { this._updateData(this.ecModel); var t = this._data; if (t[0] && \"single\" === this.get(\"selectedMode\")) { for (var e = !1, n = 0; n < t.length; n++) { var i = t[n].get(\"name\"); if (this.isSelected(i)) { this.select(i), e = !0; break } } !e && this.select(t[0].get(\"name\")) } }, e.prototype._updateData = function (t) { var e = [], n = []; t.eachRawSeries((function (i) { var r, o = i.name; if (n.push(o), i.legendVisualProvider) { var a = i.legendVisualProvider.getAllNames(); t.isSeriesFiltered(i) || (n = n.concat(a)), a.length ? e = e.concat(a) : r = !0 } else r = !0; r && Io(i) && e.push(i.name) })), this._availableNames = n; var i = z(this.get(\"data\") || e, (function (t) { return (X(t) || j(t)) && (t = { name: t }), new xc(t, this, this.ecModel) }), this); this._data = i }, e.prototype.getData = function () { return this._data }, e.prototype.select = function (t) { var e = this.option.selected; \"single\" === this.get(\"selectedMode\") && E(this._data, (function (t) { e[t.get(\"name\")] = !1 })); e[t] = !0 }, e.prototype.unSelect = function (t) { \"single\" !== this.get(\"selectedMode\") && (this.option.selected[t] = !1) }, e.prototype.toggleSelected = function (t) { var e = this.option.selected; e.hasOwnProperty(t) || (e[t] = !0), this[e[t] ? \"unSelect\" : \"select\"](t) }, e.prototype.allSelect = function () { var t = this._data, e = this.option.selected; E(t, (function (t) { e[t.get(\"name\", !0)] = !0 })) }, e.prototype.inverseSelect = function () { var t = this._data, e = this.option.selected; E(t, (function (t) { var n = t.get(\"name\", !0); e.hasOwnProperty(n) || (e[n] = !0), e[n] = !e[n] })) }, e.prototype.isSelected = function (t) { var e = this.option.selected; return !(e.hasOwnProperty(t) && !e[t]) && P(this._availableNames, t) >= 0 }, e.prototype.getOrient = function () { return \"vertical\" === this.get(\"orient\") ? { index: 1, name: \"vertical\" } : { index: 0, name: \"horizontal\" } }, e.type = \"legend.plain\", e.dependencies = [\"series\"], e.defaultOption = { z: 4, show: !0, orient: \"horizontal\", left: \"center\", top: 0, align: \"auto\", backgroundColor: \"rgba(0,0,0,0)\", borderColor: \"#ccc\", borderRadius: 0, borderWidth: 0, padding: 5, itemGap: 10, itemWidth: 25, itemHeight: 14, symbolRotate: \"inherit\", symbolKeepAspect: !0, inactiveColor: \"#ccc\", inactiveBorderColor: \"#ccc\", inactiveBorderWidth: \"auto\", itemStyle: { color: \"inherit\", opacity: \"inherit\", borderColor: \"inherit\", borderWidth: \"auto\", borderCap: \"inherit\", borderJoin: \"inherit\", borderDashOffset: \"inherit\", borderMiterLimit: \"inherit\" }, lineStyle: { width: \"auto\", color: \"inherit\", inactiveColor: \"#ccc\", inactiveWidth: 2, opacity: \"inherit\", type: \"inherit\", cap: \"inherit\", join: \"inherit\", dashOffset: \"inherit\", miterLimit: \"inherit\" }, textStyle: { color: \"#333\" }, selectedMode: !0, selector: !1, selectorLabel: { show: !0, borderRadius: 10, padding: [3, 5, 3, 5], fontSize: 12, fontFamily: \"sans-serif\", color: \"#666\", borderWidth: 1, borderColor: \"#666\" }, emphasis: { selectorLabel: { show: !0, color: \"#eee\", backgroundColor: \"#666\" } }, selectorPosition: \"auto\", selectorItemGap: 7, selectorButtonGap: 10, tooltip: { show: !1 } }, e }(Ap), _B = H, bB = E, wB = Pr, SB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.newlineDisabled = !1, n } return n(e, t), e.prototype.init = function () { this.group.add(this._contentGroup = new wB), this.group.add(this._selectorGroup = new wB), this._isFirstRender = !0 }, e.prototype.getContentGroup = function () { return this._contentGroup }, e.prototype.getSelectorGroup = function () { return this._selectorGroup }, e.prototype.render = function (t, e, n) { var i = this._isFirstRender; if (this._isFirstRender = !1, this.resetInner(), t.get(\"show\", !0)) { var r = t.get(\"align\"), o = t.get(\"orient\"); r && \"auto\" !== r || (r = \"right\" === t.get(\"left\") && \"vertical\" === o ? \"right\" : \"left\"); var a = t.get(\"selector\", !0), s = t.get(\"selectorPosition\", !0); !a || s && \"auto\" !== s || (s = \"horizontal\" === o ? \"end\" : \"start\"), this.renderInner(r, t, e, n, a, o, s); var l = t.getBoxLayoutParams(), u = { width: n.getWidth(), height: n.getHeight() }, h = t.get(\"padding\"), c = wp(l, u, h), p = this.layoutInner(t, r, c, i, a, s), d = wp(k({ width: p.width, height: p.height }, l), u, h); this.group.x = d.x - p.x, this.group.y = d.y - p.y, this.group.markRedraw(), this.group.add(this._backgroundEl = JE(p, t)) } }, e.prototype.resetInner = function () { this.getContentGroup().removeAll(), this._backgroundEl && this.group.remove(this._backgroundEl), this.getSelectorGroup().removeAll() }, e.prototype.renderInner = function (t, e, n, i, r, o, a) { var s = this.getContentGroup(), l = ft(), u = e.get(\"selectedMode\"), h = []; n.eachRawSeries((function (t) { !t.get(\"legendHoverLink\") && h.push(t.id) })), bB(e.getData(), (function (r, o) { var a = r.get(\"name\"); if (!this.newlineDisabled && (\"\" === a || \"\\n\" === a)) { var c = new wB; return c.newline = !0, void s.add(c) } var p = n.getSeriesByName(a)[0]; if (!l.get(a)) { if (p) { var d = p.getData(), f = d.getVisual(\"legendLineStyle\") || {}, g = d.getVisual(\"legendIcon\"), y = d.getVisual(\"style\"); this._createItem(p, a, o, r, e, t, f, y, g, u, i).on(\"click\", _B(MB, a, null, i, h)).on(\"mouseover\", _B(TB, p.name, null, i, h)).on(\"mouseout\", _B(CB, p.name, null, i, h)), l.set(a, !0) } else n.eachRawSeries((function (n) { if (!l.get(a) && n.legendVisualProvider) { var s = n.legendVisualProvider; if (!s.containName(a)) return; var c = s.indexOfName(a), p = s.getItemVisual(c, \"style\"), d = s.getItemVisual(c, \"legendIcon\"), f = Xn(p.fill); f && 0 === f[3] && (f[3] = .2, p = A(A({}, p), { fill: ei(f, \"rgba\") })), this._createItem(n, a, o, r, e, t, {}, p, d, u, i).on(\"click\", _B(MB, null, a, i, h)).on(\"mouseover\", _B(TB, null, a, i, h)).on(\"mouseout\", _B(CB, null, a, i, h)), l.set(a, !0) } }), this); 0 } }), this), r && this._createSelector(r, e, i, o, a) }, e.prototype._createSelector = function (t, e, n, i, r) { var o = this.getSelectorGroup(); bB(t, (function (t) { var i = t.type, r = new Ns({ style: { x: 0, y: 0, align: \"center\", verticalAlign: \"middle\" }, onclick: function () { n.dispatchAction({ type: \"all\" === i ? \"legendAllSelect\" : \"legendInverseSelect\" }) } }); o.add(r), qh(r, { normal: e.getModel(\"selectorLabel\"), emphasis: e.getModel([\"emphasis\", \"selectorLabel\"]) }, { defaultText: t.title }), Vl(r) })) }, e.prototype._createItem = function (t, e, n, i, r, o, a, s, l, u, h) { var c = t.visualDrawType, p = r.get(\"itemWidth\"), d = r.get(\"itemHeight\"), f = r.isSelected(e), g = i.get(\"symbolRotate\"), y = i.get(\"symbolKeepAspect\"), v = i.get(\"icon\"), m = function (t, e, n, i, r, o, a) { function s(t, e) { \"auto\" === t.lineWidth && (t.lineWidth = e.lineWidth > 0 ? 2 : 0), bB(t, (function (n, i) { \"inherit\" === t[i] && (t[i] = e[i]) })) } var l = e.getModel(\"itemStyle\"), u = l.getItemStyle(), h = 0 === t.lastIndexOf(\"empty\", 0) ? \"fill\" : \"stroke\", c = l.getShallow(\"decal\"); u.decal = c && \"inherit\" !== c ? sv(c, a) : i.decal, \"inherit\" === u.fill && (u.fill = i[r]); \"inherit\" === u.stroke && (u.stroke = i[h]); \"inherit\" === u.opacity && (u.opacity = (\"fill\" === r ? i : n).opacity); s(u, i); var p = e.getModel(\"lineStyle\"), d = p.getLineStyle(); if (s(d, n), \"auto\" === u.fill && (u.fill = i.fill), \"auto\" === u.stroke && (u.stroke = i.fill), \"auto\" === d.stroke && (d.stroke = i.fill), !o) { var f = e.get(\"inactiveBorderWidth\"), g = u[h]; u.lineWidth = \"auto\" === f ? i.lineWidth > 0 && g ? 2 : 0 : u.lineWidth, u.fill = e.get(\"inactiveColor\"), u.stroke = e.get(\"inactiveBorderColor\"), d.stroke = p.get(\"inactiveColor\"), d.lineWidth = p.get(\"inactiveWidth\") } return { itemStyle: u, lineStyle: d } }(l = v || l || \"roundRect\", i, a, s, c, f, h), x = new wB, _ = i.getModel(\"textStyle\"); if (!U(t.getLegendIcon) || v && \"inherit\" !== v) { var b = \"inherit\" === v && t.getData().getVisual(\"symbol\") ? \"inherit\" === g ? t.getData().getVisual(\"symbolRotate\") : g : 0; x.add(function (t) { var e = t.icon || \"roundRect\", n = Ry(e, 0, 0, t.itemWidth, t.itemHeight, t.itemStyle.fill, t.symbolKeepAspect); n.setStyle(t.itemStyle), n.rotation = (t.iconRotate || 0) * Math.PI / 180, n.setOrigin([t.itemWidth / 2, t.itemHeight / 2]), e.indexOf(\"empty\") > -1 && (n.style.stroke = n.style.fill, n.style.fill = \"#fff\", n.style.lineWidth = 2); return n }({ itemWidth: p, itemHeight: d, icon: l, iconRotate: b, itemStyle: m.itemStyle, lineStyle: m.lineStyle, symbolKeepAspect: y })) } else x.add(t.getLegendIcon({ itemWidth: p, itemHeight: d, icon: l, iconRotate: g, itemStyle: m.itemStyle, lineStyle: m.lineStyle, symbolKeepAspect: y })); var w = \"left\" === o ? p + 5 : -5, S = o, M = r.get(\"formatter\"), I = e; X(M) && M ? I = M.replace(\"{name}\", null != e ? e : \"\") : U(M) && (I = M(e)); var T = i.get(\"inactiveColor\"); x.add(new Ns({ style: $h(_, { text: I, x: w, y: d / 2, fill: f ? _.getTextColor() : T, align: S, verticalAlign: \"middle\" }) })); var C = new Ps({ shape: x.getBoundingRect(), invisible: !0 }), D = i.getModel(\"tooltip\"); return D.get(\"show\") && Wh({ el: C, componentModel: r, itemName: e, itemTooltipOption: D.option }), x.add(C), x.eachChild((function (t) { t.silent = !0 })), C.silent = !u, this.getContentGroup().add(x), Vl(x), x.__legendDataIndex = n, x }, e.prototype.layoutInner = function (t, e, n, i, r, o) { var a = this.getContentGroup(), s = this.getSelectorGroup(); bp(t.get(\"orient\"), a, t.get(\"itemGap\"), n.width, n.height); var l = a.getBoundingRect(), u = [-l.x, -l.y]; if (s.markRedraw(), a.markRedraw(), r) { bp(\"horizontal\", s, t.get(\"selectorItemGap\", !0)); var h = s.getBoundingRect(), c = [-h.x, -h.y], p = t.get(\"selectorButtonGap\", !0), d = t.getOrient().index, f = 0 === d ? \"width\" : \"height\", g = 0 === d ? \"height\" : \"width\", y = 0 === d ? \"y\" : \"x\"; \"end\" === o ? c[d] += l[f] + p : u[d] += h[f] + p, c[1 - d] += l[g] / 2 - h[g] / 2, s.x = c[0], s.y = c[1], a.x = u[0], a.y = u[1]; var v = { x: 0, y: 0 }; return v[f] = l[f] + p + h[f], v[g] = Math.max(l[g], h[g]), v[y] = Math.min(0, h[y] + c[1 - d]), v } return a.x = u[0], a.y = u[1], this.group.getBoundingRect() }, e.prototype.remove = function () { this.getContentGroup().removeAll(), this._isFirstRender = !0 }, e.type = \"legend.plain\", e }(mg); function MB(t, e, n, i) { CB(t, e, n, i), n.dispatchAction({ type: \"legendToggleSelect\", name: null != t ? t : e }), TB(t, e, n, i) } function IB(t) { for (var e, n = t.getZr().storage.getDisplayList(), i = 0, r = n.length; i < r && !(e = n[i].states.emphasis);)i++; return e && e.hoverLayer } function TB(t, e, n, i) { IB(n) || n.dispatchAction({ type: \"highlight\", seriesName: t, name: e, excludeSeriesId: i }) } function CB(t, e, n, i) { IB(n) || n.dispatchAction({ type: \"downplay\", seriesName: t, name: e, excludeSeriesId: i }) } function DB(t) { var e = t.findComponents({ mainType: \"legend\" }); e && e.length && t.filterSeries((function (t) { for (var n = 0; n < e.length; n++)if (!e[n].isSelected(t.name)) return !1; return !0 })) } function AB(t, e, n) { var i, r = {}, o = \"toggleSelected\" === t; return n.eachComponent(\"legend\", (function (n) { o && null != i ? n[i ? \"select\" : \"unSelect\"](e.name) : \"allSelect\" === t || \"inverseSelect\" === t ? n[t]() : (n[t](e.name), i = n.isSelected(e.name)), E(n.getData(), (function (t) { var e = t.get(\"name\"); if (\"\\n\" !== e && \"\" !== e) { var i = n.isSelected(e); r.hasOwnProperty(e) ? r[e] = r[e] && i : r[e] = i } })) })), \"allSelect\" === t || \"inverseSelect\" === t ? { selected: r } : { name: e.name, selected: r } } function kB(t) { t.registerComponentModel(xB), t.registerComponentView(SB), t.registerProcessor(t.PRIORITY.PROCESSOR.SERIES_FILTER, DB), t.registerSubTypeDefaulter(\"legend\", (function () { return \"plain\" })), function (t) { t.registerAction(\"legendToggleSelect\", \"legendselectchanged\", H(AB, \"toggleSelected\")), t.registerAction(\"legendAllSelect\", \"legendselectall\", H(AB, \"allSelect\")), t.registerAction(\"legendInverseSelect\", \"legendinverseselect\", H(AB, \"inverseSelect\")), t.registerAction(\"legendSelect\", \"legendselected\", H(AB, \"select\")), t.registerAction(\"legendUnSelect\", \"legendunselected\", H(AB, \"unSelect\")) }(t) } var LB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.setScrollDataIndex = function (t) { this.option.scrollDataIndex = t }, e.prototype.init = function (e, n, i) { var r = Tp(e); t.prototype.init.call(this, e, n, i), PB(this, e, r) }, e.prototype.mergeOption = function (e, n) { t.prototype.mergeOption.call(this, e, n), PB(this, this.option, e) }, e.type = \"legend.scroll\", e.defaultOption = wc(xB.defaultOption, { scrollDataIndex: 0, pageButtonItemGap: 5, pageButtonGap: null, pageButtonPosition: \"end\", pageFormatter: \"{current}/{total}\", pageIcons: { horizontal: [\"M0,0L12,-10L12,10z\", \"M0,0L-12,-10L-12,10z\"], vertical: [\"M0,0L20,0L10,-20z\", \"M0,0L20,0L10,20z\"] }, pageIconColor: \"#2f4554\", pageIconInactiveColor: \"#aaa\", pageIconSize: 15, pageTextStyle: { color: \"#333\" }, animationDurationUpdate: 800 }), e }(xB); function PB(t, e, n) { var i = [1, 1]; i[t.getOrient().index] = 0, Ip(e, n, { type: \"box\", ignoreSize: !!i }) } var OB = Pr, RB = [\"width\", \"height\"], NB = [\"x\", \"y\"], EB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.newlineDisabled = !0, n._currentIndex = 0, n } return n(e, t), e.prototype.init = function () { t.prototype.init.call(this), this.group.add(this._containerGroup = new OB), this._containerGroup.add(this.getContentGroup()), this.group.add(this._controllerGroup = new OB) }, e.prototype.resetInner = function () { t.prototype.resetInner.call(this), this._controllerGroup.removeAll(), this._containerGroup.removeClipPath(), this._containerGroup.__rectSize = null }, e.prototype.renderInner = function (e, n, i, r, o, a, s) { var l = this; t.prototype.renderInner.call(this, e, n, i, r, o, a, s); var u = this._controllerGroup, h = n.get(\"pageIconSize\", !0), c = Y(h) ? h : [h, h]; d(\"pagePrev\", 0); var p = n.getModel(\"pageTextStyle\"); function d(t, e) { var i = t + \"DataIndex\", o = Vh(n.get(\"pageIcons\", !0)[n.getOrient().name][e], { onclick: W(l._pageGo, l, i, n, r) }, { x: -c[0] / 2, y: -c[1] / 2, width: c[0], height: c[1] }); o.name = t, u.add(o) } u.add(new Ns({ name: \"pageText\", style: { text: \"xx/xx\", fill: p.getTextColor(), font: p.getFont(), verticalAlign: \"middle\", align: \"center\" }, silent: !0 })), d(\"pageNext\", 1) }, e.prototype.layoutInner = function (t, e, n, i, r, o) { var a = this.getSelectorGroup(), s = t.getOrient().index, l = RB[s], u = NB[s], h = RB[1 - s], c = NB[1 - s]; r && bp(\"horizontal\", a, t.get(\"selectorItemGap\", !0)); var p = t.get(\"selectorButtonGap\", !0), d = a.getBoundingRect(), f = [-d.x, -d.y], g = T(n); r && (g[l] = n[l] - d[l] - p); var y = this._layoutContentAndController(t, i, g, s, l, h, c, u); if (r) { if (\"end\" === o) f[s] += y[l] + p; else { var v = d[l] + p; f[s] -= v, y[u] -= v } y[l] += d[l] + p, f[1 - s] += y[c] + y[h] / 2 - d[h] / 2, y[h] = Math.max(y[h], d[h]), y[c] = Math.min(y[c], d[c] + f[1 - s]), a.x = f[0], a.y = f[1], a.markRedraw() } return y }, e.prototype._layoutContentAndController = function (t, e, n, i, r, o, a, s) { var l = this.getContentGroup(), u = this._containerGroup, h = this._controllerGroup; bp(t.get(\"orient\"), l, t.get(\"itemGap\"), i ? n.width : null, i ? null : n.height), bp(\"horizontal\", h, t.get(\"pageButtonItemGap\", !0)); var c = l.getBoundingRect(), p = h.getBoundingRect(), d = this._showController = c[r] > n[r], f = [-c.x, -c.y]; e || (f[i] = l[s]); var g = [0, 0], y = [-p.x, -p.y], v = rt(t.get(\"pageButtonGap\", !0), t.get(\"itemGap\", !0)); d && (\"end\" === t.get(\"pageButtonPosition\", !0) ? y[i] += n[r] - p[r] : g[i] += p[r] + v); y[1 - i] += c[o] / 2 - p[o] / 2, l.setPosition(f), u.setPosition(g), h.setPosition(y); var m = { x: 0, y: 0 }; if (m[r] = d ? n[r] : c[r], m[o] = Math.max(c[o], p[o]), m[a] = Math.min(0, p[a] + y[1 - i]), u.__rectSize = n[r], d) { var x = { x: 0, y: 0 }; x[r] = Math.max(n[r] - p[r] - v, 0), x[o] = m[o], u.setClipPath(new Ps({ shape: x })), u.__rectSize = x[r] } else h.eachChild((function (t) { t.attr({ invisible: !0, silent: !0 }) })); var _ = this._getPageInfo(t); return null != _.pageIndex && uh(l, { x: _.contentPosition[0], y: _.contentPosition[1] }, d ? t : null), this._updatePageInfoView(t, _), m }, e.prototype._pageGo = function (t, e, n) { var i = this._getPageInfo(e)[t]; null != i && n.dispatchAction({ type: \"legendScroll\", scrollDataIndex: i, legendId: e.id }) }, e.prototype._updatePageInfoView = function (t, e) { var n = this._controllerGroup; E([\"pagePrev\", \"pageNext\"], (function (i) { var r = null != e[i + \"DataIndex\"], o = n.childOfName(i); o && (o.setStyle(\"fill\", r ? t.get(\"pageIconColor\", !0) : t.get(\"pageIconInactiveColor\", !0)), o.cursor = r ? \"pointer\" : \"default\") })); var i = n.childOfName(\"pageText\"), r = t.get(\"pageFormatter\"), o = e.pageIndex, a = null != o ? o + 1 : 0, s = e.pageCount; i && r && i.setStyle(\"text\", X(r) ? r.replace(\"{current}\", null == a ? \"\" : a + \"\").replace(\"{total}\", null == s ? \"\" : s + \"\") : r({ current: a, total: s })) }, e.prototype._getPageInfo = function (t) { var e = t.get(\"scrollDataIndex\", !0), n = this.getContentGroup(), i = this._containerGroup.__rectSize, r = t.getOrient().index, o = RB[r], a = NB[r], s = this._findTargetItemIndex(e), l = n.children(), u = l[s], h = l.length, c = h ? 1 : 0, p = { contentPosition: [n.x, n.y], pageCount: c, pageIndex: c - 1, pagePrevDataIndex: null, pageNextDataIndex: null }; if (!u) return p; var d = m(u); p.contentPosition[r] = -d.s; for (var f = s + 1, g = d, y = d, v = null; f <= h; ++f)(!(v = m(l[f])) && y.e > g.s + i || v && !x(v, g.s)) && (g = y.i > g.i ? y : v) && (null == p.pageNextDataIndex && (p.pageNextDataIndex = g.i), ++p.pageCount), y = v; for (f = s - 1, g = d, y = d, v = null; f >= -1; --f)(v = m(l[f])) && x(y, v.s) || !(g.i < y.i) || (y = g, null == p.pagePrevDataIndex && (p.pagePrevDataIndex = g.i), ++p.pageCount, ++p.pageIndex), g = v; return p; function m(t) { if (t) { var e = t.getBoundingRect(), n = e[a] + t[a]; return { s: n, e: n + e[o], i: t.__legendDataIndex } } } function x(t, e) { return t.e >= e && t.s <= e + i } }, e.prototype._findTargetItemIndex = function (t) { return this._showController ? (this.getContentGroup().eachChild((function (i, r) { var o = i.__legendDataIndex; null == n && null != o && (n = r), o === t && (e = r) })), null != e ? e : n) : 0; var e, n }, e.type = \"legend.scroll\", e }(SB); function zB(t) { Im(kB), t.registerComponentModel(LB), t.registerComponentView(EB), function (t) { t.registerAction(\"legendScroll\", \"legendscroll\", (function (t, e) { var n = t.scrollDataIndex; null != n && e.eachComponent({ mainType: \"legend\", subType: \"scroll\", query: t }, (function (t) { t.setScrollDataIndex(n) })) })) }(t) } var VB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"dataZoom.inside\", e.defaultOption = wc(NE.defaultOption, { disabled: !1, zoomLock: !1, zoomOnMouseWheel: !0, moveOnMouseMove: !0, moveOnMouseWheel: !1, preventDefaultMouseMove: !0 }), e }(NE), BB = Do(); function FB(t, e, n) { BB(t).coordSysRecordMap.each((function (t) { var i = t.dataZoomInfoMap.get(e.uid); i && (i.getRange = n) })) } function GB(t, e) { if (e) { t.removeKey(e.model.uid); var n = e.controller; n && n.dispose() } } function WB(t, e) { t.isDisposed() || t.dispatchAction({ type: \"dataZoom\", animation: { easing: \"cubicOut\", duration: 100 }, batch: e }) } function HB(t, e, n, i) { return t.coordinateSystem.containPoint([n, i]) } function YB(t) { t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER, (function (t, e) { var n = BB(e), i = n.coordSysRecordMap || (n.coordSysRecordMap = ft()); i.each((function (t) { t.dataZoomInfoMap = null })), t.eachComponent({ mainType: \"dataZoom\", subType: \"inside\" }, (function (t) { E(OE(t).infoList, (function (n) { var r = n.model.uid, o = i.get(r) || i.set(r, function (t, e) { var n = { model: e, containsPoint: H(HB, e), dispatchAction: H(WB, t), dataZoomInfoMap: null, controller: null }, i = n.controller = new OI(t.getZr()); return E([\"pan\", \"zoom\", \"scrollMove\"], (function (t) { i.on(t, (function (e) { var i = []; n.dataZoomInfoMap.each((function (r) { if (e.isAvailableBehavior(r.model.option)) { var o = (r.getRange || {})[t], a = o && o(r.dzReferCoordSysInfo, n.model.mainType, n.controller, e); !r.model.get(\"disabled\", !0) && a && i.push({ dataZoomId: r.model.id, start: a[0], end: a[1] }) } })), i.length && n.dispatchAction(i) })) })), n }(e, n.model)); (o.dataZoomInfoMap || (o.dataZoomInfoMap = ft())).set(t.uid, { dzReferCoordSysInfo: n, model: t, getRange: null }) })) })), i.each((function (t) { var e, n = t.controller, r = t.dataZoomInfoMap; if (r) { var o = r.keys()[0]; null != o && (e = r.get(o)) } if (e) { var a = function (t) { var e, n = \"type_\", i = { type_true: 2, type_move: 1, type_false: 0, type_undefined: -1 }, r = !0; return t.each((function (t) { var o = t.model, a = !o.get(\"disabled\", !0) && (!o.get(\"zoomLock\", !0) || \"move\"); i[n + a] > i[n + e] && (e = a), r = r && o.get(\"preventDefaultMouseMove\", !0) })), { controlType: e, opt: { zoomOnMouseWheel: !0, moveOnMouseMove: !0, moveOnMouseWheel: !0, preventDefaultMouseMove: !!r } } }(r); n.enable(a.controlType, a.opt), n.setPointerChecker(t.containsPoint), Pg(t, \"dispatchAction\", e.model.get(\"throttle\", !0), \"fixRate\") } else GB(i, t) })) })) } var UB = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"dataZoom.inside\", e } return n(e, t), e.prototype.render = function (e, n, i) { t.prototype.render.apply(this, arguments), e.noTarget() ? this._clear() : (this.range = e.getPercentRange(), FB(i, e, { pan: W(XB.pan, this), zoom: W(XB.zoom, this), scrollMove: W(XB.scrollMove, this) })) }, e.prototype.dispose = function () { this._clear(), t.prototype.dispose.apply(this, arguments) }, e.prototype._clear = function () { !function (t, e) { for (var n = BB(t).coordSysRecordMap, i = n.keys(), r = 0; r < i.length; r++) { var o = i[r], a = n.get(o), s = a.dataZoomInfoMap; if (s) { var l = e.uid; s.get(l) && (s.removeKey(l), s.keys().length || GB(n, a)) } } }(this.api, this.dataZoomModel), this.range = null }, e.type = \"dataZoom.inside\", e }(VE), XB = { zoom: function (t, e, n, i) { var r = this.range, o = r.slice(), a = t.axisModels[0]; if (a) { var s = jB[e](null, [i.originX, i.originY], a, n, t), l = (s.signal > 0 ? s.pixelStart + s.pixelLength - s.pixel : s.pixel - s.pixelStart) / s.pixelLength * (o[1] - o[0]) + o[0], u = Math.max(1 / i.scale, 0); o[0] = (o[0] - l) * u + l, o[1] = (o[1] - l) * u + l; var h = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); return dk(0, o, [0, 100], 0, h.minSpan, h.maxSpan), this.range = o, r[0] !== o[0] || r[1] !== o[1] ? o : void 0 } }, pan: ZB((function (t, e, n, i, r, o) { var a = jB[i]([o.oldX, o.oldY], [o.newX, o.newY], e, r, n); return a.signal * (t[1] - t[0]) * a.pixel / a.pixelLength })), scrollMove: ZB((function (t, e, n, i, r, o) { return jB[i]([0, 0], [o.scrollDelta, o.scrollDelta], e, r, n).signal * (t[1] - t[0]) * o.scrollDelta })) }; function ZB(t) { return function (e, n, i, r) { var o = this.range, a = o.slice(), s = e.axisModels[0]; if (s) return dk(t(a, s, e, n, i, r), a, [0, 100], \"all\"), this.range = a, o[0] !== a[0] || o[1] !== a[1] ? a : void 0 } } var jB = { grid: function (t, e, n, i, r) { var o = n.axis, a = {}, s = r.model.coordinateSystem.getRect(); return t = t || [0, 0], \"x\" === o.dim ? (a.pixel = e[0] - t[0], a.pixelLength = s.width, a.pixelStart = s.x, a.signal = o.inverse ? 1 : -1) : (a.pixel = e[1] - t[1], a.pixelLength = s.height, a.pixelStart = s.y, a.signal = o.inverse ? -1 : 1), a }, polar: function (t, e, n, i, r) { var o = n.axis, a = {}, s = r.model.coordinateSystem, l = s.getRadiusAxis().getExtent(), u = s.getAngleAxis().getExtent(); return t = t ? s.pointToCoord(t) : [0, 0], e = s.pointToCoord(e), \"radiusAxis\" === n.mainType ? (a.pixel = e[0] - t[0], a.pixelLength = l[1] - l[0], a.pixelStart = l[0], a.signal = o.inverse ? 1 : -1) : (a.pixel = e[1] - t[1], a.pixelLength = u[1] - u[0], a.pixelStart = u[0], a.signal = o.inverse ? -1 : 1), a }, singleAxis: function (t, e, n, i, r) { var o = n.axis, a = r.model.coordinateSystem.getRect(), s = {}; return t = t || [0, 0], \"horizontal\" === o.orient ? (s.pixel = e[0] - t[0], s.pixelLength = a.width, s.pixelStart = a.x, s.signal = o.inverse ? 1 : -1) : (s.pixel = e[1] - t[1], s.pixelLength = a.height, s.pixelStart = a.y, s.signal = o.inverse ? -1 : 1), s } }; function qB(t) { UE(t), t.registerComponentModel(VB), t.registerComponentView(UB), YB(t) } var KB = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.type = \"dataZoom.slider\", e.layoutMode = \"box\", e.defaultOption = wc(NE.defaultOption, { show: !0, right: \"ph\", top: \"ph\", width: \"ph\", height: \"ph\", left: null, bottom: null, borderColor: \"#d2dbee\", borderRadius: 3, backgroundColor: \"rgba(47,69,84,0)\", dataBackground: { lineStyle: { color: \"#d2dbee\", width: .5 }, areaStyle: { color: \"#d2dbee\", opacity: .2 } }, selectedDataBackground: { lineStyle: { color: \"#8fb0f7\", width: .5 }, areaStyle: { color: \"#8fb0f7\", opacity: .2 } }, fillerColor: \"rgba(135,175,274,0.2)\", handleIcon: \"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z\", handleSize: \"100%\", handleStyle: { color: \"#fff\", borderColor: \"#ACB8D1\" }, moveHandleSize: 7, moveHandleIcon: \"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z\", moveHandleStyle: { color: \"#D2DBEE\", opacity: .7 }, showDetail: !0, showDataShadow: \"auto\", realtime: !0, zoomLock: !1, textStyle: { color: \"#6E7079\" }, brushSelect: !0, brushStyle: { color: \"rgba(135,175,274,0.15)\" }, emphasis: { handleStyle: { borderColor: \"#8FB0F7\" }, moveHandleStyle: { color: \"#8FB0F7\" } } }), e }(NE), $B = Ps, JB = \"horizontal\", QB = \"vertical\", tF = [\"line\", \"bar\", \"candlestick\", \"scatter\"], eF = { easing: \"cubicOut\", duration: 100, delay: 0 }, nF = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._displayables = {}, n } return n(e, t), e.prototype.init = function (t, e) { this.api = e, this._onBrush = W(this._onBrush, this), this._onBrushEnd = W(this._onBrushEnd, this) }, e.prototype.render = function (e, n, i, r) { if (t.prototype.render.apply(this, arguments), Pg(this, \"_dispatchZoomAction\", e.get(\"throttle\"), \"fixRate\"), this._orient = e.getOrient(), !1 !== e.get(\"show\")) { if (e.noTarget()) return this._clear(), void this.group.removeAll(); r && \"dataZoom\" === r.type && r.from === this.uid || this._buildView(), this._updateView() } else this.group.removeAll() }, e.prototype.dispose = function () { this._clear(), t.prototype.dispose.apply(this, arguments) }, e.prototype._clear = function () { Og(this, \"_dispatchZoomAction\"); var t = this.api.getZr(); t.off(\"mousemove\", this._onBrush), t.off(\"mouseup\", this._onBrushEnd) }, e.prototype._buildView = function () { var t = this.group; t.removeAll(), this._brushing = !1, this._displayables.brushRect = null, this._resetLocation(), this._resetInterval(); var e = this._displayables.sliderGroup = new Pr; this._renderBackground(), this._renderHandle(), this._renderDataShadow(), t.add(e), this._positionGroup() }, e.prototype._resetLocation = function () { var t = this.dataZoomModel, e = this.api, n = t.get(\"brushSelect\") ? 7 : 0, i = this._findCoordRect(), r = { width: e.getWidth(), height: e.getHeight() }, o = this._orient === JB ? { right: r.width - i.x - i.width, top: r.height - 30 - 7 - n, width: i.width, height: 30 } : { right: 7, top: i.y, width: 30, height: i.height }, a = Tp(t.option); E([\"right\", \"top\", \"width\", \"height\"], (function (t) { \"ph\" === a[t] && (a[t] = o[t]) })); var s = wp(a, r); this._location = { x: s.x, y: s.y }, this._size = [s.width, s.height], this._orient === QB && this._size.reverse() }, e.prototype._positionGroup = function () { var t = this.group, e = this._location, n = this._orient, i = this.dataZoomModel.getFirstTargetAxisModel(), r = i && i.get(\"inverse\"), o = this._displayables.sliderGroup, a = (this._dataShadowInfo || {}).otherAxisInverse; o.attr(n !== JB || r ? n === JB && r ? { scaleY: a ? 1 : -1, scaleX: -1 } : n !== QB || r ? { scaleY: a ? -1 : 1, scaleX: -1, rotation: Math.PI / 2 } : { scaleY: a ? -1 : 1, scaleX: 1, rotation: Math.PI / 2 } : { scaleY: a ? 1 : -1, scaleX: 1 }); var s = t.getBoundingRect([o]); t.x = e.x - s.x, t.y = e.y - s.y, t.markRedraw() }, e.prototype._getViewExtent = function () { return [0, this._size[0]] }, e.prototype._renderBackground = function () { var t = this.dataZoomModel, e = this._size, n = this._displayables.sliderGroup, i = t.get(\"brushSelect\"); n.add(new $B({ silent: !0, shape: { x: 0, y: 0, width: e[0], height: e[1] }, style: { fill: t.get(\"backgroundColor\") }, z2: -40 })); var r = new $B({ shape: { x: 0, y: 0, width: e[0], height: e[1] }, style: { fill: \"transparent\" }, z2: 0, onclick: W(this._onClickPanel, this) }), o = this.api.getZr(); i ? (r.on(\"mousedown\", this._onBrushStart, this), r.cursor = \"crosshair\", o.on(\"mousemove\", this._onBrush), o.on(\"mouseup\", this._onBrushEnd)) : (o.off(\"mousemove\", this._onBrush), o.off(\"mouseup\", this._onBrushEnd)), n.add(r) }, e.prototype._renderDataShadow = function () { var t = this._dataShadowInfo = this._prepareDataShadowInfo(); if (this._displayables.dataShadowSegs = [], t) { var e = this._size, n = this._shadowSize || [], i = t.series, r = i.getRawData(), o = i.getShadowDim && i.getShadowDim(), a = o && r.getDimensionInfo(o) ? i.getShadowDim() : t.otherDim; if (null != a) { var s = this._shadowPolygonPts, l = this._shadowPolylinePts; if (r !== this._shadowData || a !== this._shadowDim || e[0] !== n[0] || e[1] !== n[1]) { var u = r.getDataExtent(a), h = .3 * (u[1] - u[0]); u = [u[0] - h, u[1] + h]; var c, p = [0, e[1]], d = [0, e[0]], f = [[e[0], 0], [0, 0]], g = [], y = d[1] / (r.count() - 1), v = 0, m = Math.round(r.count() / e[0]); r.each([a], (function (t, e) { if (m > 0 && e % m) v += y; else { var n = null == t || isNaN(t) || \"\" === t, i = n ? 0 : Fr(t, u, p, !0); n && !c && e ? (f.push([f[f.length - 1][0], 0]), g.push([g[g.length - 1][0], 0])) : !n && c && (f.push([v, 0]), g.push([v, 0])), f.push([v, i]), g.push([v, i]), v += y, c = n } })), s = this._shadowPolygonPts = f, l = this._shadowPolylinePts = g } this._shadowData = r, this._shadowDim = a, this._shadowSize = [e[0], e[1]]; for (var x = this.dataZoomModel, _ = 0; _ < 3; _++) { var b = w(1 === _); this._displayables.sliderGroup.add(b), this._displayables.dataShadowSegs.push(b) } } } function w(t) { var e = x.getModel(t ? \"selectedDataBackground\" : \"dataBackground\"), n = new Pr, i = new zu({ shape: { points: s }, segmentIgnoreThreshold: 1, style: e.getModel(\"areaStyle\").getAreaStyle(), silent: !0, z2: -20 }), r = new Bu({ shape: { points: l }, segmentIgnoreThreshold: 1, style: e.getModel(\"lineStyle\").getLineStyle(), silent: !0, z2: -19 }); return n.add(i), n.add(r), n } }, e.prototype._prepareDataShadowInfo = function () { var t = this.dataZoomModel, e = t.get(\"showDataShadow\"); if (!1 !== e) { var n, i = this.ecModel; return t.eachTargetAxis((function (r, o) { E(t.getAxisProxy(r, o).getTargetSeriesModels(), (function (t) { if (!(n || !0 !== e && P(tF, t.get(\"type\")) < 0)) { var a, s = i.getComponent(LE(r), o).axis, l = { x: \"y\", y: \"x\", radius: \"angle\", angle: \"radius\" }[r], u = t.coordinateSystem; null != l && u.getOtherAxis && (a = u.getOtherAxis(s).inverse), l = t.getData().mapDimension(l), n = { thisAxis: s, series: t, thisDim: r, otherDim: l, otherAxisInverse: a } } }), this) }), this), n } }, e.prototype._renderHandle = function () { var t = this.group, e = this._displayables, n = e.handles = [null, null], i = e.handleLabels = [null, null], r = this._displayables.sliderGroup, o = this._size, a = this.dataZoomModel, s = this.api, l = a.get(\"borderRadius\") || 0, u = a.get(\"brushSelect\"), h = e.filler = new $B({ silent: u, style: { fill: a.get(\"fillerColor\") }, textConfig: { position: \"inside\" } }); r.add(h), r.add(new $B({ silent: !0, subPixelOptimize: !0, shape: { x: 0, y: 0, width: o[0], height: o[1], r: l }, style: { stroke: a.get(\"dataBackgroundColor\") || a.get(\"borderColor\"), lineWidth: 1, fill: \"rgba(0,0,0,0)\" } })), E([0, 1], (function (e) { var o = a.get(\"handleIcon\"); !Ly[o] && o.indexOf(\"path://\") < 0 && o.indexOf(\"image://\") < 0 && (o = \"path://\" + o); var s = Ry(o, -1, 0, 2, 2, null, !0); s.attr({ cursor: iF(this._orient), draggable: !0, drift: W(this._onDragMove, this, e), ondragend: W(this._onDragEnd, this), onmouseover: W(this._showDataInfo, this, !0), onmouseout: W(this._showDataInfo, this, !1), z2: 5 }); var l = s.getBoundingRect(), u = a.get(\"handleSize\"); this._handleHeight = Gr(u, this._size[1]), this._handleWidth = l.width / l.height * this._handleHeight, s.setStyle(a.getModel(\"handleStyle\").getItemStyle()), s.style.strokeNoScale = !0, s.rectHover = !0, s.ensureState(\"emphasis\").style = a.getModel([\"emphasis\", \"handleStyle\"]).getItemStyle(), Vl(s); var h = a.get(\"handleColor\"); null != h && (s.style.fill = h), r.add(n[e] = s); var c = a.getModel(\"textStyle\"); t.add(i[e] = new Ns({ silent: !0, invisible: !0, style: $h(c, { x: 0, y: 0, text: \"\", verticalAlign: \"middle\", align: \"center\", fill: c.getTextColor(), font: c.getFont() }), z2: 10 })) }), this); var c = h; if (u) { var p = Gr(a.get(\"moveHandleSize\"), o[1]), d = e.moveHandle = new Ps({ style: a.getModel(\"moveHandleStyle\").getItemStyle(), silent: !0, shape: { r: [0, 0, 2, 2], y: o[1] - .5, height: p } }), f = .8 * p, g = e.moveHandleIcon = Ry(a.get(\"moveHandleIcon\"), -f / 2, -f / 2, f, f, \"#fff\", !0); g.silent = !0, g.y = o[1] + p / 2 - .5, d.ensureState(\"emphasis\").style = a.getModel([\"emphasis\", \"moveHandleStyle\"]).getItemStyle(); var y = Math.min(o[1] / 2, Math.max(p, 10)); (c = e.moveZone = new Ps({ invisible: !0, shape: { y: o[1] - y, height: p + y } })).on(\"mouseover\", (function () { s.enterEmphasis(d) })).on(\"mouseout\", (function () { s.leaveEmphasis(d) })), r.add(d), r.add(g), r.add(c) } c.attr({ draggable: !0, cursor: iF(this._orient), drift: W(this._onDragMove, this, \"all\"), ondragstart: W(this._showDataInfo, this, !0), ondragend: W(this._onDragEnd, this), onmouseover: W(this._showDataInfo, this, !0), onmouseout: W(this._showDataInfo, this, !1) }) }, e.prototype._resetInterval = function () { var t = this._range = this.dataZoomModel.getPercentRange(), e = this._getViewExtent(); this._handleEnds = [Fr(t[0], [0, 100], e, !0), Fr(t[1], [0, 100], e, !0)] }, e.prototype._updateInterval = function (t, e) { var n = this.dataZoomModel, i = this._handleEnds, r = this._getViewExtent(), o = n.findRepresentativeAxisProxy().getMinMaxSpan(), a = [0, 100]; dk(e, i, r, n.get(\"zoomLock\") ? \"all\" : t, null != o.minSpan ? Fr(o.minSpan, a, r, !0) : null, null != o.maxSpan ? Fr(o.maxSpan, a, r, !0) : null); var s = this._range, l = this._range = Hr([Fr(i[0], r, a, !0), Fr(i[1], r, a, !0)]); return !s || s[0] !== l[0] || s[1] !== l[1] }, e.prototype._updateView = function (t) { var e = this._displayables, n = this._handleEnds, i = Hr(n.slice()), r = this._size; E([0, 1], (function (t) { var i = e.handles[t], o = this._handleHeight; i.attr({ scaleX: o / 2, scaleY: o / 2, x: n[t] + (t ? -1 : 1), y: r[1] / 2 - o / 2 }) }), this), e.filler.setShape({ x: i[0], y: 0, width: i[1] - i[0], height: r[1] }); var o = { x: i[0], width: i[1] - i[0] }; e.moveHandle && (e.moveHandle.setShape(o), e.moveZone.setShape(o), e.moveZone.getBoundingRect(), e.moveHandleIcon && e.moveHandleIcon.attr(\"x\", o.x + o.width / 2)); for (var a = e.dataShadowSegs, s = [0, i[0], i[1], r[0]], l = 0; l < a.length; l++) { var u = a[l], h = u.getClipPath(); h || (h = new Ps, u.setClipPath(h)), h.setShape({ x: s[l], y: 0, width: s[l + 1] - s[l], height: r[1] }) } this._updateDataInfo(t) }, e.prototype._updateDataInfo = function (t) { var e = this.dataZoomModel, n = this._displayables, i = n.handleLabels, r = this._orient, o = [\"\", \"\"]; if (e.get(\"showDetail\")) { var a = e.findRepresentativeAxisProxy(); if (a) { var s = a.getAxisModel().axis, l = this._range, u = t ? a.calculateDataWindow({ start: l[0], end: l[1] }).valueWindow : a.getDataValueWindow(); o = [this._formatLabel(u[0], s), this._formatLabel(u[1], s)] } } var h = Hr(this._handleEnds.slice()); function c(t) { var e = Lh(n.handles[t].parent, this.group), a = Oh(0 === t ? \"right\" : \"left\", e), s = this._handleWidth / 2 + 5, l = Ph([h[t] + (0 === t ? -s : s), this._size[1] / 2], e); i[t].setStyle({ x: l[0], y: l[1], verticalAlign: r === JB ? \"middle\" : a, align: r === JB ? a : \"center\", text: o[t] }) } c.call(this, 0), c.call(this, 1) }, e.prototype._formatLabel = function (t, e) { var n = this.dataZoomModel, i = n.get(\"labelFormatter\"), r = n.get(\"labelPrecision\"); null != r && \"auto\" !== r || (r = e.getPixelPrecision()); var o = null == t || isNaN(t) ? \"\" : \"category\" === e.type || \"time\" === e.type ? e.scale.getLabel({ value: Math.round(t) }) : t.toFixed(Math.min(r, 20)); return U(i) ? i(t, o) : X(i) ? i.replace(\"{value}\", o) : o }, e.prototype._showDataInfo = function (t) { t = this._dragging || t; var e = this._displayables, n = e.handleLabels; n[0].attr(\"invisible\", !t), n[1].attr(\"invisible\", !t), e.moveHandle && this.api[t ? \"enterEmphasis\" : \"leaveEmphasis\"](e.moveHandle, 1) }, e.prototype._onDragMove = function (t, e, n, i) { this._dragging = !0, he(i.event); var r = Ph([e, n], this._displayables.sliderGroup.getLocalTransform(), !0), o = this._updateInterval(t, r[0]), a = this.dataZoomModel.get(\"realtime\"); this._updateView(!a), o && a && this._dispatchZoomAction(!0) }, e.prototype._onDragEnd = function () { this._dragging = !1, this._showDataInfo(!1), !this.dataZoomModel.get(\"realtime\") && this._dispatchZoomAction(!1) }, e.prototype._onClickPanel = function (t) { var e = this._size, n = this._displayables.sliderGroup.transformCoordToLocal(t.offsetX, t.offsetY); if (!(n[0] < 0 || n[0] > e[0] || n[1] < 0 || n[1] > e[1])) { var i = this._handleEnds, r = (i[0] + i[1]) / 2, o = this._updateInterval(\"all\", n[0] - r); this._updateView(), o && this._dispatchZoomAction(!1) } }, e.prototype._onBrushStart = function (t) { var e = t.offsetX, n = t.offsetY; this._brushStart = new Ie(e, n), this._brushing = !0, this._brushStartTime = +new Date }, e.prototype._onBrushEnd = function (t) { if (this._brushing) { var e = this._displayables.brushRect; if (this._brushing = !1, e) { e.attr(\"ignore\", !0); var n = e.shape; if (!(+new Date - this._brushStartTime < 200 && Math.abs(n.width) < 5)) { var i = this._getViewExtent(), r = [0, 100]; this._range = Hr([Fr(n.x, i, r, !0), Fr(n.x + n.width, i, r, !0)]), this._handleEnds = [n.x, n.x + n.width], this._updateView(), this._dispatchZoomAction(!1) } } } }, e.prototype._onBrush = function (t) { this._brushing && (he(t.event), this._updateBrushRect(t.offsetX, t.offsetY)) }, e.prototype._updateBrushRect = function (t, e) { var n = this._displayables, i = this.dataZoomModel, r = n.brushRect; r || (r = n.brushRect = new $B({ silent: !0, style: i.getModel(\"brushStyle\").getItemStyle() }), n.sliderGroup.add(r)), r.attr(\"ignore\", !1); var o = this._brushStart, a = this._displayables.sliderGroup, s = a.transformCoordToLocal(t, e), l = a.transformCoordToLocal(o.x, o.y), u = this._size; s[0] = Math.max(Math.min(u[0], s[0]), 0), r.setShape({ x: l[0], y: 0, width: s[0] - l[0], height: u[1] }) }, e.prototype._dispatchZoomAction = function (t) { var e = this._range; this.api.dispatchAction({ type: \"dataZoom\", from: this.uid, dataZoomId: this.dataZoomModel.id, animation: t ? eF : null, start: e[0], end: e[1] }) }, e.prototype._findCoordRect = function () { var t, e = OE(this.dataZoomModel).infoList; if (!t && e.length) { var n = e[0].model.coordinateSystem; t = n.getRect && n.getRect() } if (!t) { var i = this.api.getWidth(), r = this.api.getHeight(); t = { x: .2 * i, y: .2 * r, width: .6 * i, height: .6 * r } } return t }, e.type = \"dataZoom.slider\", e }(VE); function iF(t) { return \"vertical\" === t ? \"ns-resize\" : \"ew-resize\" } function rF(t) { t.registerComponentModel(KB), t.registerComponentView(nF), UE(t) } var oF = function (t, e, n) { var i = T((aF[t] || {})[e]); return n && Y(i) ? i[i.length - 1] : i }, aF = { color: { active: [\"#006edd\", \"#e0ffff\"], inactive: [\"rgba(0,0,0,0)\"] }, colorHue: { active: [0, 360], inactive: [0, 0] }, colorSaturation: { active: [.3, 1], inactive: [0, 0] }, colorLightness: { active: [.9, .5], inactive: [0, 0] }, colorAlpha: { active: [.3, 1], inactive: [0, 0] }, opacity: { active: [.3, 1], inactive: [0, 0] }, symbol: { active: [\"circle\", \"roundRect\", \"diamond\"], inactive: [\"none\"] }, symbolSize: { active: [10, 50], inactive: [0, 0] } }, sF = sD.mapVisual, lF = sD.eachVisual, uF = Y, hF = E, cF = Hr, pF = Fr, dF = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.stateList = [\"inRange\", \"outOfRange\"], n.replacableOptionKeys = [\"inRange\", \"outOfRange\", \"target\", \"controller\", \"color\"], n.layoutMode = { type: \"box\", ignoreSize: !0 }, n.dataBound = [-1 / 0, 1 / 0], n.targetVisuals = {}, n.controllerVisuals = {}, n } return n(e, t), e.prototype.init = function (t, e, n) { this.mergeDefaultAndTheme(t, n) }, e.prototype.optionUpdated = function (t, e) { var n = this.option; !e && sV(n, t, this.replacableOptionKeys), this.textStyleModel = this.getModel(\"textStyle\"), this.resetItemSize(), this.completeVisualOption() }, e.prototype.resetVisual = function (t) { var e = this.stateList; t = W(t, this), this.controllerVisuals = aV(this.option.controller, e, t), this.targetVisuals = aV(this.option.target, e, t) }, e.prototype.getItemSymbol = function () { return null }, e.prototype.getTargetSeriesIndices = function () { var t = this.option.seriesIndex, e = []; return null == t || \"all\" === t ? this.ecModel.eachSeries((function (t, n) { e.push(n) })) : e = yo(t), e }, e.prototype.eachTargetSeries = function (t, e) { E(this.getTargetSeriesIndices(), (function (n) { var i = this.ecModel.getSeriesByIndex(n); i && t.call(e, i) }), this) }, e.prototype.isTargetSeries = function (t) { var e = !1; return this.eachTargetSeries((function (n) { n === t && (e = !0) })), e }, e.prototype.formatValueText = function (t, e, n) { var i, r = this.option, o = r.precision, a = this.dataBound, s = r.formatter; n = n || [\"<\", \">\"], Y(t) && (t = t.slice(), i = !0); var l = e ? t : i ? [u(t[0]), u(t[1])] : u(t); return X(s) ? s.replace(\"{value}\", i ? l[0] : l).replace(\"{value2}\", i ? l[1] : l) : U(s) ? i ? s(t[0], t[1]) : s(t) : i ? t[0] === a[0] ? n[0] + \" \" + l[1] : t[1] === a[1] ? n[1] + \" \" + l[0] : l[0] + \" - \" + l[1] : l; function u(t) { return t === a[0] ? \"min\" : t === a[1] ? \"max\" : (+t).toFixed(Math.min(o, 20)) } }, e.prototype.resetExtent = function () { var t = this.option, e = cF([t.min, t.max]); this._dataExtent = e }, e.prototype.getDataDimensionIndex = function (t) { var e = this.option.dimension; if (null != e) return t.getDimensionIndex(e); for (var n = t.dimensions, i = n.length - 1; i >= 0; i--) { var r = n[i], o = t.getDimensionInfo(r); if (!o.isCalculationCoord) return o.storeDimIndex } }, e.prototype.getExtent = function () { return this._dataExtent.slice() }, e.prototype.completeVisualOption = function () { var t = this.ecModel, e = this.option, n = { inRange: e.inRange, outOfRange: e.outOfRange }, i = e.target || (e.target = {}), r = e.controller || (e.controller = {}); C(i, n), C(r, n); var o = this.isCategory(); function a(n) { uF(e.color) && !n.inRange && (n.inRange = { color: e.color.slice().reverse() }), n.inRange = n.inRange || { color: t.get(\"gradientColor\") } } a.call(this, i), a.call(this, r), function (t, e, n) { var i = t[e], r = t[n]; i && !r && (r = t[n] = {}, hF(i, (function (t, e) { if (sD.isValidType(e)) { var n = oF(e, \"inactive\", o); null != n && (r[e] = n, \"color\" !== e || r.hasOwnProperty(\"opacity\") || r.hasOwnProperty(\"colorAlpha\") || (r.opacity = [0, 0])) } }))) }.call(this, i, \"inRange\", \"outOfRange\"), function (t) { var e = (t.inRange || {}).symbol || (t.outOfRange || {}).symbol, n = (t.inRange || {}).symbolSize || (t.outOfRange || {}).symbolSize, i = this.get(\"inactiveColor\"), r = this.getItemSymbol() || \"roundRect\"; hF(this.stateList, (function (a) { var s = this.itemSize, l = t[a]; l || (l = t[a] = { color: o ? i : [i] }), null == l.symbol && (l.symbol = e && T(e) || (o ? r : [r])), null == l.symbolSize && (l.symbolSize = n && T(n) || (o ? s[0] : [s[0], s[0]])), l.symbol = sF(l.symbol, (function (t) { return \"none\" === t ? r : t })); var u = l.symbolSize; if (null != u) { var h = -1 / 0; lF(u, (function (t) { t > h && (h = t) })), l.symbolSize = sF(u, (function (t) { return pF(t, [0, h], [0, s[0]], !0) })) } }), this) }.call(this, r) }, e.prototype.resetItemSize = function () { this.itemSize = [parseFloat(this.get(\"itemWidth\")), parseFloat(this.get(\"itemHeight\"))] }, e.prototype.isCategory = function () { return !!this.option.categories }, e.prototype.setSelected = function (t) { }, e.prototype.getSelected = function () { return null }, e.prototype.getValueState = function (t) { return null }, e.prototype.getVisualMeta = function (t) { return null }, e.type = \"visualMap\", e.dependencies = [\"series\"], e.defaultOption = { show: !0, z: 4, seriesIndex: \"all\", min: 0, max: 200, left: 0, right: null, top: null, bottom: 0, itemWidth: null, itemHeight: null, inverse: !1, orient: \"vertical\", backgroundColor: \"rgba(0,0,0,0)\", borderColor: \"#ccc\", contentColor: \"#5793f3\", inactiveColor: \"#aaa\", borderWidth: 0, padding: 5, textGap: 10, precision: 0, textStyle: { color: \"#333\" } }, e }(Ap), fF = [20, 140], gF = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.optionUpdated = function (e, n) { t.prototype.optionUpdated.apply(this, arguments), this.resetExtent(), this.resetVisual((function (t) { t.mappingMethod = \"linear\", t.dataExtent = this.getExtent() })), this._resetRange() }, e.prototype.resetItemSize = function () { t.prototype.resetItemSize.apply(this, arguments); var e = this.itemSize; (null == e[0] || isNaN(e[0])) && (e[0] = fF[0]), (null == e[1] || isNaN(e[1])) && (e[1] = fF[1]) }, e.prototype._resetRange = function () { var t = this.getExtent(), e = this.option.range; !e || e.auto ? (t.auto = 1, this.option.range = t) : Y(e) && (e[0] > e[1] && e.reverse(), e[0] = Math.max(e[0], t[0]), e[1] = Math.min(e[1], t[1])) }, e.prototype.completeVisualOption = function () { t.prototype.completeVisualOption.apply(this, arguments), E(this.stateList, (function (t) { var e = this.option.controller[t].symbolSize; e && e[0] !== e[1] && (e[0] = e[1] / 3) }), this) }, e.prototype.setSelected = function (t) { this.option.range = t.slice(), this._resetRange() }, e.prototype.getSelected = function () { var t = this.getExtent(), e = Hr((this.get(\"range\") || []).slice()); return e[0] > t[1] && (e[0] = t[1]), e[1] > t[1] && (e[1] = t[1]), e[0] < t[0] && (e[0] = t[0]), e[1] < t[0] && (e[1] = t[0]), e }, e.prototype.getValueState = function (t) { var e = this.option.range, n = this.getExtent(); return (e[0] <= n[0] || e[0] <= t) && (e[1] >= n[1] || t <= e[1]) ? \"inRange\" : \"outOfRange\" }, e.prototype.findTargetDataIndices = function (t) { var e = []; return this.eachTargetSeries((function (n) { var i = [], r = n.getData(); r.each(this.getDataDimensionIndex(r), (function (e, n) { t[0] <= e && e <= t[1] && i.push(n) }), this), e.push({ seriesId: n.id, dataIndex: i }) }), this), e }, e.prototype.getVisualMeta = function (t) { var e = yF(this, \"outOfRange\", this.getExtent()), n = yF(this, \"inRange\", this.option.range.slice()), i = []; function r(e, n) { i.push({ value: e, color: t(e, n) }) } for (var o = 0, a = 0, s = n.length, l = e.length; a < l && (!n.length || e[a] <= n[0]); a++)e[a] < n[o] && r(e[a], \"outOfRange\"); for (var u = 1; o < s; o++, u = 0)u && i.length && r(n[o], \"outOfRange\"), r(n[o], \"inRange\"); for (u = 1; a < l; a++)(!n.length || n[n.length - 1] < e[a]) && (u && (i.length && r(i[i.length - 1].value, \"outOfRange\"), u = 0), r(e[a], \"outOfRange\")); var h = i.length; return { stops: i, outerColors: [h ? i[0].color : \"transparent\", h ? i[h - 1].color : \"transparent\"] } }, e.type = \"visualMap.continuous\", e.defaultOption = wc(dF.defaultOption, { align: \"auto\", calculable: !1, hoverLink: !0, realtime: !0, handleIcon: \"path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z\", handleSize: \"120%\", handleStyle: { borderColor: \"#fff\", borderWidth: 1 }, indicatorIcon: \"circle\", indicatorSize: \"50%\", indicatorStyle: { borderColor: \"#fff\", borderWidth: 2, shadowBlur: 2, shadowOffsetX: 1, shadowOffsetY: 1, shadowColor: \"rgba(0,0,0,0.2)\" } }), e }(dF); function yF(t, e, n) { if (n[0] === n[1]) return n.slice(); for (var i = (n[1] - n[0]) / 200, r = n[0], o = [], a = 0; a <= 200 && r < n[1]; a++)o.push(r), r += i; return o.push(n[1]), o } var vF = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n.autoPositionValues = { left: 1, right: 1, top: 1, bottom: 1 }, n } return n(e, t), e.prototype.init = function (t, e) { this.ecModel = t, this.api = e }, e.prototype.render = function (t, e, n, i) { this.visualMapModel = t, !1 !== t.get(\"show\") ? this.doRender(t, e, n, i) : this.group.removeAll() }, e.prototype.renderBackground = function (t) { var e = this.visualMapModel, n = up(e.get(\"padding\") || 0), i = t.getBoundingRect(); t.add(new Ps({ z2: -1, silent: !0, shape: { x: i.x - n[3], y: i.y - n[0], width: i.width + n[3] + n[1], height: i.height + n[0] + n[2] }, style: { fill: e.get(\"backgroundColor\"), stroke: e.get(\"borderColor\"), lineWidth: e.get(\"borderWidth\") } })) }, e.prototype.getControllerVisual = function (t, e, n) { var i = (n = n || {}).forceState, r = this.visualMapModel, o = {}; if (\"color\" === e) { var a = r.get(\"contentColor\"); o.color = a } function s(t) { return o[t] } function l(t, e) { o[t] = e } var u = r.controllerVisuals[i || r.getValueState(t)]; return E(sD.prepareVisualTypes(u), (function (i) { var r = u[i]; n.convertOpacityToAlpha && \"opacity\" === i && (i = \"colorAlpha\", r = u.__alphaForOpacity), sD.dependsOn(i, e) && r && r.applyVisual(t, s, l) })), o[e] }, e.prototype.positionGroup = function (t) { var e = this.visualMapModel, n = this.api; Sp(t, e.getBoxLayoutParams(), { width: n.getWidth(), height: n.getHeight() }) }, e.prototype.doRender = function (t, e, n, i) { }, e.type = \"visualMap\", e }(mg), mF = [[\"left\", \"right\", \"width\"], [\"top\", \"bottom\", \"height\"]]; function xF(t, e, n) { var i = t.option, r = i.align; if (null != r && \"auto\" !== r) return r; for (var o = { width: e.getWidth(), height: e.getHeight() }, a = \"horizontal\" === i.orient ? 1 : 0, s = mF[a], l = [0, null, 10], u = {}, h = 0; h < 3; h++)u[mF[1 - a][h]] = l[h], u[s[h]] = 2 === h ? n[0] : i[s[h]]; var c = [[\"x\", \"width\", 3], [\"y\", \"height\", 0]][a], p = wp(u, o, i.padding); return s[(p.margin[c[2]] || 0) + p[c[0]] + .5 * p[c[1]] < .5 * o[c[1]] ? 0 : 1] } function _F(t, e) { return E(t || [], (function (t) { null != t.dataIndex && (t.dataIndexInside = t.dataIndex, t.dataIndex = null), t.highlightKey = \"visualMap\" + (e ? e.componentIndex : \"\") })), t } var bF = Fr, wF = E, SF = Math.min, MF = Math.max, IF = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._shapes = {}, n._dataInterval = [], n._handleEnds = [], n._hoverLinkDataIndices = [], n } return n(e, t), e.prototype.doRender = function (t, e, n, i) { this._api = n, i && \"selectDataRange\" === i.type && i.from === this.uid || this._buildView() }, e.prototype._buildView = function () { this.group.removeAll(); var t = this.visualMapModel, e = this.group; this._orient = t.get(\"orient\"), this._useHandle = t.get(\"calculable\"), this._resetInterval(), this._renderBar(e); var n = t.get(\"text\"); this._renderEndsText(e, n, 0), this._renderEndsText(e, n, 1), this._updateView(!0), this.renderBackground(e), this._updateView(), this._enableHoverLinkToSeries(), this._enableHoverLinkFromSeries(), this.positionGroup(e) }, e.prototype._renderEndsText = function (t, e, n) { if (e) { var i = e[1 - n]; i = null != i ? i + \"\" : \"\"; var r = this.visualMapModel, o = r.get(\"textGap\"), a = r.itemSize, s = this._shapes.mainGroup, l = this._applyTransform([a[0] / 2, 0 === n ? -o : a[1] + o], s), u = this._applyTransform(0 === n ? \"bottom\" : \"top\", s), h = this._orient, c = this.visualMapModel.textStyleModel; this.group.add(new Ns({ style: $h(c, { x: l[0], y: l[1], verticalAlign: \"horizontal\" === h ? \"middle\" : u, align: \"horizontal\" === h ? u : \"center\", text: i }) })) } }, e.prototype._renderBar = function (t) { var e = this.visualMapModel, n = this._shapes, i = e.itemSize, r = this._orient, o = this._useHandle, a = xF(e, this.api, i), s = n.mainGroup = this._createBarGroup(a), l = new Pr; s.add(l), l.add(n.outOfRange = TF()), l.add(n.inRange = TF(null, o ? DF(this._orient) : null, W(this._dragHandle, this, \"all\", !1), W(this._dragHandle, this, \"all\", !0))), l.setClipPath(new Ps({ shape: { x: 0, y: 0, width: i[0], height: i[1], r: 3 } })); var u = e.textStyleModel.getTextRect(\"国\"), h = MF(u.width, u.height); o && (n.handleThumbs = [], n.handleLabels = [], n.handleLabelPoints = [], this._createHandle(e, s, 0, i, h, r), this._createHandle(e, s, 1, i, h, r)), this._createIndicator(e, s, i, h, r), t.add(s) }, e.prototype._createHandle = function (t, e, n, i, r, o) { var a = W(this._dragHandle, this, n, !1), s = W(this._dragHandle, this, n, !0), l = _r(t.get(\"handleSize\"), i[0]), u = Ry(t.get(\"handleIcon\"), -l / 2, -l / 2, l, l, null, !0), h = DF(this._orient); u.attr({ cursor: h, draggable: !0, drift: a, ondragend: s, onmousemove: function (t) { he(t.event) } }), u.x = i[0] / 2, u.useStyle(t.getModel(\"handleStyle\").getItemStyle()), u.setStyle({ strokeNoScale: !0, strokeFirst: !0 }), u.style.lineWidth *= 2, u.ensureState(\"emphasis\").style = t.getModel([\"emphasis\", \"handleStyle\"]).getItemStyle(), Yl(u, !0), e.add(u); var c = this.visualMapModel.textStyleModel, p = new Ns({ cursor: h, draggable: !0, drift: a, onmousemove: function (t) { he(t.event) }, ondragend: s, style: $h(c, { x: 0, y: 0, text: \"\" }) }); p.ensureState(\"blur\").style = { opacity: .1 }, p.stateTransition = { duration: 200 }, this.group.add(p); var d = [l, 0], f = this._shapes; f.handleThumbs[n] = u, f.handleLabelPoints[n] = d, f.handleLabels[n] = p }, e.prototype._createIndicator = function (t, e, n, i, r) { var o = _r(t.get(\"indicatorSize\"), n[0]), a = Ry(t.get(\"indicatorIcon\"), -o / 2, -o / 2, o, o, null, !0); a.attr({ cursor: \"move\", invisible: !0, silent: !0, x: n[0] / 2 }); var s = t.getModel(\"indicatorStyle\").getItemStyle(); if (a instanceof Is) { var l = a.style; a.useStyle(A({ image: l.image, x: l.x, y: l.y, width: l.width, height: l.height }, s)) } else a.useStyle(s); e.add(a); var u = this.visualMapModel.textStyleModel, h = new Ns({ silent: !0, invisible: !0, style: $h(u, { x: 0, y: 0, text: \"\" }) }); this.group.add(h); var c = [(\"horizontal\" === r ? i / 2 : 6) + n[0] / 2, 0], p = this._shapes; p.indicator = a, p.indicatorLabel = h, p.indicatorLabelPoint = c, this._firstShowIndicator = !0 }, e.prototype._dragHandle = function (t, e, n, i) { if (this._useHandle) { if (this._dragging = !e, !e) { var r = this._applyTransform([n, i], this._shapes.mainGroup, !0); this._updateInterval(t, r[1]), this._hideIndicator(), this._updateView() } e === !this.visualMapModel.get(\"realtime\") && this.api.dispatchAction({ type: \"selectDataRange\", from: this.uid, visualMapId: this.visualMapModel.id, selected: this._dataInterval.slice() }), e ? !this._hovering && this._clearHoverLinkToSeries() : CF(this.visualMapModel) && this._doHoverLinkToSeries(this._handleEnds[t], !1) } }, e.prototype._resetInterval = function () { var t = this.visualMapModel, e = this._dataInterval = t.getSelected(), n = t.getExtent(), i = [0, t.itemSize[1]]; this._handleEnds = [bF(e[0], n, i, !0), bF(e[1], n, i, !0)] }, e.prototype._updateInterval = function (t, e) { e = e || 0; var n = this.visualMapModel, i = this._handleEnds, r = [0, n.itemSize[1]]; dk(e, i, r, t, 0); var o = n.getExtent(); this._dataInterval = [bF(i[0], r, o, !0), bF(i[1], r, o, !0)] }, e.prototype._updateView = function (t) { var e = this.visualMapModel, n = e.getExtent(), i = this._shapes, r = [0, e.itemSize[1]], o = t ? r : this._handleEnds, a = this._createBarVisual(this._dataInterval, n, o, \"inRange\"), s = this._createBarVisual(n, n, r, \"outOfRange\"); i.inRange.setStyle({ fill: a.barColor }).setShape(\"points\", a.barPoints), i.outOfRange.setStyle({ fill: s.barColor }).setShape(\"points\", s.barPoints), this._updateHandle(o, a) }, e.prototype._createBarVisual = function (t, e, n, i) { var r = { forceState: i, convertOpacityToAlpha: !0 }, o = this._makeColorGradient(t, r), a = [this.getControllerVisual(t[0], \"symbolSize\", r), this.getControllerVisual(t[1], \"symbolSize\", r)], s = this._createBarPoints(n, a); return { barColor: new $u(0, 0, 0, 1, o), barPoints: s, handlesColor: [o[0].color, o[o.length - 1].color] } }, e.prototype._makeColorGradient = function (t, e) { var n = [], i = (t[1] - t[0]) / 100; n.push({ color: this.getControllerVisual(t[0], \"color\", e), offset: 0 }); for (var r = 1; r < 100; r++) { var o = t[0] + i * r; if (o > t[1]) break; n.push({ color: this.getControllerVisual(o, \"color\", e), offset: r / 100 }) } return n.push({ color: this.getControllerVisual(t[1], \"color\", e), offset: 1 }), n }, e.prototype._createBarPoints = function (t, e) { var n = this.visualMapModel.itemSize; return [[n[0] - e[0], t[0]], [n[0], t[0]], [n[0], t[1]], [n[0] - e[1], t[1]]] }, e.prototype._createBarGroup = function (t) { var e = this._orient, n = this.visualMapModel.get(\"inverse\"); return new Pr(\"horizontal\" !== e || n ? \"horizontal\" === e && n ? { scaleX: \"bottom\" === t ? -1 : 1, rotation: -Math.PI / 2 } : \"vertical\" !== e || n ? { scaleX: \"left\" === t ? 1 : -1 } : { scaleX: \"left\" === t ? 1 : -1, scaleY: -1 } : { scaleX: \"bottom\" === t ? 1 : -1, rotation: Math.PI / 2 }) }, e.prototype._updateHandle = function (t, e) { if (this._useHandle) { var n = this._shapes, i = this.visualMapModel, r = n.handleThumbs, o = n.handleLabels, a = i.itemSize, s = i.getExtent(); wF([0, 1], (function (l) { var u = r[l]; u.setStyle(\"fill\", e.handlesColor[l]), u.y = t[l]; var h = bF(t[l], [0, a[1]], s, !0), c = this.getControllerVisual(h, \"symbolSize\"); u.scaleX = u.scaleY = c / a[0], u.x = a[0] - c / 2; var p = Ph(n.handleLabelPoints[l], Lh(u, this.group)); o[l].setStyle({ x: p[0], y: p[1], text: i.formatValueText(this._dataInterval[l]), verticalAlign: \"middle\", align: \"vertical\" === this._orient ? this._applyTransform(\"left\", n.mainGroup) : \"center\" }) }), this) } }, e.prototype._showIndicator = function (t, e, n, i) { var r = this.visualMapModel, o = r.getExtent(), a = r.itemSize, s = [0, a[1]], l = this._shapes, u = l.indicator; if (u) { u.attr(\"invisible\", !1); var h = this.getControllerVisual(t, \"color\", { convertOpacityToAlpha: !0 }), c = this.getControllerVisual(t, \"symbolSize\"), p = bF(t, o, s, !0), d = a[0] - c / 2, f = { x: u.x, y: u.y }; u.y = p, u.x = d; var g = Ph(l.indicatorLabelPoint, Lh(u, this.group)), y = l.indicatorLabel; y.attr(\"invisible\", !1); var v = this._applyTransform(\"left\", l.mainGroup), m = \"horizontal\" === this._orient; y.setStyle({ text: (n || \"\") + r.formatValueText(e), verticalAlign: m ? v : \"middle\", align: m ? \"center\" : v }); var x = { x: d, y: p, style: { fill: h } }, _ = { style: { x: g[0], y: g[1] } }; if (r.ecModel.isAnimationEnabled() && !this._firstShowIndicator) { var b = { duration: 100, easing: \"cubicInOut\", additive: !0 }; u.x = f.x, u.y = f.y, u.animateTo(x, b), y.animateTo(_, b) } else u.attr(x), y.attr(_); this._firstShowIndicator = !1; var w = this._shapes.handleLabels; if (w) for (var S = 0; S < w.length; S++)this._api.enterBlur(w[S]) } }, e.prototype._enableHoverLinkToSeries = function () { var t = this; this._shapes.mainGroup.on(\"mousemove\", (function (e) { if (t._hovering = !0, !t._dragging) { var n = t.visualMapModel.itemSize, i = t._applyTransform([e.offsetX, e.offsetY], t._shapes.mainGroup, !0, !0); i[1] = SF(MF(0, i[1]), n[1]), t._doHoverLinkToSeries(i[1], 0 <= i[0] && i[0] <= n[0]) } })).on(\"mouseout\", (function () { t._hovering = !1, !t._dragging && t._clearHoverLinkToSeries() })) }, e.prototype._enableHoverLinkFromSeries = function () { var t = this.api.getZr(); this.visualMapModel.option.hoverLink ? (t.on(\"mouseover\", this._hoverLinkFromSeriesMouseOver, this), t.on(\"mouseout\", this._hideIndicator, this)) : this._clearHoverLinkFromSeries() }, e.prototype._doHoverLinkToSeries = function (t, e) { var n = this.visualMapModel, i = n.itemSize; if (n.option.hoverLink) { var r = [0, i[1]], o = n.getExtent(); t = SF(MF(r[0], t), r[1]); var a = function (t, e, n) { var i = 6, r = t.get(\"hoverLinkDataSize\"); r && (i = bF(r, e, n, !0) / 2); return i }(n, o, r), s = [t - a, t + a], l = bF(t, r, o, !0), u = [bF(s[0], r, o, !0), bF(s[1], r, o, !0)]; s[0] < r[0] && (u[0] = -1 / 0), s[1] > r[1] && (u[1] = 1 / 0), e && (u[0] === -1 / 0 ? this._showIndicator(l, u[1], \"< \", a) : u[1] === 1 / 0 ? this._showIndicator(l, u[0], \"> \", a) : this._showIndicator(l, l, \"≈ \", a)); var h = this._hoverLinkDataIndices, c = []; (e || CF(n)) && (c = this._hoverLinkDataIndices = n.findTargetDataIndices(u)); var p = function (t, e) { var n = {}, i = {}; return r(t || [], n), r(e || [], i, n), [o(n), o(i)]; function r(t, e, n) { for (var i = 0, r = t.length; i < r; i++) { var o = Mo(t[i].seriesId, null); if (null == o) return; for (var a = yo(t[i].dataIndex), s = n && n[o], l = 0, u = a.length; l < u; l++) { var h = a[l]; s && s[h] ? s[h] = null : (e[o] || (e[o] = {}))[h] = 1 } } } function o(t, e) { var n = []; for (var i in t) if (t.hasOwnProperty(i) && null != t[i]) if (e) n.push(+i); else { var r = o(t[i], !0); r.length && n.push({ seriesId: i, dataIndex: r }) } return n } }(h, c); this._dispatchHighDown(\"downplay\", _F(p[0], n)), this._dispatchHighDown(\"highlight\", _F(p[1], n)) } }, e.prototype._hoverLinkFromSeriesMouseOver = function (t) { var e; if (wy(t.target, (function (t) { var n = js(t); if (null != n.dataIndex) return e = n, !0 }), !0), e) { var n = this.ecModel.getSeriesByIndex(e.seriesIndex), i = this.visualMapModel; if (i.isTargetSeries(n)) { var r = n.getData(e.dataType), o = r.getStore().get(i.getDataDimensionIndex(r), e.dataIndex); isNaN(o) || this._showIndicator(o, o) } } }, e.prototype._hideIndicator = function () { var t = this._shapes; t.indicator && t.indicator.attr(\"invisible\", !0), t.indicatorLabel && t.indicatorLabel.attr(\"invisible\", !0); var e = this._shapes.handleLabels; if (e) for (var n = 0; n < e.length; n++)this._api.leaveBlur(e[n]) }, e.prototype._clearHoverLinkToSeries = function () { this._hideIndicator(); var t = this._hoverLinkDataIndices; this._dispatchHighDown(\"downplay\", _F(t, this.visualMapModel)), t.length = 0 }, e.prototype._clearHoverLinkFromSeries = function () { this._hideIndicator(); var t = this.api.getZr(); t.off(\"mouseover\", this._hoverLinkFromSeriesMouseOver), t.off(\"mouseout\", this._hideIndicator) }, e.prototype._applyTransform = function (t, e, n, i) { var r = Lh(e, i ? null : this.group); return Y(t) ? Ph(t, r, n) : Oh(t, r, n) }, e.prototype._dispatchHighDown = function (t, e) { e && e.length && this.api.dispatchAction({ type: t, batch: e }) }, e.prototype.dispose = function () { this._clearHoverLinkFromSeries(), this._clearHoverLinkToSeries() }, e.prototype.remove = function () { this._clearHoverLinkFromSeries(), this._clearHoverLinkToSeries() }, e.type = \"visualMap.continuous\", e }(vF); function TF(t, e, n, i) { return new zu({ shape: { points: t }, draggable: !!n, cursor: e, drift: n, onmousemove: function (t) { he(t.event) }, ondragend: i }) } function CF(t) { var e = t.get(\"hoverLinkOnHandle\"); return !!(null == e ? t.get(\"realtime\") : e) } function DF(t) { return \"vertical\" === t ? \"ns-resize\" : \"ew-resize\" } var AF = { type: \"selectDataRange\", event: \"dataRangeSelected\", update: \"update\" }, kF = function (t, e) { e.eachComponent({ mainType: \"visualMap\", query: t }, (function (e) { e.setSelected(t.selected) })) }, LF = [{ createOnAllSeries: !0, reset: function (t, e) { var n = []; return e.eachComponent(\"visualMap\", (function (e) { var i, r, o, a, s, l = t.pipelineContext; !e.isTargetSeries(t) || l && l.large || n.push((i = e.stateList, r = e.targetVisuals, o = W(e.getValueState, e), a = e.getDataDimensionIndex(t.getData()), s = {}, E(i, (function (t) { var e = sD.prepareVisualTypes(r[t]); s[t] = e })), { progress: function (t, e) { var n, i; function l(t) { return vy(e, i, t) } function u(t, n) { xy(e, i, t, n) } null != a && (n = e.getDimensionIndex(a)); for (var h = e.getStore(); null != (i = t.next());) { var c = e.getRawDataItem(i); if (!c || !1 !== c.visualMap) for (var p = null != a ? h.get(n, i) : i, d = o(p), f = r[d], g = s[d], y = 0, v = g.length; y < v; y++) { var m = g[y]; f[m] && f[m].applyVisual(p, l, u) } } } })) })), n } }, { createOnAllSeries: !0, reset: function (t, e) { var n = t.getData(), i = []; e.eachComponent(\"visualMap\", (function (e) { if (e.isTargetSeries(t)) { var r = e.getVisualMeta(W(PF, null, t, e)) || { stops: [], outerColors: [] }, o = e.getDataDimensionIndex(n); o >= 0 && (r.dimension = o, i.push(r)) } })), t.getData().setVisual(\"visualMeta\", i) } }]; function PF(t, e, n, i) { for (var r = e.targetVisuals[i], o = sD.prepareVisualTypes(r), a = { color: my(t.getData(), \"color\") }, s = 0, l = o.length; s < l; s++) { var u = o[s], h = r[\"opacity\" === u ? \"__alphaForOpacity\" : u]; h && h.applyVisual(n, c, p) } return a.color; function c(t) { return a[t] } function p(t, e) { a[t] = e } } var OF = E; function RF(t) { var e = t && t.visualMap; Y(e) || (e = e ? [e] : []), OF(e, (function (t) { if (t) { NF(t, \"splitList\") && !NF(t, \"pieces\") && (t.pieces = t.splitList, delete t.splitList); var e = t.pieces; e && Y(e) && OF(e, (function (t) { q(t) && (NF(t, \"start\") && !NF(t, \"min\") && (t.min = t.start), NF(t, \"end\") && !NF(t, \"max\") && (t.max = t.end)) })) } })) } function NF(t, e) { return t && t.hasOwnProperty && t.hasOwnProperty(e) } var EF = !1; function zF(t) { EF || (EF = !0, t.registerSubTypeDefaulter(\"visualMap\", (function (t) { return t.categories || (t.pieces ? t.pieces.length > 0 : t.splitNumber > 0) && !t.calculable ? \"piecewise\" : \"continuous\" })), t.registerAction(AF, kF), E(LF, (function (e) { t.registerVisual(t.PRIORITY.VISUAL.COMPONENT, e) })), t.registerPreprocessor(RF)) } function VF(t) { t.registerComponentModel(gF), t.registerComponentView(IF), zF(t) } var BF = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n._pieceList = [], n } return n(e, t), e.prototype.optionUpdated = function (e, n) { t.prototype.optionUpdated.apply(this, arguments), this.resetExtent(); var i = this._mode = this._determineMode(); this._pieceList = [], FF[this._mode].call(this, this._pieceList), this._resetSelected(e, n); var r = this.option.categories; this.resetVisual((function (t, e) { \"categories\" === i ? (t.mappingMethod = \"category\", t.categories = T(r)) : (t.dataExtent = this.getExtent(), t.mappingMethod = \"piecewise\", t.pieceList = z(this._pieceList, (function (t) { return t = T(t), \"inRange\" !== e && (t.visual = null), t }))) })) }, e.prototype.completeVisualOption = function () { var e = this.option, n = {}, i = sD.listVisualTypes(), r = this.isCategory(); function o(t, e, n) { return t && t[e] && t[e].hasOwnProperty(n) } E(e.pieces, (function (t) { E(i, (function (e) { t.hasOwnProperty(e) && (n[e] = 1) })) })), E(n, (function (t, n) { var i = !1; E(this.stateList, (function (t) { i = i || o(e, t, n) || o(e.target, t, n) }), this), !i && E(this.stateList, (function (t) { (e[t] || (e[t] = {}))[n] = oF(n, \"inRange\" === t ? \"active\" : \"inactive\", r) })) }), this), t.prototype.completeVisualOption.apply(this, arguments) }, e.prototype._resetSelected = function (t, e) { var n = this.option, i = this._pieceList, r = (e ? n : t).selected || {}; if (n.selected = r, E(i, (function (t, e) { var n = this.getSelectedMapKey(t); r.hasOwnProperty(n) || (r[n] = !0) }), this), \"single\" === n.selectedMode) { var o = !1; E(i, (function (t, e) { var n = this.getSelectedMapKey(t); r[n] && (o ? r[n] = !1 : o = !0) }), this) } }, e.prototype.getItemSymbol = function () { return this.get(\"itemSymbol\") }, e.prototype.getSelectedMapKey = function (t) { return \"categories\" === this._mode ? t.value + \"\" : t.index + \"\" }, e.prototype.getPieceList = function () { return this._pieceList }, e.prototype._determineMode = function () { var t = this.option; return t.pieces && t.pieces.length > 0 ? \"pieces\" : this.option.categories ? \"categories\" : \"splitNumber\" }, e.prototype.setSelected = function (t) { this.option.selected = T(t) }, e.prototype.getValueState = function (t) { var e = sD.findPieceIndex(t, this._pieceList); return null != e && this.option.selected[this.getSelectedMapKey(this._pieceList[e])] ? \"inRange\" : \"outOfRange\" }, e.prototype.findTargetDataIndices = function (t) { var e = [], n = this._pieceList; return this.eachTargetSeries((function (i) { var r = [], o = i.getData(); o.each(this.getDataDimensionIndex(o), (function (e, i) { sD.findPieceIndex(e, n) === t && r.push(i) }), this), e.push({ seriesId: i.id, dataIndex: r }) }), this), e }, e.prototype.getRepresentValue = function (t) { var e; if (this.isCategory()) e = t.value; else if (null != t.value) e = t.value; else { var n = t.interval || []; e = n[0] === -1 / 0 && n[1] === 1 / 0 ? 0 : (n[0] + n[1]) / 2 } return e }, e.prototype.getVisualMeta = function (t) { if (!this.isCategory()) { var e = [], n = [\"\", \"\"], i = this, r = this._pieceList.slice(); if (r.length) { var o = r[0].interval[0]; o !== -1 / 0 && r.unshift({ interval: [-1 / 0, o] }), (o = r[r.length - 1].interval[1]) !== 1 / 0 && r.push({ interval: [o, 1 / 0] }) } else r.push({ interval: [-1 / 0, 1 / 0] }); var a = -1 / 0; return E(r, (function (t) { var e = t.interval; e && (e[0] > a && s([a, e[0]], \"outOfRange\"), s(e.slice()), a = e[1]) }), this), { stops: e, outerColors: n } } function s(r, o) { var a = i.getRepresentValue({ interval: r }); o || (o = i.getValueState(a)); var s = t(a, o); r[0] === -1 / 0 ? n[0] = s : r[1] === 1 / 0 ? n[1] = s : e.push({ value: r[0], color: s }, { value: r[1], color: s }) } }, e.type = \"visualMap.piecewise\", e.defaultOption = wc(dF.defaultOption, { selected: null, minOpen: !1, maxOpen: !1, align: \"auto\", itemWidth: 20, itemHeight: 14, itemSymbol: \"roundRect\", pieces: null, categories: null, splitNumber: 5, selectedMode: \"multiple\", itemGap: 10, hoverLink: !0 }), e }(dF), FF = { splitNumber: function (t) { var e = this.option, n = Math.min(e.precision, 20), i = this.getExtent(), r = e.splitNumber; r = Math.max(parseInt(r, 10), 1), e.splitNumber = r; for (var o = (i[1] - i[0]) / r; +o.toFixed(n) !== o && n < 5;)n++; e.precision = n, o = +o.toFixed(n), e.minOpen && t.push({ interval: [-1 / 0, i[0]], close: [0, 0] }); for (var a = 0, s = i[0]; a < r; s += o, a++) { var l = a === r - 1 ? i[1] : s + o; t.push({ interval: [s, l], close: [1, 1] }) } e.maxOpen && t.push({ interval: [i[1], 1 / 0], close: [0, 0] }), ro(t), E(t, (function (t, e) { t.index = e, t.text = this.formatValueText(t.interval) }), this) }, categories: function (t) { var e = this.option; E(e.categories, (function (e) { t.push({ text: this.formatValueText(e, !0), value: e }) }), this), GF(e, t) }, pieces: function (t) { var e = this.option; E(e.pieces, (function (e, n) { q(e) || (e = { value: e }); var i = { text: \"\", index: n }; if (null != e.label && (i.text = e.label), e.hasOwnProperty(\"value\")) { var r = i.value = e.value; i.interval = [r, r], i.close = [1, 1] } else { for (var o = i.interval = [], a = i.close = [0, 0], s = [1, 0, 1], l = [-1 / 0, 1 / 0], u = [], h = 0; h < 2; h++) { for (var c = [[\"gte\", \"gt\", \"min\"], [\"lte\", \"lt\", \"max\"]][h], p = 0; p < 3 && null == o[h]; p++)o[h] = e[c[p]], a[h] = s[p], u[h] = 2 === p; null == o[h] && (o[h] = l[h]) } u[0] && o[1] === 1 / 0 && (a[0] = 0), u[1] && o[0] === -1 / 0 && (a[1] = 0), o[0] === o[1] && a[0] && a[1] && (i.value = o[0]) } i.visual = sD.retrieveVisuals(e), t.push(i) }), this), GF(e, t), ro(t), E(t, (function (t) { var e = t.close, n = [[\"<\", \"≤\"][e[1]], [\">\", \"≥\"][e[0]]]; t.text = t.text || this.formatValueText(null != t.value ? t.value : t.interval, !1, n) }), this) } }; function GF(t, e) { var n = t.inverse; (\"vertical\" === t.orient ? !n : n) && e.reverse() } var WF = function (t) { function e() { var n = null !== t && t.apply(this, arguments) || this; return n.type = e.type, n } return n(e, t), e.prototype.doRender = function () { var t = this.group; t.removeAll(); var e = this.visualMapModel, n = e.get(\"textGap\"), i = e.textStyleModel, r = i.getFont(), o = i.getTextColor(), a = this._getItemAlign(), s = e.itemSize, l = this._getViewData(), u = l.endsText, h = it(e.get(\"showLabel\", !0), !u); u && this._renderEndsText(t, u[0], s, h, a), E(l.viewPieceList, (function (i) { var l = i.piece, u = new Pr; u.onclick = W(this._onItemClick, this, l), this._enableHoverLink(u, i.indexInModelPieceList); var c = e.getRepresentValue(l); if (this._createItemSymbol(u, c, [0, 0, s[0], s[1]]), h) { var p = this.visualMapModel.getValueState(c); u.add(new Ns({ style: { x: \"right\" === a ? -n : s[0] + n, y: s[1] / 2, text: l.text, verticalAlign: \"middle\", align: a, font: r, fill: o, opacity: \"outOfRange\" === p ? .5 : 1 } })) } t.add(u) }), this), u && this._renderEndsText(t, u[1], s, h, a), bp(e.get(\"orient\"), t, e.get(\"itemGap\")), this.renderBackground(t), this.positionGroup(t) }, e.prototype._enableHoverLink = function (t, e) { var n = this; t.on(\"mouseover\", (function () { return i(\"highlight\") })).on(\"mouseout\", (function () { return i(\"downplay\") })); var i = function (t) { var i = n.visualMapModel; i.option.hoverLink && n.api.dispatchAction({ type: t, batch: _F(i.findTargetDataIndices(e), i) }) } }, e.prototype._getItemAlign = function () { var t = this.visualMapModel, e = t.option; if (\"vertical\" === e.orient) return xF(t, this.api, t.itemSize); var n = e.align; return n && \"auto\" !== n || (n = \"left\"), n }, e.prototype._renderEndsText = function (t, e, n, i, r) { if (e) { var o = new Pr, a = this.visualMapModel.textStyleModel; o.add(new Ns({ style: $h(a, { x: i ? \"right\" === r ? n[0] : 0 : n[0] / 2, y: n[1] / 2, verticalAlign: \"middle\", align: i ? r : \"center\", text: e }) })), t.add(o) } }, e.prototype._getViewData = function () { var t = this.visualMapModel, e = z(t.getPieceList(), (function (t, e) { return { piece: t, indexInModelPieceList: e } })), n = t.get(\"text\"), i = t.get(\"orient\"), r = t.get(\"inverse\"); return (\"horizontal\" === i ? r : !r) ? e.reverse() : n && (n = n.slice().reverse()), { viewPieceList: e, endsText: n } }, e.prototype._createItemSymbol = function (t, e, n) { t.add(Ry(this.getControllerVisual(e, \"symbol\"), n[0], n[1], n[2], n[3], this.getControllerVisual(e, \"color\"))) }, e.prototype._onItemClick = function (t) { var e = this.visualMapModel, n = e.option, i = n.selectedMode; if (i) { var r = T(n.selected), o = e.getSelectedMapKey(t); \"single\" === i || !0 === i ? (r[o] = !0, E(r, (function (t, e) { r[e] = e === o }))) : r[o] = !r[o], this.api.dispatchAction({ type: \"selectDataRange\", from: this.uid, visualMapId: this.visualMapModel.id, selected: r }) } }, e.type = \"visualMap.piecewise\", e }(vF); function HF(t) { t.registerComponentModel(BF), t.registerComponentView(WF), zF(t) } var YF = { label: { enabled: !0 }, decal: { show: !1 } }, UF = Do(), XF = {}; function ZF(t, e) { var n = t.getModel(\"aria\"); if (n.get(\"enabled\")) { var i = T(YF); C(i.label, t.getLocaleModel().get(\"aria\"), !1), C(n.option, i, !1), function () { if (n.getModel(\"decal\").get(\"show\")) { var e = ft(); t.eachSeries((function (t) { if (!t.isColorBySeries()) { var n = e.get(t.type); n || (n = {}, e.set(t.type, n)), UF(t).scope = n } })), t.eachRawSeries((function (e) { if (!t.isSeriesFiltered(e)) if (U(e.enableAriaDecal)) e.enableAriaDecal(); else { var n = e.getData(); if (e.isColorBySeries()) { var i = rd(e.ecModel, e.name, XF, t.getSeriesCount()), r = n.getVisual(\"decal\"); n.setVisual(\"decal\", u(r, i)) } else { var o = e.getRawData(), a = {}, s = UF(e).scope; n.each((function (t) { var e = n.getRawIndex(t); a[e] = t })); var l = o.count(); o.each((function (t) { var i = a[t], r = o.getName(t) || t + \"\", h = rd(e.ecModel, r, s, l), c = n.getItemVisual(i, \"decal\"); n.setItemVisual(i, \"decal\", u(c, h)) })) } } function u(t, e) { var n = t ? A(A({}, e), t) : e; return n.dirty = !0, n } })) } }(), function () { var i = t.getLocaleModel().get(\"aria\"), o = n.getModel(\"label\"); if (o.option = k(o.option, i), !o.get(\"enabled\")) return; var a = e.getZr().dom; if (o.get(\"description\")) return void a.setAttribute(\"aria-label\", o.get(\"description\")); var s, l = t.getSeriesCount(), u = o.get([\"data\", \"maxCount\"]) || 10, h = o.get([\"series\", \"maxCount\"]) || 10, c = Math.min(l, h); if (l < 1) return; var p = function () { var e = t.get(\"title\"); e && e.length && (e = e[0]); return e && e.text }(); if (p) { var d = o.get([\"general\", \"withTitle\"]); s = r(d, { title: p }) } else s = o.get([\"general\", \"withoutTitle\"]); var f = [], g = l > 1 ? o.get([\"series\", \"multiple\", \"prefix\"]) : o.get([\"series\", \"single\", \"prefix\"]); s += r(g, { seriesCount: l }), t.eachSeries((function (e, n) { if (n < c) { var i = void 0, a = e.get(\"name\") ? \"withName\" : \"withoutName\"; i = r(i = l > 1 ? o.get([\"series\", \"multiple\", a]) : o.get([\"series\", \"single\", a]), { seriesId: e.seriesIndex, seriesName: e.get(\"name\"), seriesType: (x = e.subType, t.getLocaleModel().get([\"series\", \"typeNames\"])[x] || \"自定义图\") }); var s = e.getData(); if (s.count() > u) i += r(o.get([\"data\", \"partialData\"]), { displayCnt: u }); else i += o.get([\"data\", \"allData\"]); for (var h = o.get([\"data\", \"separator\", \"middle\"]), p = o.get([\"data\", \"separator\", \"end\"]), d = [], g = 0; g < s.count(); g++)if (g < u) { var y = s.getName(g), v = s.getValues(g), m = o.get([\"data\", y ? \"withName\" : \"withoutName\"]); d.push(r(m, { name: y, value: v.join(h) })) } i += d.join(h) + p, f.push(i) } var x })); var y = o.getModel([\"series\", \"multiple\", \"separator\"]), v = y.get(\"middle\"), m = y.get(\"end\"); s += f.join(v) + m, a.setAttribute(\"aria-label\", s) }() } function r(t, e) { if (!X(t)) return t; var n = t; return E(e, (function (t, e) { n = n.replace(new RegExp(\"\\\\{\\\\s*\" + e + \"\\\\s*\\\\}\", \"g\"), t) })), n } } function jF(t) { if (t && t.aria) { var e = t.aria; null != e.show && (e.enabled = e.show), e.label = e.label || {}, E([\"description\", \"general\", \"series\", \"data\"], (function (t) { null != e[t] && (e.label[t] = e[t]) })) } } var qF = { value: \"eq\", \"<\": \"lt\", \"<=\": \"lte\", \">\": \"gt\", \">=\": \"gte\", \"=\": \"eq\", \"!=\": \"ne\", \"<>\": \"ne\" }, KF = function () { function t(t) { if (null == (this._condVal = X(t) ? new RegExp(t) : et(t) ? t : null)) { var e = \"\"; 0, co(e) } } return t.prototype.evaluate = function (t) { var e = typeof t; return X(e) ? this._condVal.test(t) : !!j(e) && this._condVal.test(t + \"\") }, t }(), $F = function () { function t() { } return t.prototype.evaluate = function () { return this.value }, t }(), JF = function () { function t() { } return t.prototype.evaluate = function () { for (var t = this.children, e = 0; e < t.length; e++)if (!t[e].evaluate()) return !1; return !0 }, t }(), QF = function () { function t() { } return t.prototype.evaluate = function () { for (var t = this.children, e = 0; e < t.length; e++)if (t[e].evaluate()) return !0; return !1 }, t }(), tG = function () { function t() { } return t.prototype.evaluate = function () { return !this.child.evaluate() }, t }(), eG = function () { function t() { } return t.prototype.evaluate = function () { for (var t = !!this.valueParser, e = (0, this.getValue)(this.valueGetterParam), n = t ? this.valueParser(e) : null, i = 0; i < this.subCondList.length; i++)if (!this.subCondList[i].evaluate(t ? n : e)) return !1; return !0 }, t }(); function nG(t, e) { if (!0 === t || !1 === t) { var n = new $F; return n.value = t, n } var i = \"\"; return rG(t) || co(i), t.and ? iG(\"and\", t, e) : t.or ? iG(\"or\", t, e) : t.not ? function (t, e) { var n = t.not, i = \"\"; 0; rG(n) || co(i); var r = new tG; r.child = nG(n, e), r.child || co(i); return r }(t, e) : function (t, e) { for (var n = \"\", i = e.prepareGetValue(t), r = [], o = G(t), a = t.parser, s = a ? mf(a) : null, l = 0; l < o.length; l++) { var u = o[l]; if (\"parser\" !== u && !e.valueGetterAttrMap.get(u)) { var h = mt(qF, u) ? qF[u] : u, c = t[u], p = s ? s(c) : c, d = Sf(h, p) || \"reg\" === h && new KF(p); d || co(n), r.push(d) } } r.length || co(n); var f = new eG; return f.valueGetterParam = i, f.valueParser = s, f.getValue = e.getValue, f.subCondList = r, f }(t, e) } function iG(t, e, n) { var i = e[t], r = \"\"; Y(i) || co(r), i.length || co(r); var o = \"and\" === t ? new JF : new QF; return o.children = z(i, (function (t) { return nG(t, n) })), o.children.length || co(r), o } function rG(t) { return q(t) && !N(t) } var oG = function () { function t(t, e) { this._cond = nG(t, e) } return t.prototype.evaluate = function () { return this._cond.evaluate() }, t }(); var aG = { type: \"echarts:filter\", transform: function (t) { for (var e, n, i, r = t.upstream, o = (n = t.config, i = { valueGetterAttrMap: ft({ dimension: !0 }), prepareGetValue: function (t) { var e = \"\", n = t.dimension; mt(t, \"dimension\") || co(e); var i = r.getDimensionInfo(n); return i || co(e), { dimIdx: i.index } }, getValue: function (t) { return r.retrieveValueFromItem(e, t.dimIdx) } }, new oG(n, i)), a = [], s = 0, l = r.count(); s < l; s++)e = r.getRawDataItem(s), o.evaluate() && a.push(e); return { data: a } } }; var sG = { type: \"echarts:sort\", transform: function (t) { var e = t.upstream, n = t.config, i = \"\", r = yo(n); r.length || co(i); var o = []; E(r, (function (t) { var n = t.dimension, r = t.order, a = t.parser, s = t.incomparable; if (null == n && co(i), \"asc\" !== r && \"desc\" !== r && co(i), s && \"min\" !== s && \"max\" !== s) { var l = \"\"; 0, co(l) } if (\"asc\" !== r && \"desc\" !== r) { var u = \"\"; 0, co(u) } var h = e.getDimensionInfo(n); h || co(i); var c = a ? mf(a) : null; a && !c && co(i), o.push({ dimIdx: h.index, parser: c, comparator: new bf(r, s) }) })); var a = e.sourceFormat; a !== Np && a !== Ep && co(i); for (var s = [], l = 0, u = e.count(); l < u; l++)s.push(e.getRawDataItem(l)); return s.sort((function (t, n) { for (var i = 0; i < o.length; i++) { var r = o[i], a = e.retrieveValueFromItem(t, r.dimIdx), s = e.retrieveValueFromItem(n, r.dimIdx); r.parser && (a = r.parser(a), s = r.parser(s)); var l = r.comparator.evaluate(a, s); if (0 !== l) return l } return 0 })), { data: s } } }; var lG = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"dataset\", e } return n(e, t), e.prototype.init = function (e, n, i) { t.prototype.init.call(this, e, n, i), this._sourceManager = new Wf(this), Hf(this) }, e.prototype.mergeOption = function (e, n) { t.prototype.mergeOption.call(this, e, n), Hf(this) }, e.prototype.optionUpdated = function () { this._sourceManager.dirty() }, e.prototype.getSourceManager = function () { return this._sourceManager }, e.type = \"dataset\", e.defaultOption = { seriesLayoutBy: Fp }, e }(Ap), uG = function (t) { function e() { var e = null !== t && t.apply(this, arguments) || this; return e.type = \"dataset\", e } return n(e, t), e.type = \"dataset\", e }(mg); var hG = ts.CMD; function cG(t, e) { return Math.abs(t - e) < 1e-5 } function pG(t) { var e, n, i, r, o, a = t.data, s = t.len(), l = [], u = 0, h = 0, c = 0, p = 0; function d(t, n) { e && e.length > 2 && l.push(e), e = [t, n] } function f(t, n, i, r) { cG(t, i) && cG(n, r) || e.push(t, n, i, r, i, r) } function g(t, n, i, r, o, a) { var s = Math.abs(n - t), l = 4 * Math.tan(s / 4) / 3, u = n < t ? -1 : 1, h = Math.cos(t), c = Math.sin(t), p = Math.cos(n), d = Math.sin(n), f = h * o + i, g = c * a + r, y = p * o + i, v = d * a + r, m = o * l * u, x = a * l * u; e.push(f - m * c, g + x * h, y + m * d, v - x * p, y, v) } for (var y = 0; y < s;) { var v = a[y++], m = 1 === y; switch (m && (c = u = a[y], p = h = a[y + 1], v !== hG.L && v !== hG.C && v !== hG.Q || (e = [c, p])), v) { case hG.M: u = c = a[y++], h = p = a[y++], d(c, p); break; case hG.L: f(u, h, n = a[y++], i = a[y++]), u = n, h = i; break; case hG.C: e.push(a[y++], a[y++], a[y++], a[y++], u = a[y++], h = a[y++]); break; case hG.Q: n = a[y++], i = a[y++], r = a[y++], o = a[y++], e.push(u + 2 / 3 * (n - u), h + 2 / 3 * (i - h), r + 2 / 3 * (n - r), o + 2 / 3 * (i - o), r, o), u = r, h = o; break; case hG.A: var x = a[y++], _ = a[y++], b = a[y++], w = a[y++], S = a[y++], M = a[y++] + S; y += 1; var I = !a[y++]; n = Math.cos(S) * b + x, i = Math.sin(S) * w + _, m ? d(c = n, p = i) : f(u, h, n, i), u = Math.cos(M) * b + x, h = Math.sin(M) * w + _; for (var T = (I ? -1 : 1) * Math.PI / 2, C = S; I ? C > M : C < M; C += T) { g(C, I ? Math.max(C + T, M) : Math.min(C + T, M), x, _, b, w) } break; case hG.R: c = u = a[y++], p = h = a[y++], n = c + a[y++], i = p + a[y++], d(n, p), f(n, p, n, i), f(n, i, c, i), f(c, i, c, p), f(c, p, n, p); break; case hG.Z: e && f(u, h, c, p), u = c, h = p } } return e && e.length > 2 && l.push(e), l } function dG(t, e, n, i, r, o, a, s, l, u) { if (cG(t, n) && cG(e, i) && cG(r, a) && cG(o, s)) l.push(a, s); else { var h = 2 / u, c = h * h, p = a - t, d = s - e, f = Math.sqrt(p * p + d * d); p /= f, d /= f; var g = n - t, y = i - e, v = r - a, m = o - s, x = g * g + y * y, _ = v * v + m * m; if (x < c && _ < c) l.push(a, s); else { var b = p * g + d * y, w = -p * v - d * m; if (x - b * b < c && b >= 0 && _ - w * w < c && w >= 0) l.push(a, s); else { var S = [], M = []; xn(t, n, r, a, .5, S), xn(e, i, o, s, .5, M), dG(S[0], M[0], S[1], M[1], S[2], M[2], S[3], M[3], l, u), dG(S[4], M[4], S[5], M[5], S[6], M[6], S[7], M[7], l, u) } } } } function fG(t, e, n) { var i = t[e], r = t[1 - e], o = Math.abs(i / r), a = Math.ceil(Math.sqrt(o * n)), s = Math.floor(n / a); 0 === s && (s = 1, a = n); for (var l = [], u = 0; u < a; u++)l.push(s); var h = n - a * s; if (h > 0) for (u = 0; u < h; u++)l[u % a] += 1; return l } function gG(t, e, n) { for (var i = t.r0, r = t.r, o = t.startAngle, a = t.endAngle, s = Math.abs(a - o), l = s * r, u = r - i, h = l > Math.abs(u), c = fG([l, u], h ? 0 : 1, e), p = (h ? s : u) / c.length, d = 0; d < c.length; d++)for (var f = (h ? u : s) / c[d], g = 0; g < c[d]; g++) { var y = {}; h ? (y.startAngle = o + p * d, y.endAngle = o + p * (d + 1), y.r0 = i + f * g, y.r = i + f * (g + 1)) : (y.startAngle = o + f * g, y.endAngle = o + f * (g + 1), y.r0 = i + p * d, y.r = i + p * (d + 1)), y.clockwise = t.clockwise, y.cx = t.cx, y.cy = t.cy, n.push(y) } } function yG(t, e, n, i) { return t * i - n * e } function vG(t, e, n, i, r, o, a, s) { var l = n - t, u = i - e, h = a - r, c = s - o, p = yG(h, c, l, u); if (Math.abs(p) < 1e-6) return null; var d = yG(t - r, e - o, h, c) / p; return d < 0 || d > 1 ? null : new Ie(d * l + t, d * u + e) } function mG(t, e, n) { var i = new Ie; Ie.sub(i, n, e), i.normalize(); var r = new Ie; return Ie.sub(r, t, e), r.dot(i) } function xG(t, e) { var n = t[t.length - 1]; n && n[0] === e[0] && n[1] === e[1] || t.push(e) } function _G(t) { var e = t.points, n = [], i = []; Aa(e, n, i); var r = new Re(n[0], n[1], i[0] - n[0], i[1] - n[1]), o = r.width, a = r.height, s = r.x, l = r.y, u = new Ie, h = new Ie; return o > a ? (u.x = h.x = s + o / 2, u.y = l, h.y = l + a) : (u.y = h.y = l + a / 2, u.x = s, h.x = s + o), function (t, e, n) { for (var i = t.length, r = [], o = 0; o < i; o++) { var a = t[o], s = t[(o + 1) % i], l = vG(a[0], a[1], s[0], s[1], e.x, e.y, n.x, n.y); l && r.push({ projPt: mG(l, e, n), pt: l, idx: o }) } if (r.length < 2) return [{ points: t }, { points: t }]; r.sort((function (t, e) { return t.projPt - e.projPt })); var u = r[0], h = r[r.length - 1]; if (h.idx < u.idx) { var c = u; u = h, h = c } var p = [u.pt.x, u.pt.y], d = [h.pt.x, h.pt.y], f = [p], g = [d]; for (o = u.idx + 1; o <= h.idx; o++)xG(f, t[o].slice()); for (xG(f, d), xG(f, p), o = h.idx + 1; o <= u.idx + i; o++)xG(g, t[o % i].slice()); return xG(g, p), xG(g, d), [{ points: f }, { points: g }] }(e, u, h) } function bG(t, e, n, i) { if (1 === n) i.push(e); else { var r = Math.floor(n / 2), o = t(e); bG(t, o[0], r, i), bG(t, o[1], n - r, i) } return i } function wG(t, e) { e.setStyle(t.style), e.z = t.z, e.z2 = t.z2, e.zlevel = t.zlevel } function SG(t, e) { var n, i = [], r = t.shape; switch (t.type) { case \"rect\": !function (t, e, n) { for (var i = t.width, r = t.height, o = i > r, a = fG([i, r], o ? 0 : 1, e), s = o ? \"width\" : \"height\", l = o ? \"height\" : \"width\", u = o ? \"x\" : \"y\", h = o ? \"y\" : \"x\", c = t[s] / a.length, p = 0; p < a.length; p++)for (var d = t[l] / a[p], f = 0; f < a[p]; f++) { var g = {}; g[u] = p * c, g[h] = f * d, g[s] = c, g[l] = d, g.x += t.x, g.y += t.y, n.push(g) } }(r, e, i), n = Ps; break; case \"sector\": gG(r, e, i), n = Pu; break; case \"circle\": gG({ r0: 0, r: r.r, startAngle: 0, endAngle: 2 * Math.PI, cx: r.cx, cy: r.cy }, e, i), n = Pu; break; default: var o = t.getComputedTransform(), a = o ? Math.sqrt(Math.max(o[0] * o[0] + o[1] * o[1], o[2] * o[2] + o[3] * o[3])) : 1, s = z(function (t, e) { var n = pG(t), i = []; e = e || 1; for (var r = 0; r < n.length; r++) { var o = n[r], a = [], s = o[0], l = o[1]; a.push(s, l); for (var u = 2; u < o.length;) { var h = o[u++], c = o[u++], p = o[u++], d = o[u++], f = o[u++], g = o[u++]; dG(s, l, h, c, p, d, f, g, a, e), s = f, l = g } i.push(a) } return i }(t.getUpdatedPathProxy(), a), (function (t) { return function (t) { for (var e = [], n = 0; n < t.length;)e.push([t[n++], t[n++]]); return e }(t) })), l = s.length; if (0 === l) bG(_G, { points: s[0] }, e, i); else if (l === e) for (var u = 0; u < l; u++)i.push({ points: s[u] }); else { var h = 0, c = z(s, (function (t) { var e = [], n = []; Aa(t, e, n); var i = (n[1] - e[1]) * (n[0] - e[0]); return h += i, { poly: t, area: i } })); c.sort((function (t, e) { return e.area - t.area })); var p = e; for (u = 0; u < l; u++) { var d = c[u]; if (p <= 0) break; var f = u === l - 1 ? p : Math.ceil(d.area / h * e); f < 0 || (bG(_G, { points: d.poly }, f, i), p -= f) } } n = zu }if (!n) return function (t, e) { for (var n = [], i = 0; i < e; i++)n.push(du(t)); return n }(t, e); var g = []; for (u = 0; u < i.length; u++) { var y = new n; y.setShape(i[u]), wG(t, y), g.push(y) } return g } function MG(t, e) { var n = t.length, i = e.length; if (n === i) return [t, e]; for (var r = [], o = [], a = n < i ? t : e, s = Math.min(n, i), l = Math.abs(i - n) / 6, u = (s - 2) / 6, h = Math.ceil(l / u) + 1, c = [a[0], a[1]], p = l, d = 2; d < s;) { var f = a[d - 2], g = a[d - 1], y = a[d++], v = a[d++], m = a[d++], x = a[d++], _ = a[d++], b = a[d++]; if (p <= 0) c.push(y, v, m, x, _, b); else { for (var w = Math.min(p, h - 1) + 1, S = 1; S <= w; S++) { var M = S / w; xn(f, y, m, _, M, r), xn(g, v, x, b, M, o), f = r[3], g = o[3], c.push(r[1], o[1], r[2], o[2], f, g), y = r[5], v = o[5], m = r[6], x = o[6] } p -= w - 1 } } return a === t ? [c, e] : [t, c] } function IG(t, e) { for (var n = t.length, i = t[n - 2], r = t[n - 1], o = [], a = 0; a < e.length;)o[a++] = i, o[a++] = r; return o } function TG(t) { for (var e = 0, n = 0, i = 0, r = t.length, o = 0, a = r - 2; o < r; a = o, o += 2) { var s = t[a], l = t[a + 1], u = t[o], h = t[o + 1], c = s * h - u * l; e += c, n += (s + u) * c, i += (l + h) * c } return 0 === e ? [t[0] || 0, t[1] || 0] : [n / e / 3, i / e / 3, e] } function CG(t, e, n, i) { for (var r = (t.length - 2) / 6, o = 1 / 0, a = 0, s = t.length, l = s - 2, u = 0; u < r; u++) { for (var h = 6 * u, c = 0, p = 0; p < s; p += 2) { var d = 0 === p ? h : (h + p - 2) % l + 2, f = t[d] - n[0], g = t[d + 1] - n[1], y = e[p] - i[0] - f, v = e[p + 1] - i[1] - g; c += y * y + v * v } c < o && (o = c, a = u) } return a } function DG(t) { for (var e = [], n = t.length, i = 0; i < n; i += 2)e[i] = t[n - i - 2], e[i + 1] = t[n - i - 1]; return e } function AG(t) { return t.__isCombineMorphing } var kG = \"__mOriginal_\"; function LG(t, e, n) { var i = kG + e, r = t[i] || t[e]; t[i] || (t[i] = t[e]); var o = n.replace, a = n.after, s = n.before; t[e] = function () { var t, e = arguments; return s && s.apply(this, e), t = o ? o.apply(this, e) : r.apply(this, e), a && a.apply(this, e), t } } function PG(t, e) { var n = kG + e; t[n] && (t[e] = t[n], t[n] = null) } function OG(t, e) { for (var n = 0; n < t.length; n++)for (var i = t[n], r = 0; r < i.length;) { var o = i[r], a = i[r + 1]; i[r++] = e[0] * o + e[2] * a + e[4], i[r++] = e[1] * o + e[3] * a + e[5] } } function RG(t, e) { var n = t.getUpdatedPathProxy(), i = e.getUpdatedPathProxy(), r = function (t, e) { for (var n, i, r, o = [], a = [], s = 0; s < Math.max(t.length, e.length); s++) { var l = t[s], u = e[s], h = void 0, c = void 0; l ? u ? (i = h = (n = MG(l, u))[0], r = c = n[1]) : (c = IG(r || l, l), h = l) : (h = IG(i || u, u), c = u), o.push(h), a.push(c) } return [o, a] }(pG(n), pG(i)), o = r[0], a = r[1], s = t.getComputedTransform(), l = e.getComputedTransform(); s && OG(o, s), l && OG(a, l), LG(e, \"updateTransform\", { replace: function () { this.transform = null } }), e.transform = null; var u = function (t, e, n, i) { for (var r, o = [], a = 0; a < t.length; a++) { var s = t[a], l = e[a], u = TG(s), h = TG(l); null == r && (r = u[2] < 0 != h[2] < 0); var c = [], p = [], d = 0, f = 1 / 0, g = [], y = s.length; r && (s = DG(s)); for (var v = 6 * CG(s, l, u, h), m = y - 2, x = 0; x < m; x += 2) { var _ = (v + x) % m + 2; c[x + 2] = s[_] - u[0], c[x + 3] = s[_ + 1] - u[1] } if (c[0] = s[v] - u[0], c[1] = s[v + 1] - u[1], n > 0) for (var b = i / n, w = -i / 2; w <= i / 2; w += b) { var S = Math.sin(w), M = Math.cos(w), I = 0; for (x = 0; x < s.length; x += 2) { var T = c[x], C = c[x + 1], D = l[x] - h[0], A = l[x + 1] - h[1], k = D * M - A * S, L = D * S + A * M; g[x] = k, g[x + 1] = L; var P = k - T, O = L - C; I += P * P + O * O } if (I < f) { f = I, d = w; for (var R = 0; R < g.length; R++)p[R] = g[R] } } else for (var N = 0; N < y; N += 2)p[N] = l[N] - h[0], p[N + 1] = l[N + 1] - h[1]; o.push({ from: c, to: p, fromCp: u, toCp: h, rotation: -d }) } return o }(o, a, 10, Math.PI), h = []; LG(e, \"buildPath\", { replace: function (t) { for (var n = e.__morphT, i = 1 - n, r = [], o = 0; o < u.length; o++) { var a = u[o], s = a.from, l = a.to, c = a.rotation * n, p = a.fromCp, d = a.toCp, f = Math.sin(c), g = Math.cos(c); Bt(r, p, d, n); for (var y = 0; y < s.length; y += 2) { var v = s[y], m = s[y + 1], x = v * i + (S = l[y]) * n, _ = m * i + (M = l[y + 1]) * n; h[y] = x * g - _ * f + r[0], h[y + 1] = x * f + _ * g + r[1] } var b = h[0], w = h[1]; t.moveTo(b, w); for (y = 2; y < s.length;) { var S = h[y++], M = h[y++], I = h[y++], T = h[y++], C = h[y++], D = h[y++]; b === S && w === M && I === C && T === D ? t.lineTo(C, D) : t.bezierCurveTo(S, M, I, T, C, D), b = C, w = D } } } }) } function NG(t, e, n) { if (!t || !e) return e; var i = n.done, r = n.during; return RG(t, e), e.__morphT = 0, e.animateTo({ __morphT: 1 }, k({ during: function (t) { e.dirtyShape(), r && r(t) }, done: function () { PG(e, \"buildPath\"), PG(e, \"updateTransform\"), e.__morphT = -1, e.createPathProxy(), e.dirtyShape(), i && i() } }, n)), e } function EG(t, e, n, i, r, o) { t = r === n ? 0 : Math.round(32767 * (t - n) / (r - n)), e = o === i ? 0 : Math.round(32767 * (e - i) / (o - i)); for (var a, s = 0, l = 32768; l > 0; l /= 2) { var u = 0, h = 0; (t & l) > 0 && (u = 1), (e & l) > 0 && (h = 1), s += l * l * (3 * u ^ h), 0 === h && (1 === u && (t = l - 1 - t, e = l - 1 - e), a = t, t = e, e = a) } return s } function zG(t) { var e = 1 / 0, n = 1 / 0, i = -1 / 0, r = -1 / 0, o = z(t, (function (t) { var o = t.getBoundingRect(), a = t.getComputedTransform(), s = o.x + o.width / 2 + (a ? a[4] : 0), l = o.y + o.height / 2 + (a ? a[5] : 0); return e = Math.min(s, e), n = Math.min(l, n), i = Math.max(s, i), r = Math.max(l, r), [s, l] })); return z(o, (function (o, a) { return { cp: o, z: EG(o[0], o[1], e, n, i, r), path: t[a] } })).sort((function (t, e) { return t.z - e.z })).map((function (t) { return t.path })) } function VG(t) { return SG(t.path, t.count) } function BG(t) { return Y(t[0]) } function FG(t, e) { for (var n = [], i = t.length, r = 0; r < i; r++)n.push({ one: t[r], many: [] }); for (r = 0; r < e.length; r++) { var o = e[r].length, a = void 0; for (a = 0; a < o; a++)n[a % i].many.push(e[r][a]) } var s = 0; for (r = i - 1; r >= 0; r--)if (!n[r].many.length) { var l = n[s].many; if (l.length <= 1) { if (!s) return n; s = 0 } o = l.length; var u = Math.ceil(o / 2); n[r].many = l.slice(u, o), n[s].many = l.slice(0, u), s++ } return n } var GG = { clone: function (t) { for (var e = [], n = 1 - Math.pow(1 - t.path.style.opacity, 1 / t.count), i = 0; i < t.count; i++) { var r = du(t.path); r.setStyle(\"opacity\", n), e.push(r) } return e }, split: null }; function WG(t, e, n, i, r, o) { if (t.length && e.length) { var a = sh(\"update\", i, r); if (a && a.duration > 0) { var s, l, u = i.getModel(\"universalTransition\").get(\"delay\"), h = Object.assign({ setToFinal: !0 }, a); BG(t) && (s = t, l = e), BG(e) && (s = e, l = t); for (var c = s ? s === t : t.length > e.length, p = s ? FG(l, s) : FG(c ? e : t, [c ? t : e]), d = 0, f = 0; f < p.length; f++)d += p[f].many.length; var g = 0; for (f = 0; f < p.length; f++)y(p[f], c, g, d), g += p[f].many.length } } function y(t, e, i, r, a) { var s = t.many, l = t.one; if (1 !== s.length || a) for (var c = k({ dividePath: GG[n], individualDelay: u && function (t, e, n, o) { return u(t + i, r) } }, h), p = e ? function (t, e, n) { var i = []; !function t(e) { for (var n = 0; n < e.length; n++) { var r = e[n]; AG(r) ? t(r.childrenRef()) : r instanceof _s && i.push(r) } }(t); var r = i.length; if (!r) return { fromIndividuals: [], toIndividuals: [], count: 0 }; var o = (n.dividePath || VG)({ path: e, count: r }); if (o.length !== r) return console.error(\"Invalid morphing: unmatched splitted path\"), { fromIndividuals: [], toIndividuals: [], count: 0 }; i = zG(i), o = zG(o); for (var a = n.done, s = n.during, l = n.individualDelay, u = new hr, h = 0; h < r; h++) { var c = i[h], p = o[h]; p.parent = e, p.copyTransform(u), l || RG(c, p) } function d(t) { for (var e = 0; e < o.length; e++)o[e].addSelfToZr(t) } function f() { e.__isCombineMorphing = !1, e.__morphT = -1, e.childrenRef = null, PG(e, \"addSelfToZr\"), PG(e, \"removeSelfFromZr\") } e.__isCombineMorphing = !0, e.childrenRef = function () { return o }, LG(e, \"addSelfToZr\", { after: function (t) { d(t) } }), LG(e, \"removeSelfFromZr\", { after: function (t) { for (var e = 0; e < o.length; e++)o[e].removeSelfFromZr(t) } }); var g = o.length; if (l) { var y = g, v = function () { 0 == --y && (f(), a && a()) }; for (h = 0; h < g; h++) { var m = l ? k({ delay: (n.delay || 0) + l(h, g, i[h], o[h]), done: v }, n) : n; NG(i[h], o[h], m) } } else e.__morphT = 0, e.animateTo({ __morphT: 1 }, k({ during: function (t) { for (var n = 0; n < g; n++) { var i = o[n]; i.__morphT = e.__morphT, i.dirtyShape() } s && s(t) }, done: function () { f(); for (var e = 0; e < t.length; e++)PG(t[e], \"updateTransform\"); a && a() } }, n)); return e.__zr && d(e.__zr), { fromIndividuals: i, toIndividuals: o, count: g } }(s, l, c) : function (t, e, n) { var i = e.length, r = [], o = n.dividePath || VG; if (AG(t)) { !function t(e) { for (var n = 0; n < e.length; n++) { var i = e[n]; AG(i) ? t(i.childrenRef()) : i instanceof _s && r.push(i) } }(t.childrenRef()); var a = r.length; if (a < i) for (var s = 0, l = a; l < i; l++)r.push(du(r[s++ % a])); r.length = i } else { r = o({ path: t, count: i }); var u = t.getComputedTransform(); for (l = 0; l < r.length; l++)r[l].setLocalTransform(u); if (r.length !== i) return console.error(\"Invalid morphing: unmatched splitted path\"), { fromIndividuals: [], toIndividuals: [], count: 0 } } r = zG(r), e = zG(e); var h = n.individualDelay; for (l = 0; l < i; l++) { var c = h ? k({ delay: (n.delay || 0) + h(l, i, r[l], e[l]) }, n) : n; NG(r[l], e[l], c) } return { fromIndividuals: r, toIndividuals: e, count: e.length } }(l, s, c), d = p.fromIndividuals, f = p.toIndividuals, g = d.length, v = 0; v < g; v++) { m = u ? k({ delay: u(v, g) }, h) : h; o(d[v], f[v], e ? s[v] : t.one, e ? t.one : s[v], m) } else { var m, x = e ? s[0] : l, _ = e ? l : s[0]; if (AG(x)) y({ many: [x], one: _ }, !0, i, r, !0); else NG(x, _, m = u ? k({ delay: u(i, r) }, h) : h), o(x, _, x, _, m) } } } function HG(t) { if (!t) return []; if (Y(t)) { for (var e = [], n = 0; n < t.length; n++)e.push(HG(t[n])); return e } var i = []; return t.traverse((function (t) { t instanceof _s && !t.disableMorphing && !t.invisible && !t.ignore && i.push(t) })), i } var YG = Do(); function UG(t) { var e = []; return E(t, (function (t) { var n = t.data; if (!(n.count() > 1e4)) for (var i = n.getIndices(), r = function (t) { for (var e = t.dimensions, n = 0; n < e.length; n++) { var i = t.getDimensionInfo(e[n]); if (i && 0 === i.otherDims.itemGroupId) return e[n] } }(n), o = 0; o < i.length; o++)e.push({ data: n, dim: t.dim || r, divide: t.divide, dataIndex: o }) })), e } function XG(t, e, n) { t.traverse((function (t) { t instanceof _s && hh(t, { style: { opacity: 0 } }, e, { dataIndex: n, isFrom: !0 }) })) } function ZG(t) { if (t.parent) { var e = t.getComputedTransform(); t.setLocalTransform(e), t.parent.remove(t) } } function jG(t) { t.stopAnimation(), t.isGroup && t.traverse((function (t) { t.stopAnimation() })) } function qG(t, e, n) { var i = sh(\"update\", n, e); i && t.traverse((function (t) { if (t instanceof ma) { var e = function (t) { return ah(t).oldStyle }(t); e && t.animateFrom({ style: e }, i) } })) } function KG(t, e, n) { var i = UG(t), r = UG(e); function o(t, e, n, i, r) { (n || t) && e.animateFrom({ style: n && n !== t ? A(A({}, n.style), t.style) : t.style }, r) } function a(t) { for (var e = 0; e < t.length; e++)if (t[e].dim) return t[e].dim } var s = a(i), l = a(r), u = !1; function h(t, e) { return function (n) { var i = n.data, r = n.dataIndex; if (e) return i.getId(r); var o = i.hostModel && i.hostModel.get(\"dataGroupId\"), a = t ? s || l : l || s, u = a && i.getDimensionInfo(a), h = u && u.ordinalMeta; if (u) { var c = i.get(u.name, r); return h && h.categories[c] || c + \"\" } var p = i.getRawDataItem(r); return p && p.groupId ? p.groupId + \"\" : o || i.getId(r) } } var c = function (t, e) { var n = t.length; if (n !== e.length) return !1; for (var i = 0; i < n; i++) { var r = t[i], o = e[i]; if (r.data.getId(r.dataIndex) !== o.data.getId(o.dataIndex)) return !1 } return !0 }(i, r), p = {}; if (!c) for (var d = 0; d < r.length; d++) { var f = r[d], g = f.data.getItemGraphicEl(f.dataIndex); g && (p[g.id] = !0) } function y(t, e) { var n = i[e], a = r[t], s = a.data.hostModel, l = n.data.getItemGraphicEl(n.dataIndex), h = a.data.getItemGraphicEl(a.dataIndex); l !== h ? l && p[l.id] || h && (jG(h), l ? (jG(l), ZG(l), u = !0, WG(HG(l), HG(h), a.divide, s, t, o)) : XG(h, s, t)) : h && qG(h, a.dataIndex, s) } new Dm(i, r, h(!0, c), h(!1, c), null, \"multiple\").update(y).updateManyToOne((function (t, e) { var n = r[t], a = n.data, s = a.hostModel, l = a.getItemGraphicEl(n.dataIndex), h = B(z(e, (function (t) { return i[t].data.getItemGraphicEl(i[t].dataIndex) })), (function (t) { return t && t !== l && !p[t.id] })); l && (jG(l), h.length ? (E(h, (function (t) { jG(t), ZG(t) })), u = !0, WG(HG(h), HG(l), n.divide, s, t, o)) : XG(l, s, n.dataIndex)) })).updateOneToMany((function (t, e) { var n = i[e], a = n.data.getItemGraphicEl(n.dataIndex); if (!a || !p[a.id]) { var s = B(z(t, (function (t) { return r[t].data.getItemGraphicEl(r[t].dataIndex) })), (function (t) { return t && t !== a })), l = r[t[0]].data.hostModel; s.length && (E(s, (function (t) { return jG(t) })), a ? (jG(a), ZG(a), u = !0, WG(HG(a), HG(s), n.divide, l, t[0], o)) : E(s, (function (e) { return XG(e, l, t[0]) }))) } })).updateManyToMany((function (t, e) { new Dm(e, t, (function (t) { return i[t].data.getId(i[t].dataIndex) }), (function (t) { return r[t].data.getId(r[t].dataIndex) })).update((function (n, i) { y(t[n], e[i]) })).execute() })).execute(), u && E(e, (function (t) { var e = t.data.hostModel, i = e && n.getViewOfSeriesModel(e), r = sh(\"update\", e, 0); i && e.isAnimationEnabled() && r && r.duration > 0 && i.group.traverse((function (t) { t instanceof _s && !t.animators.length && t.animateFrom({ style: { opacity: 0 } }, r) })) })) } function $G(t) { var e = t.getModel(\"universalTransition\").get(\"seriesKey\"); return e || t.id } function JG(t) { return Y(t) ? t.sort().join(\",\") : t } function QG(t) { if (t.hostModel) return t.hostModel.getModel(\"universalTransition\").get(\"divideShape\") } function tW(t, e) { for (var n = 0; n < t.length; n++) { if (null != e.seriesIndex && e.seriesIndex === t[n].seriesIndex || null != e.seriesId && e.seriesId === t[n].id) return n } } Im([function (t) { t.registerPainter(\"canvas\", Hw) }]), Im([function (t) { t.registerPainter(\"svg\", Ew) }]), Im([function (t) { t.registerChartView(SS), t.registerSeriesModel(Yw), t.registerLayout(MS(\"line\", !0)), t.registerVisual({ seriesType: \"line\", reset: function (t) { var e = t.getData(), n = t.getModel(\"lineStyle\").getLineStyle(); n && !n.stroke && (n.stroke = e.getVisual(\"style\").fill), e.setVisual(\"legendLineStyle\", n) } }), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, CS(\"line\")) }, function (t) { t.registerChartView(ES), t.registerSeriesModel(AS), t.registerLayout(t.PRIORITY.VISUAL.LAYOUT, H(Ox, \"bar\")), t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, Rx(\"bar\")), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, CS(\"bar\")), t.registerAction({ type: \"changeAxisOrder\", event: \"changeAxisOrder\", update: \"update\" }, (function (t, e) { var n = t.componentType || \"series\"; e.eachComponent({ mainType: n, query: t }, (function (e) { t.sortInfo && e.axis.setCategorySortInfo(t.sortInfo) })) })) }, function (t) { t.registerChartView(cM), t.registerSeriesModel(fM), _y(\"pie\", t.registerAction), t.registerLayout(H(nM, \"pie\")), t.registerProcessor(iM(\"pie\")), t.registerProcessor(function (t) { return { seriesType: t, reset: function (t, e) { var n = t.getData(); n.filterSelf((function (t) { var e = n.mapDimension(\"value\"), i = n.get(e, t); return !(j(i) && !isNaN(i) && i < 0) })) } } }(\"pie\")) }, function (t) { Im(gI), t.registerSeriesModel(gM), t.registerChartView(xM), t.registerLayout(MS(\"scatter\")) }, function (t) { Im(AI), t.registerChartView(_I), t.registerSeriesModel(bI), t.registerLayout(yI), t.registerProcessor(iM(\"radar\")), t.registerPreprocessor(xI) }, function (t) { Im(rC), t.registerChartView(BT), t.registerSeriesModel(FT), t.registerLayout(WT), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, GT), _y(\"map\", t.registerAction) }, function (t) { t.registerChartView(yC), t.registerSeriesModel(VC), t.registerLayout(FC), t.registerVisual(GC), function (t) { t.registerAction({ type: \"treeExpandAndCollapse\", event: \"treeExpandAndCollapse\", update: \"update\" }, (function (t, e) { e.eachComponent({ mainType: \"series\", subType: \"tree\", query: t }, (function (e) { var n = t.dataIndex, i = e.getData().tree.getNodeByDataIndex(n); i.isExpand = !i.isExpand })) })), t.registerAction({ type: \"treeRoam\", event: \"treeRoam\", update: \"none\" }, (function (t, e, n) { e.eachComponent({ mainType: \"series\", subType: \"tree\", query: t }, (function (e) { var i = eC(e.coordinateSystem, t, void 0, n); e.setCenter && e.setCenter(i.center), e.setZoom && e.setZoom(i.zoom) })) })) }(t) }, function (t) { t.registerSeriesModel(YC), t.registerChartView(iD), t.registerVisual(_D), t.registerLayout(OD), function (t) { for (var e = 0; e < WC.length; e++)t.registerAction({ type: WC[e], update: \"updateView\" }, xt); t.registerAction({ type: \"treemapRootToNode\", update: \"updateView\" }, (function (t, e) { e.eachComponent({ mainType: \"series\", subType: \"treemap\", query: t }, (function (e, n) { var i = RC(t, [\"treemapZoomToNode\", \"treemapRootToNode\"], e); if (i) { var r = e.getViewRoot(); r && (t.direction = EC(r, i.node) ? \"rollUp\" : \"drillDown\"), e.resetViewRoot(i.node) } })) })) }(t) }, function (t) { t.registerChartView(OA), t.registerSeriesModel(FA), t.registerProcessor(BD), t.registerVisual(FD), t.registerVisual(WD), t.registerLayout(JD), t.registerLayout(t.PRIORITY.VISUAL.POST_CHART_LAYOUT, aA), t.registerLayout(lA), t.registerCoordinateSystem(\"graphView\", { dimensions: YT.dimensions, create: uA }), t.registerAction({ type: \"focusNodeAdjacency\", event: \"focusNodeAdjacency\", update: \"series:focusNodeAdjacency\" }, xt), t.registerAction({ type: \"unfocusNodeAdjacency\", event: \"unfocusNodeAdjacency\", update: \"series:unfocusNodeAdjacency\" }, xt), t.registerAction(GA, (function (t, e, n) { e.eachComponent({ mainType: \"series\", query: t }, (function (e) { var i = eC(e.coordinateSystem, t, void 0, n); e.setCenter && e.setCenter(i.center), e.setZoom && e.setZoom(i.zoom) })) })) }, function (t) { t.registerChartView(UA), t.registerSeriesModel(XA) }, function (t) { t.registerChartView(qA), t.registerSeriesModel(KA), t.registerLayout($A), t.registerProcessor(iM(\"funnel\")) }, function (t) { Im(SL), t.registerChartView(JA), t.registerSeriesModel(ik), t.registerVisual(t.PRIORITY.VISUAL.BRUSH, ak) }, function (t) { t.registerChartView(TL), t.registerSeriesModel(CL), t.registerLayout(DL), t.registerVisual(FL), t.registerAction({ type: \"dragNode\", event: \"dragnode\", update: \"update\" }, (function (t, e) { e.eachComponent({ mainType: \"series\", subType: \"sankey\", query: t }, (function (e) { e.setNodePosition(t.dataIndex, [t.localX, t.localY]) })) })) }, function (t) { t.registerSeriesModel(WL), t.registerChartView(HL), t.registerVisual(qL), t.registerLayout($L), t.registerTransform(JL) }, function (t) { t.registerChartView(tP), t.registerSeriesModel(cP), t.registerPreprocessor(pP), t.registerVisual(vP), t.registerLayout(mP) }, function (t) { t.registerChartView(wP), t.registerSeriesModel(SP), t.registerLayout(MS(\"effectScatter\")) }, function (t) { t.registerChartView(LP), t.registerSeriesModel(NP), t.registerLayout(kP), t.registerVisual(zP) }, function (t) { t.registerChartView(FP), t.registerSeriesModel(GP) }, function (t) { t.registerChartView(UP), t.registerSeriesModel(uO), t.registerLayout(t.PRIORITY.VISUAL.LAYOUT, H(Ox, \"pictorialBar\")), t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, Rx(\"pictorialBar\")) }, function (t) { t.registerChartView(hO), t.registerSeriesModel(cO), t.registerLayout(pO), t.registerProcessor(iM(\"themeRiver\")) }, function (t) { t.registerChartView(vO), t.registerSeriesModel(mO), t.registerLayout(H(bO, \"sunburst\")), t.registerProcessor(H(iM, \"sunburst\")), t.registerVisual(SO), function (t) { t.registerAction({ type: gO, update: \"updateView\" }, (function (t, e) { e.eachComponent({ mainType: \"series\", subType: \"sunburst\", query: t }, (function (e, n) { var i = RC(t, [gO], e); if (i) { var r = e.getViewRoot(); r && (t.direction = EC(r, i.node) ? \"rollUp\" : \"drillDown\"), e.resetViewRoot(i.node) } })) })), t.registerAction({ type: yO, update: \"none\" }, (function (t, e, n) { t = A({}, t), e.eachComponent({ mainType: \"series\", subType: \"sunburst\", query: t }, (function (e) { var n = RC(t, [yO], e); n && (t.dataIndex = n.node.dataIndex) })), n.dispatchAction(A(t, { type: \"highlight\" })) })), t.registerAction({ type: \"sunburstUnhighlight\", update: \"updateView\" }, (function (t, e, n) { t = A({}, t), n.dispatchAction(A(t, { type: \"downplay\" })) })) }(t) }, function (t) { t.registerChartView(fR), t.registerSeriesModel(CO) }]), Im((function (t) { Im(gI), Im(gN) })), Im((function (t) { Im(gN), iI.registerAxisPointerClass(\"PolarAxisPointer\", yN), t.registerCoordinateSystem(\"polar\", kN), t.registerComponentModel(mN), t.registerComponentView(XN), CM(t, \"angle\", _N, YN), CM(t, \"radius\", bN, UN), t.registerComponentView(NN), t.registerComponentView(BN), t.registerLayout(H(HN, \"bar\")) })), Im(rC), Im((function (t) { Im(gN), iI.registerAxisPointerClass(\"SingleAxisPointer\", aE), t.registerComponentView(hE), t.registerComponentView(KN), t.registerComponentModel(JN), CM(t, \"single\", JN, JN.defaultOption), t.registerCoordinateSystem(\"single\", iE) })), Im(SL), Im((function (t) { t.registerComponentModel(cE), t.registerComponentView(dE), t.registerCoordinateSystem(\"calendar\", gE) })), Im((function (t) { t.registerComponentModel(bE), t.registerComponentView(ME), t.registerPreprocessor((function (t) { var e = t.graphic; Y(e) ? e[0] && e[0].elements ? t.graphic = [t.graphic[0]] : t.graphic = [{ elements: e }] : e && !e.elements && (t.graphic = [{ elements: [e] }]) })) })), Im((function (t) { t.registerComponentModel($E), t.registerComponentView(QE), qE(\"saveAsImage\", tz), qE(\"magicType\", iz), qE(\"dataView\", hz), qE(\"dataZoom\", Pz), qE(\"restore\", gz), Im(XE) })), Im((function (t) { Im(gN), t.registerComponentModel(Nz), t.registerComponentView(Jz), t.registerAction({ type: \"showTip\", event: \"showTip\", update: \"tooltip:manuallyShowTip\" }, xt), t.registerAction({ type: \"hideTip\", event: \"hideTip\", update: \"tooltip:manuallyHideTip\" }, xt) })), Im(gN), Im((function (t) { t.registerComponentView(_V), t.registerComponentModel(bV), t.registerPreprocessor(iV), t.registerVisual(t.PRIORITY.VISUAL.BRUSH, gV), t.registerAction({ type: \"brush\", event: \"brush\", update: \"updateVisual\" }, (function (t, e) { e.eachComponent({ mainType: \"brush\", query: t }, (function (e) { e.setAreas(t.areas) })) })), t.registerAction({ type: \"brushSelect\", event: \"brushSelected\", update: \"none\" }, xt), t.registerAction({ type: \"brushEnd\", event: \"brushEnd\", update: \"none\" }, xt), qE(\"brush\", MV) })), Im((function (t) { t.registerComponentModel(IV), t.registerComponentView(TV) })), Im((function (t) { t.registerComponentModel(DV), t.registerComponentView(OV), t.registerSubTypeDefaulter(\"timeline\", (function () { return \"slider\" })), function (t) { t.registerAction({ type: \"timelineChange\", event: \"timelineChanged\", update: \"prepareAndUpdate\" }, (function (t, e, n) { var i = e.getComponent(\"timeline\"); return i && null != t.currentIndex && (i.setCurrentIndex(t.currentIndex), !i.get(\"loop\", !0) && i.isIndexMax() && i.getPlayState() && (i.setPlayState(!1), n.dispatchAction({ type: \"timelinePlayChange\", playState: !1, from: t.from }))), e.resetOption(\"timeline\", { replaceMerge: i.get(\"replaceMerge\", !0) }), k({ currentIndex: i.option.currentIndex }, t) })), t.registerAction({ type: \"timelinePlayChange\", event: \"timelinePlayChanged\", update: \"update\" }, (function (t, e) { var n = e.getComponent(\"timeline\"); n && null != t.playState && n.setPlayState(t.playState) })) }(t), t.registerPreprocessor(EV) })), Im((function (t) { t.registerComponentModel(HV), t.registerComponentView(eB), t.registerPreprocessor((function (t) { BV(t.series, \"markPoint\") && (t.markPoint = t.markPoint || {}) })) })), Im((function (t) { t.registerComponentModel(nB), t.registerComponentView(uB), t.registerPreprocessor((function (t) { BV(t.series, \"markLine\") && (t.markLine = t.markLine || {}) })) })), Im((function (t) { t.registerComponentModel(hB), t.registerComponentView(mB), t.registerPreprocessor((function (t) { BV(t.series, \"markArea\") && (t.markArea = t.markArea || {}) })) })), Im((function (t) { Im(kB), Im(zB) })), Im((function (t) { Im(qB), Im(rF) })), Im(qB), Im(rF), Im((function (t) { Im(VF), Im(HF) })), Im(VF), Im(HF), Im((function (t) { t.registerPreprocessor(jF), t.registerVisual(t.PRIORITY.VISUAL.ARIA, ZF) })), Im((function (t) { t.registerTransform(aG), t.registerTransform(sG) })), Im((function (t) { t.registerComponentModel(lG), t.registerComponentView(uG) })), Im((function (t) { t.registerUpdateLifecycle(\"series:beforeupdate\", (function (t, e, n) { E(yo(n.seriesTransition), (function (t) { E(yo(t.to), (function (t) { for (var e = n.updatedSeries, i = 0; i < e.length; i++)(null != t.seriesIndex && t.seriesIndex === e[i].seriesIndex || null != t.seriesId && t.seriesId === e[i].id) && (e[i].__universalTransitionEnabled = !0) })) })) })), t.registerUpdateLifecycle(\"series:transition\", (function (t, e, n) { var i = YG(e); if (i.oldSeries && n.updatedSeries && n.optionChanged) { var r = n.seriesTransition; if (r) E(yo(r), (function (t) { !function (t, e, n, i) { var r = [], o = []; E(yo(t.from), (function (t) { var n = tW(e.oldSeries, t); n >= 0 && r.push({ data: e.oldData[n], divide: QG(e.oldData[n]), dim: t.dimension }) })), E(yo(t.to), (function (t) { var e = tW(n.updatedSeries, t); if (e >= 0) { var i = n.updatedSeries[e].getData(); o.push({ data: i, divide: QG(i), dim: t.dimension }) } })), r.length > 0 && o.length > 0 && KG(r, o, i) }(t, i, n, e) })); else { var o = function (t, e) { var n = ft(), i = ft(), r = ft(); return E(t.oldSeries, (function (e, n) { var o = t.oldData[n], a = $G(e), s = JG(a); i.set(s, o), Y(a) && E(a, (function (t) { r.set(t, { data: o, key: s }) })) })), E(e.updatedSeries, (function (t) { if (t.isUniversalTransitionEnabled() && t.isAnimationEnabled()) { var e = t.getData(), o = $G(t), a = JG(o), s = i.get(a); if (s) n.set(a, { oldSeries: [{ divide: QG(s), data: s }], newSeries: [{ divide: QG(e), data: e }] }); else if (Y(o)) { var l = []; E(o, (function (t) { var e = i.get(t); e && l.push({ divide: QG(e), data: e }) })), l.length && n.set(a, { oldSeries: l, newSeries: [{ data: e, divide: QG(e) }] }) } else { var u = r.get(o); if (u) { var h = n.get(u.key); h || (h = { oldSeries: [{ data: u.data, divide: QG(u.data) }], newSeries: [] }, n.set(u.key, h)), h.newSeries.push({ data: e, divide: QG(e) }) } } } })), n }(i, n); E(o.keys(), (function (t) { var n = o.get(t); KG(n.oldSeries, n.newSeries, e) })) } E(n.updatedSeries, (function (t) { t.__universalTransitionEnabled && (t.__universalTransitionEnabled = !1) })) } for (var a = t.getSeries(), s = i.oldSeries = [], l = i.oldData = [], u = 0; u < a.length; u++) { var h = a[u].getData(); h.count() < 1e4 && (s.push(a[u]), l.push(h)) } })) })), Im((function (t) { t.registerUpdateLifecycle(\"series:beforeupdate\", (function (t, e, n) { var i = Lb(e).labelManager; i || (i = Lb(e).labelManager = new kb), i.clearLabels() })), t.registerUpdateLifecycle(\"series:layoutlabels\", (function (t, e, n) { var i = Lb(e).labelManager; n.updatedSeries.forEach((function (t) { i.addLabelsOfSeries(e.getViewOfSeriesModel(t)) })), i.updateLayoutConfig(e), i.layout(e), i.processLabelsOverall() })) })), t.Axis = X_, t.ChartView = wg, t.ComponentModel = Ap, t.ComponentView = mg, t.List = Jm, t.Model = xc, t.PRIORITY = vv, t.SeriesModel = hg, t.color = ii, t.connect = function (t) { if (Y(t)) { var e = t; t = null, E(e, (function (e) { null != e.group && (t = e.group) })), t = t || \"g_\" + im++, E(e, (function (e) { e.group = t })) } return em[t] = !0, t }, t.dataTool = {}, t.dependencies = { zrender: \"5.4.0\" }, t.disConnect = om, t.disconnect = am, t.dispose = function (t) { X(t) ? t = tm[t] : t instanceof Hv || (t = sm(t)), t instanceof Hv && !t.isDisposed() && t.dispose() }, t.env = r, t.extendChartView = function (t) { var e = wg.extend(t); return wg.registerClass(e), e }, t.extendComponentModel = function (t) { var e = Ap.extend(t); return Ap.registerClass(e), e }, t.extendComponentView = function (t) { var e = mg.extend(t); return mg.registerClass(e), e }, t.extendSeriesModel = function (t) { var e = hg.extend(t); return hg.registerClass(e), e }, t.format = R_, t.getCoordinateSystemDimensions = function (t) { var e = dd.get(t); if (e) return e.getDimensionsInfo ? e.getDimensionsInfo() : e.dimensions.slice() }, t.getInstanceByDom = sm, t.getInstanceById = function (t) { return tm[t] }, t.getMap = function (t) { var e = dv(\"getMap\"); return e && e(t) }, t.graphic = O_, t.helper = v_, t.init = function (t, e, n) { var i = !(n && n.ssr); if (i) { 0; var r = sm(t); if (r) return r; 0 } var o = new Hv(t, e, n); return o.id = \"ec_\" + nm++, tm[o.id] = o, i && No(t, rm, o.id), Vv(o), cv.trigger(\"afterinit\", o), o }, t.innerDrawElementOnCanvas = nv, t.matrix = Me, t.number = L_, t.parseGeoJSON = k_, t.parseGeoJson = k_, t.registerAction = fm, t.registerCoordinateSystem = gm, t.registerLayout = ym, t.registerLoading = _m, t.registerLocale = Ac, t.registerMap = bm, t.registerPostInit = cm, t.registerPostUpdate = pm, t.registerPreprocessor = um, t.registerProcessor = hm, t.registerTheme = lm, t.registerTransform = wm, t.registerUpdateLifecycle = dm, t.registerVisual = vm, t.setCanvasCreator = function (t) { c({ createCanvas: t }) }, t.setPlatformAPI = c, t.throttle = Lg, t.time = P_, t.use = Im, t.util = N_, t.vector = Ht, t.version = \"5.4.0\", t.zrUtil = bt, t.zrender = Vr, Object.defineProperty(t, \"__esModule\", { value: !0 })\n}));\n  </script>\n</head>\n\n<body>\n  <div id=\"main\" />\n</body>\n\n</html>\n"
  },
  {
    "path": "packages/react-native-echarts/src/utils/builder.ts",
    "content": "export const formatString = (str?: string): string => {\n  if (!str) return '';\n  return str\n    .replace(/(\\w+:)|(\\w+ :)/g, s => {\n      return `\"${s.substring(0, s.length - 1)}\":`;\n    })\n    .replace(/\\\\\"/g, \"'\")\n    .replace(/\"function (\\w+)\\((.*)\\) ?\\{([\\n\\s\\S]*?)\\}\"/g, (_, a, b, c) => {\n      return `function ${a}(${b}){${formatString(c)}}`;\n    });\n};\n\nexport type EchartsInitOptions = {\n  devicePixelRatio?: number;\n  renderer?: 'canvas' | 'svg';\n  locale?: 'ZH' | 'EN';\n  useDirtyRect?: boolean;\n};\n\nexport const buildEcharts = (backgroundColor: string, echartsInitOptions: EchartsInitOptions) => {\n  return `\n    function setBackgroundColor(color) {\n      document.getElementById('main').style.backgroundColor = color;\n    }\n\n    function sendCallbackData(uuid, data) {\n      window.ReactNativeWebView.postMessage(JSON.stringify({\"types\":\"CALLBACK\", \"uuid\": uuid, \"payload\": data}));\n    }\n\n    function parse (data) {\n      return JSON.parse(data, function (key, value) {\n        if (value\n          && typeof value === \"string\"\n          && value.substr(0,8) === \"function\"\n        ) {\n          var startBody = value.indexOf('{') + 1;\n          var endBody = value.lastIndexOf('}');\n          var startArgs = value.indexOf('(') + 1;\n          var endArgs = value.indexOf(')');\n\n          return new Function(value.substring(startArgs, endArgs), value.substring(startBody, endBody));\n        }\n        return value;\n      });\n    }\n\n    window.onresize = function() {\n      chart.resize();\n    };\n\n    function processMessage(e) {\n      var req = parse(e.data);\n\n      switch(req.types) {\n        case \"SET_OPTION\":\n          chart.setOption(eval('(req.payload.option)'), req.payload.notMerge, req.payload.lazyUpdate);\n          break;\n\n        case \"CLEAR\":\n          chart.clear();\n          break;\n\n        case \"SET_BACKGROUND_COLOR\":\n          setBackgroundColor(req.color);\n          break;\n\n        case \"GET_OPTION\":\n          var option = chart.getOption();\n          var data = {};\n\n          if(req.properties !== undefined) {\n            req.properties.forEach(function (prop) {\n              data[prop] = option[prop];\n            });\n          } else {\n            var data = {\n              option: option\n            };\n          }\n          sendCallbackData(req.uuid, data);\n          break;\n\n        default:\n          break;\n      }\n    }\n\n    window.document.addEventListener('message', function(e) {\n      processMessage(e);\n    });\n\n    window.addEventListener('message', function(e) {\n      processMessage(e);\n    });\n\n    var chart = echarts.init(document.getElementById('main'), undefined, ${JSON.stringify(echartsInitOptions)});\n    setBackgroundColor(\"${backgroundColor}\");\n    true;\n  `;\n};\n"
  },
  {
    "path": "packages/react-native-echarts/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-echarts/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-image-picker/CHANGELOG.md",
    "content": "# @td-design/react-native-image-picker\n\n## 1.8.1\n\n### Patch Changes\n\n- [#928](https://github.com/thundersdata-frontend/td-design/pull/928) [`d035cb837`](https://github.com/thundersdata-frontend/td-design/commit/d035cb837371dfc32fe7fe8105bead76195c93af) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 优化弹窗类组件的显示方式\n\n## 1.8.0\n\n### Minor Changes\n\n- [#855](https://github.com/thundersdata-frontend/td-design/pull/855) [`5707f6852`](https://github.com/thundersdata-frontend/td-design/commit/5707f6852ca6dd4d1c425aebb0c06841227154c4) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复授权弹窗的bug\n\n## 1.7.3\n\n### Patch Changes\n\n- [#821](https://github.com/thundersdata-frontend/td-design/pull/821) [`a8e2b30ce`](https://github.com/thundersdata-frontend/td-design/commit/a8e2b30ce3a34ab1404a6b741073487857d5e9c6) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修改File类型定义\n\n## 1.7.2\n\n### Patch Changes\n\n- [#783](https://github.com/thundersdata-frontend/td-design/pull/783) [`839433baf`](https://github.com/thundersdata-frontend/td-design/commit/839433bafc549c82067b308cff3dd29dfb616d76) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复 loading 图标定位 bug\n\n## 1.7.1\n\n### Patch Changes\n\n- [#714](https://github.com/thundersdata-frontend/td-design/pull/714) [`ef6d88136`](https://github.com/thundersdata-frontend/td-design/commit/ef6d88136421ea13b19b11730f94b589047c5a8b) Thanks [@chj-damon](https://github.com/chj-damon)! - 继续优化组件样式\n\n## 1.7.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 样式优化\n\n## 1.6.8\n\n### Patch Changes\n\n- [#677](https://github.com/thundersdata-frontend/td-design/pull/677) [`469b748a3`](https://github.com/thundersdata-frontend/td-design/commit/469b748a33b288afc288be969a193eae0e2f6d13) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化组件同时为一些组件补充 activeOpacity 属性\n\n## 1.6.7\n\n### Patch Changes\n\n- [#675](https://github.com/thundersdata-frontend/td-design/pull/675) [`fd54834e7`](https://github.com/thundersdata-frontend/td-design/commit/fd54834e790a51054aa3b6d53857ba73f126d0d4) Thanks [@chen929104](https://github.com/chen929104)! - 修改预览图片 resizeMode 为 cover 时显示不全的问题\n\n## 1.6.6\n\n### Patch Changes\n\n- [#660](https://github.com/thundersdata-frontend/td-design/pull/660) [`94e1422ba`](https://github.com/thundersdata-frontend/td-design/commit/94e1422babc364a236695e12a80718336a039e70) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 修复 Modal 的几个方法在关闭后 Portal 没有被销毁的问题 2. 优化 ImagePicker 两个方法的写法 3. 修复 ActionSheet 的一些问题\n\n## 1.6.5\n\n### Patch Changes\n\n- [#625](https://github.com/thundersdata-frontend/td-design/pull/625) [`5efa85848`](https://github.com/thundersdata-frontend/td-design/commit/5efa858485f78542b293404baa504e11182830bb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 useTheme 引入路径不正确导致报错的问题\n\n## 1.6.4\n\n### Patch Changes\n\n- [#589](https://github.com/thundersdata-frontend/td-design/pull/589) [`6bd906307`](https://github.com/thundersdata-frontend/td-design/commit/6bd90630781c3769af64ab0983f8d050daca6c0c) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复 useUpdateEffect 第一次不会执行的问题\n\n## 1.6.3\n\n### Patch Changes\n\n- [`4efbfc3c0`](https://github.com/thundersdata-frontend/td-design/commit/4efbfc3c0584e02326258ee01d62627c5f34525b) - 修复 TS 类型报错\n"
  },
  {
    "path": "packages/react-native-image-picker/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-image-picker\",\n  \"version\": \"1.8.1\",\n  \"description\": \"基于 @td-design/react-native 的 image-picker 组件\",\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"license\": \"Apache-2.0\",\n  \"author\": \"thundersdata-frontend\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"devDependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@td-design/rn-hooks\": \"workspace:^2.8.1\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-image-picker\": \"^5.6.0\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"registry\": \"https://registry.npmjs.org/\"\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\",\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/react-native-image-picker/src/index.md",
    "content": "---\ntitle: ImagePicker - 图片选择组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 图片选择组件\n  path: /image-picker\n---\n\n# ImagePicker 图片选择组件\n\n使用本组件需要单独安装：**yarn add @td-design/react-native-image-picker react-native-image-picker**\n\n该组件依赖[react-native-image-picker](https://github.com/react-native-image-picker/react-native-image-picker)\n\n## 效果演示\n\n### 1. 简单用法\n\n```tsx | pure\nimport { helpers, Image } from '@td-design/react-native';\nimport ImagePicker from '@td-design/react-native-image-picker';\n\nconst { px } = helpers;\n\nconst APP = () => {\n  return (\n    <ImagePicker onGrantFail={() => Toast.bottom({ content: '对不起，授权失败' })} onUpload={file => file.uri}>\n      <Image source={require('./assets/img-add-complete.webp')} style={{ width: px(100), height: px(100) }} />\n    </ImagePicker>\n  );\n};\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1673597570320504020.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 自定义上传文字和图标\n\n```tsx | pure\nimport { Box, helpers, Image, Text, Toast } from '@td-design/react-native';\nimport ImagePicker from '@td-design/react-native-image-picker';\n\nconst { px } = helpers;\n\nconst APP = () => {\n  return (\n    <ImagePicker onGrantFail={() => Toast.bottom({ content: '对不起，授权失败' })} onUpload={file => file.uri}>\n      <Box\n        justifyContent=\"center\"\n        alignItems=\"center\"\n        width={100}\n        height={100}\n        borderWidth={1}\n        borderColor=\"border\"\n        borderStyle=\"dashed\"\n        borderRadius=\"x1\"\n      >\n        <Image source={require('./assets/img-add.webp')} style={{ width: px(44), height: px(44) }} />\n        <Text variant=\"p3\" color=\"gray300\" marginTop=\"x1\">\n          上传图片\n        </Text>\n      </Box>\n    </ImagePicker>\n  );\n};\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1673596506190144658.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| width | `false` | 宽度 | `number` | `100` |\n| height | `false` | 高度 | `number` | `100` |\n| value | `false` | 当前选择的图片 uri | `string` |  |\n| options | `false` | 其他图片自定义配置 | `CameraOptions` |  |\n| showUploadImg | `false` | 上传图片后是否在背景图展示 | `boolean` | `true` |\n| onBeforeUpload | `false` | 上传文件之前的钩子 | `(file: File) => boolean \\| Promise<boolean>` |  |\n| onUpload | `false` | 上传 | `(file: File) => Promise<string>` |  |\n| onAfterUpload | `false` | 上传完成 | `(result?: string) => void` |  |\n| onCancel | `false` | 取消上传事件回调 | `(response: ImagePickerResponse) => void` |  |\n| onFail | `false` | 上传失败事件回调 | `(response: ImagePickerResponse) => void` |  |\n| onGrantFail | `false` | 授权失败的回调 | `() => void` |  |\n| libraryRationale | `false` | 打开相册授权的文本 | `Rationale` |  |\n| cameraRationale | `false` | 打开摄像头授权的文本 | `Rationale` |  |\n| launchLibraryText | `false` | 打开相册文本 | `string` | `打开相册` |\n| launchCameraText | `false` | 打开摄像头文本 | `string` | `打开摄像头` |\n| previewImgText | `false` | 预览图片文本 | `string` | `预览图片` |\n| deleteImgText | `false` | 删除图片文本 | `string` | `删除图片` |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n\n_`CameraOptions`来自 [react-native-image-picker](https://github.com/react-native-image-picker/react-native-image-picker)_\n\n```ts\nexport interface File {\n  fileName: string;\n  fileType: string;\n  uri: string;\n  fileSize?: number;\n}\n```\n"
  },
  {
    "path": "packages/react-native-image-picker/src/index.tsx",
    "content": "import React, { forwardRef, useImperativeHandle } from 'react';\nimport { Image } from 'react-native';\nimport { CameraOptions } from 'react-native-image-picker';\n\nimport { Box, helpers, Indicator, Pressable, Theme, useTheme } from '@td-design/react-native';\n\nimport { ImagePickerProps, ImagePickerRef } from './type';\nimport useImagePicker from './useImagePicker';\n\nconst { px, ONE_PIXEL } = helpers;\nconst { UIActivityIndicator } = Indicator;\n\nconst cameraOptions: CameraOptions = {\n  mediaType: 'photo',\n  includeBase64: true,\n  quality: 1,\n  saveToPhotos: false,\n  durationLimit: 15,\n};\n\nconst ImagePicker = forwardRef<ImagePickerRef, ImagePickerProps>(\n  (\n    {\n      value,\n      width = px(100),\n      height = px(100),\n      options = cameraOptions,\n      showUploadImg = true,\n      launchLibraryText = '打开相册',\n      launchCameraText = '打开摄像头',\n      children,\n      onBeforeUpload,\n      onUpload,\n      onAfterUpload,\n      onCancel,\n      onFail,\n      onGrantFail,\n      activeOpacity = 0.6,\n    },\n    ref\n  ) => {\n    const theme = useTheme<Theme>();\n\n    const { currentImgSource, loading, handlePress } = useImagePicker({\n      value,\n      showUploadImg,\n      options,\n      onBeforeUpload,\n      onUpload,\n      onAfterUpload,\n      onCancel,\n      onFail,\n      onGrantFail,\n      launchLibraryText,\n      launchCameraText,\n    });\n\n    useImperativeHandle(ref, () => ({}));\n\n    return (\n      <Box>\n        <Pressable\n          activeOpacity={activeOpacity}\n          onPress={handlePress}\n          disabled={loading}\n          style={{ justifyContent: 'center', alignItems: 'flex-start', width, height }}\n        >\n          {!!currentImgSource ? (\n            <Image\n              source={{ uri: currentImgSource }}\n              style={{\n                width,\n                height,\n              }}\n            />\n          ) : (\n            children\n          )}\n        </Pressable>\n        {loading && (\n          <Box\n            width={width}\n            height={height}\n            borderWidth={ONE_PIXEL}\n            borderColor=\"border\"\n            borderRadius=\"x1\"\n            justifyContent=\"center\"\n            alignItems=\"center\"\n            backgroundColor=\"mask\"\n            position=\"absolute\"\n            top={0}\n            left={0}\n          >\n            <UIActivityIndicator size={px(24)} color={theme.colors.primary200} />\n          </Box>\n        )}\n      </Box>\n    );\n  }\n);\n\nexport default ImagePicker;\n"
  },
  {
    "path": "packages/react-native-image-picker/src/type.ts",
    "content": "import { PropsWithChildren } from 'react';\nimport { Rationale } from 'react-native';\nimport { CameraOptions, ImagePickerResponse } from 'react-native-image-picker';\n\nimport type { File } from '@td-design/react-native';\n\nexport interface ImagePickerRef {}\n\nexport type ImagePickerProps = PropsWithChildren<{\n  /** 宽度 */\n  width?: number;\n  /** 高度 */\n  height?: number;\n  /** 当前选择的图片uri */\n  value?: string;\n  /** 其他图片自定义配置,详细参考react-native-image-picker的option配置 */\n  options?: CameraOptions;\n  /** 上传图片后是否在背景图展示，如果为 true 上传后会自动展示上传图片(此时只能上传一张) */\n  showUploadImg?: boolean;\n  /** 上传文件之前的钩子，参数为上传的文件，若返回 false 则停止上传,同时可以在里面执行一些上传提示操作 */\n  onBeforeUpload?: ((file: File) => boolean) | ((file: File) => Promise<boolean>);\n  /** 上传 */\n  onUpload?: (file: File) => Promise<string>;\n  /** 上传结束后 */\n  onAfterUpload?: (result?: string) => void;\n  /** 取消选择图片 */\n  onCancel?: (response: ImagePickerResponse) => void;\n  /** 选择图片失败 */\n  onFail?: (response: ImagePickerResponse) => void;\n  /** 授权失败 */\n  onGrantFail?: () => void;\n  /** 打开相册授权的文本 */\n  libraryRationale?: Rationale;\n  /** 打开摄像头授权的文本 */\n  cameraRationale?: Rationale;\n  /** 打开相册文本 */\n  launchLibraryText?: string;\n  /** 打开摄像头文本 */\n  launchCameraText?: string;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}>;\n\nexport type HookProps = Pick<\n  ImagePickerProps,\n  | 'value'\n  | 'onBeforeUpload'\n  | 'onUpload'\n  | 'onAfterUpload'\n  | 'onCancel'\n  | 'onFail'\n  | 'onGrantFail'\n  | 'launchLibraryText'\n  | 'launchCameraText'\n> &\n  Required<Pick<ImagePickerProps, 'options' | 'showUploadImg'>>;\n"
  },
  {
    "path": "packages/react-native-image-picker/src/useImagePicker.ts",
    "content": "import { useEffect } from 'react';\nimport { Keyboard, PermissionsAndroid, Platform } from 'react-native';\nimport { ImagePickerResponse, launchImageLibrary, launchCamera as launchRNCamera } from 'react-native-image-picker';\n\nimport { ActionSheet } from '@td-design/react-native';\nimport type { File } from '@td-design/react-native';\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport { HookProps } from './type';\n\nfunction getSource(value?: string) {\n  if (value && (value.startsWith('http') || value.startsWith('file:'))) {\n    return value;\n  }\n  return undefined;\n}\n\nexport default function useImagePicker({\n  value,\n  options,\n  showUploadImg,\n  onBeforeUpload,\n  onUpload,\n  onAfterUpload,\n  onCancel,\n  onFail,\n  onGrantFail,\n  launchLibraryText,\n  launchCameraText,\n}: HookProps) {\n  const [currentImgSource, setCurrentImgSource] = useSafeState<string | undefined>(getSource(value));\n  const [loading, setLoading] = useSafeState(false);\n\n  useEffect(() => {\n    const source = getSource(value);\n    if (showUploadImg) {\n      setCurrentImgSource(source);\n    }\n  }, [value, showUploadImg]);\n\n  /** 打开相册 */\n  const launchLibrary = async () => {\n    const response = await launchImageLibrary(options);\n    handleCallback(response);\n  };\n\n  /** 打开摄像头 */\n  const launchCamera = async () => {\n    if (Platform.OS === 'android') {\n      const result = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA);\n      if (result !== 'granted') {\n        onGrantFail?.();\n        return;\n      }\n    }\n    const response = await launchRNCamera(options);\n    handleCallback(response);\n  };\n\n  /** 打开相册或者摄像头的回调函数 */\n  const handleCallback = async (response: ImagePickerResponse) => {\n    if (response.didCancel) {\n      // 用户取消上传 回调\n      onCancel?.(response);\n    } else if (response.errorCode) {\n      // 上传失败 回调\n      onFail?.(response);\n    }\n\n    if (!response.assets || response.assets.length === 0) return;\n\n    const file: File = {\n      fileName: response.assets[0].fileName!,\n      fileType: response.assets[0].type!,\n      uri: response.assets[0].uri!,\n      fileSize: response.assets[0].fileSize!,\n    };\n    // 执行上传前的操作及判断\n    if (onBeforeUpload) {\n      const result = await onBeforeUpload(file);\n      if (!result) {\n        return;\n      }\n    }\n    setLoading(true);\n    const result = await onUpload?.(file);\n    setLoading(false);\n    onAfterUpload?.(result);\n    if (result && showUploadImg) {\n      setCurrentImgSource(result);\n    }\n  };\n\n  const handlePress = () => {\n    Keyboard.dismiss();\n    ActionSheet.show({\n      items: [\n        { text: launchLibraryText!, onPress: launchLibrary },\n        { text: launchCameraText!, onPress: launchCamera },\n      ],\n    });\n  };\n\n  return {\n    currentImgSource,\n    loading,\n    handlePress,\n  };\n}\n"
  },
  {
    "path": "packages/react-native-image-picker/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-image-picker/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-password/CHANGELOG.md",
    "content": "# @td-design/react-native-password\n\n## 2.5.4\n\n### Patch Changes\n\n- [#825](https://github.com/thundersdata-frontend/td-design/pull/825) [`08ae08cd5`](https://github.com/thundersdata-frontend/td-design/commit/08ae08cd56a6510983b9fa5f4566569fea08ff05) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 不直接暴露PasswordModal,提供showPasswordModal方法\n\n## 2.5.3\n\n### Patch Changes\n\n- [#823](https://github.com/thundersdata-frontend/td-design/pull/823) [`655fbe2eb`](https://github.com/thundersdata-frontend/td-design/commit/655fbe2ebdb3fe73b5ce632da766d0b06b817a4d) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复PasswordModal的bug\n\n## 2.5.2\n\n### Patch Changes\n\n- [#821](https://github.com/thundersdata-frontend/td-design/pull/821) [`a8e2b30ce`](https://github.com/thundersdata-frontend/td-design/commit/a8e2b30ce3a34ab1404a6b741073487857d5e9c6) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 删除Password组件多余的Object.assign\n\n## 2.5.1\n\n### Patch Changes\n\n- [#714](https://github.com/thundersdata-frontend/td-design/pull/714) [`ef6d88136`](https://github.com/thundersdata-frontend/td-design/commit/ef6d88136421ea13b19b11730f94b589047c5a8b) Thanks [@chj-damon](https://github.com/chj-damon)! - 继续优化组件样式\n\n## 2.5.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 样式优化\n\n## 2.4.2\n\n### Patch Changes\n\n- [#679](https://github.com/thundersdata-frontend/td-design/pull/679) [`2882dd79d`](https://github.com/thundersdata-frontend/td-design/commit/2882dd79d2589d6871ed388c18cbbfc8c56b220d) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化组件 border 显示问题\n\n## 2.4.1\n\n### Patch Changes\n\n- [#677](https://github.com/thundersdata-frontend/td-design/pull/677) [`469b748a3`](https://github.com/thundersdata-frontend/td-design/commit/469b748a33b288afc288be969a193eae0e2f6d13) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化组件同时为一些组件补充 activeOpacity 属性\n\n## 2.4.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n## 2.3.2\n\n### Patch Changes\n\n- [#625](https://github.com/thundersdata-frontend/td-design/pull/625) [`5efa85848`](https://github.com/thundersdata-frontend/td-design/commit/5efa858485f78542b293404baa504e11182830bb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 useTheme 引入路径不正确导致报错的问题\n\n## 2.3.1\n\n### Patch Changes\n\n- [#611](https://github.com/thundersdata-frontend/td-design/pull/611) [`0e334a77e`](https://github.com/thundersdata-frontend/td-design/commit/0e334a77e7cbf25a446f962e90d8645f5dfafa4b) Thanks [@chj-damon](https://github.com/chj-damon)! - 防御性修改防止 RN 对&&的判断问题\n\n## 2.3.0\n\n### Minor Changes\n\n- [`fddce8944`](https://github.com/thundersdata-frontend/td-design/commit/fddce89444ff649bd9c086cd75a9d351a847dd70) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 import 包导致的报错\n\n## 2.2.3\n\n### Patch Changes\n\n- [#531](https://github.com/thundersdata-frontend/td-design/pull/531) [`8b837c8ae`](https://github.com/thundersdata-frontend/td-design/commit/8b837c8aeb2133b74f2f168077d7ebe2edabe652) Thanks [@qqack](https://github.com/qqack)! - fix: 暗黑模式下的样式优化\n"
  },
  {
    "path": "packages/react-native-password/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-password\",\n  \"version\": \"2.5.4\",\n  \"description\": \"基于 @td-design/react-native 的 password 组件\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@td-design/rn-hooks\": \"workspace:^2.8.1\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\"\n}\n"
  },
  {
    "path": "packages/react-native-password/src/Password.tsx",
    "content": "import React, { forwardRef } from 'react';\nimport { Keyboard } from 'react-native';\n\nimport {\n  Box,\n  Flex,\n  helpers,\n  Modal,\n  NumberKeyboardView,\n  Pressable,\n  SvgIcon,\n  Theme,\n  useTheme,\n} from '@td-design/react-native';\n\nimport usePassword, { PasswordProps } from './usePassword';\n\nconst { px, ONE_PIXEL } = helpers;\n\nexport interface PasswordInputRef {\n  show: () => void;\n  hide: () => void;\n  clear: () => void;\n}\n\nconst Password = forwardRef<PasswordInputRef, PasswordProps>(\n  ({ length = 6, onDone, clean = true, onChange, showCursor = false, activeOpacity = 0.6 }, ref) => {\n    const theme = useTheme<Theme>();\n    const {\n      show,\n      hide,\n      clear,\n      password,\n      itemWidth,\n      handleLayout,\n      combineText,\n      visible,\n      handleSubmit,\n      handleDelete,\n      setFalse,\n    } = usePassword({\n      clean,\n      length,\n      onDone,\n      onChange,\n    });\n\n    React.useImperativeHandle(ref, () => {\n      return {\n        show: show,\n        hide: hide,\n        clear: clear,\n      };\n    });\n\n    /** 密码框的render */\n    const passwordItems: React.ReactNode[] = [...Array(length)].map((_, i) => {\n      let borderRightWidth = ONE_PIXEL;\n      if (i === length - 1) {\n        borderRightWidth = 0;\n      }\n      return (\n        <Box\n          key={i}\n          width={itemWidth}\n          height={itemWidth}\n          justifyContent=\"center\"\n          alignItems=\"center\"\n          borderRightWidth={borderRightWidth}\n          borderColor=\"border\"\n        >\n          {password.length === i && visible && showCursor ? (\n            <Box width={1} height={itemWidth / 3} backgroundColor={'primary200'} />\n          ) : (\n            <Box\n              width={theme.spacing.x3}\n              height={theme.spacing.x3}\n              borderRadius=\"x3\"\n              backgroundColor=\"gray500\"\n              opacity={password.length > i ? 1 : 0}\n            />\n          )}\n        </Box>\n      );\n    });\n\n    return (\n      <Box onLayout={handleLayout}>\n        <Pressable onPress={show} activeOpacity={activeOpacity}>\n          <Flex borderWidth={ONE_PIXEL} borderColor=\"border\" borderRadius=\"x1\">\n            {passwordItems}\n          </Flex>\n        </Pressable>\n        <Modal visible={visible} maskClosable={true} position=\"bottom\" onClose={setFalse}>\n          <Flex justifyContent=\"center\" alignItems=\"center\" height={px(48)}>\n            <Pressable\n              onPress={() => {\n                Keyboard.dismiss();\n                setFalse();\n              }}\n              activeOpacity={activeOpacity}\n            >\n              <SvgIcon name=\"down\" size={px(24)} color={theme.colors.icon} />\n            </Pressable>\n          </Flex>\n          <NumberKeyboardView onPress={combineText} onDelete={handleDelete} onSubmit={handleSubmit} type=\"integer\" />\n        </Modal>\n      </Box>\n    );\n  }\n);\n\nexport default Password;\n"
  },
  {
    "path": "packages/react-native-password/src/PasswordModal.tsx",
    "content": "import React, { FC } from 'react';\n\nimport {\n  Box,\n  Flex,\n  helpers,\n  Modal,\n  NumberKeyboardView,\n  Text,\n  Theme,\n  useTheme,\n  WhiteSpace,\n} from '@td-design/react-native';\n\nimport usePasswordModal from './usePasswordModal';\n\nconst { ONE_PIXEL } = helpers;\n\nexport interface PasswordModalProps {\n  /** 提交事件 */\n  onDone?: (password: string) => void;\n  /** 密码长度 */\n  length?: number;\n  /** 密码框标题 */\n  title?: string;\n  /** 是否显示光标 */\n  showCursor?: boolean;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\nconst PasswordModal: FC<\n  PasswordModalProps & {\n    onAnimationEnd?: (visible: boolean) => void;\n  }\n> = ({ length = 6, activeOpacity = 0.6, onDone, title, showCursor = false, onAnimationEnd }) => {\n  const theme = useTheme<Theme>();\n  const { password, visible, setFalse, itemWidth, handleLayout, combineText, handleSubmit, handleDelete } =\n    usePasswordModal({\n      length,\n      onDone,\n    });\n\n  /** 密码框的render */\n  const passwordItems: React.ReactNode[] = [...Array(length)].map((_, i) => {\n    let borderRightWidth = ONE_PIXEL;\n    if (i === length - 1) {\n      borderRightWidth = 0;\n    }\n    return (\n      <Box\n        key={i}\n        width={itemWidth}\n        height={itemWidth}\n        justifyContent=\"center\"\n        alignItems=\"center\"\n        borderRightWidth={borderRightWidth}\n        borderColor=\"border\"\n      >\n        {password.length === i && visible && showCursor ? (\n          <Box width={1} height={itemWidth / 3} backgroundColor={'primary200'} />\n        ) : (\n          <Box\n            width={theme.spacing.x3}\n            height={theme.spacing.x3}\n            borderRadius=\"x3\"\n            backgroundColor=\"gray500\"\n            opacity={password.length > i ? 1 : 0}\n          />\n        )}\n      </Box>\n    );\n  });\n\n  return (\n    <Modal visible={visible} maskClosable={true} position=\"bottom\" onClose={setFalse} onAnimationEnd={onAnimationEnd}>\n      <Box>\n        {!!title && (\n          <>\n            <WhiteSpace />\n            <Text variant=\"p0\" color=\"text\" textAlign=\"center\">\n              {title}\n            </Text>\n          </>\n        )}\n        <WhiteSpace />\n        <Flex\n          marginHorizontal=\"x2\"\n          borderWidth={ONE_PIXEL}\n          borderColor=\"border\"\n          borderRadius=\"x1\"\n          onLayout={handleLayout}\n        >\n          {passwordItems}\n        </Flex>\n      </Box>\n      <WhiteSpace />\n      <NumberKeyboardView\n        onPress={combineText}\n        onDelete={handleDelete}\n        onSubmit={handleSubmit}\n        type=\"integer\"\n        activeOpacity={activeOpacity}\n      />\n    </Modal>\n  );\n};\n\nexport default PasswordModal;\n"
  },
  {
    "path": "packages/react-native-password/src/index.md",
    "content": "---\ntitle: Password - 密码框组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 密码框组件\n  path: /password\n---\n\n# Password 密码框组件\n\n使用本组件需要单独安装：**yarn add @td-design/react-native-password**\n\n## 效果演示\n\n### 1. 基本\n\n```tsx | pure\n  <Text>基本:</Text>\n  <WhiteSpace />\n  <Password onDone={onDone} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"密码框组件 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608963546617636014.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 显示光标\n\n```tsx | pure\n  <Text>显示光标:</Text>\n  <WhiteSpace />\n  <Password onDone={onDone} showCursor />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"显示光标 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608963546603881375.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 基本弹窗\n\n```tsx | pure\n  <Text>弹窗:</Text>\n  <WhiteSpace />\n  <Button\n    title=\"modal\"\n    onPress={() => {\n      showPasswordModal({ title: '仿支付宝支付', onDone: onDone });\n    }}\n  />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"基本弹窗 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608963546615332497.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 弹窗显示光标\n\n```tsx | pure\n  <Text>弹窗显示光标:</Text>\n  <WhiteSpace />\n  <Button\n    title=\"modal\"\n    onPress={() => {\n      showPasswordModal({ title: '仿支付宝支付', onDone: onDone, showCursor: true });\n    }}\n  />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"弹窗显示光标 ios\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608963548250977751.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Password 组件\n\n| 属性          | 必填    | 说明                 | 类型                         | 默认值  |\n| ------------- | ------- | -------------------- | ---------------------------- | ------- |\n| length        | `false` | 密码框长度           | `number`                     | `6`     |\n| onDone        | `false` | 按键完成事件回调事件 | `(password: string) => void` |         |\n| clean         | `false` | 是否清除             | `boolean`                    | `true`  |\n| onChange      | `false` | 密码改变事件回调事件 | `(password: string) => void` |         |\n| showCursor    | `false` | 是否显示光标         | `boolean`                    | `false` |\n| activeOpacity | `false` | 按下时的不透明度     | `number`                     | `0.6`   |\n\n### PasswordInputRef\n\n| 属性  | 说明              | 类型         |\n| ----- | ----------------- | ------------ |\n| show  | 显示键盘          | `() => void` |\n| hide  | 隐藏键盘          | `() => void` |\n| clean | 清除 imput 的输入 | `() => void` |\n\n### PasswordModal 组件\n\n| 属性          | 必填    | 说明             | 类型                         | 默认值  |\n| ------------- | ------- | ---------------- | ---------------------------- | ------- |\n| title         | `false` | 密码框标题       | `string`                     |         |\n| length        | `false` | 密码框长度       | `number`                     | `6`     |\n| onDone        | `false` | 提交事件         | `(password: string) => void` |         |\n| showCursor    | `false` | 是否显示光标     | `boolean`                    | `false` |\n| activeOpacity | `false` | 按下时的不透明度 | `number`                     | `0.6`   |\n"
  },
  {
    "path": "packages/react-native-password/src/index.tsx",
    "content": "import React from 'react';\n\nimport { Portal } from '@td-design/react-native';\n\nimport { default as Password } from './Password';\nimport PasswordModal, { PasswordModalProps } from './PasswordModal';\n\nfunction showPasswordModal(props: PasswordModalProps) {\n  const key = Portal.add(\n    <PasswordModal\n      {...props}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    />\n  );\n}\n\nexport { Password, showPasswordModal };\n"
  },
  {
    "path": "packages/react-native-password/src/usePassword.ts",
    "content": "import { LayoutChangeEvent } from 'react-native';\n\nimport { helpers } from '@td-design/react-native';\nimport { useBoolean, useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nconst { deviceWidth } = helpers;\nexport interface PasswordProps {\n  /** 密码框长度 */\n  length?: number;\n  /** 完成事件 */\n  onDone?: (password: string) => void;\n  /** 是否清除 */\n  clean?: boolean;\n  /** 密码改变 */\n  onChange?: (password: string) => void;\n  /** 是否显示光标 */\n  showCursor?: boolean;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nexport default function usePassword({\n  clean = true,\n  length = 6,\n  onDone,\n  onChange,\n}: Pick<PasswordProps, 'clean' | 'length' | 'onDone' | 'onChange'>) {\n  const [password, setPassword] = useSafeState('');\n  const [visible, { setTrue, setFalse }] = useBoolean(false);\n\n  const [width, setWidth] = useSafeState(deviceWidth);\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    setWidth(e.nativeEvent.layout.width);\n  };\n\n  const itemWidth = Math.floor(width / length);\n\n  /** 显示键盘 */\n  const show = () => {\n    if (clean) {\n      setPassword('');\n    }\n    setTrue();\n  };\n\n  /** 隐藏键盘 */\n  const hide = () => {\n    setFalse();\n  };\n\n  /** 键盘删除事件 */\n  const handleDelete = () => {\n    const nextPassword = password.substring(0, password.length - 1);\n    setPassword(nextPassword);\n    onChange?.(nextPassword);\n  };\n\n  /** 按键 */\n  const combineText = (text: string | number) => {\n    const nextPassword = password + text;\n    if (nextPassword.length <= length) {\n      setPassword(nextPassword);\n      onChange?.(nextPassword);\n      if (nextPassword.length === length) {\n        onDone?.(nextPassword);\n        hide();\n      }\n    }\n  };\n\n  /** 键盘提交事件 */\n  const handleSubmit = () => {\n    onDone?.(password);\n    hide();\n  };\n\n  /** 清除密码 */\n  const clear = () => {\n    setPassword('');\n  };\n\n  return {\n    password,\n    show,\n    clear,\n    hide,\n    visible,\n    itemWidth,\n    handleLayout: useMemoizedFn(handleLayout),\n    setFalse: useMemoizedFn(setFalse),\n    combineText: useMemoizedFn(combineText),\n    handleSubmit: useMemoizedFn(handleSubmit),\n    handleDelete: useMemoizedFn(handleDelete),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-password/src/usePasswordModal.ts",
    "content": "import { LayoutChangeEvent } from 'react-native';\n\nimport { helpers } from '@td-design/react-native';\nimport { useBoolean, useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { PasswordModalProps } from './PasswordModal';\n\nconst { deviceWidth } = helpers;\n\nexport default function usePasswordModal({ length = 6, onDone }: Pick<PasswordModalProps, 'length' | 'onDone'>) {\n  const [password, setPassword] = useSafeState('');\n  const [visible, { setFalse }] = useBoolean(true);\n\n  const [width, setWidth] = useSafeState(deviceWidth);\n\n  const handleLayout = (e: LayoutChangeEvent) => {\n    setWidth(e.nativeEvent.layout.width);\n  };\n\n  const itemWidth = Math.floor(width / length);\n\n  /** 键盘删除事件 */\n  const handleDelete = () => {\n    const nextPassword = password.substring(0, password.length - 1);\n    setPassword(nextPassword);\n  };\n  /** 按键 */\n  const combineText = (text: string | number) => {\n    const nextPassword = password + text;\n    if (nextPassword.length <= length) {\n      setPassword(nextPassword);\n      if (nextPassword.length === length) {\n        onDone?.(nextPassword);\n        setFalse();\n      }\n    }\n  };\n  /** 键盘提交事件 */\n  const handleSubmit = () => {\n    onDone?.(password);\n    setFalse();\n  };\n\n  return {\n    password,\n    visible,\n    itemWidth,\n    handleLayout: useMemoizedFn(handleLayout),\n    setFalse: useMemoizedFn(setFalse),\n    combineText: useMemoizedFn(combineText),\n    handleSubmit: useMemoizedFn(handleSubmit),\n    handleDelete: useMemoizedFn(handleDelete),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-password/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false,\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-password/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-picker/CHANGELOG.md",
    "content": "# @td-design/react-native-picker\n\n## 5.0.0\n\n### Major Changes\n\n- [#934](https://github.com/thundersdata-frontend/td-design/pull/934) [`a7f8412eb`](https://github.com/thundersdata-frontend/td-design/commit/a7f8412eb188f798953705307de2228893d19085) Thanks [@chj-damon](https://github.com/chj-damon)! - 重构picker模块\n\n## 4.1.1\n\n### Patch Changes\n\n- [#928](https://github.com/thundersdata-frontend/td-design/pull/928) [`d035cb837`](https://github.com/thundersdata-frontend/td-design/commit/d035cb837371dfc32fe7fe8105bead76195c93af) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 优化弹窗类组件的显示方式\n\n## 4.1.0\n\n### Minor Changes\n\n- [#921](https://github.com/thundersdata-frontend/td-design/pull/921) [`ea4ef3b4b`](https://github.com/thundersdata-frontend/td-design/commit/ea4ef3b4b004617e0233fc7e1c7dc1ea9d57c5d1) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化代码，删除一些无用的useEffect赋值\n\n## 4.0.0\n\n### Major Changes\n\n- [#918](https://github.com/thundersdata-frontend/td-design/pull/918) [`bb2621507`](https://github.com/thundersdata-frontend/td-design/commit/bb262150749ba677a9cfd64111c11605e9e9d074) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 用Modal.show重写弹窗的打开方式\n\n## 3.2.5\n\n### Patch Changes\n\n- [#915](https://github.com/thundersdata-frontend/td-design/pull/915) [`f5b4deb36`](https://github.com/thundersdata-frontend/td-design/commit/f5b4deb36b35bfd0ec5819d740f04775e301e0cc) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复日期组件的bug\n\n## 3.2.4\n\n### Patch Changes\n\n- [#913](https://github.com/thundersdata-frontend/td-design/pull/913) [`0fb7dcad8`](https://github.com/thundersdata-frontend/td-design/commit/0fb7dcad8f0a3cc56bf08a6462d55a98f86f5d88) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复DatePicker的bug\n\n## 3.2.3\n\n### Patch Changes\n\n- [#910](https://github.com/thundersdata-frontend/td-design/pull/910) [`e82f39542`](https://github.com/thundersdata-frontend/td-design/commit/e82f395426b20dc438b08679a4a292aaafaeb9e2) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复picker在取消后无法自动选择第一个选项的bug\n\n## 3.2.2\n\n### Patch Changes\n\n- [#908](https://github.com/thundersdata-frontend/td-design/pull/908) [`e23a233cb`](https://github.com/thundersdata-frontend/td-design/commit/e23a233cb0a105d326042fe5e34f2ea62edd8ae4) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复有时候没有滚动到value对应的选项的bug\n\n## 3.2.1\n\n### Patch Changes\n\n- [#904](https://github.com/thundersdata-frontend/td-design/pull/904) [`2e1c36022`](https://github.com/thundersdata-frontend/td-design/commit/2e1c3602295fc1c1433ea801315605c74ca55a04) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复删除日期后自动设置当前日期的bug\n\n## 3.2.0\n\n### Minor Changes\n\n- [#902](https://github.com/thundersdata-frontend/td-design/pull/902) [`14d15a380`](https://github.com/thundersdata-frontend/td-design/commit/14d15a38093165dd4cae084fb15249af07ae5155) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复picker组件在安卓设备使用物理返回键时的bug\n\n## 3.1.0\n\n### Minor Changes\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 优化代码\n\n### Patch Changes\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 优化代码性能\n\n## 3.0.1\n\n### Patch Changes\n\n- [#890](https://github.com/thundersdata-frontend/td-design/pull/890) [`fe9a1ab9d`](https://github.com/thundersdata-frontend/td-design/commit/fe9a1ab9d4cb8133257138c2f6430194faf59af3) Thanks [@chj-damon](https://github.com/chj-damon)! - 删除 `react-native-redash`依赖优化`react-native-picker` 的`onChange`事件的参数类型问题\n\n## 3.0.0\n\n### Major Changes\n\n- [#888](https://github.com/thundersdata-frontend/td-design/pull/888) [`0dded2b86`](https://github.com/thundersdata-frontend/td-design/commit/0dded2b86b90eed8eb48eec9981ac80d91d2e556) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 使用reanimated和gesture-handler重写滚动选择组件\n\n## 2.7.1\n\n### Patch Changes\n\n- [#886](https://github.com/thundersdata-frontend/td-design/pull/886) [`41725ad19`](https://github.com/thundersdata-frontend/td-design/commit/41725ad19acd60590ac371dd0a54ba05e62ff002) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复日期区间选择组件在清除日期后的bug\n\n## 2.7.0\n\n### Minor Changes\n\n- [#878](https://github.com/thundersdata-frontend/td-design/pull/878) [`3d5401aec`](https://github.com/thundersdata-frontend/td-design/commit/3d5401aecae37ee2e10bcac603d4471055c1e870) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复日期组件在mode='time'时的bug\n\n## 2.6.0\n\n### Minor Changes\n\n- [#876](https://github.com/thundersdata-frontend/td-design/pull/876) [`1e0983390`](https://github.com/thundersdata-frontend/td-design/commit/1e0983390f4e27f09f1d6d3f89abdcb3a60debc8) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复快速滑动时的bug以及title过长时折行的bug\n\n## 2.5.4\n\n### Patch Changes\n\n- [#871](https://github.com/thundersdata-frontend/td-design/pull/871) [`f559e98de`](https://github.com/thundersdata-frontend/td-design/commit/f559e98de39e90d132502862938391b64c71fd62) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复picker组件多列时值互相干扰的问题\n\n## 2.5.3\n\n### Patch Changes\n\n- [#869](https://github.com/thundersdata-frontend/td-design/pull/869) [`05212f4b7`](https://github.com/thundersdata-frontend/td-design/commit/05212f4b7916ca8f48278adbe2872be390362a92) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复DatePeriodInput组件在label位置为top时的样式问题\n\n## 2.5.2\n\n### Patch Changes\n\n- [#867](https://github.com/thundersdata-frontend/td-design/pull/867) [`12ef8c831`](https://github.com/thundersdata-frontend/td-design/commit/12ef8c8314790ac9e32aa68ae5e78939713dd334) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复picker组件在滑动时的选中bug\n\n## 2.5.1\n\n### Patch Changes\n\n- [#853](https://github.com/thundersdata-frontend/td-design/pull/853) [`57f5fb6c9`](https://github.com/thundersdata-frontend/td-design/commit/57f5fb6c994dd79cff74d411da49d8eedb3bb3b2) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 缩小picker的scale,并配置文字的超出效果\n\n## 2.5.0\n\n### Minor Changes\n\n- [#845](https://github.com/thundersdata-frontend/td-design/pull/845) [`a1ca23ae5`](https://github.com/thundersdata-frontend/td-design/commit/a1ca23ae51940f9fd06ec630852b46c5ceee3bed) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 优化picker组件的性能问题\n\n## 2.4.3\n\n### Patch Changes\n\n- [#840](https://github.com/thundersdata-frontend/td-design/pull/840) [`3cce14f86`](https://github.com/thundersdata-frontend/td-design/commit/3cce14f860819bf53da3d5545ec77d866bbfa74a) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: picker组件支持自定义连接符（默认是,）\n\n## 2.4.2\n\n### Patch Changes\n\n- [#810](https://github.com/thundersdata-frontend/td-design/pull/810) [`b541087a3`](https://github.com/thundersdata-frontend/td-design/commit/b541087a38439df39cd2bad436ab29d090d0f419) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 继续优化Input组件的样式问题\n\n## 2.4.1\n\n### Patch Changes\n\n- [#805](https://github.com/thundersdata-frontend/td-design/pull/805) [`4344a1e18`](https://github.com/thundersdata-frontend/td-design/commit/4344a1e185a96cdf5fef7d1ab1bf3e4f08fb60b6) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Input相关组件在FormItem下的高度问题\n\n## 2.4.0\n\n### Minor Changes\n\n- [#802](https://github.com/thundersdata-frontend/td-design/pull/802) [`e81ddb0ce`](https://github.com/thundersdata-frontend/td-design/commit/e81ddb0ceb6f5c692be12eec032b1ec5465b9199) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 全面优化组件在表单下使用时的样式\n\n## 2.3.5\n\n### Patch Changes\n\n- [#790](https://github.com/thundersdata-frontend/td-design/pull/790) [`d0e2d71b3`](https://github.com/thundersdata-frontend/td-design/commit/d0e2d71b3267cd0dc733b479a75aab137f9b7f5b) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Picker 组件的 placeholder 跟 Input 组件的 placeholder 颜色不一致的问题\n\n## 2.3.4\n\n### Patch Changes\n\n- [#783](https://github.com/thundersdata-frontend/td-design/pull/783) [`839433baf`](https://github.com/thundersdata-frontend/td-design/commit/839433bafc549c82067b308cff3dd29dfb616d76) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复在表单中使用时的样式问题\n\n## 2.3.3\n\n### Patch Changes\n\n- [#747](https://github.com/thundersdata-frontend/td-design/pull/747) [`d91317db1`](https://github.com/thundersdata-frontend/td-design/commit/d91317db103dfe4ed8bd4531f5c170f3602b0429) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复一些bug\n\n## 2.3.2\n\n### Patch Changes\n\n- [#722](https://github.com/thundersdata-frontend/td-design/pull/722) [`2b60004e7`](https://github.com/thundersdata-frontend/td-design/commit/2b60004e7fabcef3b6ae7346ba203e3f5ad710d5) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化选项滚动事件执行频次\n\n## 2.3.1\n\n### Patch Changes\n\n- [#714](https://github.com/thundersdata-frontend/td-design/pull/714) [`ef6d88136`](https://github.com/thundersdata-frontend/td-design/commit/ef6d88136421ea13b19b11730f94b589047c5a8b) Thanks [@chj-damon](https://github.com/chj-damon)! - 继续优化组件样式\n\n## 2.3.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 样式优化\n\n## 2.2.1\n\n### Patch Changes\n\n- [#696](https://github.com/thundersdata-frontend/td-design/pull/696) [`9c03dda70`](https://github.com/thundersdata-frontend/td-design/commit/9c03dda70a896d25a22a1dabadff55721e17ce91) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 Picker 组件样式问题\n\n## 2.2.0\n\n### Minor Changes\n\n- [#677](https://github.com/thundersdata-frontend/td-design/pull/677) [`51d50f49a`](https://github.com/thundersdata-frontend/td-design/commit/51d50f49a20d7068337b2f48df320e2a781b85f7) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 DatePicker 相关组件内存溢出的 bug 重构 Cascader 组件为函数式组件\n\n## 2.1.2\n\n### Patch Changes\n\n- [#666](https://github.com/thundersdata-frontend/td-design/pull/666) [`c59bc62c0`](https://github.com/thundersdata-frontend/td-design/commit/c59bc62c0d387c14abf53f5da24f5a1ddf07e0ec) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 为 NumberKeyboard 组件新增`extra`属性 2. 修改 WheelPickerItem 组件,让文字效果更好 3. 优化 theme 文件内关于`textVariants`的定义 4. 为 Tag 组件新增`selectable`属性控制是否可选中\n\n## 2.1.1\n\n### Patch Changes\n\n- [#658](https://github.com/thundersdata-frontend/td-design/pull/658) [`b75b9cda3`](https://github.com/thundersdata-frontend/td-design/commit/b75b9cda3642d6c8b75652a8d8feff51a09d4035) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复在级联选择时没有刷新的问题\n\n## 2.1.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n## 2.0.5\n\n### Patch Changes\n\n- [#625](https://github.com/thundersdata-frontend/td-design/pull/625) [`5efa85848`](https://github.com/thundersdata-frontend/td-design/commit/5efa858485f78542b293404baa504e11182830bb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 useTheme 引入路径不正确导致报错的问题\n\n## 2.0.4\n\n### Patch Changes\n\n- [#611](https://github.com/thundersdata-frontend/td-design/pull/611) [`0e334a77e`](https://github.com/thundersdata-frontend/td-design/commit/0e334a77e7cbf25a446f962e90d8645f5dfafa4b) Thanks [@chj-damon](https://github.com/chj-damon)! - 防御性修改防止 RN 对&&的判断问题\n\n## 2.0.3\n\n### Patch Changes\n\n- [#604](https://github.com/thundersdata-frontend/td-design/pull/604) [`42354300c`](https://github.com/thundersdata-frontend/td-design/commit/42354300c885e04812a0d2f65ea0b59bac3be6f2) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 picker 滚动后无法选中第一条数据的问题\n\n## 2.0.2\n\n### Patch Changes\n\n- [#597](https://github.com/thundersdata-frontend/td-design/pull/597) [`f80645f2b`](https://github.com/thundersdata-frontend/td-design/commit/f80645f2b22986770d5276e48bc4138c913d3702) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 WheelPicker 滚动异常的问题\n\n## 2.0.1\n\n### Patch Changes\n\n- [#589](https://github.com/thundersdata-frontend/td-design/pull/589) [`6bd906307`](https://github.com/thundersdata-frontend/td-design/commit/6bd90630781c3769af64ab0983f8d050daca6c0c) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复 useUpdateEffect 第一次不会执行的问题\n\n## 2.0.0\n\n### Major Changes\n\n- [`124097240`](https://github.com/thundersdata-frontend/td-design/commit/1240972402c5a81da22aa618341eed07075ee17e) Thanks [@chj-damon](https://github.com/chj-damon)! - 使用 JS 重写 WheelPicker 减少对第三方库的依赖\n\n## 1.10.3\n\n### Patch Changes\n\n- [`01b225c70`](https://github.com/thundersdata-frontend/td-design/commit/01b225c704528343f5e3720010f4f83e661f0d6a) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 IOS 上字体太大导致出现省略号的 bug\n\n## 1.10.2\n\n### Patch Changes\n\n- [`4efbfc3c0`](https://github.com/thundersdata-frontend/td-design/commit/4efbfc3c0584e02326258ee01d62627c5f34525b) - 优化组件样式\n\n## 1.10.1\n\n### Patch Changes\n\n- [#547](https://github.com/thundersdata-frontend/td-design/pull/547) [`fac4e4a80`](https://github.com/thundersdata-frontend/td-design/commit/fac4e4a8046925f7f8a4fc0019387f4adb164959) Thanks [@chen929104](https://github.com/chen929104)! - 修复 picker-input flex:1 导致的高度无效\n\n## 1.10.0\n\n### Minor Changes\n\n- [`52fda6b15`](https://github.com/thundersdata-frontend/td-design/commit/52fda6b158960e1c4152f06b711c95438052afc1) - 为日期选择输入框增加 disabled 属性\n\n## 1.9.4\n\n### Patch Changes\n\n- [`e749c01a6`](https://github.com/thundersdata-frontend/td-design/commit/e749c01a6daa53c1171104b30b720dc3625ce1f9) - 去除一些使用 useMemo 的过度优化场景\n"
  },
  {
    "path": "packages/react-native-picker/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-picker\",\n  \"version\": \"5.0.0\",\n  \"description\": \"基于 @td-design/react-native 的 picker 组件\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"dependencies\": {\n    \"array-tree-filter\": \"^2.1.0\",\n    \"dayjs\": \"^1.11.9\",\n    \"lodash-es\": \"^4.17.21\"\n  },\n  \"devDependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@td-design/rn-hooks\": \"workspace:^2.8.1\",\n    \"@types/lodash-es\": \"^4.17.8\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-gesture-handler\": \"^2.12.0\",\n    \"react-native-reanimated\": \"^3.3.0\",\n    \"react-native-safe-area-context\": \"^4.7.1\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/cascade-picker/index.tsx",
    "content": "import React, { ForwardedRef } from 'react';\nimport { Modal, StyleSheet } from 'react-native';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { Box, Flex, helpers, Pressable, Text } from '@td-design/react-native';\n\nimport WheelPicker from '../components/WheelPicker';\nimport { CascaderProps, PickerRef } from '../type';\nimport useCascader from './useCascader';\n\nconst { ONE_PIXEL, px } = helpers;\n\nfunction Cascader(\n  {\n    data,\n    cols = 3,\n    activeOpacity = 0.6,\n    title,\n    cancelText = '取消',\n    okText = '确定',\n    value,\n    onChange,\n    ...restProps\n  }: CascaderProps,\n  ref: ForwardedRef<PickerRef>\n) {\n  const { childrenTree, stateValue, handleValueChange, handleOk, handleClose, visible } = useCascader({\n    data,\n    cols,\n    value,\n    onChange,\n    ref,\n  });\n\n  const { bottom } = useSafeAreaInsets();\n\n  if (childrenTree.length === 0) return null;\n\n  return (\n    <Modal visible={visible} statusBarTranslucent animationType=\"none\" transparent>\n      <GestureHandlerRootView style={{ flex: 1 }}>\n        <Box flex={1} justifyContent={'flex-end'} style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}>\n          <Flex\n            borderBottomWidth={ONE_PIXEL}\n            borderBottomColor=\"border\"\n            backgroundColor=\"white\"\n            paddingVertical=\"x3\"\n            paddingHorizontal=\"x3\"\n          >\n            <Pressable activeOpacity={activeOpacity} onPress={handleClose} style={styles.cancel}>\n              <Text variant=\"p0\" color=\"primary200\">\n                {cancelText}\n              </Text>\n            </Pressable>\n            <Flex.Item alignItems=\"center\">\n              <Text variant=\"p0\" color=\"text\">\n                {title}\n              </Text>\n            </Flex.Item>\n            <Pressable activeOpacity={activeOpacity} onPress={handleOk} style={styles.submit}>\n              <Text variant=\"p0\" color=\"primary200\">\n                {okText}\n              </Text>\n            </Pressable>\n          </Flex>\n          <Flex backgroundColor={'white'} height={px(200)} style={{ paddingBottom: bottom }}>\n            {childrenTree.map((item, index) => (\n              <WheelPicker\n                key={index}\n                {...restProps}\n                {...{ data: item.map(el => ({ ...el, value: el.value })), value: stateValue[index] }}\n                onChange={value => handleValueChange(value, index)}\n              />\n            ))}\n          </Flex>\n        </Box>\n      </GestureHandlerRootView>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  cancel: { justifyContent: 'center', alignItems: 'flex-start' },\n  submit: { justifyContent: 'center', alignItems: 'flex-end' },\n});\n\nexport default React.forwardRef(Cascader);\n"
  },
  {
    "path": "packages/react-native-picker/src/cascade-picker/useCascader.ts",
    "content": "import { ForwardedRef, useImperativeHandle, useMemo } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport arrayTreeFilter from 'array-tree-filter';\n\nimport { CascadePickerItemProps, PickerData } from '../components/WheelPicker/type';\nimport { CascaderProps, PickerRef } from '../type';\n\nexport default function useCascader({\n  data,\n  cols = 3,\n  value,\n  onChange,\n  ref,\n}: Pick<CascaderProps, 'data' | 'cols' | 'value' | 'onChange'> & {\n  ref: ForwardedRef<PickerRef>;\n}) {\n  const [stateValue, setStateValue] = useSafeState<(string | number)[]>(generateNextValue(data, value, cols));\n  const [visible, setVisible] = useSafeState(false);\n\n  useImperativeHandle(ref, () => ({\n    show: () => {\n      setVisible(true);\n    },\n    hide: () => {\n      setVisible(false);\n    },\n  }));\n\n  const handleValueChange = (value: PickerData<string | number>, index: number) => {\n    const newValue = [...stateValue];\n    // 修改当前的值，然后把后面的值都清掉\n    newValue[index] = value.value;\n    newValue.length = index + 1;\n    const nextValue = generateNextValue(data, newValue, cols);\n    setStateValue(nextValue);\n  };\n\n  const handleOk = () => {\n    onChange?.(stateValue);\n    setVisible(false);\n  };\n\n  const handleClose = () => {\n    const nextValue = generateNextValue(data, value, cols);\n    setStateValue(nextValue);\n    setVisible(false);\n  };\n\n  const childrenTree = useMemo(() => {\n    const childrenTree = arrayTreeFilter(data, (c, level) => {\n      return c.value === stateValue[level];\n    }).map(c => c.children);\n\n    // in case the users data is async get when select change\n    const needPad = cols - childrenTree.length;\n    if (needPad > 0) {\n      for (let i = 0; i < needPad; i++) {\n        childrenTree.push([]);\n      }\n    }\n    childrenTree.length = cols! - 1;\n    childrenTree.unshift(data);\n\n    return childrenTree as CascadePickerItemProps<string | number>[][];\n  }, [data, stateValue, cols]);\n\n  return {\n    stateValue,\n    childrenTree,\n    visible,\n    handleValueChange: useMemoizedFn(handleValueChange),\n    handleOk: useMemoizedFn(handleOk),\n    handleClose: useMemoizedFn(handleClose),\n  };\n}\n\nfunction generateNextValue<T>(data: CascadePickerItemProps<T>[], value: T[] | undefined, cols: number) {\n  let d = data;\n  let level = 0;\n  const nextValue: T[] = [];\n\n  if (value && value.length) {\n    do {\n      const index = d.findIndex(item => item.value === value[level]);\n\n      if (index < 0) {\n        break;\n      }\n\n      nextValue[level] = value[level];\n      level += 1;\n      d = d[index].children || [];\n    } while (d.length > 0);\n  }\n\n  for (let i = level; i < cols; i++) {\n    if (d && d.length) {\n      nextValue[i] = d[0].value!;\n      d = d[0].children || [];\n    } else {\n      break;\n    }\n  }\n  return nextValue;\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/components/DatePicker/index.tsx",
    "content": "import React, { FC } from 'react';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { Flex } from '@td-design/react-native';\nimport dayjs from 'dayjs';\n\nimport WheelPicker from '../WheelPicker';\nimport { DatePickerPropsBase } from './type';\nimport useDatePicker from './useDatePicker';\n\nconst DatePicker: FC<\n  Omit<DatePickerPropsBase, 'mode' | 'labelUnit' | 'format'> &\n    Required<Pick<DatePickerPropsBase, 'mode' | 'labelUnit' | 'format'>>\n> = ({ value = new Date(), minDate, maxDate, mode, labelUnit, format, onChange, ...restProps }) => {\n  const { onValueChange, getValueCols } = useDatePicker({\n    minDate,\n    maxDate,\n    mode,\n    labelUnit,\n    format,\n    value,\n    onChange,\n  });\n\n  const { bottom } = useSafeAreaInsets();\n  const { values, cols } = getValueCols();\n\n  return (\n    <Flex backgroundColor=\"white\" style={{ paddingBottom: bottom }}>\n      {cols.map((col, index) => {\n        return (\n          <WheelPicker\n            key={index}\n            {...restProps}\n            data={col}\n            value={values[index]}\n            onChange={value => onValueChange(value, index)}\n          />\n        );\n      })}\n    </Flex>\n  );\n};\n\nexport default React.memo(DatePicker, (p, n) => {\n  if (!p.value || !n.value) {\n    return true;\n  }\n\n  return dayjs(p.value).isSame(dayjs(n.value));\n});\n"
  },
  {
    "path": "packages/react-native-picker/src/components/DatePicker/type.ts",
    "content": "import { SyntheticEvent } from 'react';\n\nimport { ModalPickerProps } from '../../type';\nimport { CascadePickerItemProps, WheelPickerPropsBase } from '../WheelPicker/type';\n\nexport type Event = SyntheticEvent<\n  Readonly<{\n    timestamp: number;\n  }>\n>;\n\ntype DateMode = 'datetime' | 'date' | 'time' | 'month' | 'year';\ntype LabelUnit = { year: string; month: string; day: string; hour: string; minute: string };\n\ntype DateUnit = 'year' | 'month' | 'date' | 'hour' | 'minute';\ntype DateRef = { [key in DateUnit]: string };\nexport interface DatePickerPropsBase extends WheelPickerPropsBase {\n  /** 显示模式 */\n  mode?: DateMode;\n  /** 单位文字 */\n  labelUnit?: LabelUnit;\n  /** 日期格式化 */\n  format?: string;\n  /** 当前日期 */\n  value?: Date;\n  /** 日期修改事件 */\n  onChange?: (date?: Date, formatDate?: string) => void;\n  /** 最小日期 */\n  minDate?: Date | string;\n  /** 最大日期 */\n  maxDate?: Date | string;\n}\n\nexport { CascadePickerItemProps, ModalPickerProps, DateUnit, DateRef };\n"
  },
  {
    "path": "packages/react-native-picker/src/components/DatePicker/useDatePicker.ts",
    "content": "import { useMemo } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport dayjs, { Dayjs } from 'dayjs';\n\nimport { PickerData } from '../WheelPicker/type';\nimport { CascadePickerItemProps, DatePickerPropsBase } from './type';\n\nexport default function useDatePicker<T>({\n  mode,\n  labelUnit,\n  format,\n  value,\n  minDate = '1970-01-01',\n  maxDate = '2100-01-01',\n  onChange,\n}: Required<Pick<DatePickerPropsBase, 'value' | 'mode' | 'labelUnit' | 'format'>> &\n  Pick<DatePickerPropsBase, 'minDate' | 'maxDate' | 'onChange'>) {\n  const minDayjs = useMemo(() => dayjs(minDate), [minDate]);\n  const maxDayjs = useMemo(() => dayjs(maxDate), [maxDate]);\n\n  const [tempValue, setTempValue] = useSafeState(value ?? new Date());\n\n  const clipDate = (date: Date) => {\n    if (mode === 'datetime') {\n      if (dayjs(date).isBefore(minDayjs)) {\n        return cloneDate(minDayjs);\n      }\n      if (dayjs(date).isAfter(maxDayjs)) {\n        return cloneDate(maxDayjs);\n      }\n    } else if (mode === 'date' || mode === 'year' || mode === 'month') {\n      if (dayjs(date).add(1, 'day').isBefore(minDayjs)) {\n        return cloneDate(minDayjs);\n      }\n      if (dayjs(date).isAfter(maxDayjs.add(1, 'day'))) {\n        return cloneDate(maxDayjs);\n      }\n    }\n    return dayjs(date);\n  };\n\n  const getDate = () => {\n    return clipDate(tempValue);\n  };\n\n  const getMinYear = () => {\n    return minDayjs.get('year');\n  };\n\n  const getMaxYear = () => {\n    return maxDayjs.get('year');\n  };\n\n  const getMinMonth = () => {\n    return minDayjs.get('month');\n  };\n\n  const getMaxMonth = () => {\n    return maxDayjs.get('month');\n  };\n\n  const getMinDay = () => {\n    return minDayjs.get('date');\n  };\n\n  const getMaxDay = () => {\n    return maxDayjs.get('date');\n  };\n\n  const cloneDate = (date: Dayjs) => {\n    return dayjs(date);\n  };\n\n  const getDateData = () => {\n    const date = getDate();\n    const selYear = date.get('year');\n    const selMonth = date.get('month');\n    const minDateYear = getMinYear();\n    const maxDateYear = getMaxYear();\n    const minDateMonth = getMinMonth();\n    const maxDateMonth = getMaxMonth();\n    const minDateDay = getMinDay();\n    const maxDateDay = getMaxDay();\n\n    const years: CascadePickerItemProps<T>[] = [];\n    for (let i = minDateYear; i <= maxDateYear; i++) {\n      years.push({\n        value: (i + '') as T,\n        label: i + labelUnit.year,\n      });\n    }\n    if (mode === 'year') {\n      return [years];\n    }\n\n    const months: CascadePickerItemProps<T>[] = [];\n    let minMonth = 0;\n    let maxMonth = 11;\n    if (minDateYear === selYear) {\n      minMonth = minDateMonth;\n    }\n    if (maxDateYear === selYear) {\n      maxMonth = maxDateMonth;\n    }\n\n    for (let i = minMonth; i <= maxMonth; i++) {\n      months.push({\n        value: (i + '') as T,\n        label: i + 1 + labelUnit.month,\n      });\n    }\n    if (mode === 'month') {\n      return [years, months];\n    }\n\n    const days: CascadePickerItemProps<T>[] = [];\n    let minDay = 1;\n    let maxDay = getDaysInMonth(date.toDate());\n\n    if (minDateYear === selYear && minDateMonth === selMonth) {\n      minDay = minDateDay;\n    }\n    if (maxDateYear === selYear && maxDateMonth === selMonth) {\n      maxDay = maxDateDay;\n    }\n    for (let i = minDay; i <= maxDay; i++) {\n      days.push({\n        value: (i + '') as T,\n        label: i + labelUnit.day,\n      });\n    }\n    return [years, months, days];\n  };\n\n  const getTimeData = (date: Dayjs) => {\n    let minHour = 0;\n    let maxHour = 23;\n    let minMinute = 0;\n    let maxMinute = 59;\n\n    const hours: CascadePickerItemProps<T>[] = [];\n    for (let i = minHour; i <= maxHour; i++) {\n      hours.push({\n        value: (i + '') as T,\n        label: labelUnit.hour ? i + labelUnit.hour + '' : pad(i),\n      });\n    }\n\n    const minutes: CascadePickerItemProps<T>[] = [];\n    const selMinute = date.get('minute');\n    for (let i = minMinute; i <= maxMinute; i += 1) {\n      minutes.push({\n        value: (i + '') as T,\n        label: labelUnit.minute ? i + labelUnit.minute + '' : pad(i),\n      });\n      if (selMinute > i && selMinute < i + 1) {\n        minutes.push({\n          value: (selMinute + '') as T,\n          label: labelUnit.minute ? selMinute + labelUnit.minute + '' : pad(selMinute),\n        });\n      }\n    }\n    const cols = [hours, minutes].concat([]);\n\n    return { cols, selMinute };\n  };\n\n  const getValueCols = () => {\n    const date = getDate();\n    let cols: CascadePickerItemProps<T>[][] = [];\n    let values: string[] = [];\n\n    if (mode === 'year') {\n      return {\n        cols: getDateData(),\n        values: [date.get('year') + ''],\n      };\n    }\n\n    if (mode === 'month') {\n      return {\n        cols: getDateData(),\n        values: [date.get('year') + '', date.get('month') + ''],\n      };\n    }\n\n    if (mode === 'datetime' || mode === 'date') {\n      cols = getDateData();\n      values = [date.get('year') + '', date.get('month') + '', date.get('date') + ''];\n    }\n\n    if (mode === 'datetime' || mode === 'time') {\n      const time = getTimeData(date);\n      cols = cols.concat(time.cols);\n      const hour = date.get('hour');\n      const dtValue = [hour + '', time.selMinute + ''];\n      values = values.concat(dtValue);\n    }\n\n    return {\n      values,\n      cols,\n    };\n  };\n\n  const setMonth = (date: Date, month: number) => {\n    date.setDate(Math.min(date.getDate(), getDaysInMonth(new Date(date.getFullYear(), month))));\n    date.setMonth(month);\n    return dayjs(date);\n  };\n\n  const getNewDate = (value: number, index: number) => {\n    const date = cloneDate(getDate());\n    let newValue: Dayjs | undefined = undefined;\n\n    if (mode === 'datetime' || mode === 'date' || mode === 'year' || mode === 'month') {\n      switch (index) {\n        case 0:\n          newValue = date.set('year', value);\n          break;\n        case 1:\n          newValue = setMonth(date.toDate(), value);\n          break;\n        case 2:\n          newValue = date.set('date', value);\n          break;\n        case 3:\n          newValue = date.set('hour', value);\n          break;\n        case 4:\n          newValue = date.set('minute', value);\n          break;\n        default:\n          break;\n      }\n    } else if (mode === 'time') {\n      switch (index) {\n        case 0:\n          newValue = date.set('hour', value);\n          break;\n        case 1:\n          newValue = date.set('minute', value);\n          break;\n        default:\n          break;\n      }\n    }\n    return clipDate(newValue!.toDate());\n  };\n\n  const onValueChange = (data: PickerData<T>, index: number) => {\n    const newDate = getNewDate(parseInt(data.value + '', 10), index);\n    setTempValue(newDate.toDate());\n    onChange?.(newDate.toDate(), newDate.format(format));\n  };\n\n  return {\n    getValueCols: useMemoizedFn(getValueCols),\n    onValueChange: useMemoizedFn(onValueChange),\n  };\n}\n\nfunction pad(n: number) {\n  return n < 10 ? `0${n}` : n + '';\n}\n\nfunction getDaysInMonth(date: Date) {\n  return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/components/WheelPicker/index.tsx",
    "content": "import React from 'react';\nimport { StyleSheet, View } from 'react-native';\nimport { PanGestureHandler } from 'react-native-gesture-handler';\nimport Animated, {\n  Easing,\n  Extrapolate,\n  interpolate,\n  runOnJS,\n  SharedValue,\n  useAnimatedGestureHandler,\n  useAnimatedStyle,\n  useDerivedValue,\n  useSharedValue,\n  withTiming,\n} from 'react-native-reanimated';\n\nimport { CascadePickerItemProps, WheelPickerProps } from './type';\n\nexport default function WheelPicker<T>({\n  itemHeight = 40,\n  data,\n  visibleRest = 5,\n  textStyle,\n  contentContainerStyle,\n  indicatorBgColor = 'rgba(0, 0, 0, 0.3)',\n  value,\n  onChange,\n  ...props\n}: WheelPickerProps<T>) {\n  const initialIndex = value ? data.findIndex(item => item.value === value) : 0;\n  const translateY = useSharedValue(-itemHeight * initialIndex);\n\n  const snapPoints = new Array(data.length).fill(0).map((_, index) => -itemHeight * index);\n\n  const timingConfig = {\n    duration: 1000,\n    easing: Easing.bezier(0.35, 1, 0.35, 1),\n  };\n\n  const wrapper = (index: number) => {\n    onChange?.(data[index], index);\n  };\n\n  const onGestureEvent = useAnimatedGestureHandler({\n    onStart(_, ctx: any) {\n      ctx.y = translateY.value;\n    },\n    onActive(event, ctx) {\n      translateY.value = ctx.y + event.translationY;\n    },\n    onEnd(event) {\n      const snapPointsY = snapPoint(translateY.value, event.velocityY, snapPoints);\n      const index = Math.abs(snapPointsY / itemHeight);\n      translateY.value = withTiming(snapPointsY, timingConfig);\n      runOnJS(wrapper)(index);\n    },\n  });\n\n  const animatedStyle = useAnimatedStyle(() => ({\n    transform: [{ translateY: translateY.value }],\n  }));\n\n  return (\n    <View {...props} style={styles.container}>\n      <PanGestureHandler onGestureEvent={onGestureEvent}>\n        <Animated.View\n          style={[\n            animatedStyle,\n            contentContainerStyle,\n            {\n              height: itemHeight * visibleRest,\n              paddingTop: (itemHeight * visibleRest - itemHeight) / 2,\n            },\n          ]}\n        >\n          {data.map((data, index) => (\n            <PickerItem\n              key={index}\n              translateY={translateY}\n              index={index}\n              itemHeight={itemHeight}\n              visibleRest={visibleRest}\n              data={data}\n              textStyle={textStyle}\n            />\n          ))}\n        </Animated.View>\n      </PanGestureHandler>\n      <View\n        style={{\n          width: '100%',\n          height: itemHeight,\n          backgroundColor: indicatorBgColor,\n          opacity: 0.2,\n          position: 'absolute',\n        }}\n        pointerEvents=\"none\"\n      />\n    </View>\n  );\n}\n\nfunction PickerItem<T>({\n  translateY,\n  index,\n  data,\n  itemHeight,\n  visibleRest,\n  textStyle,\n}: {\n  translateY: SharedValue<number>;\n  index: number;\n  data: CascadePickerItemProps<T>;\n} & Required<Pick<WheelPickerProps<T>, 'itemHeight' | 'visibleRest'>> &\n  Pick<WheelPickerProps<T>, 'textStyle'>) {\n  const y = useDerivedValue(() =>\n    interpolate(\n      translateY.value / -itemHeight,\n      [index - visibleRest / 2, index, index + visibleRest / 2],\n      [-1, 0, 1],\n      Extrapolate.CLAMP\n    )\n  );\n\n  const textAnimation = useAnimatedStyle(() => ({\n    opacity: 1 / (1 + Math.abs(y.value)),\n    transform: [\n      {\n        scale: 1 - Math.abs(y.value) * 0.35,\n      },\n      {\n        perspective: 500,\n      },\n      {\n        rotateX: `${y.value * 65}deg`,\n      },\n    ],\n  }));\n\n  return (\n    <Animated.View style={[styles.item, { height: itemHeight }]}>\n      <Animated.Text style={[textAnimation, textStyle]}>{data.label}</Animated.Text>\n    </Animated.View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    overflow: 'hidden',\n    justifyContent: 'center',\n    position: 'relative',\n  },\n  item: {\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n});\n\n/**\n * @summary Select a point where the animation should snap to given the value of the gesture and it's velocity.\n * @worklet\n */\nconst snapPoint = (value: number, velocity: number, points: ReadonlyArray<number>): number => {\n  'worklet';\n  const point = value + 0.2 * velocity;\n  const deltas = points.map(p => Math.abs(point - p));\n  const minDelta = Math.min.apply(null, deltas);\n  return points.find(p => Math.abs(point - p) === minDelta) || points[0];\n};\n"
  },
  {
    "path": "packages/react-native-picker/src/components/WheelPicker/type.ts",
    "content": "import { StyleProp, TextStyle, ViewProps, ViewStyle } from 'react-native';\nimport { SharedValue } from 'react-native-reanimated';\n\nexport type PickerData<T> = {\n  label: string;\n  value: T;\n};\n\nexport interface CascadePickerItemProps<T> extends PickerData<T> {\n  children?: CascadePickerItemProps<T>[];\n}\n\nexport type WheelPickerPropsBase = {\n  itemHeight?: number;\n  visibleRest?: number;\n  textStyle?: StyleProp<TextStyle>;\n  contentContainerStyle?: StyleProp<ViewStyle>;\n  indicatorBgColor?: string;\n};\n\n/** 滚轮选择器的属性 */\nexport type WheelPickerProps<T> = ViewProps &\n  WheelPickerPropsBase & {\n    /** 数据行数组 */\n    data: CascadePickerItemProps<T>[];\n    /** 当前选中的数据行下标 */\n    value?: T;\n    /** 选择数据行的处理函数 */\n    onChange?: (value: PickerData<T>, index: number) => void;\n  };\n\n/** 滚轮选择器子项的属性 */\nexport type WheelPickerItemProps<T> = {\n  translateY: SharedValue<number>;\n  index: number;\n  data: PickerData<T>;\n} & Required<Pick<WheelPickerProps<T>, 'itemHeight' | 'visibleRest'>> &\n  Pick<WheelPickerProps<T>, 'textStyle'>;\n"
  },
  {
    "path": "packages/react-native-picker/src/date-period-input/index.md",
    "content": "---\ntitle: DatePeriodInput - 日期区间输入\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 选择组件\n  path: /picker\n  order: 9\n---\n\n# DatePeriodInput 日期区间输入\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<DatePeriodInput label=\"订单时间\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644824685474919859.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性                     | 必填    | 说明                         | 类型            | 默认值                 |\n| ------------------------ | ------- | ---------------------------- | --------------- | ---------------------- | -------------------- | --- |\n| indicatorBackgroundColor | `false` | 指示器背景色                 | `string`        |                        |\n| itemTextStyle            | `false` | 数据行文字样式               | `TextStyle`     |                        |\n| itemHeight               | `false` | 数据行高度                   | `number`        |                        |\n| itemStyle                | `false` | 数据行样式                   | `ViewStyle`     |                        |\n| containerStyle           | `false` | 选择器容器样式               | `ViewStyle`     |                        |\n| mode                     | `false` | 显示模式                     | `DateMode`      |                        |\n| labelUnit                | `false` | 单位文字                     | `LabelUnit`     |                        |\n| format                   | `false` | 日期格式化                   | `string`        | `YYYY-MM-DD`           |\n| title                    | `false` | 选择器标题                   | `string`        |                        |\n| onClose                  | `false` | 弹窗关闭事件                 | `() => void`    |                        |\n| cancelText               | `false` | 取消按钮文本                 | `string`        | `取消`                 |\n| okText                   | `false` | 确认按钮文本                 | `string`        | `确定`                 |\n| activeOpacity            | `false` | 按下时的不透明度             | `number`        | `0.6`                  |\n| label                    | `false` | 标签文本                     | `ReactNode`     |                        |\n| labelPosition            | `false` | 标签位置。输入框左侧或者顶部 | `left` \\| `top` | `left`                 |\n| colon                    | `false` | 是否在标签后显示冒号         | `boolean`       | `false`                |\n| required                 | `false` | 是否在标签前显示必填标识     | `boolean`       | `false`                |\n| placeholders             | `false` | 默认提示语                   | `string[]`      | `['请选择', '请选择']` |\n| value                    | `false` | 当前日期                     | `[Date          | undefined, Date        | undefined]`          |     |\n| onChange                 | `false` | 修改日期事件                 | `(value: [Date  | undefined, Date        | undefined]) => void` |     |\n| allowClear               | `false` | 是否允许清除                 | `boolean`       | `true`                 |\n| disabled                 | `false` | 是否禁用                     | `boolean`       | `false`                |\n"
  },
  {
    "path": "packages/react-native-picker/src/date-period-input/index.tsx",
    "content": "import React, { FC, ReactNode } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { Box, Brief, Flex, helpers, Label, Pressable, SvgIcon, Text, useTheme } from '@td-design/react-native';\nimport dayjs from 'dayjs';\n\nimport { DatePickerPropsBase, ModalPickerProps } from '../components/DatePicker/type';\nimport DatePicker from '../date-picker';\nimport useDatePeriodInput from './useDatePeriodInput';\n\nexport interface DatePeriodInputProps\n  extends Omit<DatePickerPropsBase, 'value' | 'onChange' | 'minDate' | 'maxDate'>,\n    Omit<ModalPickerProps, 'visible' | 'displayType'> {\n  /** 标签文本 */\n  label?: ReactNode;\n  /** 标签文本位置 */\n  labelPosition?: 'top' | 'left';\n  /** 是否显示冒号 */\n  colon?: boolean;\n  /** 是否必填 */\n  required?: boolean;\n  /** 默认提示语 */\n  placeholders?: string[];\n  value?: [Date | undefined, Date | undefined];\n  onChange?: (value: [Date | undefined, Date | undefined]) => void;\n  /** 是否允许清除 */\n  allowClear?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 额外内容 */\n  brief?: ReactNode;\n  itemHeight?: number;\n}\n\nconst { ONE_PIXEL } = helpers;\n\n/** 适用于筛选条件下的日期区间选择 */\nconst DatePeriodInput: FC<DatePeriodInputProps> = ({\n  label,\n  labelPosition = 'left',\n  required = false,\n  colon = false,\n  placeholders = ['请选择', '请选择'],\n  format = 'YYYY-MM-DD',\n  value,\n  onChange,\n  allowClear = true,\n  disabled = false,\n  itemHeight,\n  activeOpacity = 0.6,\n  brief,\n  ...restProps\n}) => {\n  const theme = useTheme();\n  const { dates, order, datePickerRef, handleChange, handleStartPress, handleEndPress, clearStartDate, clearEndDate } =\n    useDatePeriodInput({\n      value,\n      onChange,\n    });\n\n  const styles = StyleSheet.create({\n    content: {\n      paddingVertical: theme.spacing.x2,\n      paddingHorizontal: theme.spacing.x1,\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      flexDirection: 'row',\n    },\n    icon: { alignItems: 'flex-end' },\n  });\n\n  const Content = (\n    <Flex\n      justifyContent=\"space-between\"\n      alignItems=\"center\"\n      borderWidth={ONE_PIXEL}\n      borderColor=\"border\"\n      borderRadius=\"x1\"\n      style={{\n        ...(itemHeight ? { height: itemHeight } : {}),\n        ...(labelPosition === 'top' ? {} : { flex: 1 }),\n      }}\n    >\n      <Pressable disabled={disabled} onPress={handleStartPress} activeOpacity={activeOpacity} style={styles.content}>\n        <Flex>\n          <SvgIcon name=\"date\" color={theme.colors.icon} />\n          <Text variant=\"p2\" color={disabled ? 'disabled' : dates[0] ? 'text' : 'gray300'} marginLeft=\"x2\">\n            {dates[0] ? dayjs(dates[0]).format(format) : placeholders[0]}\n          </Text>\n        </Flex>\n        {!disabled && allowClear && dates[0] && (\n          <Pressable activeOpacity={1} onPress={clearStartDate} hitOffset={10} style={styles.icon}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n      </Pressable>\n      <Box paddingHorizontal=\"x2\">\n        <Text variant=\"p1\" color=\"text\">\n          ~\n        </Text>\n      </Box>\n      <Pressable disabled={disabled} onPress={handleEndPress} activeOpacity={activeOpacity} style={styles.content}>\n        <Flex>\n          <SvgIcon name=\"date\" color={theme.colors.icon} />\n          <Text variant=\"p2\" color={disabled ? 'disabled' : dates[1] ? 'text' : 'gray300'} marginLeft=\"x2\">\n            {dates[1] ? dayjs(dates[1]).format(format) : placeholders[1]}\n          </Text>\n        </Flex>\n        {!disabled && allowClear && dates[1] && (\n          <Pressable activeOpacity={1} onPress={clearEndDate} hitOffset={10} style={styles.icon}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n      </Pressable>\n    </Flex>\n  );\n\n  return (\n    <>\n      {labelPosition === 'top' ? (\n        <Box>\n          <Label {...{ label, colon, required }} />\n          {Content}\n          <Brief brief={brief} />\n        </Box>\n      ) : (\n        <Box>\n          <Flex>\n            <Label {...{ label, colon, required }} />\n            {Content}\n          </Flex>\n          <Brief brief={brief} />\n        </Box>\n      )}\n      <DatePicker\n        ref={datePickerRef}\n        value={order === 'start' ? dates[0] : dates[1]}\n        onChange={handleChange}\n        {...restProps}\n        minDate={order === 'end' ? dates[0] : undefined}\n        maxDate={order === 'start' ? dates[1] : undefined}\n      />\n    </>\n  );\n};\n\nexport default DatePeriodInput;\n"
  },
  {
    "path": "packages/react-native-picker/src/date-period-input/useDatePeriodInput.tsx",
    "content": "import { useRef } from 'react';\nimport { Keyboard } from 'react-native';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport type { DatePeriodInputProps } from '.';\nimport { DatePickerRef } from '../type';\n\nexport default function useDatePeriodInput({ value, onChange }: Pick<DatePeriodInputProps, 'value' | 'onChange'>) {\n  const datePickerRef = useRef<DatePickerRef>(null);\n  const [order, setOrder] = useSafeState<'start' | 'end'>('start');\n  const [dates, setDates] = useSafeState(value ?? [undefined, undefined]);\n\n  const handleChange = useMemoizedFn((date: Date | undefined) => {\n    const [startDate, endDate] = dates;\n    if (onChange) {\n      onChange(order === 'start' ? [date!, endDate] : [startDate, date!]);\n    } else {\n      setDates((draft: any[]) => {\n        const nextDates = [...draft];\n        nextDates[order === 'start' ? 0 : 1] = date;\n        return nextDates;\n      });\n    }\n  });\n\n  /** 点开开始时间选择器 */\n  const handleStartPress = () => {\n    Keyboard.dismiss();\n    setOrder('start');\n    datePickerRef.current?.show();\n  };\n\n  /** 点开结束时间选择器 */\n  const handleEndPress = () => {\n    Keyboard.dismiss();\n    setOrder('end');\n    datePickerRef.current?.show();\n  };\n\n  /**\n   * 清除开始时间\n   * 不光是要把date改掉，同时还需要判断结束时间是否有值\n   * 如果有值，需要设置结束时间为最大时间\n   * 如果没有值，则最大时间\n   */\n  const clearStartDate = () => {\n    const [, endDate] = value ?? [, undefined];\n    if (onChange) {\n      onChange([undefined, endDate]);\n    } else {\n      setDates(draft => [undefined, draft[1]]);\n    }\n  };\n\n  /** 清除结束时间 */\n  const clearEndDate = () => {\n    const [startDate] = value ?? [undefined];\n    if (onChange) {\n      onChange([startDate, undefined]);\n    } else {\n      setDates(draft => [draft[0], undefined]);\n    }\n  };\n\n  return {\n    dates,\n    order,\n    datePickerRef,\n    handleChange: useMemoizedFn(handleChange),\n    handleStartPress: useMemoizedFn(handleStartPress),\n    handleEndPress: useMemoizedFn(handleEndPress),\n    clearStartDate: useMemoizedFn(clearStartDate),\n    clearEndDate: useMemoizedFn(clearEndDate),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/date-picker/index.md",
    "content": "---\ntitle: DatePicker - 日期选择\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 选择组件\n  path: /picker\n---\n\n# DatePicker 日期选择\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Button title=\"显示\" onPress={() => setVisible(true)} />\n<Text>{formattedValue}</Text>\n<DatePicker\n  title=\"请选择日期\"\n  visible={visible}\n  onClose={() => setVisible(false)}\n  value={value}\n  onChange={(value, formattedValue) => {\n    setValue(value);\n    setFormattedValue(formattedValue)\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"datePicker-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607926683318866421.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 只显示年月日\n\n```tsx | pure\n<Button title=\"显示\" onPress={() => setVisible(true)} />\n<Text>{formattedValue}</Text>\n<DatePicker\n  title=\"请选择日期\"\n  display=\"Y-M-D\"\n  format=\"YYYY-MM-DD\"\n  visible={visible}\n  onClose={() => setVisible(false)}\n  value={value}\n  onChange={(value, formattedValue) => {\n    setValue(value);\n    setFormattedValue(formattedValue)\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"datePicker-ios2.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607927967538107659.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 直接在页面内展示\n\n```tsx | pure\nconst datePickerRef = useRef<{ getValue: () => { date: Date; formatDate: string } }>(null);\n\n<Button\n  title=\"getValue\"\n  onPress={() => {\n    if (datePickerRef.current) {\n      const { date, formatDate } = datePickerRef.current.getValue();\n      setValue(date);\n      setFormattedValue(formatDate);\n    }\n  }}\n/>\n<Text>{formattedValue}</Text>\n<DatePicker\n  ref={datePickerRef}\n  title=\"请选择日期\"\n  displayType=\"view\"\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"datePicker-ios3.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607929116069430286.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 展示顺序为分时日月年\n\n```tsx | pure\n<Button title=\"显示\" onPress={() => setVisible(true)} />\n<Text>{formattedValue}</Text>\n<DatePicker\n  title=\"请选择日期\"\n  display=\"T-H-D-M-Y\"\n  visible={visible}\n  onClose={() => setVisible(false)}\n  value={value}\n  onChange={handleChange}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"datePicker-ios4.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1607929412126551034.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### DatePicker 属性\n\n| 属性                     | 必填    | 说明             | 类型                                         | 默认值       |\n| ------------------------ | ------- | ---------------- | -------------------------------------------- | ------------ |\n| indicatorBackgroundColor | `false` | 指示器背景色     | `string`                                     |              |\n| itemTextStyle            | `false` | 数据行文字样式   | `TextStyle`                                  |              |\n| itemHeight               | `false` | 数据行高度       | `number`                                     |              |\n| itemStyle                | `false` | 数据行样式       | `ViewStyle`                                  |              |\n| containerStyle           | `false` | 选择器容器样式   | `ViewStyle`                                  |              |\n| mode                     | `false` | 显示模式         | `DateMode`                                   |              |\n| labelUnit                | `false` | 单位文字         | `LabelUnit`                                  |              |\n| format                   | `false` | 日期格式化       | `string`                                     | `YYYY-MM-DD` |\n| value                    | `false` | 当前日期         | `Date`                                       |              |\n| onChange                 | `false` | 日期修改事件     | `(date?: Date, formatDate?: string) => void` |              |\n| minDate                  | `false` | 最小日期         | `string`                                     |              |\n| maxDate                  | `false` | 最大日期         | `string`                                     |              |\n| title                    | `false` | 选择器标题       | `string`                                     |              |\n| displayType              | `false` | 选择器显示类型   | `view` \\| `modal`                            | `modal`      |\n| visible                  | `false` | 控制弹窗显示     | `boolean`                                    |              |\n| onClose                  | `false` | 弹窗关闭事件     | `() => void`                                 |              |\n| cancelText               | `false` | 取消按钮文本     | `string`                                     | `取消`       |\n| okText                   | `false` | 确认按钮文本     | `string`                                     | `确定`       |\n| activeOpacity            | `false` | 按下时的不透明度 | `number`                                     | `0.6`        |\n"
  },
  {
    "path": "packages/react-native-picker/src/date-picker/index.tsx",
    "content": "import React, { forwardRef } from 'react';\nimport { Modal, StyleSheet } from 'react-native';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\nimport { Box, Flex, helpers, Pressable, Text } from '@td-design/react-native';\n\nimport DatePickerRN from '../components/DatePicker';\nimport { DatePickerPropsBase, ModalPickerProps } from '../components/DatePicker/type';\nimport { DatePickerRef } from '../type';\nimport useDatePicker from './useDatePicker';\n\nconst { ONE_PIXEL } = helpers;\n\nexport type DatePickerProps = DatePickerPropsBase & ModalPickerProps;\n\nconst DatePicker = forwardRef<DatePickerRef, DatePickerProps>((props, ref) => {\n  const {\n    title,\n    format = 'YYYY-MM-DD HH:mm',\n    labelUnit = { year: '年', month: '月', day: '日', hour: '时', minute: '分' },\n    mode = 'date',\n    minDate,\n    maxDate,\n    value,\n    onChange,\n    cancelText = '取消',\n    okText = '确定',\n    activeOpacity = 0.6,\n    ...restProps\n  } = props;\n\n  const { date, handleChange, handleOk, handleClose, visible } = useDatePicker({\n    onChange,\n    value,\n    format,\n    ref,\n  });\n\n  return (\n    <Modal visible={visible} statusBarTranslucent animationType=\"none\" transparent>\n      <GestureHandlerRootView style={{ flex: 1 }}>\n        <Box flex={1} justifyContent={'flex-end'} style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}>\n          <Flex\n            borderBottomWidth={ONE_PIXEL}\n            borderBottomColor=\"border\"\n            backgroundColor=\"white\"\n            paddingVertical=\"x3\"\n            paddingHorizontal=\"x3\"\n          >\n            <Pressable activeOpacity={activeOpacity} onPress={handleClose} style={styles.cancel}>\n              <Text variant=\"p0\" color=\"primary200\">\n                {cancelText}\n              </Text>\n            </Pressable>\n            <Flex.Item alignItems=\"center\">\n              <Text variant=\"p0\" color=\"text\">\n                {title}\n              </Text>\n            </Flex.Item>\n            <Pressable activeOpacity={activeOpacity} onPress={handleOk} style={styles.submit}>\n              <Text variant=\"p0\" color=\"primary200\">\n                {okText}\n              </Text>\n            </Pressable>\n          </Flex>\n          <DatePickerRN\n            {...restProps}\n            {...{ mode, value: date, minDate, maxDate, labelUnit, format }}\n            onChange={handleChange}\n          />\n        </Box>\n      </GestureHandlerRootView>\n    </Modal>\n  );\n});\n\nexport default DatePicker;\n\nconst styles = StyleSheet.create({\n  cancel: { justifyContent: 'center', alignItems: 'flex-start' },\n  submit: { justifyContent: 'center', alignItems: 'flex-end' },\n});\n"
  },
  {
    "path": "packages/react-native-picker/src/date-picker/useDatePicker.ts",
    "content": "import { ForwardedRef, useImperativeHandle } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport dayjs from 'dayjs';\n\nimport { DatePickerPropsBase, ModalPickerProps } from '../components/DatePicker/type';\nimport { DatePickerRef } from '../type';\n\nexport default function useDatePicker({\n  onChange,\n  value,\n  format,\n  ref,\n}: DatePickerPropsBase &\n  ModalPickerProps & {\n    ref: ForwardedRef<DatePickerRef>;\n  }) {\n  const [date, setDate] = useSafeState<Date | undefined>(value);\n  const [visible, setVisible] = useSafeState(false);\n\n  useImperativeHandle(ref, () => ({\n    show: () => {\n      setVisible(true);\n    },\n    hide: () => {\n      setVisible(false);\n    },\n    getValue: () => {\n      return {\n        date,\n        formatDate: dayjs(date).format(format),\n      };\n    },\n  }));\n\n  const handleChange = (date?: Date) => {\n    setDate(date);\n  };\n\n  const handleClose = () => {\n    setDate(value);\n    setVisible(false);\n  };\n\n  const handleOk = () => {\n    const value = date ?? new Date();\n    onChange?.(value, dayjs(value).format(format));\n    setVisible(false);\n  };\n\n  return {\n    date,\n    visible,\n    handleChange: useMemoizedFn(handleChange),\n    handleOk: useMemoizedFn(handleOk),\n    handleClose: useMemoizedFn(handleClose),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/date-picker-input/index.md",
    "content": "---\ntitle: DatePickerInput - 日期表单输入\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 选择组件\n  path: /picker\n---\n\n# DatePickerInput 日期表单输入\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<DatePickerInput label=\"运单时间\" />\n<WhiteSpace />\n<DatePickerInput label=\"运单时间\" labelPosition=\"left\" />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644825070032852502.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性                     | 必填    | 说明             | 类型                                         | 默认值       |\n| ------------------------ | ------- | ---------------- | -------------------------------------------- | ------------ |\n| indicatorBackgroundColor | `false` | 指示器背景色     | `string`                                     |              |\n| itemTextStyle            | `false` | 数据行文字样式   | `TextStyle`                                  |              |\n| itemHeight               | `false` | 数据行高度       | `number`                                     |              |\n| itemStyle                | `false` | 数据行样式       | `ViewStyle`                                  |              |\n| containerStyle           | `false` | 选择器容器样式   | `ViewStyle`                                  |              |\n| mode                     | `false` | 显示模式         | `DateMode`                                   |              |\n| labelUnit                | `false` | 单位文字         | `LabelUnit`                                  |              |\n| format                   | `false` | 日期格式化       | `string`                                     | `YYYY-MM-DD` |\n| value                    | `false` | 当前日期         | `Date`                                       |              |\n| onChange                 | `false` | 日期修改事件     | `(date?: Date, formatDate?: string) => void` |              |\n| minDate                  | `false` | 最小日期         | `string`                                     |              |\n| maxDate                  | `false` | 最大日期         | `string`                                     |              |\n| title                    | `false` | 选择器标题       | `string`                                     |              |\n| onClose                  | `false` | 弹窗关闭事件     | `() => void`                                 |              |\n| cancelText               | `false` | 取消按钮文本     | `string`                                     | `取消`       |\n| okText                   | `false` | 确认按钮文本     | `string`                                     | `确定`       |\n| activeOpacity            | `false` | 按下时的不透明度 | `number`                                     | `0.6`        |\n| label                    | `false` | 标签文本         | `ReactNode`                                  |              |\n| labelPosition            | `false` | 标签文本位置     | `top \\| left`                                | `top`        |\n| required                 | `false` | 是否必填         | `boolean`                                    | `false`      |\n| colon                    | `false` | 是否显示冒号     | `boolean`                                    | `false`      |\n| placeholder              | `false` | 默认提示语       | `string`                                     | `请选择`     |\n| allowClear               | `false` | 是否允许清除     | `boolean`                                    | `true`       |\n| disabled                 | `false` | 是否禁用         | `boolean`                                    | `false`      |\n| brief                    | `false` | 额外内容         | `ReactNode`                                  |              |\n| style                    | `false` | 自定义样式       | `ViewStyle`                                  |              |\n"
  },
  {
    "path": "packages/react-native-picker/src/date-picker-input/index.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\n\nimport { Box, Brief, Flex, helpers, Label, Pressable, SvgIcon, Text, useTheme } from '@td-design/react-native';\n\nimport { DatePickerPropsBase } from '../components/DatePicker/type';\nimport DatePicker from '../date-picker';\nimport { ModalPickerProps } from '../type';\nimport useDatePicker from '../useDatePicker';\n\nexport interface DatePickerInputProps extends DatePickerPropsBase, Omit<ModalPickerProps, 'visible' | 'displayType'> {\n  /** 标签文本 */\n  label?: ReactNode;\n  /** 标签文本位置 */\n  labelPosition?: 'top' | 'left';\n  /** 是否显示冒号 */\n  colon?: boolean;\n  /** 是否必填 */\n  required?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 默认提示语 */\n  placeholder?: string;\n  /** 是否允许清除 */\n  allowClear?: boolean;\n  /** 额外内容 */\n  brief?: ReactNode;\n  style?: StyleProp<ViewStyle>;\n  itemHeight?: number;\n}\n\nconst { ONE_PIXEL } = helpers;\n\n/** 适用于筛选条件下的日期选择 */\nconst DatePickerInput = ({\n  label,\n  labelPosition = 'left',\n  placeholder = '请选择',\n  required = false,\n  colon = false,\n  format = 'YYYY-MM-DD',\n  value,\n  onChange,\n  style,\n  brief,\n  allowClear = true,\n  disabled = false,\n  itemHeight,\n  activeOpacity = 0.6,\n  ...restProps\n}: DatePickerInputProps) => {\n  const theme = useTheme();\n  const { date, handleChange, currentText, handleInputClear, handlePress, datePickerRef } = useDatePicker({\n    value,\n    format,\n    onChange,\n    placeholder,\n  });\n\n  const styles = StyleSheet.create({\n    content: {\n      paddingVertical: theme.spacing.x2,\n      paddingHorizontal: theme.spacing.x1,\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      flexDirection: 'row',\n      borderWidth: ONE_PIXEL,\n      borderColor: theme.colors.border,\n      borderRadius: theme.borderRadii.x1,\n    },\n    top: {},\n    left: { flex: 1 },\n    icon: { alignItems: 'flex-end' },\n  });\n\n  const Content = !disabled ? (\n    <Pressable\n      onPress={handlePress}\n      activeOpacity={activeOpacity}\n      style={[\n        itemHeight ? { height: itemHeight } : {},\n        styles.content,\n        style,\n        labelPosition === 'top' ? styles.top : styles.left,\n      ]}\n    >\n      <Flex flex={1}>\n        <SvgIcon name=\"date\" color={theme.colors.icon} />\n        <Text variant=\"p1\" color={currentText === placeholder ? 'gray300' : 'text'} marginLeft=\"x2\">\n          {currentText}\n        </Text>\n      </Flex>\n      <Flex>\n        {allowClear && !!currentText && currentText !== placeholder && (\n          <Pressable activeOpacity={1} onPress={handleInputClear} style={styles.icon}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n        <SvgIcon name=\"right\" color={theme.colors.icon} />\n      </Flex>\n    </Pressable>\n  ) : (\n    <Box style={[styles.content, style, labelPosition === 'top' ? styles.top : styles.left]}>\n      <Flex flex={1}>\n        <SvgIcon name=\"date\" color={theme.colors.icon} />\n        <Text variant=\"p1\" color={'disabled'} marginLeft=\"x2\">\n          {currentText}\n        </Text>\n      </Flex>\n    </Box>\n  );\n\n  return (\n    <>\n      {labelPosition === 'top' ? (\n        <Box>\n          <Label {...{ label, required, colon }} />\n          {Content}\n          <Brief brief={brief} />\n        </Box>\n      ) : (\n        <Box>\n          <Flex>\n            <Label {...{ label, required, colon }} />\n            {Content}\n          </Flex>\n          <Brief brief={brief} />\n        </Box>\n      )}\n      <DatePicker ref={datePickerRef} value={date} onChange={handleChange} {...restProps} />\n    </>\n  );\n};\nexport default DatePickerInput;\n"
  },
  {
    "path": "packages/react-native-picker/src/date-picker-item/index.md",
    "content": "---\ntitle: DatePickerItem - 日期列表表单输入\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 选择组件\n  path: /picker\n---\n\n# DatePickerItem 日期列表表单输入\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<DatePickerItem />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644825310419977747.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 在表单中效果\n\n```tsx | pure\n<FormListItem title=\"选择日期\" arrow=\"horizontal\" name=\"date1\" required rules={[{ required: true, message: '请选择' }]}>\n  <DatePickerItem />\n</FormListItem>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644825399805402640.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性                     | 必填    | 说明             | 类型                                         | 默认值       |\n| ------------------------ | ------- | ---------------- | -------------------------------------------- | ------------ |\n| indicatorBackgroundColor | `false` | 指示器背景色     | `string`                                     |              |\n| itemTextStyle            | `false` | 数据行文字样式   | `TextStyle`                                  |              |\n| itemHeight               | `false` | 数据行高度       | `number`                                     |              |\n| itemStyle                | `false` | 数据行样式       | `ViewStyle`                                  |              |\n| containerStyle           | `false` | 选择器容器样式   | `ViewStyle`                                  |              |\n| mode                     | `false` | 显示模式         | `DateMode`                                   |              |\n| labelUnit                | `false` | 单位文字         | `LabelUnit`                                  |              |\n| format                   | `false` | 日期格式化       | `string`                                     | `YYYY-MM-DD` |\n| value                    | `false` | 当前日期         | `Date`                                       |              |\n| onChange                 | `false` | 日期修改事件     | `(date?: Date, formatDate?: string) => void` |              |\n| minDate                  | `false` | 最小日期         | `string`                                     |              |\n| maxDate                  | `false` | 最大日期         | `string`                                     |              |\n| title                    | `false` | 选择器标题       | `string`                                     |              |\n| onClose                  | `false` | 弹窗关闭事件     | `() => void`                                 |              |\n| cancelText               | `false` | 取消按钮文本     | `string`                                     | `取消`       |\n| okText                   | `false` | 确认按钮文本     | `string`                                     | `确定`       |\n| placeholder              | `false` | 默认提示语       | `string`                                     | `请选择`     |\n| allowClear               | `false` | 是否允许清除     | `boolean`                                    | `true`       |\n| disabled                 | `false` | 是否禁用         | `boolean`                                    | `false`      |\n| style                    | `false` | 自定义样式       | `ViewStyle`                                  |              |\n| activeOpacity            | `false` | 按下时的不透明度 | `number`                                     | `0.6`        |\n"
  },
  {
    "path": "packages/react-native-picker/src/date-picker-item/index.tsx",
    "content": "import React from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\n\nimport { Box, Pressable, SvgIcon, Text, Theme, useTheme } from '@td-design/react-native';\n\nimport { DatePickerPropsBase } from '../components/DatePicker/type';\nimport DatePicker from '../date-picker';\nimport { ModalPickerProps } from '../type';\nimport useDatePicker from '../useDatePicker';\n\ninterface PickerItemProps extends DatePickerPropsBase, Omit<ModalPickerProps, 'visible' | 'displayType'> {\n  placeholder?: string;\n  /** 是否允许清除 */\n  allowClear?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  style?: StyleProp<ViewStyle>;\n  inForm?: boolean;\n}\n\nconst DatePickerItem = ({\n  placeholder = '请选择',\n  format = 'YYYY-MM-DD',\n  value,\n  onChange,\n  style,\n  allowClear = true,\n  disabled = false,\n  activeOpacity = 0.6,\n  inForm,\n  ...restProps\n}: PickerItemProps) => {\n  const theme = useTheme<Theme>();\n  const { date, handleChange, currentText, handleInputClear, handlePress, datePickerRef } = useDatePicker({\n    value,\n    format,\n    onChange,\n    placeholder,\n  });\n\n  const styles = StyleSheet.create({\n    content: {\n      justifyContent: 'flex-end',\n      alignItems: 'center',\n      flexDirection: 'row',\n      flexGrow: 1,\n      paddingHorizontal: theme.spacing[inForm ? 'x0' : 'x1'],\n    },\n    icon: { alignItems: 'flex-end' },\n  });\n\n  const Content = (\n    <>\n      <Text variant=\"p1\" color={disabled ? 'disabled' : currentText === placeholder ? 'gray300' : 'text'}>\n        {currentText}\n      </Text>\n      {!disabled && allowClear && !!currentText && currentText !== placeholder && (\n        <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10} style={styles.icon}>\n          <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n        </Pressable>\n      )}\n    </>\n  );\n\n  if (!disabled)\n    return (\n      <>\n        <Pressable onPress={handlePress} activeOpacity={activeOpacity} style={[styles.content, style]}>\n          {Content}\n        </Pressable>\n        <DatePicker ref={datePickerRef} value={date} onChange={handleChange} {...restProps} />\n      </>\n    );\n  return <Box style={[styles.content, style]}>{Content}</Box>;\n};\n\nexport default DatePickerItem;\n"
  },
  {
    "path": "packages/react-native-picker/src/index.ts",
    "content": "import { default as CascaderPicker } from './cascade-picker';\nimport { default as DatePeriodInput } from './date-period-input';\nimport { default as DatePicker } from './date-picker';\nimport { default as DatePickerInput } from './date-picker-input';\nimport { default as DatePickerItem } from './date-picker-item';\nimport { default as NormalPicker } from './normal-picker';\nimport { default as PickerInput } from './picker-input';\nimport { default as PickerItem } from './picker-item';\n\nexport {\n  DatePicker,\n  NormalPicker,\n  CascaderPicker,\n  DatePickerItem,\n  DatePeriodInput,\n  DatePickerInput,\n  PickerInput,\n  PickerItem,\n};\n"
  },
  {
    "path": "packages/react-native-picker/src/normal-picker/index.tsx",
    "content": "import React from 'react';\nimport { Modal, StyleSheet } from 'react-native';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { Box, Flex, helpers, Pressable, Text } from '@td-design/react-native';\n\nimport WheelPicker from '../components/WheelPicker';\nimport { NormalPickerProps, PickerRef } from '../type';\nimport useNormalPicker from './useNormalPicker';\n\nconst { ONE_PIXEL, px } = helpers;\nfunction NormalPicker(props: NormalPickerProps, ref: React.ForwardedRef<PickerRef>) {\n  const {\n    title,\n    data,\n    value,\n    onChange,\n    cancelText = '取消',\n    okText = '确定',\n    activeOpacity = 0.6,\n    ...restProps\n  } = props;\n\n  const { bottom } = useSafeAreaInsets();\n\n  const initialValue = data.length > 0 ? data[0].value : undefined;\n\n  const { selectedValue, handleOk, handleChange, handleClose, visible } = useNormalPicker({\n    value,\n    initialValue,\n    onChange,\n    ref,\n  });\n\n  if (data.length === 0) return null;\n\n  return (\n    <Modal visible={visible} statusBarTranslucent animationType=\"none\" transparent>\n      <GestureHandlerRootView style={{ flex: 1 }}>\n        <Box flex={1} justifyContent={'flex-end'} style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}>\n          <Flex\n            height={px(50)}\n            borderBottomWidth={ONE_PIXEL}\n            borderBottomColor=\"border\"\n            backgroundColor=\"white\"\n            paddingHorizontal=\"x3\"\n          >\n            <Pressable activeOpacity={activeOpacity} onPress={handleClose} style={styles.cancel}>\n              <Text variant=\"p0\" color=\"primary200\">\n                {cancelText}\n              </Text>\n            </Pressable>\n            <Flex.Item alignItems=\"center\">\n              <Text variant=\"p0\" color=\"text\">\n                {title}\n              </Text>\n            </Flex.Item>\n            <Pressable activeOpacity={activeOpacity} onPress={handleOk} style={styles.submit}>\n              <Text variant=\"p0\" color=\"primary200\">\n                {okText}\n              </Text>\n            </Pressable>\n          </Flex>\n          <Box height={px(200)} backgroundColor=\"white\" style={{ paddingBottom: bottom }}>\n            <WheelPicker {...restProps} data={data} value={selectedValue} onChange={handleChange} />\n          </Box>\n        </Box>\n      </GestureHandlerRootView>\n    </Modal>\n  );\n}\n\nexport default React.forwardRef(NormalPicker);\n\nconst styles = StyleSheet.create({\n  cancel: { justifyContent: 'center', alignItems: 'flex-start' },\n  submit: { justifyContent: 'center', alignItems: 'flex-end' },\n});\n"
  },
  {
    "path": "packages/react-native-picker/src/normal-picker/useNormalPicker.ts",
    "content": "import { ForwardedRef, useImperativeHandle } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { PickerData } from '../components/WheelPicker/type';\nimport { NormalPickerProps, PickerRef } from '../type';\n\nexport default function useNormalPicker({\n  value,\n  initialValue,\n  onChange,\n  ref,\n}: Omit<NormalPickerProps, 'data'> & { initialValue?: string | number } & {\n  ref: ForwardedRef<PickerRef>;\n}) {\n  const [selectedValue, selectValue] = useSafeState(value || initialValue);\n  const [visible, setVisible] = useSafeState(false);\n\n  useImperativeHandle(ref, () => ({\n    show: () => {\n      setVisible(true);\n    },\n    hide: () => {\n      setVisible(false);\n    },\n  }));\n\n  const handleChange = (val: PickerData<string | number>) => {\n    selectValue(val.value);\n  };\n\n  const handleClose = () => {\n    selectValue(value);\n    setVisible(false);\n  };\n\n  const handleOk = () => {\n    onChange?.(selectedValue || initialValue);\n    setVisible(false);\n  };\n\n  return {\n    selectedValue,\n    visible,\n    ref,\n    handleChange: useMemoizedFn(handleChange),\n    handleOk: useMemoizedFn(handleOk),\n    handleClose: useMemoizedFn(handleClose),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/picker-input/index.md",
    "content": "---\ntitle: PickerInput - 选择器表单输入\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 选择组件\n  path: /picker\n---\n\n# PickerInput 选择器表单输入\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<PickerInput label=\"hahaha\" data={loadTypeData} />\n<WhiteSpace />\n<PickerInput label=\"hahaha\" labelPosition=\"left\" data={loadTypeData} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644825727475637877.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| data | `true` | 选择项数据 | `CascadePickerItemProps[]` \\| `Array<CascadePickerItemProps[]>` | `[]` |\n| cascade | `false` | 是否级联选择 | `boolean` | `false` |\n| cols | `false` | 选择列数量 | `number` | `3` |\n| hyphen | `false` | 连接符 | `number` | `,` |\n| value | `false` | 选中的值 | `ItemValue[]` |  |\n| onChange | `false` | 选择回调 | `(value?: ItemValue[]) => void` |  |\n| title | `false` | 选择器标题 | `string` |  |\n| onClose | `false` | 弹窗关闭事件 | `() => void` |  |\n| cancelText | `false` | 取消按钮文本 | `string` | `取消` |\n| okText | `false` | 确认按钮文本 | `string` | `确定` |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n| label | `false` | 标签文本 | `ReactNode` |  |\n| labelPosition | `false` | 标签文本位置 | `top \\| left` | `top` |\n| required | `false` | 是否必填 | `boolean` | `false` |\n| colon | `false` | 是否显示冒号 | `boolean` | `false` |\n| placeholder | `false` | 默认提示语 | `string` | `请选择` |\n| allowClear | `false` | 是否允许清除 | `boolean` | `true` |\n| disabled | `false` | 是否禁用 | `boolean` | `false` |\n| brief | `false` | 额外内容 | `ReactNode` |  |\n| style | `false` | 自定义样式 | `ViewStyle` |  |\n"
  },
  {
    "path": "packages/react-native-picker/src/picker-input/index.tsx",
    "content": "import React from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { Box, Brief, Flex, helpers, Label, Pressable, SvgIcon, Text, useTheme } from '@td-design/react-native';\n\nimport CascaderPicker from '../cascade-picker';\nimport NormalPicker from '../normal-picker';\nimport { PickerInputProps } from '../type';\nimport usePicker from '../usePicker';\n\nconst { ONE_PIXEL } = helpers;\n\nfunction PickerInput({\n  label,\n  labelPosition = 'left',\n  placeholder = '请选择',\n  required = false,\n  colon = false,\n  cascade,\n  value,\n  data,\n  onChange,\n  style,\n  brief,\n  allowClear = true,\n  disabled = false,\n  itemHeight,\n  hyphen = ',',\n  activeOpacity = 0.6,\n  ...restProps\n}: PickerInputProps) {\n  const theme = useTheme();\n  const { state, currentText, handlePress, handleChange, handleInputClear, pickerRef } = usePicker({\n    data,\n    cascade,\n    value,\n    onChange,\n    placeholder,\n    hyphen,\n  });\n\n  const styles = StyleSheet.create({\n    content: {\n      paddingVertical: theme.spacing.x2,\n      paddingHorizontal: theme.spacing.x1,\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      flexDirection: 'row',\n      borderWidth: ONE_PIXEL,\n      borderColor: theme.colors.border,\n      borderRadius: theme.borderRadii.x1,\n    },\n    top: {},\n    left: { flex: 1 },\n    icon: { alignItems: 'flex-end' },\n  });\n\n  const BaseContent = (\n    <>\n      <Box flex={1}>\n        <Text\n          variant=\"p1\"\n          color={disabled ? 'disabled' : currentText === placeholder ? 'gray300' : 'text'}\n          marginLeft=\"x2\"\n        >\n          {currentText}\n        </Text>\n      </Box>\n      <Flex>\n        {!disabled && allowClear && !!currentText && currentText !== placeholder && (\n          <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10} style={styles.icon}>\n            <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n          </Pressable>\n        )}\n        <SvgIcon name=\"right\" color={theme.colors.icon} />\n      </Flex>\n    </>\n  );\n\n  const Content = !disabled ? (\n    <Pressable\n      onPress={handlePress}\n      activeOpacity={activeOpacity}\n      style={[\n        itemHeight ? { height: itemHeight } : {},\n        styles.content,\n        style,\n        labelPosition === 'top' ? styles.top : styles.left,\n      ]}\n    >\n      {BaseContent}\n    </Pressable>\n  ) : (\n    <Box\n      style={[\n        itemHeight ? { height: itemHeight } : {},\n        styles.content,\n        style,\n        labelPosition === 'top' ? styles.top : styles.left,\n      ]}\n    >\n      {BaseContent}\n    </Box>\n  );\n\n  return (\n    <>\n      {labelPosition === 'top' ? (\n        <Box>\n          <Label {...{ label, required, colon }} />\n          {Content}\n          <Brief brief={brief} />\n        </Box>\n      ) : (\n        <Box>\n          <Flex>\n            <Label {...{ label, required, colon }} />\n            {Content}\n          </Flex>\n          <Brief brief={brief} />\n        </Box>\n      )}\n      {cascade ? (\n        <CascaderPicker\n          data={data}\n          onChange={handleChange}\n          value={state as (string | number)[]}\n          ref={pickerRef}\n          {...restProps}\n        />\n      ) : (\n        <NormalPicker\n          data={data}\n          onChange={handleChange}\n          value={state as string | number}\n          ref={pickerRef}\n          {...restProps}\n        />\n      )}\n    </>\n  );\n}\n\nexport default PickerInput;\n"
  },
  {
    "path": "packages/react-native-picker/src/picker-item/index.md",
    "content": "---\ntitle: PickerItem - 选择器列表表单输入\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 选择组件\n  path: /picker\n---\n\n# PickerItem 选择器列表表单输入\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<PickerItem data={carrierList} />\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644826189985177460.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 在表单中效果\n\n```tsx | pure\n<FormListItem\n  title=\"驾驶车辆总重量\"\n  arrow=\"horizontal\"\n  name=\"loadType\"\n  required\n  rules={[{ required: true, message: '请选择' }]}\n>\n  <PickerItem data={loadTypeData} />\n</FormListItem>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1644826202135539833.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| data | `true` | 选择项数据 | `CascadePickerItemProps[]` \\| `Array<CascadePickerItemProps[]>` | `[]` |\n| cascade | `false` | 是否级联选择 | `boolean` | `false` |\n| cols | `false` | 选择列数量 | `number` | `3` |\n| hyphen | `false` | 连接符 | `number` | `,` |\n| value | `false` | 选中的值 | `ItemValue[]` |  |\n| onChange | `false` | 选择回调 | `(value?: ItemValue[]) => void` |  |\n| title | `false` | 选择器标题 | `string` |  |\n| onClose | `false` | 弹窗关闭事件 | `() => void` |  |\n| cancelText | `false` | 取消按钮文本 | `string` | `取消` |\n| okText | `false` | 确认按钮文本 | `string` | `确定` |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n| placeholder | `false` | 默认提示语 | `string` | `请选择` |\n| allowClear | `false` | 是否允许清除 | `boolean` | `true` |\n| disabled | `false` | 是否禁用 | `boolean` | `false` |\n| style | `false` | 自定义样式 | `ViewStyle` |  |\n"
  },
  {
    "path": "packages/react-native-picker/src/picker-item/index.tsx",
    "content": "import React from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { Box, Pressable, SvgIcon, Text, Theme, useTheme } from '@td-design/react-native';\n\nimport CascaderPicker from '../cascade-picker';\nimport NormalPicker from '../normal-picker';\nimport { PickerItemProps } from '../type';\nimport usePicker from '../usePicker';\n\nfunction PickerItem({\n  placeholder = '请选择',\n  disabled = false,\n  cascade,\n  value,\n  data,\n  onChange,\n  style,\n  allowClear = true,\n  hyphen = ',',\n  activeOpacity = 0.6,\n  inForm,\n  ...restProps\n}: PickerItemProps) {\n  const theme = useTheme<Theme>();\n  const { state, currentText, handlePress, handleChange, handleInputClear, pickerRef } = usePicker({\n    data,\n    cascade,\n    value,\n    onChange,\n    placeholder,\n    hyphen,\n  });\n\n  const styles = StyleSheet.create({\n    content: {\n      flexGrow: 1,\n      justifyContent: 'flex-end',\n      alignItems: 'center',\n      flexDirection: 'row',\n      paddingHorizontal: theme.spacing[inForm ? 'x0' : 'x1'],\n    },\n    icon: { alignItems: 'flex-end' },\n  });\n\n  const Content = (\n    <>\n      <Text\n        variant=\"p1\"\n        color={disabled ? 'disabled' : currentText === placeholder ? 'gray300' : 'text'}\n        numberOfLines={1}\n        textAlign={'right'}\n        style={{ flex: 1 }}\n      >\n        {currentText}\n      </Text>\n      {!disabled && allowClear && !!currentText && currentText !== placeholder && (\n        <Pressable activeOpacity={1} onPress={handleInputClear} hitOffset={10} style={styles.icon}>\n          <SvgIcon name=\"closecircleo\" color={theme.colors.icon} />\n        </Pressable>\n      )}\n    </>\n  );\n\n  if (!disabled)\n    return (\n      <>\n        <Pressable onPress={handlePress} activeOpacity={activeOpacity} style={[styles.content, style]}>\n          {Content}\n        </Pressable>\n        {cascade ? (\n          <CascaderPicker\n            data={data}\n            onChange={handleChange}\n            value={state as (string | number)[]}\n            ref={pickerRef}\n            {...restProps}\n          />\n        ) : (\n          <NormalPicker\n            data={data}\n            onChange={handleChange}\n            value={state as string | number}\n            ref={pickerRef}\n            {...restProps}\n          />\n        )}\n      </>\n    );\n\n  return <Box style={[styles.content, style]}>{Content}</Box>;\n}\n\nexport default PickerItem;\n"
  },
  {
    "path": "packages/react-native-picker/src/type.ts",
    "content": "import { StyleProp, ViewStyle } from 'react-native';\n\nimport { CascadePickerItemProps, WheelPickerPropsBase } from './components/WheelPicker/type';\n\nexport interface PickerRef {\n  hide: () => void;\n  show: () => void;\n}\n\nexport interface DatePickerRef {\n  hide: () => void;\n  show: () => void;\n  getValue: () => { date?: Date; formatDate: string };\n}\n\n/** 弹窗Picker的属性 */\nexport interface ModalPickerProps {\n  /** 选择器标题 */\n  title?: string;\n  /** 取消按钮文本 */\n  cancelText?: string;\n  /** 确认按钮文本 */\n  okText?: string;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nexport type CascaderProps = WheelPickerPropsBase & {\n  data: CascadePickerItemProps<string | number>[];\n  /** 展示几列 */\n  cols?: number;\n  /** 当前值 */\n  value?: (string | number)[];\n  /** 修改事件 */\n  onChange?: (value?: (string | number)[]) => void;\n} & ModalPickerProps;\n\nexport type NormalPickerProps = WheelPickerPropsBase & {\n  data: CascadePickerItemProps<string | number>[];\n  /** 当前值 */\n  value?: string | number;\n  /** 修改事件 */\n  onChange?: (value?: string | number) => void;\n} & ModalPickerProps;\n\nexport type PickerProps = CascaderProps | NormalPickerProps;\n\nexport type PickerInputProps = PickerProps & {\n  cascade?: boolean;\n  /** 标签文本 */\n  label?: React.ReactNode;\n  /** 标签文本位置 */\n  labelPosition?: 'top' | 'left';\n  /** 是否显示冒号 */\n  colon?: boolean;\n  /** 是否必填 */\n  required?: boolean;\n  /** 默认提示语 */\n  placeholder?: string;\n  /** 是否允许清除 */\n  allowClear?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 额外内容 */\n  brief?: React.ReactNode;\n  /** 自定义样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 自定义高度 */\n  itemHeight?: number;\n  /** 连接符 */\n  hyphen?: string;\n};\n\nexport type PickerItemProps = PickerProps & {\n  cascade?: boolean;\n  placeholder?: string;\n  /** 是否允许清除 */\n  allowClear?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 自定义样式 */\n  style?: StyleProp<ViewStyle>;\n  /** 是否在表单里 */\n  inForm?: boolean;\n  /** 连接符 */\n  hyphen?: string;\n};\n"
  },
  {
    "path": "packages/react-native-picker/src/useDatePicker.tsx",
    "content": "import { useRef } from 'react';\nimport { Keyboard } from 'react-native';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\nimport dayjs from 'dayjs';\n\nimport { DatePickerPropsBase } from './components/DatePicker/type';\nimport { DatePickerRef } from './type';\n\nfunction getText(value?: Date, format?: string, placeholder?: string) {\n  if (value) {\n    return dayjs(value).format(format);\n  }\n  return placeholder;\n}\n\nexport default function useDatePicker({\n  value,\n  onChange,\n  placeholder = '请选择',\n  format = 'YYYY-MM-DD',\n}: Pick<DatePickerPropsBase, 'value' | 'onChange' | 'format'> & {\n  placeholder?: string;\n}) {\n  const datePickerRef = useRef<DatePickerRef>(null);\n  const [date, setDate] = useSafeState(value);\n\n  const currentText = getText(date, format, placeholder);\n\n  const handlePress = () => {\n    Keyboard.dismiss();\n    datePickerRef.current?.show();\n  };\n\n  const handleChange = (date?: Date, formatDate?: string) => {\n    setDate(date);\n    onChange?.(date, formatDate);\n  };\n\n  const handleInputClear = () => {\n    setDate(undefined);\n    onChange?.(undefined);\n  };\n\n  return {\n    date,\n    currentText,\n    datePickerRef,\n    handlePress: useMemoizedFn(handlePress),\n    handleChange: useMemoizedFn(handleChange),\n    handleInputClear: useMemoizedFn(handleInputClear),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/usePicker.tsx",
    "content": "import { useRef } from 'react';\nimport { Keyboard } from 'react-native';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { CascadePickerItemProps } from './components/WheelPicker/type';\nimport { PickerInputProps, PickerRef } from './type';\nimport { transformValueToLabel } from './utils';\n\nfunction getText<T>(\n  data: CascadePickerItemProps<T>[],\n  value?: T[] | T,\n  cascade?: boolean,\n  placeholder?: string,\n  hyphen?: string\n) {\n  if (value) {\n    return transformValueToLabel(data, value, cascade, hyphen) || placeholder;\n  }\n  return placeholder;\n}\n\nexport default function usePicker<T extends string | number>({\n  data,\n  cascade = false,\n  value,\n  onChange,\n  placeholder = '请选择',\n  hyphen,\n}: Pick<PickerInputProps, 'data' | 'value' | 'cascade' | 'onChange'> & {\n  placeholder?: string;\n  hyphen?: string;\n}) {\n  const pickerRef = useRef<PickerRef>(null);\n  const [state, setState] = useSafeState(value);\n\n  const currentText = getText(data, state, cascade, placeholder, hyphen);\n\n  const handlePress = () => {\n    Keyboard.dismiss();\n    pickerRef.current?.show();\n  };\n\n  const handleChange = (value?: T[] | T) => {\n    setState(value);\n\n    if (cascade) {\n      (onChange as (value?: T[]) => void)?.(value as T[]);\n    } else {\n      (onChange as (value?: T) => void)?.(value as T);\n    }\n  };\n\n  const handleInputClear = () => {\n    setState(undefined);\n    onChange?.(undefined);\n  };\n\n  return {\n    state,\n    currentText,\n    pickerRef,\n    handlePress: useMemoizedFn(handlePress),\n    handleChange: useMemoizedFn(handleChange),\n    handleInputClear: useMemoizedFn(handleInputClear),\n  };\n}\n"
  },
  {
    "path": "packages/react-native-picker/src/utils.ts",
    "content": "import { CascadePickerItemProps } from './components/WheelPicker/type';\n\n/**\n * 根据value，返回对应的label\n * @param data 数据\n * @param value 选中的值\n * @param cascade 是否级联\n * @returns 值对应的文本\n */\nexport function transformValueToLabel<T>(\n  data: CascadePickerItemProps<T>[],\n  value?: T[] | T,\n  cascade?: boolean,\n  hyphen?: string\n) {\n  if (!value) return undefined;\n\n  if (!cascade) {\n    return data.find(item => item.value === value)?.label;\n  }\n\n  return (value as T[]).map(val => findByValue(data, val)?.label).join(hyphen);\n}\n\n/**\n * 根据value从一个级联数组中查找节点\n * @param data\n * @param value\n * @returns\n */\nfunction findByValue<T>(data: CascadePickerItemProps<T>[], value: T): CascadePickerItemProps<T> | undefined {\n  let selectedItem: CascadePickerItemProps<T> | undefined = undefined;\n\n  function recursion(list: CascadePickerItemProps<T>[], value: T) {\n    if (!list) return;\n    for (let i = 0; i < list.length; i++) {\n      if (list[i].value === value) {\n        selectedItem = list[i];\n        break;\n      }\n      if (list[i].children) {\n        recursion(list[i].children!, value);\n      }\n    }\n  }\n\n  recursion(data, value);\n\n  return selectedItem;\n}\n"
  },
  {
    "path": "packages/react-native-picker/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\", \"calendar\", \"password\", \"rating\", \"tabs\"]\n}\n"
  },
  {
    "path": "packages/react-native-picker/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-rating/CHANGELOG.md",
    "content": "# @td-design/react-native-rating\n\n## 2.7.2\n\n### Patch Changes\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 优化useEffect的依赖项\n\n- [#892](https://github.com/thundersdata-frontend/td-design/pull/892) [`0648f3c23`](https://github.com/thundersdata-frontend/td-design/commit/0648f3c23a361f5aa2a01c436554d4c10933256f) Thanks [@chj-damon](https://github.com/chj-damon)! - refactor: 优化代码性能\n\n## 2.7.1\n\n### Patch Changes\n\n- [#890](https://github.com/thundersdata-frontend/td-design/pull/890) [`fe9a1ab9d`](https://github.com/thundersdata-frontend/td-design/commit/fe9a1ab9d4cb8133257138c2f6430194faf59af3) Thanks [@chj-damon](https://github.com/chj-damon)! - 删除 `react-native-redash`依赖优化`react-native-picker` 的`onChange`事件的参数类型问题\n\n## 2.7.0\n\n### Minor Changes\n\n- [#743](https://github.com/thundersdata-frontend/td-design/pull/743) [`acdd74c13`](https://github.com/thundersdata-frontend/td-design/commit/acdd74c1324be45816f4e1dff0d5e854124172ad) Thanks [@chj-damon](https://github.com/chj-damon)! - perf: 优化多个组件\n\n## 2.6.1\n\n### Patch Changes\n\n- [#714](https://github.com/thundersdata-frontend/td-design/pull/714) [`ef6d88136`](https://github.com/thundersdata-frontend/td-design/commit/ef6d88136421ea13b19b11730f94b589047c5a8b) Thanks [@chj-damon](https://github.com/chj-damon)! - 继续优化组件样式\n\n## 2.6.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 样式优化\n\n## 2.5.1\n\n### Patch Changes\n\n- [#677](https://github.com/thundersdata-frontend/td-design/pull/677) [`469b748a3`](https://github.com/thundersdata-frontend/td-design/commit/469b748a33b288afc288be969a193eae0e2f6d13) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化组件同时为一些组件补充 activeOpacity 属性\n\n## 2.5.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n## 2.4.4\n\n### Patch Changes\n\n- [#631](https://github.com/thundersdata-frontend/td-design/pull/631) [`71a4fb174`](https://github.com/thundersdata-frontend/td-design/commit/71a4fb17491c9bf22d407a3450f49e827a243503) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复一些样式上的问题\n\n## 2.4.3\n\n### Patch Changes\n\n- [#625](https://github.com/thundersdata-frontend/td-design/pull/625) [`5efa85848`](https://github.com/thundersdata-frontend/td-design/commit/5efa858485f78542b293404baa504e11182830bb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 useTheme 引入路径不正确导致报错的问题\n\n## 2.4.2\n\n### Patch Changes\n\n- [#589](https://github.com/thundersdata-frontend/td-design/pull/589) [`6bd906307`](https://github.com/thundersdata-frontend/td-design/commit/6bd90630781c3769af64ab0983f8d050daca6c0c) Thanks [@SunshineH2](https://github.com/SunshineH2)! - 修复 useUpdateEffect 第一次不会执行的问题\n"
  },
  {
    "path": "packages/react-native-rating/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-rating\",\n  \"version\": \"2.7.2\",\n  \"description\": \"基于 @td-design/react-native 的 rating 组件\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@td-design/rn-hooks\": \"workspace:^2.8.1\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-gesture-handler\": \"^2.12.0\",\n    \"react-native-reanimated\": \"^3.3.0\",\n    \"react-native-svg\": \"^13.10.0\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\"\n}\n"
  },
  {
    "path": "packages/react-native-rating/src/SwipeRating.tsx",
    "content": "import React, { forwardRef, useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport { PanGestureHandler } from 'react-native-gesture-handler';\nimport Animated from 'react-native-reanimated';\n\nimport { Flex, Theme, useTheme } from '@td-design/react-native';\n\nimport SwipeStar from './components/SwipeStar';\nimport { SwipeRatingProps } from './type';\nimport useSwipeRating from './useSwipeRating';\n\nconst SwipeRating = forwardRef<unknown, SwipeRatingProps>(\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  (props, _ref) => {\n    const theme = useTheme<Theme>();\n    const {\n      onFinishRating,\n      size = 40,\n      count = 5,\n      rating = count / 2,\n      fractions = 2,\n      strokeColor = theme.colors.func200,\n      ratingBgColor = theme.colors.white,\n      ratingFillColor = theme.colors.func200,\n    } = props;\n\n    if (size > 80) {\n      throw new Error('评分组件最大size不能超过80');\n    }\n\n    const { primaryViewStyle, handler } = useSwipeRating({\n      fractions,\n      size,\n      rating,\n      count,\n      onFinishRating,\n      ratingFillColor,\n    });\n\n    const Ratings = useMemo(\n      () =>\n        Array(count)\n          .fill('')\n          .map((_, index) => (\n            <SwipeStar key={index} width={size} height={size} bgColor={ratingBgColor} strokeColor={strokeColor} />\n          )),\n      [count, ratingBgColor, size, strokeColor]\n    );\n\n    const styles = StyleSheet.create({\n      content: { flexDirection: 'row', alignItems: 'center', width: count * size },\n    });\n\n    return (\n      <PanGestureHandler onGestureEvent={handler}>\n        <Animated.View style={styles.content}>\n          <Flex style={StyleSheet.absoluteFill}>\n            <Animated.View style={primaryViewStyle} />\n          </Flex>\n          <Flex justifyContent=\"center\" alignItems=\"center\">\n            {Ratings}\n          </Flex>\n        </Animated.View>\n      </PanGestureHandler>\n    );\n  }\n);\n\nexport default SwipeRating;\n"
  },
  {
    "path": "packages/react-native-rating/src/TapRating.tsx",
    "content": "import React, { forwardRef, useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport { Flex, helpers, Text, Theme, useTheme } from '@td-design/react-native';\n\nimport Star from './components/Star';\nimport { TapRatingProps } from './type';\nimport useTapRating from './useTapRating';\n\nconst { px } = helpers;\nconst STAR_SIZE = px(40);\n\nconst TapRating = forwardRef<unknown, TapRatingProps>(\n  (\n    props,\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _ref\n  ) => {\n    const theme = useTheme<Theme>();\n    const {\n      rating = 3,\n      reviews = ['非常差', '很差', '一般', '很好', '非常好'],\n      count = 5,\n      activeOpacity = 0.6,\n      showReview = true,\n      reviewSize = px(24),\n      onFinishRating,\n      size = STAR_SIZE,\n      disabled = false,\n      starStyle,\n      outRangeScale = 1.2,\n      selectedColor = theme.colors.func200,\n      reviewColor = selectedColor,\n      unselectedColor = theme.colors.gray50,\n    } = props;\n\n    const { position, handleSelect } = useTapRating({ rating, onFinishRating });\n\n    const styles = StyleSheet.create({\n      text: {\n        margin: theme.spacing.x2,\n        fontWeight: 'bold',\n        fontSize: reviewSize,\n        color: reviewColor,\n      },\n    });\n\n    const Ratings = useMemo(\n      () =>\n        Array(count)\n          .fill('')\n          .map((_, index) => (\n            <Star\n              key={index}\n              position={index + 1}\n              fill={position >= index + 1}\n              onSelectStarInPosition={handleSelect}\n              {...{ size, disabled, starStyle, selectedColor, unselectedColor, outRangeScale, activeOpacity }}\n            />\n          )),\n      [count, disabled, outRangeScale, position, selectedColor, size, starStyle, unselectedColor, activeOpacity]\n    );\n\n    return (\n      <Flex flexDirection=\"column\" alignItems=\"center\" justifyContent=\"center\" backgroundColor=\"transparent\">\n        {showReview && (\n          <Text variant=\"h0\" style={styles.text}>\n            {reviews[position - 1]}\n          </Text>\n        )}\n        <Flex justifyContent=\"center\" alignItems=\"center\">\n          {Ratings}\n        </Flex>\n      </Flex>\n    );\n  }\n);\n\nexport default TapRating;\n"
  },
  {
    "path": "packages/react-native-rating/src/components/Star.tsx",
    "content": "/**\n * 单个评分组件\n */\nimport React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated, { runOnJS, useAnimatedStyle, useSharedValue, withSequence, withTiming } from 'react-native-reanimated';\n\nimport { Pressable, Theme, useTheme } from '@td-design/react-native';\n\nimport { StarProps } from '../type';\n\nexport const STAR_IMAGE =\n  'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAoCAYAAACIC2hQAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAKqADAAQAAAABAAAAKAAAAACu2vZrAAAEA0lEQVRYCdWYS4gTWRSGz6mULxhdKDiCdGxtH92dRKYZFy4aVGbhRhEExYW48AHiwoUO6ug4ONAzoy5EUBFFRFAXPhYqPhbuBDeCisb46LQdkzAILmahIG2SquN/K5PGpKtu5XHb1oKQuuec+5+vTj3ug+g7OdgkpzxrX0firicSm9i6yvHsGVP6xkAl2baVhE5WgVnWfsD2VdmabBgBlafROajiKzDYIzhs62fuzj4aYW/QYDUY7x/O9BscIyFVtOPu9+/UmLXlikpqTpSc0gAqOs43NeOBIPsnTmSe+vrrNLZeUdfZEwipIISA6vxeJ09gWEsVlVfzZ1Jh6DWJTAjMoBxMLlmc4FjuuTZO42ytooWhXaGQKrmQRY7s03CEupquqKTaZ5DrZgA6MTSLClBVtcd1cddgf13xNUHNV9R1fq0bUiVVVS2W9tbkr7vZVEUl2b4UL8htZJlUd6ZyoEMRWs2x/I0G++GGBBwiByx6eS5KJXceMc9H9co/4gUoz+yAbvWZmfJ4Fl5AMw3tfrKsfnKdNMUXv2G+4viJDINKcvaPRKXNCFpEwoCjuRDSv81+ii3ZuIi8ryGBC6DHZEXOcncmqyQ9UBnomE4fi0lUanpLeUx3Zv5AERtD8GC6/DJ9LBz95iDVRYtMplLRm4H9/9bzL6aLYUyPqVdkTaTyefrXmLBpIaG36gUrgzIdNK1vTM+y/lFaHigncpdxtsOYuDEhPoSJ9wklN/x5Ug15NmsblhLHvRmPMozt0ccL88Nz2SpQxSXJWZuI3NPekDdWoMwHcJf//DL9CNAybHQ9Pg3ncB75MvirnDPt40T+79pcvqAqSJLRtYC9iFP/JUatkom2xbs5njvsJxUIqoIl1baKXL4M4PF+nQ3bduKZPBKkWfmO+voxy7mOcX+jr9Okka2/dJAqlbaiKkBEmJLRIk5H73kdb3dyZ0YttwMPbUW9Xi+7puJ/9CBVEpcwc9Mf4aCloYRewoDXKcXCVMJBReJhIgb8oTnCQUlGv6JCBkA5XKTlijIZuPX0FUCFpnnLb80Va2+9t68kMkXT36DL1VZVC4qVYTPPJzYYONXwFbj6O6cHZdFeZQ1MEkvflRhhFvDCXJxsewna92tidM0unVMPKgFbiVWKnAHQBkpswtZi7mbFhWXuPbR7sUW+AuPfk4o98F/t+mkOPSjxg+C+/A6A2ykyuRNA5zGFdP1iOZG9RfFcDzDW4Zf2i/FsFmmrrwUFwF3AnKoSZ36PFcwfAOyA/xjHUoUqv0+DmQVzzEsU7+jGrsgWAOerwpiuUWzjhSpbTUNb7koslijLMB73oj1IkR/uAO6/iq+Zf0nPnUCFT8sxhexB/4cUz95SF6PT+gz2IBnaCegUDQAAAABJRU5ErkJggg==';\nexport const STAR_SELECTED_IMAGE =\n  'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAoCAYAAACIC2hQAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAKqADAAQAAAABAAAAKAAAAACu2vZrAAAEA0lEQVRYCdWYS4gTWRSGz6mULxhdKDiCdGxtH92dRKYZFy4aVGbhRhEExYW48AHiwoUO6ug4ONAzoy5EUBFFRFAXPhYqPhbuBDeCisb46LQdkzAILmahIG2SquN/K5PGpKtu5XHb1oKQuuec+5+vTj3ug+g7OdgkpzxrX0firicSm9i6yvHsGVP6xkAl2baVhE5WgVnWfsD2VdmabBgBlafROajiKzDYIzhs62fuzj4aYW/QYDUY7x/O9BscIyFVtOPu9+/UmLXlikpqTpSc0gAqOs43NeOBIPsnTmSe+vrrNLZeUdfZEwipIISA6vxeJ09gWEsVlVfzZ1Jh6DWJTAjMoBxMLlmc4FjuuTZO42ytooWhXaGQKrmQRY7s03CEupquqKTaZ5DrZgA6MTSLClBVtcd1cddgf13xNUHNV9R1fq0bUiVVVS2W9tbkr7vZVEUl2b4UL8htZJlUd6ZyoEMRWs2x/I0G++GGBBwiByx6eS5KJXceMc9H9co/4gUoz+yAbvWZmfJ4Fl5AMw3tfrKsfnKdNMUXv2G+4viJDINKcvaPRKXNCFpEwoCjuRDSv81+ii3ZuIi8ryGBC6DHZEXOcncmqyQ9UBnomE4fi0lUanpLeUx3Zv5AERtD8GC6/DJ9LBz95iDVRYtMplLRm4H9/9bzL6aLYUyPqVdkTaTyefrXmLBpIaG36gUrgzIdNK1vTM+y/lFaHigncpdxtsOYuDEhPoSJ9wklN/x5Ug15NmsblhLHvRmPMozt0ccL88Nz2SpQxSXJWZuI3NPekDdWoMwHcJf//DL9CNAybHQ9Pg3ncB75MvirnDPt40T+79pcvqAqSJLRtYC9iFP/JUatkom2xbs5njvsJxUIqoIl1baKXL4M4PF+nQ3bduKZPBKkWfmO+voxy7mOcX+jr9Okka2/dJAqlbaiKkBEmJLRIk5H73kdb3dyZ0YttwMPbUW9Xi+7puJ/9CBVEpcwc9Mf4aCloYRewoDXKcXCVMJBReJhIgb8oTnCQUlGv6JCBkA5XKTlijIZuPX0FUCFpnnLb80Va2+9t68kMkXT36DL1VZVC4qVYTPPJzYYONXwFbj6O6cHZdFeZQ1MEkvflRhhFvDCXJxsewna92tidM0unVMPKgFbiVWKnAHQBkpswtZi7mbFhWXuPbR7sUW+AuPfk4o98F/t+mkOPSjxg+C+/A6A2ykyuRNA5zGFdP1iOZG9RfFcDzDW4Zf2i/FsFmmrrwUFwF3AnKoSZ36PFcwfAOyA/xjHUoUqv0+DmQVzzEsU7+jGrsgWAOerwpiuUWzjhSpbTUNb7koslijLMB73oj1IkR/uAO6/iq+Zf0nPnUCFT8sxhexB/4cUz95SF6PT+gz2IBnaCegUDQAAAABJRU5ErkJggg==';\n\nconst Star: FC<StarProps> = ({\n  fill,\n  size,\n  selectedColor,\n  unselectedColor,\n  disabled,\n  starStyle,\n  outRangeScale,\n  position,\n  activeOpacity = 0.6,\n  onSelectStarInPosition,\n}) => {\n  const theme = useTheme<Theme>();\n\n  const animation = useSharedValue(0);\n\n  const handlePress = () => {\n    'worklet';\n    animation.value = withSequence(withTiming(1), withTiming(0));\n    onSelectStarInPosition && runOnJS(onSelectStarInPosition)(position);\n  };\n\n  const style = useAnimatedStyle(() => ({\n    transform: [\n      {\n        scale: mix(animation.value, 1, outRangeScale),\n      },\n    ],\n  }));\n\n  const source = fill ? STAR_SELECTED_IMAGE : STAR_IMAGE;\n\n  const styles = StyleSheet.create({\n    image: {\n      margin: theme.spacing.x1,\n      // tintColor 在安卓下不能为undefined，否则不会显示\n      tintColor: fill && selectedColor ? selectedColor : unselectedColor,\n      width: size,\n      height: size,\n    },\n  });\n\n  return (\n    <Pressable activeOpacity={activeOpacity} onPress={handlePress} disabled={disabled}>\n      <Animated.Image source={{ uri: source }} style={[styles.image, starStyle, style]} />\n    </Pressable>\n  );\n};\n\nexport default Star;\n\nconst mix = (value: number, x: number, y: number) => {\n  'worklet';\n  return x * (1 - value) + y * value;\n};\n"
  },
  {
    "path": "packages/react-native-rating/src/components/SwipeStar.tsx",
    "content": "import React, { FC } from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { Theme, useTheme } from '@td-design/react-native';\n\nconst SwipeStar: FC<{ width?: number; height?: number; bgColor?: string; strokeColor?: string }> = ({\n  width = 40,\n  height = 40,\n  ...restProps\n}) => {\n  const theme = useTheme<Theme>();\n  const { bgColor = theme.colors.background, strokeColor = theme.colors.func200 } = restProps;\n\n  const xml = `\n  <svg width=${width} height=${height} viewBox=\"0 0 80 80\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n  <title>star</title>\n  <g id=\"页面-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n      <g id=\"star\" fill-rule=\"nonzero\">\n          <path d=\"M80,0 L80,80 L0,80 L0,0 L80,0 Z M39.9888734,4 C37.764954,4 35.731337,5.30862308 34.7337808,7.38162792 L27.5325576,22.695565 C27.0489394,23.632796 26.1666324,24.2741488 25.1561538,24.422983 L9.03261518,26.9014524 C6.81871742,27.2657196 4.98944788,28.8976888 4.30141154,31.122361 C3.58335378,33.3464074 4.17254414,35.8029246 5.8100678,37.412416 L17.4580463,49.1964118 C18.1824133,49.9416956 18.5290786,50.9985472 18.3942053,52.0504068 L15.5893289,68.8664466 C15.2742964,70.6372876 15.7516161,72.4612466 16.8855491,73.8196302 C18.0312864,75.1843692 19.6795911,75.976329 21.4187192,75.997679 C22.379976,76.0165872 23.327366,75.7565662 24.155184,75.2466278 L38.6296424,67.2141336 C39.0894234,67.0277718 39.5767482,66.9261208 40.0698872,66.913713 C40.5734358,66.9031742 41.0705792,67.0327982 41.5101318,67.2892386 L56.0566026,75.2466278 C56.8690762,75.7291872 57.7861214,75.9876824 58.721055,75.997679 C60.4453508,75.9584982 62.0690248,75.143008 63.1734932,73.7614418 C64.2779618,72.3798756 64.7551482,70.5674254 64.4820338,68.7913414 L61.7455688,52.0504068 C61.5743872,50.9951428 61.9266614,49.9211916 62.681728,49.1964118 L74.2540936,37.337311 C75.8492302,35.6949058 76.4080926,33.2483286 75.6943382,31.0322348 C74.9689446,28.8428064 73.1405414,27.252491 70.9451314,26.9014524 L54.8215928,24.422983 C53.8077954,24.2830124 52.9219828,23.6391112 52.445189,22.695565 L45.243966,7.38162792 C44.2464096,5.30862308 42.2127928,4 39.9888734,4 Z\" id=\"bg\" fill=\"${bgColor}\"></path>\n          <path d=\"M39.9888736,4.5 C41.0034868,4.5 41.9744924,4.79900194 42.8057374,5.33390426 C43.6415098,5.8717199 44.3359444,6.64776882 44.7914964,7.5943974 L44.7914964,7.5943974 L51.9989298,22.9210696 C52.5514164,24.0144072 53.5798966,24.7562906 54.7456268,24.9171786 L54.7456268,24.9171786 L70.8661864,27.3951808 C71.8705696,27.5557782 72.7906492,28.000453 73.5428552,28.6547096 C74.299321,29.3126712 74.8860554,30.1824276 75.2184144,31.1855196 C75.5472502,32.2065022 75.5828566,33.2805742 75.352606,34.2885612 C75.1229236,35.2940598 74.628588,36.23406 73.896241,36.9881106 L73.896241,36.9881106 L62.3354834,48.8356984 C61.4639266,49.672296 61.0542748,50.911447 61.2521182,52.1310664 L61.2521182,52.1310664 L63.987843,68.8673354 C64.2395726,70.5043526 63.801203,72.1755114 62.782951,73.44923 C61.7725272,74.713157 60.2879752,75.4619458 58.7264014,75.4977082 C57.879116,75.4886486 57.0481796,75.2540222 56.2965624,74.8079718 L56.2965624,74.8079718 L41.762093,66.8573644 C41.2424482,66.5541972 40.654652,66.4013654 40.057311,66.4138716 C39.4938152,66.4280498 38.937062,66.5460192 38.4128616,66.7626034 L38.4128616,66.7626034 L23.8929444,74.8209168 C23.147435,75.2801528 22.2943256,75.5148062 21.424857,75.4977172 C19.8295407,75.4781326 18.3190004,74.74945 17.2693892,73.499214 C16.2287868,72.2526348 15.7925888,70.5785926 16.0825155,68.9487094 L16.0825155,68.9487094 L18.8901451,52.1139984 C19.0445697,50.9096612 18.6454755,49.7007408 17.8136461,48.844917 L17.8136461,48.844917 L6.16055584,37.0558238 C5.4092605,36.3173896 4.89919534,35.3843172 4.6586071,34.3812304 C4.4173719,33.3754462 4.44693986,32.2989842 4.779088,31.2700948 C5.09542576,30.2472596 5.67349722,29.3601904 6.4276748,28.6873564 C7.1775119,28.0183946 8.10149474,27.5613788 9.1085817,27.395648 L9.1085817,27.395648 L25.2290134,24.9176462 C26.3958594,24.7457804 27.4177998,24.0083368 27.9850278,22.9083346 L27.9850278,22.9083346 L35.1843292,7.59843744 C35.641803,6.64776882 36.3362374,5.87171994 37.1720098,5.3339043 C38.0032548,4.79900196 38.9742604,4.5 39.9888736,4.5 Z\"  id=\"border\" stroke=\"${strokeColor}\" stroke-width=\"1\"></path>\n      </g>\n  </g>\n</svg>\n  `;\n  return <SvgXml xml={xml} width={width} height={height} />;\n};\n\nexport default SwipeStar;\n"
  },
  {
    "path": "packages/react-native-rating/src/index.md",
    "content": "---\ntitle: Rating - 评分组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 评分组件\n  path: /ratings\n---\n\n# Rating 评分组件\n\n使用本组件需要单独安装：**yarn add @td-design/react-native-rating**\n\n## 效果演示\n\n### 1. 点击评分\n\n```tsx | pure\n<TapRating count={5} selectedColor=\"red\" />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"rating-ios1.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608031082750770825.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 不显示评分对应的文字\n\n```tsx | pure\n<TapRating count={5} showReview={false} />\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"rating-ios2.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608031167591520069.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 滑动评分向上取整\n\n```tsx | pure\nconst [rating, setRating] = useState(0);\n\n<Text>您选择的分数是：{rating}</Text>\n<SwipeRating\n  count={5}\n  fractions={0}\n  defaultRating={0}\n  onFinishRating={position => {\n    setRating(position);\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"rating-ios3.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608031383343799559.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 滑动评分保留小数\n\n```tsx | pure\nconst [rating, setRating] = useState(2.5);\n\n<Text>您选择的分数是：{rating}</Text>\n<SwipeRating\n  count={5}\n  defaultRating={2.5}\n  fractions={2}\n  onFinishRating={position => {\n    setRating(position);\n  }}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"rating-ios4.gif\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608031551235116500.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### TapRating\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| defaultRating | `false` | 默认分数 | `number` |  |\n| count | `false` | 评分总数 | `number` | `5` |\n| showReview | `false` | 是否显示文字 | `boolean` | `true` |\n| reviewSize | `false` | 文字大小 | `number` | `25` |\n| reviewColor | `false` | 文字颜色 | `string` |  |\n| reviews | `false` | 文字数组 | `string[]` | `['非常差', '很差', '一般', '很好', '非常好']` |\n| size | `false` | 评分大小 | `number` | `40` |\n| disabled | `false` | 是否禁用 | `boolean` | `false` |\n| starStyle | `false` | 评分样式 | `ImageStyle` |  |\n| selectedColor | `false` | 评分选中颜色 | `string` | `gold` |\n| unselectedColor | `false` | 评分未选中颜色 | `string` | `gray` |\n| outRangeScale | `false` | 评分点击时缩放大小 | `number` |  |\n| onFinishRating | `false` | 评分结束时的回调事件 | `(rating: number) => void` | `1.2` |\n| activeOpacity | `false` | 按下时的不透明度 | `number` | `0.6` |\n\n### SwipeRating\n\n| 属性            | 必填    | 说明                      | 类型                       | 默认值 |\n| --------------- | ------- | ------------------------- | -------------------------- | ------ |\n| ratingBgColor   | `false` | 评分底色                  | `string`                   |        |\n| ratingFillColor | `false` | 评分填充色                | `string`                   |        |\n| count           | `false` | 评分总数                  | `number`                   | `5`    |\n| strokeColor     | `false` | 评分边框色                | `string`                   |        |\n| size            | `false` | 评分大小                  | `number`                   | `40`   |\n| disabled        | `false` | 是否禁用                  | `boolean`                  |        |\n| defaultRating   | `false` | 默认选中评分              | `number`                   | `2.5`  |\n| minValue        | `false` | 评分最小值                | `number`                   | `0`    |\n| fractions       | `false` | 小数位数。传 0 时向上取整 | `number`                   | `2`    |\n| onFinishRating  | `false` | 评分结束时的回调事件      | `(rating: number) => void` |        |\n"
  },
  {
    "path": "packages/react-native-rating/src/index.tsx",
    "content": "import SwipeRating from './SwipeRating';\nimport TapRating from './TapRating';\n\nexport { TapRating, SwipeRating };\n"
  },
  {
    "path": "packages/react-native-rating/src/type.ts",
    "content": "import { ImageStyle, StyleProp } from 'react-native';\n\nexport interface TapRatingProps {\n  /** 评分  */\n  rating?: number;\n  /** 评分总数，默认为5 */\n  count?: number;\n  /** 是否显示文字，默认为true */\n  showReview?: boolean;\n  /** 文字大小，默认25 */\n  reviewSize?: number;\n  /** 文字颜色，默认同评分选中颜色 */\n  reviewColor?: string;\n  /** 文字数组，默认为['非常差', '很差', '一般', '很好', '非常好'] */\n  reviews?: string[];\n  /** 评分大小，默认为40 */\n  size?: number;\n  /** 是否禁用选择，默认为false */\n  disabled?: boolean;\n  /** 评分样式 */\n  starStyle?: StyleProp<ImageStyle>;\n  /** 评分选中颜色 */\n  selectedColor?: string;\n  /** 评分未选中时的颜色 */\n  unselectedColor?: string;\n  /** 评分点击时缩放大小 */\n  outRangeScale?: number;\n  /** 评分结束时的回调事件 */\n  onFinishRating?: (rating: number) => void;\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n}\n\nexport type StarProps = Required<\n  Pick<TapRatingProps, 'size' | 'disabled' | 'selectedColor' | 'unselectedColor' | 'outRangeScale' | 'activeOpacity'>\n> &\n  Pick<TapRatingProps, 'starStyle'> & {\n    /** 是否填充选中颜色 */\n    fill?: boolean;\n    /** 当前评分分数 */\n    position: number;\n    /** 修改评分分数 */\n    onSelectStarInPosition: (position: number) => void;\n  };\n\nexport interface SwipeRatingProps {\n  /** 评分底色 */\n  ratingBgColor?: string;\n  /** 评分填充色 */\n  ratingFillColor?: string;\n  /** 评分总数 */\n  count?: number;\n  /** 评分边框色 */\n  strokeColor?: string;\n  /** 评分大小 */\n  size?: number;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 默认评分为count / 2 */\n  rating?: number;\n  /** 小数位数 */\n  fractions?: number;\n  /** 评分结束时的回调事件 */\n  onFinishRating?: (rating: number) => void;\n}\n"
  },
  {
    "path": "packages/react-native-rating/src/useSwipeRating.ts",
    "content": "import { useEffect } from 'react';\nimport { runOnJS, useAnimatedGestureHandler, useAnimatedStyle, useSharedValue } from 'react-native-reanimated';\n\nimport { SwipeRatingProps } from './type';\n\nexport default function useSwipeRating({\n  onFinishRating,\n  size = 40,\n  count = 5,\n  rating = count / 2,\n  fractions = 2,\n  ratingFillColor,\n}: Pick<SwipeRatingProps, 'size' | 'count' | 'rating' | 'fractions' | 'onFinishRating'> & { ratingFillColor: string }) {\n  const translateX = useSharedValue(0);\n\n  const getCurrentRating = (translateX: number) => {\n    'worklet';\n    return !fractions ? Math.ceil(translateX / size) : +(translateX / size).toFixed(fractions);\n  };\n\n  useEffect(() => {\n    translateX.value = rating * size;\n  }, [rating, size]);\n\n  const handler = useAnimatedGestureHandler({\n    onStart(_, ctx: Record<string, number>) {\n      ctx.offsetX = translateX.value;\n    },\n    onActive(event, ctx) {\n      const value = event.translationX + ctx.offsetX;\n      translateX.value = value >= count * size ? count * size : value;\n    },\n    onEnd() {\n      const currentRating = getCurrentRating(translateX.value);\n      onFinishRating && runOnJS(onFinishRating)(currentRating);\n    },\n  });\n\n  const primaryViewStyle = useAnimatedStyle(() => {\n    return {\n      backgroundColor: ratingFillColor,\n      width: translateX.value,\n      height: size - 1,\n    };\n  });\n\n  return { primaryViewStyle, handler };\n}\n"
  },
  {
    "path": "packages/react-native-rating/src/useTapRating.ts",
    "content": "import { useEffect } from 'react';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport { TapRatingProps } from './type';\n\nexport default function useTapRating({\n  rating = 3,\n  onFinishRating,\n}: Pick<TapRatingProps, 'rating' | 'onFinishRating'>) {\n  const [position, setPosition] = useSafeState(rating);\n\n  useEffect(() => {\n    setPosition(rating);\n  }, [rating]);\n\n  const handleSelect = (position: number) => {\n    setPosition(position);\n    onFinishRating?.(position);\n  };\n\n  return { position, handleSelect: useMemoizedFn(handleSelect) };\n}\n"
  },
  {
    "path": "packages/react-native-rating/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-rating/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-share/CHANGELOG.md",
    "content": "# @td-design/react-native-share\n\n## 1.5.2\n\n### Patch Changes\n\n- [#928](https://github.com/thundersdata-frontend/td-design/pull/928) [`d035cb837`](https://github.com/thundersdata-frontend/td-design/commit/d035cb837371dfc32fe7fe8105bead76195c93af) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 优化弹窗类组件的显示方式\n\n## 1.5.1\n\n### Patch Changes\n\n- [#714](https://github.com/thundersdata-frontend/td-design/pull/714) [`ef6d88136`](https://github.com/thundersdata-frontend/td-design/commit/ef6d88136421ea13b19b11730f94b589047c5a8b) Thanks [@chj-damon](https://github.com/chj-damon)! - 继续优化组件样式\n\n## 1.5.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 样式优化\n\n## 1.4.1\n\n### Patch Changes\n\n- [#677](https://github.com/thundersdata-frontend/td-design/pull/677) [`469b748a3`](https://github.com/thundersdata-frontend/td-design/commit/469b748a33b288afc288be969a193eae0e2f6d13) Thanks [@chj-damon](https://github.com/chj-damon)! - 优化组件同时为一些组件补充 activeOpacity 属性\n\n## 1.4.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n## 1.3.4\n\n### Patch Changes\n\n- [#631](https://github.com/thundersdata-frontend/td-design/pull/631) [`71a4fb174`](https://github.com/thundersdata-frontend/td-design/commit/71a4fb17491c9bf22d407a3450f49e827a243503) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复一些样式上的问题\n\n## 1.3.3\n\n### Patch Changes\n\n- [#625](https://github.com/thundersdata-frontend/td-design/pull/625) [`5efa85848`](https://github.com/thundersdata-frontend/td-design/commit/5efa858485f78542b293404baa504e11182830bb) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复 useTheme 引入路径不正确导致报错的问题\n"
  },
  {
    "path": "packages/react-native-share/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-share\",\n  \"version\": \"1.5.2\",\n  \"description\": \"基于 @td-design/react-native 的 share 组件\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-svg\": \"^13.10.0\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/react-native-share/src/index.md",
    "content": "---\ntitle: Share - 分享组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 分享组件\n  path: /share\n---\n\n# Share 分享组件\n\n使用本组件需要单独安装：**yarn add @td-design/react-native-share**\n\n## 效果演示\n\n### 1. 支持所有分享\n\n```tsx | pure\n<Share\n  visible={visible}\n  onCancel={() => setVisible(false)}\n  onRefresh={() => console.log('123')}\n  onShareSms={() => console.log('1')}\n  onShareFriends={() => console.log('1')}\n  onShareMoments={() => console.log('2')}\n  onShareWeibo={() => console.log('3')}\n  onShareAlipay={() => console.log('4')}\n  onShareDingtalk={() => console.log('5')}\n  onShareQQ={() => console.log('6')}\n  onShareZhihu={() => console.log('7')}\n  onShareQQMail={() => console.log('8')}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608257540826683640.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. 只分享微信和微博\n\n```tsx | pure\n<Share\n  visible={visible}\n  onCancel={() => setVisible(false)}\n  onRefresh={() => console.log('123')}\n  onShareFriends={() => console.log('1')}\n  onShareMoments={() => console.log('2')}\n  onShareWeibo={() => console.log('3')}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608257643797039788.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 自定义分享应用\n\n```tsx | pure\n<Share\n  visible={visible}\n  onCancel={() => setVisible(false)}\n  onRefresh={() => console.log('123')}\n  onShareFriends={() => console.log('1')}\n  onShareMoments={() => console.log('2')}\n  onShareWeibo={() => console.log('3')}\n  extraShares={[{ label: 'QQ', icon: <QQ />, schema: 'mqq://', onPress: onShareQQ }]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608257825295838178.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 4. 自定义操作项\n\n```tsx | pure\n<Share\n  visible={visible}\n  onCancel={() => setVisible(false)}\n  onRefresh={() => console.log('123')}\n  onShareSms={() => console.log('1')}\n  onShareFriends={() => console.log('1')}\n  onShareMoments={() => console.log('2')}\n  onShareWeibo={() => console.log('3')}\n  onShareAlipay={() => console.log('4')}\n  onShareDingtalk={() => console.log('5')}\n  onShareQQ={() => console.log('6')}\n  onShareZhihu={() => console.log('7')}\n  onShareQQMail={() => console.log('8')}\n  extraActions={[\n    {\n      label: '截图',\n      icon: <Icon type=\"material\" name=\"add-a-photo\" size={60} color=\"#000\" />,\n      onPress: () => console.log('9'),\n    },\n  ]}\n/>\n```\n\n<center>\n  <figure>\n    <img\n      alt=\"\"\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1608258219008870837.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n### Share\n\n| 属性            | 必填    | 说明             | 类型            | 默认值 |\n| --------------- | ------- | ---------------- | --------------- | ------ |\n| visible         | `false` | 是否显示操作面板 | `boolean`       |        |\n| activeOpacity   | `false` | 按下时的不透明度 | `number`        | `0.6`  |\n| onCancel        | `true`  | 关闭操作面板     | `() => void`    |        |\n| cancelText      | `false` | 关闭文字         | `string`        | `取消` |\n| refreshText     | `false` | 刷新文字         | `string`        | `刷新` |\n| onRefresh       | `true`  | 刷新页面         | `() => void`    |        |\n| extraShares     | `false` | 自定义分享项     | `ShareItem[]`   | `[]`   |\n| extraActions    | `false` | 自定义操作项     | `ShareAction[]` | `[]`   |\n| onShareSms      | `false` | 分享到短信       | `() => void`    |        |\n| onShareFriends  | `false` | 分享给微信好友   | `() => void`    |        |\n| onShareMoments  | `false` | 分享到朋友圈     | `() => void`    |        |\n| onShareWeibo    | `false` | 分享到微博       | `() => void`    |        |\n| onShareAlipay   | `false` | 分享到支付宝     | `() => void`    |        |\n| onShareDingtalk | `false` | 分享到钉钉       | `() => void`    |        |\n| onShareQQ       | `false` | 分享到 QQ        | `() => void`    |        |\n| onShareZhihu    | `false` | 分享到知乎       | `() => void`    |        |\n| onShareQQMail   | `false` | 分享到 QQ 邮箱   | `() => void`    |        |\n\n### ShareItem\n\n| 属性    | 必填    | 说明              | 类型         | 默认值 |\n| ------- | ------- | ----------------- | ------------ | ------ |\n| appName | `false` | 应用名称          | `string`     |        |\n| label   | `true`  | 文本              | `string`     |        |\n| icon    | `true`  | 图标              | `Icon`       |        |\n| schema  | `true`  | 应用的 url schema | `string`     |        |\n| onPress | `true`  | 点击事件处理函数  | `() => void` |        |\n\n### ShareAction\n\n| 属性    | 必填   | 说明             | 类型         | 默认值 |\n| ------- | ------ | ---------------- | ------------ | ------ |\n| label   | `true` | 文本             | `string`     |        |\n| icon    | `true` | 图标             | `Icon`       |        |\n| onPress | `true` | 点击事件处理函数 | `() => void` |        |\n\n_`Icon`组件大小允许自定义，但是取 40 比较合适。_\n"
  },
  {
    "path": "packages/react-native-share/src/index.tsx",
    "content": "import React, { FC, ReactNode, useState } from 'react';\nimport { Linking, ScrollView, StyleSheet } from 'react-native';\n\nimport { Box, helpers, Modal, Portal, Pressable, Text, Theme, useTheme } from '@td-design/react-native';\n\nimport Alipay from './svg/alipay';\nimport Dingding from './svg/dingding';\nimport Moments from './svg/moments';\nimport QQ from './svg/qq';\nimport QQMail from './svg/qqmail';\nimport Refresh from './svg/refresh';\nimport Sina from './svg/sina';\nimport Sms from './svg/sms';\nimport Wechat from './svg/wechat';\nimport Zhihu from './svg/zhihu';\n\nconst { px, ONE_PIXEL } = helpers;\nexport interface ShareItem {\n  appName?: string;\n  label: string;\n  icon: ReactNode;\n  schema: string;\n  onPress: () => void;\n}\n\nexport interface ShareAction {\n  label: string;\n  icon: ReactNode;\n  onPress: () => void;\n}\ninterface ShareProps {\n  /** 按下时的不透明度 */\n  activeOpacity?: number;\n  /** 关闭文字 */\n  cancelText?: string;\n  /** 刷新文字 */\n  refreshText?: string;\n  /** 刷新页面 */\n  onRefresh: () => void;\n  /** 自定义分享项 */\n  extraShares?: ShareItem[];\n  /** 自定义操作项 */\n  extraActions?: ShareAction[];\n  onShareSms?: () => void;\n  onShareFriends?: () => void;\n  onShareMoments?: () => void;\n  onShareWeibo?: () => void;\n  onShareAlipay?: () => void;\n  onShareDingtalk?: () => void;\n  onShareQQ?: () => void;\n  onShareZhihu?: () => void;\n  onShareQQMail?: () => void;\n}\n\nconst ShareContent: FC<ShareProps & { onAnimationEnd: (visible: boolean) => void }> = ({\n  activeOpacity = 0.6,\n  cancelText = '取消',\n  refreshText = '刷新',\n  onAnimationEnd,\n  onRefresh,\n  extraShares = [],\n  extraActions = [],\n  onShareSms,\n  onShareFriends,\n  onShareMoments,\n  onShareWeibo,\n  onShareAlipay,\n  onShareDingtalk,\n  onShareQQ,\n  onShareZhihu,\n  onShareQQMail,\n}) => {\n  const [visible, setVisible] = useState(true);\n\n  const theme = useTheme<Theme>();\n  const styles = StyleSheet.create({\n    action: {\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: theme.spacing.x2,\n      borderTopWidth: ONE_PIXEL,\n      borderTopColor: theme.colors.border,\n      backgroundColor: theme.colors.white,\n    },\n    item: {\n      justifyContent: 'center',\n      alignItems: 'center',\n      marginRight: theme.spacing.x2,\n    },\n    content1: {\n      padding: theme.spacing.x2,\n      borderBottomWidth: ONE_PIXEL,\n      borderColor: theme.colors.border,\n    },\n    content2: { padding: theme.spacing.x2 },\n  });\n\n  const baseActions: ShareItem[] = [];\n\n  // 根据传入方法来判断是否需要渲染对应的分享场景\n  if (onShareSms) {\n    baseActions.push({\n      label: '短信',\n      icon: <Sms />,\n      schema: 'sms://',\n      onPress: onShareSms,\n    });\n  }\n  if (onShareFriends) {\n    baseActions.push({\n      label: '微信',\n      appName: '微信',\n      icon: <Wechat />,\n      schema: 'weixin://',\n      onPress: onShareFriends,\n    });\n  }\n  if (onShareMoments) {\n    baseActions.push({\n      label: '朋友圈',\n      appName: '微信',\n      icon: <Moments />,\n      schema: 'weixin://',\n      onPress: onShareMoments,\n    });\n  }\n  if (onShareWeibo) {\n    baseActions.push({ label: '微博', icon: <Sina />, schema: 'sinaweibo://', onPress: onShareWeibo });\n  }\n  if (onShareAlipay) {\n    baseActions.push({ label: '支付宝', icon: <Alipay />, schema: 'alipays://', onPress: onShareAlipay });\n  }\n  if (onShareDingtalk) {\n    baseActions.push({ label: '钉钉', icon: <Dingding />, schema: 'dingtalk://', onPress: onShareDingtalk });\n  }\n  if (onShareQQ) {\n    baseActions.push({ label: 'QQ', icon: <QQ />, schema: 'mqq://', onPress: onShareQQ });\n  }\n  if (onShareZhihu) {\n    baseActions.push({ label: '知乎', icon: <Zhihu />, schema: 'zhihu://', onPress: onShareZhihu });\n  }\n  if (onShareQQMail) {\n    baseActions.push({ label: 'QQ邮箱', icon: <QQMail />, schema: 'qqmail://', onPress: onShareQQMail });\n  }\n\n  const _actions = baseActions.concat(extraShares);\n  const secondaryActions = [\n    {\n      label: refreshText,\n      icon: <Refresh color={theme.colors.gray400} />,\n      onPress: onRefresh,\n    },\n    ...extraActions,\n  ];\n\n  const renderShareItem = (item: ShareItem) => {\n    return (\n      <Pressable\n        activeOpacity={activeOpacity}\n        key={item.label}\n        onPress={() => {\n          if (item.schema) {\n            Linking.canOpenURL(item.schema)\n              .then(() => {\n                if (item.onPress) {\n                  item.onPress();\n                }\n              })\n              .catch(() => {\n                console.log(`您尚未安装${item.appName ?? item.label}`);\n              });\n          } else if (item.onPress) {\n            item.onPress();\n          }\n        }}\n        style={styles.item}\n      >\n        <Box width={px(40)} height={px(40)} justifyContent=\"center\" alignItems=\"center\" marginBottom=\"x1\">\n          {item.icon}\n        </Box>\n        <Text variant=\"p2\" color=\"text\">\n          {item.label}\n        </Text>\n      </Pressable>\n    );\n  };\n\n  const renderActionItem = (item: ShareAction) => {\n    return (\n      <Pressable activeOpacity={activeOpacity} key={item.label} onPress={item.onPress} style={styles.item}>\n        <Box width={px(40)} height={px(40)} justifyContent=\"center\" alignItems=\"center\" marginBottom=\"x1\">\n          {item.icon}\n        </Box>\n        <Text variant=\"p2\" color=\"text\">\n          {item.label}\n        </Text>\n      </Pressable>\n    );\n  };\n\n  return (\n    <Modal.Content\n      position=\"bottom\"\n      maskVisible\n      maskClosable\n      animationType=\"slide\"\n      onAnimationEnd={onAnimationEnd}\n      visible={visible}\n      onClose={() => setVisible(false)}\n    >\n      <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.content1}>\n        {_actions.map(renderShareItem)}\n      </ScrollView>\n      <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.content2}>\n        {secondaryActions.map(renderActionItem)}\n      </ScrollView>\n      <Pressable\n        activeOpacity={activeOpacity}\n        onPress={() => {\n          setVisible(false);\n        }}\n        style={styles.action}\n      >\n        <Text variant=\"p0\" color=\"text\">\n          {cancelText}\n        </Text>\n      </Pressable>\n    </Modal.Content>\n  );\n};\n\nconst Share = () => null;\n\nShare.displayName = 'Share';\n\nShare.show = (props: ShareProps) => {\n  const key = Portal.add(\n    <ShareContent\n      {...props}\n      onAnimationEnd={visible => {\n        if (!visible) {\n          Portal.remove(key);\n        }\n      }}\n    />\n  );\n};\n\nexport default Share;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/alipay.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(30);\nconst height = px(30);\nconst xml = `\n<svg t=\"1609229362828\" class=\"icon\" viewBox=\"0 0 1037 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"10903\" width=${width} height=${height}><path d=\"M665.600029 614.4c70.4-128 96-249.6 96-249.6l-12.8 0 0 0L640.000029 364.8 524.800029 364.8 524.800029 275.2l281.6 0L806.400029 236.8 524.800029 236.8 524.800029 102.4l-128 0 0 134.4-256 0 0 38.4 256 0 0 89.6L179.200029 364.8l0 38.4 441.6 0c0 6.4 0 6.4-6.4 12.8C614.400029 460.8 582.400029 524.8 556.800029 576 230.400029 448 134.400029 524.8 108.800029 537.6c-217.6 153.6-12.8 345.6 19.2 339.2 230.4 51.2 377.6-44.8 480-166.4 6.4 6.4 12.8 6.4 19.2 6.4 70.4 38.4 409.6 198.4 409.6 198.4s0-140.8 0-192C985.600029 723.2 800.000029 659.2 665.600029 614.4zM499.200029 672c-160 204.8-352 140.8-384 128C38.400029 780.8 12.800029 640 108.800029 595.2c160-51.2 300.8 6.4 403.2 57.6C505.600029 665.6 499.200029 672 499.200029 672z\" fill=\"#01A1EA\" p-id=\"10904\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/dingding.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(32);\nconst height = px(32);\nconst xml = `\n<svg t=\"1609229391798\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"11135\" width=${width} height=${height}><path d=\"M836.3 409.4c-1.5 6-5 14.9-10 25.6h0.1l-0.6 1c-29 62.1-104.5 183.7-104.5 183.7s-0.1-0.3-0.4-0.7l-22.1 38.5h106.5L602 928.2 648.2 744h-83.8l29.1-121.9c-23.6 5.7-51.4 13.5-84.4 24.1 0 0-44.6 26.2-128.5-50.3 0 0-56.6-49.9-23.8-62.4 13.9-5.3 67.7-12 110-17.7C524 508 559.2 504 559.2 504s-176.2 2.5-218-4c-41.8-6.5-94.9-76.5-106.2-137.9 0 0-17.4-33.7 37.6-17.7 55 16 282.9 62.2 282.9 62.2s-296.4-91-316.1-113.2c-19.7-22.2-58-121.2-53-182 0 0 2.2-15.2 17.6-11.1 0 0 219.1 100.3 369 155.2 149.9 54.9 280.1 82.8 263.3 153.9z m0 0\" p-id=\"11136\" fill=\"#00ACFF\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/moments.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(30);\nconst height = px(30);\n\nconst xml = `\n<svg t=\"1609225166832\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1493\" width=${width} height=${height}><path d=\"M681.7 38.8S614.1 12 512 12 342.3 42.7 342.3 42.7L681.8 381l-0.1-342.2z\" fill=\"#FB5453\" p-id=\"1494\"></path><path d=\"M865.5 158.5c-72.2-71.3-142-96.7-142-96.7l-2.4 476 245.3-242c0 0.1-28.6-66-100.9-137.3z\" fill=\"#6468F1\" p-id=\"1495\"></path><path d=\"M980.9 344.6L638 679.5h346.9s27.2-66.7 27.2-167.5c-0.1-100.7-31.2-167.4-31.2-167.4z\" fill=\"#5283F0\" p-id=\"1496\"></path><path d=\"M726.3 965.1s67-28.2 139.2-99.5 98-140.1 98-140.1L481 723.1l245.3 242z\" fill=\"#00B2FE\" p-id=\"1497\"></path><path d=\"M342.2 985.3s67.6 26.8 169.7 26.8c102.2 0 169.7-30.7 169.7-30.7L342.1 643.1l0.1 342.2z\" fill=\"#66D020\" p-id=\"1498\"></path><path d=\"M158.4 865.6c72.2 71.3 142 96.7 142 96.7l2.4-476-245.3 242c0.1-0.1 28.7 66 100.9 137.3z\" fill=\"#9AD122\" p-id=\"1499\"></path><path d=\"M39.1 344.6s-27.2 66.7-27.2 167.5S43 679.6 43 679.6l342.9-334.9H39.1v-0.1z\" fill=\"#FFC71A\" p-id=\"1500\"></path><path d=\"M297.7 59s-67 28.2-139.2 99.5-98 140.1-98 140.1L543 301 297.7 59z\" fill=\"#FF7612\" p-id=\"1501\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/qq.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(30);\nconst height = px(30);\n\nconst xml = `\n<svg t=\"1609229433937\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"11413\" width=${width} height=${height}><path d=\"M120.366545 576.791273c-31.325091 73.728-36.398545 144.290909-11.264 157.230545 17.314909 9.076364 44.497455-11.589818 69.818182-49.431273a207.732364 207.732364 0 0 0 70.656 108.544c-37.236364 13.963636-61.719273 36.352-61.719272 61.85891 0 41.890909 66.048 75.915636 147.502545 75.915636 73.495273 0 134.423273-27.601455 145.640727-63.813818h17.547637c11.310545 36.165818 72.192 63.813818 145.687272 63.813818 81.454545 0 147.502545-33.978182 147.502546-75.915636 0-25.506909-24.389818-48.081455-61.719273-61.85891a208.197818 208.197818 0 0 0 70.656-108.544c25.460364 37.841455 52.596364 58.507636 69.818182 49.431273 25.181091-13.125818 20.200727-83.502545-11.264-157.230545a208.802909 208.802909 0 0 0-83.502546-110.08 112.407273 112.407273 0 0 0-16.290909-71.121455 24.901818 24.901818 0 0 0 0-3.909818 63.301818 63.301818 0 0 0-6.656-28.346182C746.263273 212.666182 648.192 93.090909 489.518545 93.090909S232.634182 212.666182 226.257455 363.333818a62.929455 62.929455 0 0 0-6.702546 28.346182v3.909818a113.384727 113.384727 0 0 0-16.756364 59.997091c0 3.723636 0 7.447273 0.465455 11.170909a209.082182 209.082182 0 0 0-83.409455 110.033455z m0 0\" fill=\"#1296db\" p-id=\"11414\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/qqmail.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(30);\nconst height = px(30);\n\nconst xml = `\n<svg t=\"1609229469028\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"11691\" width=${width} height=${height}><path d=\"M881.81248 829.568 142.26432 829.568c-41.74336 0-75.70432-33.96096-75.70432-75.70944L66.56 270.0544c0-41.66656 33.96096-75.62752 75.70432-75.62752l739.54816 0c41.67168 0 75.62752 33.96096 75.62752 75.62752l0 483.80416C957.44 795.61216 923.48416 829.568 881.81248 829.568L881.81248 829.568 881.81248 829.568zM142.26432 235.15136c-19.24608 0-34.98496 15.6672-34.98496 34.90304l0 483.80416c0 19.328 15.73888 35.00032 34.98496 35.00032l739.54816 0c19.24608 0 34.91328-15.67232 34.91328-35.00032L916.72576 270.0544c0-19.24096-15.67232-34.90304-34.91328-34.90304L142.26432 235.15136 142.26432 235.15136 142.26432 235.15136z\" p-id=\"11692\" fill=\"#F2BB41\"></path><path d=\"M881.81248 829.568 142.26432 829.568c-31.17056 0-59.56096-19.6352-70.69184-48.90112-2.944-7.87456-0.79872-16.77824 5.48352-22.4256l288.74752-257.408c8.3456-7.3984 21.22752-6.7584 28.6976 1.66912 7.48032 8.42752 6.7584 21.22752-1.664 28.6976l-276.17792 246.35904c6.52288 6.99392 15.744 11.28448 25.60512 11.28448l739.54816 0c9.7792 0 19.00544-4.29056 25.5232-11.28448l-279.43936-249.22624c-8.35072-7.47008-9.14432-20.27008-1.5872-28.70272 7.4752-8.3456 20.35712-9.06752 28.70272-1.66912l291.84512 260.28032c6.28224 5.64224 8.50432 14.55104 5.48352 22.41536C941.29664 809.9328 912.91136 829.568 881.81248 829.568L881.81248 829.568 881.81248 829.568z\" p-id=\"11693\" fill=\"#F2BB41\"></path><path d=\"M512.03584 646.58432c-4.84352 0-9.69728-1.664-13.5168-5.15584L77.06112 265.76384c-6.28736-5.64736-8.42752-14.55104-5.48352-22.4256 11.13088-29.26592 39.52128-48.91136 70.69184-48.91136l739.54816 0c31.09376 0 59.47904 19.72736 70.53312 48.91136 3.0208 7.87456 0.7936 16.77824-5.48352 22.4256l-421.22752 375.66464C521.73824 644.92032 516.8896 646.58432 512.03584 646.58432L512.03584 646.58432 512.03584 646.58432zM116.6592 246.51776l395.38176 352.44032 395.29984-352.44032c-6.51776-7.07584-15.744-11.37152-25.5232-11.37152L142.26432 235.14624C132.4032 235.15136 123.1872 239.44704 116.6592 246.51776L116.6592 246.51776 116.6592 246.51776z\" p-id=\"11694\" fill=\"#F2BB41\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/refresh.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(24);\nconst height = px(24);\n\nexport default ({ color }: { color: string }) => {\n  const xml = `\n  <svg t=\"1609225806969\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"3453\" width=${width} height=${height}><path d=\"M989.9 477.9c-18.9 0-34.1 15.3-34.1 34.1 0 244.7-199.1 443.7-443.7 443.7S68.3 756.7 68.3 512 267.3 68.3 512 68.3c146.5 0 283.8 73.3 366.1 193.1H699.8c-18.9 0-34.1 15.3-34.1 34.1s15.3 34.1 34.1 34.1h248.7c18.9 0 34.1-15.3 34.1-34.1V46.8c0-18.9-15.3-34.1-34.1-34.1S914.4 28 914.4 46.8v148.8C818 73.5 669.6 0 512 0 229.7 0 0 229.7 0 512s229.7 512 512 512 512-229.7 512-512c0-18.9-15.3-34.1-34.1-34.1z\" p-id=\"3454\" fill=\"${color}\"></path></svg>\n  `;\n  return <SvgXml xml={xml} width={width} height={height} />;\n};\n"
  },
  {
    "path": "packages/react-native-share/src/svg/sina.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(40);\nconst height = px(40);\n\nconst xml = `\n<svg t=\"1609229336448\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"10713\" width=${width} height=${height}><path d=\"M643.573 533.504c-26.037-24.15-59.786-42.027-101.728-53.621-41.941-11.104-86.304-14.486-134.026-9.654-72.32 7.734-132.587 30.432-180.267 69.558-47.733 38.645-69.43 82.133-64.608 129.941 2.901 31.403 17.355 59.413 43.392 83.573s59.787 42.027 101.728 53.622 86.304 14.933 134.037 10.133c72.32-7.723 132.587-30.421 180.267-69.557s69.419-82.603 64.565-130.422c-2.858-31.402-17.322-59.413-43.36-83.573z\" fill=\"#FFFFFF\" p-id=\"10714\"></path><path d=\"M533.163 602.581c-15.424-29.461-40.971-48.789-77.131-58.442-34.23-9.184-68.47-5.803-102.699 9.173q-50.624 22.464-73.76 68.117c-15.434 30.934-16.394 61.344-3.381 91.734 13.024 29.952 37.13 50.72 71.84 61.866 36.16 12.075 72.8 10.144 109.44-5.802 36.64-15.456 62.677-40.096 77.141-73.419 14.944-32.843 14.464-63.755-1.45-93.227z m-129.206 100c-7.232 11.104-17.354 18.838-30.858 23.67q-19.52 6.506-36.16-1.451c-11.083-5.333-18.315-13.525-21.206-24.64-2.901-11.595-0.97-22.699 6.262-33.813 6.752-11.115 16.874-18.358 29.408-22.699a50.315 50.315 0 0 1 35.68 0.48c11.573 4.832 18.805 13.045 22.176 24.64s1.408 22.699-5.302 33.813zM449.76 643.2a18.421 18.421 0 0 1-11.093 9.664 22.997 22.997 0 0 1-13.984 0c-9.6-4.832-11.563-12.075-6.262-22.219a21.067 21.067 0 0 1 24.587-9.664 14.848 14.848 0 0 1 8.683 9.184c1.44 4.299 0.48 8.651-1.931 13.035z\" fill=\"#040000\" p-id=\"10715\"></path><path d=\"M820.512 561.525c-11.083-17.386-24.107-30.432-39.05-40.096a207.467 207.467 0 0 0-50.134-23.189c-3.85-1.45-6.752-2.41-8.192-2.89a61.312 61.312 0 0 1-5.792-3.873c-2.4-1.93-3.37-3.861-2.4-6.272a30.677 30.677 0 0 0 2.4-9.664c14.464-37.685 14.464-66.656 0-87.466-14.933-19.808-40.01-29.952-74.667-29.952s-74.73 9.664-120.053 28.981l-2.89 0.97a27.307 27.307 0 0 1-6.753 1.931 12.277 12.277 0 0 1-7.232 0.48 6.08 6.08 0 0 1-4.821-3.381c-0.96-1.93-0.96-5.333 0.48-9.653 14.933-47.339 11.573-81.643-9.6-102.4-23.616-24.16-64.117-25.12-120.043-3.382-56.522 22.24-111.957 60.886-166.965 115.958-41.461 42.026-73.77 84.053-96.427 126.56s-33.706 82.602-33.706 120.277c0 35.264 10.602 67.627 31.818 98.07q31.819 44.917 83.894 73.898c34.229 19.328 73.76 34.304 117.152 45.408A538.827 538.827 0 0 0 441.6 868.267c45.803-0.48 90.155-5.334 132.096-15.456 42.432-10.144 79.072-23.67 110.41-40.534a409.44 409.44 0 0 0 82.443-57.482c23.147-21.259 40.982-43.968 53.035-67.2 12.053-23.67 17.835-46.379 17.835-68.598a105.333 105.333 0 0 0-16.907-57.472zM622.357 747.5c-47.722 39.136-107.989 61.866-180.266 69.557-47.734 4.832-92.086 1.45-134.038-10.133S232.32 777.45 206.325 753.3s-40.533-52.17-43.392-83.573c-4.821-47.819 16.875-91.296 64.608-129.941 47.734-39.126 108-61.867 180.267-69.558 47.723-4.832 92.085-1.45 134.027 9.654 41.941 11.594 75.733 29.472 101.728 53.621s40.533 52.17 43.392 83.573c4.832 47.819-16.864 91.296-64.598 130.422z\" fill=\"#CD281E\" p-id=\"10716\"></path><path d=\"M801.227 313.237c13.504 15.456 22.666 33.323 26.517 53.131s2.89 39.125-3.37 57.483c-2.411 7.733-7.233 13.045-14.465 16.906-7.232 3.382-14.464 4.352-21.696 1.931a25.781 25.781 0 0 1-16.394-14.485c-3.371-7.243-4.342-14.496-1.931-21.739 6.272-20.779 2.41-38.645-11.573-54.581q-21.675-23.2-52.064-17.398a30.25 30.25 0 0 1-22.176-3.818c-6.752-4.352-11.094-10.144-12.054-18.358-1.45-7.733-0.48-14.933 3.862-21.738s10.122-11.115 17.834-12.555a112.32 112.32 0 0 1 107.51 35.264z\" fill=\"#DA761E\" p-id=\"10717\"></path><path d=\"M889.461 233.045a224 224 0 0 1 54.955 109.174c8.203 41.536 6.272 80.672-6.741 118.4a35.2 35.2 0 0 1-16.395 19.808c-8.192 4.341-16.395 4.832-25.6 1.93a31.936 31.936 0 0 1-19.285-16.906c-4.331-8.214-4.822-16.427-2.411-25.6 9.163-26.571 10.667-55.072 4.821-84.534a157.515 157.515 0 0 0-39.05-77.29c-20.267-22.71-44.352-38.166-72.32-46.859a166.901 166.901 0 0 0-84.374-4.352 32.256 32.256 0 0 1-25.546-4.832c-7.712-4.821-12.534-12.075-14.464-21.248s-0.48-17.397 4.821-25.12a31.755 31.755 0 0 1 21.259-14.55c40.01-8.693 79.552-6.762 119.082 5.803 39.051 12.555 72.8 34.294 101.248 66.134z\" fill=\"#DA761E\" p-id=\"10718\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/sms.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(30);\nconst height = px(30);\n\nconst xml = `\n<svg t=\"1609225198686\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1732\" width=${width} height=${height}><path d=\"M532.292683 0C238.726909 0 0.02559 204.718113 0.02559 457.391443c0 150.160736 54.608557 273.042783 163.77449 361.788085v150.211915c0 40.943623 13.664934 54.608557 34.136745 54.608557a52.254298 52.254298 0 0 0 34.136746-13.664934l163.77449-95.603359a924.814074 924.814074 0 0 0 136.444622 13.716114c293.514594 0 491.323471-218.434226 491.323471-470.851659S778.261495 0 532.292683 0z m0 860.123151c-27.329868 0-95.552179-6.806877-122.830868-6.806878l-27.278688-6.806877-20.471812 13.664934-122.830867 68.273491v-143.302679l-27.278689-20.471811c-88.745302-75.080368-136.546981-184.246301-136.546981-307.077169 0-218.434226 204.718113-388.964414 464.198321-388.964415 197.962415 0 423.254698 163.77449 423.254698 388.964415-6.806877 231.894442-191.104358 402.578169-430.215114 402.578168zM273.068373 402.782887a61.415434 61.415434 0 1 0 43.451419 18.015194 62.131947 62.131947 0 0 0-43.451419-18.015194z m238.906037 0a61.415434 61.415434 0 1 0 43.45142 18.015194A62.131947 62.131947 0 0 0 511.820872 402.782887z m238.906038 0a61.415434 61.415434 0 1 0 43.451419 18.015194 62.131947 62.131947 0 0 0-43.40024-18.015194z\" p-id=\"1733\" fill=\"#6AD460\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/wechat.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(36);\nconst height = px(36);\n\nconst xml = `\n<svg t=\"1609229172056\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"10202\" width=${width} height=${height}><path d=\"M982.664533 621.294933c0-113.442133-93.678933-208.776533-218.641067-233.437867-1.6384-1.6384-1.6384-1.6384-3.2768-1.6384s-1.655467 0-3.293867 0c-1.621333 0-1.621333 0-3.259733-1.655467-1.655467 0-3.293867 0-4.932267 0l-1.655467 0c-1.655467 0-3.2768 0-4.932267-1.655467l-1.655467 0c-1.655467 0-4.9152 0-6.570667 0-11.52-1.655467-24.661333-1.655467-36.164267-1.655467-157.815467 0-282.743467 106.871467-282.743467 240.0256 0 29.576533 6.570667 59.170133 18.090667 85.486933l0 1.621333c1.655467 0 1.655467 1.655467 1.655467 3.293867L436.906667 711.68c0 1.6384 0 3.2768 1.655467 3.2768l0 1.655467c0 1.655467 1.655467 1.655467 1.655467 3.2768l1.655467 1.655467 0 1.655467c1.6384 1.655467 1.6384 1.655467 1.6384 3.259733l1.655467 1.655467c0 0 0 1.655467 1.655467 1.655467l0 1.655467c1.621333 3.2768 1.621333 4.932267 3.2768 6.570667 34.525867 54.254933 93.713067 93.696 162.747733 113.425067 4.9152 1.6384 11.502933 3.2768 16.452267 3.2768 23.022933 4.932267 46.011733 8.226133 69.034667 8.226133 34.5088 0 65.757867-6.587733 96.989867-14.813867l105.216 50.961067-26.299733-88.7808C939.9296 765.952 982.664533 698.555733 982.664533 621.294933zM612.795733 585.130667c-19.712 0-34.5088-14.7968-34.5088-34.525867 0-19.712 14.7968-36.164267 34.5088-36.164267 19.729067 0 36.164267 16.452267 36.164267 36.164267C648.96 570.333867 632.541867 585.130667 612.795733 585.130667zM795.272533 585.130667c-19.729067 0-34.5088-14.7968-34.5088-34.525867 0-19.712 14.779733-36.164267 34.5088-36.164267s36.164267 16.452267 36.164267 36.164267C831.4368 570.333867 815.0016 585.130667 795.272533 585.130667z\" p-id=\"10203\" fill=\"#4CBF00\"></path><path d=\"M473.070933 424.021333c59.204267-49.288533 138.103467-78.8992 225.211733-78.8992 6.587733 0 13.1584 0 19.729067 0C680.192 223.488 548.693333 133.0688 392.533333 133.0688c-187.392 0-338.6368 128.2048-338.6368 286.020267 0 92.0576 49.322667 172.629333 128.221867 225.211733l-29.610667 105.216 124.945067-59.1872c36.164267 9.864533 75.605333 16.452267 115.080533 16.452267l1.655467 0c-9.8816-26.3168-14.813867-55.893333-14.813867-85.486933C379.374933 544.034133 415.5392 473.344 473.070933 424.021333zM502.6816 276.087467c26.299733 0 46.0288 21.3504 46.0288 46.011733 0 26.3168-19.729067 46.045867-46.0288 46.045867-24.661333 0-46.045867-19.729067-46.045867-46.045867C456.635733 297.437867 478.020267 276.087467 502.6816 276.087467zM280.746667 368.145067c-26.299733 0-46.0288-19.729067-46.0288-46.045867 0-24.661333 19.729067-46.011733 46.0288-46.011733 24.661333 0 46.045867 21.3504 46.045867 46.011733C326.775467 348.416 305.408 368.145067 280.746667 368.145067z\" p-id=\"10204\" fill=\"#4CBF00\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/src/svg/zhihu.tsx",
    "content": "import React from 'react';\nimport { SvgXml } from 'react-native-svg';\n\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\nconst width = px(26);\nconst height = px(26);\n\nconst xml = `\n<svg t=\"1609229261758\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"10435\" width=${width} height=${height}><path d=\"M544.949 561.422s0-71.387-34.779-75.050c-34.779-3.663-142.775 0-142.775 0v-219.654h161.078s-1.83-73.219-32.949-73.219h-261.755l43.93-117.148s-65.897 3.663-89.692 45.761-98.844 252.604-98.844 252.604 25.627 10.983 67.726-20.134c42.101-31.116 56.743-86.033 56.743-86.033l76.879-3.663 1.83 223.316s-133.621-1.83-161.078 0c-27.457 1.83-42.101 75.050-42.101 75.050h203.182s-18.307 124.47-69.557 214.164c-53.085 89.692-151.929 161.078-151.929 161.078s71.387 29.287 140.947-10.983c69.557-42.101 120.811-223.316 120.811-223.316l162.912 203.182s14.643-97.013-1.83-124.47c-18.307-27.457-113.49-137.283-113.49-137.283l-42.101 36.607 29.287-120.811h177.552zM587.050 188.010l-1.83 660.793h65.897l23.795 82.37 115.321-82.37h162.912v-660.793h-366.091zM879.92 775.584h-76.879l-97.013 75.050-21.965-75.050h-20.134v-512.527h215.991v512.527z\" fill=\"#0E87EA\" p-id=\"10436\"></path></svg>\n`;\n\nexport default () => <SvgXml xml={xml} width={width} height={height} />;\n"
  },
  {
    "path": "packages/react-native-share/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-share/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-skeleton/CHANGELOG.md",
    "content": "# @td-design/react-native-skeleton\n\n## 1.3.0\n\n### Minor Changes\n\n- [#743](https://github.com/thundersdata-frontend/td-design/pull/743) [`acdd74c13`](https://github.com/thundersdata-frontend/td-design/commit/acdd74c1324be45816f4e1dff0d5e854124172ad) Thanks [@chj-damon](https://github.com/chj-damon)! - perf: 优化多个组件\n\n## 1.2.0\n\n### Minor Changes\n\n- [#712](https://github.com/thundersdata-frontend/td-design/pull/712) [`fbb667b32`](https://github.com/thundersdata-frontend/td-design/commit/fbb667b32019f5d0436ff2093ad52ffd0a95b641) Thanks [@chj-damon](https://github.com/chj-damon)! - 样式优化\n\n## 1.1.0\n\n### Minor Changes\n\n- [#654](https://github.com/thundersdata-frontend/td-design/pull/654) [`a27035f58`](https://github.com/thundersdata-frontend/td-design/commit/a27035f58266c625742c9d03171cedbb913ac199) Thanks [@chj-damon](https://github.com/chj-damon)! - 1. 对组件进行性能优化; 2.重写 Accordion 组件; 3. 修复一些发现的 bug\n\n## 1.0.0\n\n### Major Changes\n\n- [`4d1d4db4c`](https://github.com/thundersdata-frontend/td-design/commit/4d1d4db4c83b1d37810af6c289adfade573364d8) Thanks [@chj-damon](https://github.com/chj-damon)! - 从组件库中拆分 Skeleton 组件单独使用\n"
  },
  {
    "path": "packages/react-native-skeleton/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-skeleton\",\n  \"version\": \"1.3.0\",\n  \"description\": \"基于 @td-design/react-native 的 skeleton 组件\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@shopify/restyle\": \"2.4.2\",\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@td-design/rn-hooks\": \"workspace:^2.8.1\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-reanimated\": \"^3.3.0\",\n    \"react-native-linear-gradient\": \"^2.8.0\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\"\n}\n"
  },
  {
    "path": "packages/react-native-skeleton/src/ShiverBone.tsx",
    "content": "import React, { FC } from 'react';\nimport LinearGradient from 'react-native-linear-gradient';\nimport Animated, { interpolate, useAnimatedStyle } from 'react-native-reanimated';\n\nimport { calc } from './helper';\nimport { ShiverBoneProps } from './type';\n\n/**\n * 渐变的骨架组件\n */\nexport const ShiverBone: FC<ShiverBoneProps> = ({\n  style,\n  boneStyle,\n  animationDirection,\n  boneColor,\n  highlightColor,\n  animation,\n  size,\n}) => {\n  const animatedStyle = useAnimatedStyle(() => {\n    const boneWidth =\n      (typeof style.width === 'string' && style.width.includes('%') ? calc(size.width, style.width) : style.width) ?? 0;\n    const boneHeight =\n      (typeof style.height === 'string' && style.height.includes('%')\n        ? calc(size.height, style.height)\n        : style.height) ?? 0;\n    const outputRange: number[] = [];\n\n    if (animationDirection === 'horizontalRight') {\n      outputRange.push(-boneWidth, +boneWidth);\n    } else if (animationDirection === 'horizontalLeft') {\n      outputRange.push(+boneWidth, -boneWidth);\n    } else if (animationDirection === 'verticalDown') {\n      outputRange.push(-boneHeight, +boneHeight);\n    } else if (animationDirection === 'verticalUp') {\n      outputRange.push(+boneHeight, -boneHeight);\n    }\n    const position = interpolate(animation.value, [0, 1], outputRange);\n    if (animationDirection === 'verticalUp' || animationDirection === 'verticalDown') {\n      return {\n        transform: [{ translateY: position }],\n      };\n    }\n    return {\n      transform: [{ translateX: position }],\n    };\n  });\n\n  return (\n    <Animated.View style={boneStyle}>\n      <Animated.View style={[{ position: 'absolute', height: '100%', width: '100%' }, animatedStyle]}>\n        <LinearGradient\n          style={{ flex: 1 }}\n          colors={[boneColor!, highlightColor!, boneColor!]}\n          start={{ x: 0, y: 0 }}\n          end={animationDirection?.startsWith('horizontal') ? { x: 1, y: 0 } : { x: 0, y: 1 }}\n        />\n      </Animated.View>\n    </Animated.View>\n  );\n};\n"
  },
  {
    "path": "packages/react-native-skeleton/src/StaticBone.tsx",
    "content": "import React, { FC } from 'react';\nimport Animated, { interpolateColor, useAnimatedStyle } from 'react-native-reanimated';\n\nimport { StaticBoneProps } from './type';\n\n/**\n * 静态的骨架组件\n */\nexport const StaticBone: FC<StaticBoneProps> = ({ boneStyle, animationType, boneColor, highlightColor, animation }) => {\n  const animatedStyle = useAnimatedStyle(() => {\n    return {\n      backgroundColor: interpolateColor(animation.value, [0, 1], [boneColor!, highlightColor!]),\n    };\n  });\n\n  const styles = animationType === 'none' ? animatedStyle : [boneStyle, animatedStyle];\n\n  return <Animated.View style={styles} />;\n};\n"
  },
  {
    "path": "packages/react-native-skeleton/src/helper.ts",
    "content": "export function calc(val: number, percent: string) {\n  'worklet';\n  try {\n    const percentage = Number(percent.replace('%', '')) / 100;\n    return val * percentage;\n  } catch (error) {\n    return val;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-skeleton/src/index.md",
    "content": "---\ntitle: Skeleton - 骨架屏组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 骨架屏组件\n  path: /skeleton\n---\n\n# Skeleton 骨架屏组件\n\n使用本组件前，请在您的项目里安装依赖：\n\n```code\nyarn add react-native-linear-gradient @td-design/react-native-skeleton\n```\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\n<Skeleton\n  containerStyle={styles.titleContainer}\n  styles={secondLayout}\n  loading={true}\n  animationDirection=\"horizontalRight\"\n>\n  <View>\n    <Text style={styles.bigText}>Benjamin Franklin</Text>\n  </View>\n  <Text style={[styles.normalText, { marginTop: 20 }]}>An investment in knowledge pays the best interest.</Text>\n</Skeleton>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643251256650405037.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 2. animationType=\"pulse\"\n\n```tsx | pure\n<Skeleton animationType=\"pulse\" styles={thirdLayout} containerStyle={styles.descContainer} loading={true}>\n  <Text style={styles.normalText}>“It is easier to prevent bad habits than to break them.“</Text>\n</Skeleton>\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643251448641774906.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n### 3. 5s 后显示内容\n\n```tsx | pure\nuseEffect(() => {\n  setTimeout(() => {\n    setLoading(false);\n  }, 5000);\n}, []);\n\n<Skeleton\n  containerStyle={styles.titleContainer}\n  styles={secondLayout}\n  loading={loading}\n  animationDirection=\"horizontalRight\"\n>\n  <View>\n    <Text style={styles.bigText}>Benjamin Franklin</Text>\n  </View>\n  <Text style={[styles.normalText, { marginTop: 20 }]}>An investment in knowledge pays the best interest.</Text>\n</Skeleton>;\n```\n\n<center>\n  <figure>\n    <img\n      src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1643251723101514352.gif\"\n      style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n    />\n  </figure>\n</center>\n\n## API\n\n| 属性 | 必填 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- | --- |\n| loading | `false` | 是否正在加载 | `boolean` | `true` |\n| styles | `true` | 骨架屏的样式 | `ViewStyle[]` |  |\n| duration | `false` | 动画的执行速度 | `number` | `1200` |\n| easing | `false` | 动画的执行方式 | `Animated.EasingFunction` | `Easing.bezierFn(0.5, 0, 0.25, 1)` |\n| containerStyle | `false` | 容器样式 | `StyleProp<ViewStyle>` |  |\n| animationType | `false` | 动画类型（条纹/脉搏/无） | `AnimationType` | `shiver` |\n| animationDirection | `false` | 动画方向（条纹动画有效） | `AnimationDirection` | `horizontalRight` |\n| boneColor | `false` | 基础颜色 | `string` | `#E1E9EE` |\n| highlightColor | `false` | 高亮颜色 | `string` | `#F2F8FC` |\n\n```code\nexport type AnimationType = 'none' | 'shiver' | 'pulse' | undefined;\n\nexport type AnimationDirection =\n  |'horizontalLeft'\n  | 'horizontalRight'\n  | 'verticalUp'\n  | 'verticalDown'\n  | undefined;\n\n```\n\n_关于`styles`属性的说明：_\n\n- `styles`属性是一个数组，数组的每一项是一个`ViewStyle`对象，用于描述骨架屏的样式，数组的每一项对应骨架屏的一行，数组的长度决定了骨架屏的行数。\n- `styles`的样式最好跟里面元素的样式保持一致或者近似，否则会出现骨架效果跟实际效果不一致的情况。比如：\n\n```tsx\n<Skeleton styles={[styles.box1, styles.box2]}>\n  <View style={styles.box1}>\n    <Text>hello world</Text>\n  </View>\n  <View style={styles.box2}>\n    <Text>hello world</Text>\n  </View>\n</Skeleton>;\n\nconst styles = StyleSheet.create({\n  box1: {\n    width: 200,\n    height: 50,\n  },\n  box2: {\n    width: 300,\n    height: 120,\n    marginTop: 20,\n  },\n});\n```\n"
  },
  {
    "path": "packages/react-native-skeleton/src/index.tsx",
    "content": "import React, { FC, useEffect, useMemo } from 'react';\nimport { ReactElement } from 'react';\nimport { LayoutChangeEvent, ViewStyle } from 'react-native';\nimport Animated, { Easing, useSharedValue, withRepeat, withTiming } from 'react-native-reanimated';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nimport { calc } from './helper';\nimport { ShiverBone } from './ShiverBone';\nimport { StaticBone } from './StaticBone';\nimport { AnimationType, SkeletonProps } from './type';\n\nconst DEFAULT_BORDER_RADIUS = 4;\n\nconst getBoneStyles = (\n  style: ViewStyle,\n  size: { width: number; height: number },\n  animationType: AnimationType,\n  boneColor: string\n) => {\n  const boneWidth =\n    (typeof style.width === 'string' && style.width.includes('%') ? calc(size.width, style.width) : style.width) ?? 0;\n\n  const boneHeight =\n    (typeof style.height === 'string' && style.height.includes('%') ? calc(size.height, style.height) : style.height) ??\n    0;\n\n  const boneStyle = {\n    width: boneWidth,\n    height: boneHeight,\n    borderRadius: style.borderRadius || DEFAULT_BORDER_RADIUS,\n    ...style,\n  };\n\n  if (animationType !== 'pulse') {\n    boneStyle.overflow = 'hidden';\n    boneStyle.backgroundColor = style.backgroundColor || boneColor;\n  }\n  return boneStyle;\n};\n\nconst Skeleton: FC<SkeletonProps> = ({\n  containerStyle,\n  easing = Easing.bezierFn(0.5, 0, 0.25, 1),\n  duration = 1200,\n  styles,\n  animationType = 'shiver',\n  animationDirection = 'horizontalRight',\n  loading = true,\n  boneColor = '#E1E9EE',\n  highlightColor = '#F2F8FC',\n  children,\n}) => {\n  const [size, setSize] = useSafeState({ width: 0, height: 0 });\n  const animationValue = useSharedValue(0);\n\n  const onLayout = (e: LayoutChangeEvent) => {\n    const { width, height } = e.nativeEvent.layout;\n    setSize({ width, height });\n  };\n\n  useEffect(() => {\n    // 重置动画\n    animationValue.value = 0;\n\n    if (loading) {\n      if (animationType === 'shiver') {\n        animationValue.value = withRepeat(withTiming(1, { duration, easing }), -1, false);\n      } else {\n        animationValue.value = withRepeat(withTiming(1, { duration: duration / 2, easing }), -1, true);\n      }\n    }\n  }, [loading, animationType]);\n\n  const Bones = useMemo(() => {\n    if (styles.length > 0) {\n      return styles.map((style, i) => {\n        const boneStyle = getBoneStyles(style, size, animationType, boneColor);\n\n        if (animationType === 'pulse' || animationType === 'none') {\n          return (\n            <StaticBone\n              key={`${i}`}\n              boneStyle={boneStyle}\n              {...{ animationType, boneColor, highlightColor }}\n              animation={animationValue}\n            />\n          );\n        }\n\n        return (\n          <ShiverBone\n            key={`${i}`}\n            style={style}\n            boneStyle={boneStyle}\n            {...{ animationDirection, boneColor, highlightColor }}\n            animation={animationValue}\n            size={size}\n          />\n        );\n      });\n    }\n\n    return React.Children.map(children, (child, i) => {\n      const style = (child as ReactElement).props.style || {};\n      const boneStyle = getBoneStyles(style, size, animationType, boneColor);\n\n      if (animationType === 'pulse' || animationType === 'none') {\n        return (\n          <StaticBone\n            key={`${i}`}\n            boneStyle={boneStyle}\n            {...{ animationType, boneColor, highlightColor }}\n            animation={animationValue}\n          />\n        );\n      }\n      return (\n        <ShiverBone\n          key={`${i}`}\n          style={style}\n          boneStyle={boneStyle}\n          {...{ animationDirection, boneColor, highlightColor }}\n          animation={animationValue}\n          size={size}\n        />\n      );\n    });\n  }, [styles, size, animationType, animationDirection, boneColor, highlightColor, animationValue]);\n\n  return (\n    <Animated.View style={containerStyle} onLayout={onLayout}>\n      {loading ? Bones : children}\n    </Animated.View>\n  );\n};\n\nexport default Skeleton;\n"
  },
  {
    "path": "packages/react-native-skeleton/src/type.ts",
    "content": "import { PropsWithChildren } from 'react';\nimport { StyleProp, ViewStyle } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\nexport type AnimationType = 'none' | 'shiver' | 'pulse' | undefined;\nexport type AnimationDirection = 'horizontalLeft' | 'horizontalRight' | 'verticalUp' | 'verticalDown' | undefined;\n\nexport interface Direction {\n  x: number;\n  y: number;\n}\n\nexport type SkeletonProps = PropsWithChildren<{\n  /** 是否正在加载 */\n  loading: boolean;\n  /** 骨架屏的样式 */\n  styles: ViewStyle[];\n  /** 动画的执行速度 */\n  duration?: number;\n  /** 动画的执行方式 */\n  easing?: Animated.EasingFunction;\n  /** 容器样式 */\n  containerStyle?: StyleProp<ViewStyle>;\n  /** 动画类型。条纹/脉搏/无 */\n  animationType?: AnimationType;\n  /** 动画方向（条纹动画有效）。水平向左/水平向右/垂直向上/垂直向下 */\n  animationDirection?: AnimationDirection;\n  /** 基础颜色 */\n  boneColor?: string;\n  /** 高亮颜色 */\n  highlightColor?: string;\n}>;\n\nexport interface ShiverBoneProps extends Pick<SkeletonProps, 'animationDirection' | 'boneColor' | 'highlightColor'> {\n  style: ViewStyle;\n  boneStyle: StyleProp<ViewStyle>;\n  animation: Animated.SharedValue<number>;\n  size: { width: number; height: number };\n}\n\nexport interface StaticBoneProps extends Pick<SkeletonProps, 'animationType' | 'boneColor' | 'highlightColor'> {\n  boneStyle: StyleProp<ViewStyle>;\n  animation: Animated.SharedValue<number>;\n}\n"
  },
  {
    "path": "packages/react-native-skeleton/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false,\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-skeleton/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-tabs/CHANGELOG.md",
    "content": "# @td-design/react-native-tabs\n\n## 4.5.3\n\n### Patch Changes\n\n- [#878](https://github.com/thundersdata-frontend/td-design/pull/878) [`28b6ab7fa`](https://github.com/thundersdata-frontend/td-design/commit/28b6ab7fa16eb9bd8c684c57a05d49ae982e7db0) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 优化PagerView的业务逻辑\n\n## 4.5.2\n\n### Patch Changes\n\n- [#865](https://github.com/thundersdata-frontend/td-design/pull/865) [`f02a5a90f`](https://github.com/thundersdata-frontend/td-design/commit/f02a5a90f3f5154cceb6ee1983abb9c1939e3a95) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: tabs增加设置当前页的功能\n\n## 4.5.1\n\n### Patch Changes\n\n- [#851](https://github.com/thundersdata-frontend/td-design/pull/851) [`b1257f756`](https://github.com/thundersdata-frontend/td-design/commit/b1257f7560d71c457a810541bc5f3f09e8dfd885) Thanks [@chj-damon](https://github.com/chj-damon)! - fix: 修复Tabs在涉及到state变动时导致re-render的bug\n\n## 4.5.0\n\n### Minor Changes\n\n- [#847](https://github.com/thundersdata-frontend/td-design/pull/847) [`0383d708b`](https://github.com/thundersdata-frontend/td-design/commit/0383d708b6efc81cba1fc5f9b1e1558e8babf9f1) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 为Tabs增加lazy功能\n\n## 4.4.0\n\n### Minor Changes\n\n- [#814](https://github.com/thundersdata-frontend/td-design/pull/814) [`23969b426`](https://github.com/thundersdata-frontend/td-design/commit/23969b426d3e627e556d72258ebb065250970c26) Thanks [@chj-damon](https://github.com/chj-damon)! - feat: 新增切换tab事件\n\n## 4.3.0\n\n### Minor Changes\n\n- [#743](https://github.com/thundersdata-frontend/td-design/pull/743) [`acdd74c13`](https://github.com/thundersdata-frontend/td-design/commit/acdd74c1324be45816f4e1dff0d5e854124172ad) Thanks [@chj-damon](https://github.com/chj-damon)! - perf: 优化多个组件\n\n## 4.2.0\n\n### Minor Changes\n\n- [#719](https://github.com/thundersdata-frontend/td-design/pull/719) [`7bd47862f`](https://github.com/thundersdata-frontend/td-design/commit/7bd47862fc7db32143ad5df5e7f669b14a86792b) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复安卓手机上卡屏的问题\n\n## 4.1.0\n\n### Minor Changes\n\n- [#700](https://github.com/thundersdata-frontend/td-design/pull/700) [`bfcdddbce`](https://github.com/thundersdata-frontend/td-design/commit/bfcdddbcea2097a49f54b30868ad98f2837f9625) Thanks [@chj-damon](https://github.com/chj-damon)! - 新增懒加载功能\n\n## 4.0.0\n\n### Major Changes\n\n- [#698](https://github.com/thundersdata-frontend/td-design/pull/698) [`52e472893`](https://github.com/thundersdata-frontend/td-design/commit/52e472893db980bbbc0131fe45da2188ec681542) Thanks [@chj-damon](https://github.com/chj-damon)! - 重写 Tabs 组件\n\n## 3.2.3\n\n### Patch Changes\n\n- [#685](https://github.com/thundersdata-frontend/td-design/pull/685) [`4578abbba`](https://github.com/thundersdata-frontend/td-design/commit/4578abbbac5fc96dc16cb9a67993213087093252) Thanks [@qqack](https://github.com/qqack)! - 修复 tabs 指示器条与文字不对齐的 bug\n\n## 3.2.2\n\n### Patch Changes\n\n- [#611](https://github.com/thundersdata-frontend/td-design/pull/611) [`0e334a77e`](https://github.com/thundersdata-frontend/td-design/commit/0e334a77e7cbf25a446f962e90d8645f5dfafa4b) Thanks [@chj-damon](https://github.com/chj-damon)! - 防御性修改防止 RN 对&&的判断问题\n\n## 3.2.1\n\n### Patch Changes\n\n- [`e749c01a6`](https://github.com/thundersdata-frontend/td-design/commit/e749c01a6daa53c1171104b30b720dc3625ce1f9) - 去除一些使用 useMemo 的过度优化场景\n"
  },
  {
    "path": "packages/react-native-tabs/package.json",
    "content": "{\n  \"name\": \"@td-design/react-native-tabs\",\n  \"version\": \"4.5.3\",\n  \"description\": \"基于 @td-design/react-native 的 tabs 组件\",\n  \"main\": \"lib/module/index.js\",\n  \"module\": \"lib/module/index.js\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"lib\",\n    \"android\",\n    \"ios\"\n  ],\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"bob build\",\n    \"tsc\": \"tsc -p ./tsconfig.json\"\n  },\n  \"keywords\": [\n    \"restyle\",\n    \"react-native-library\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"dependencies\": {\n    \"color\": \"^4.2.3\"\n  },\n  \"devDependencies\": {\n    \"@td-design/react-native\": \"workspace:^5.9.9\",\n    \"@td-design/rn-hooks\": \"workspace:^2.8.1\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-native\": \"^0.72.2\",\n    \"react-native-builder-bob\": \"^0.21.3\",\n    \"react-native-pager-view\": \"^6.2.0\",\n    \"react-native-reanimated\": \"^3.3.0\",\n    \"typescript\": \"5.1.6\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      \"module\",\n      [\n        \"typescript\",\n        {\n          \"project\": \"tsconfig.build.json\"\n        }\n      ]\n    ]\n  },\n  \"gitHead\": \"a230ae795ff160ad5a251dc51dbe6aab56f6eb61\",\n  \"bundledDependencies\": [\n    \"color\"\n  ]\n}"
  },
  {
    "path": "packages/react-native-tabs/src/SceneView.tsx",
    "content": "import React, { useEffect } from 'react';\nimport { View } from 'react-native';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\nexport default function SceneView({\n  lazy,\n  currentPage,\n  index,\n  children,\n}: {\n  lazy: boolean;\n  currentPage: number;\n  index: number;\n  children: (props: { loading: boolean }) => React.ReactNode;\n}) {\n  const [isLoading, setIsLoading] = useSafeState(lazy && Math.abs(currentPage - index) > 0);\n\n  if (isLoading && Math.abs(currentPage - index) <= 0 && lazy) {\n    setIsLoading(false);\n  }\n\n  useEffect(() => {\n    let timer: NodeJS.Timeout | undefined;\n\n    if (!lazy && isLoading) {\n      timer = setTimeout(() => {\n        setIsLoading(false);\n      }, 0);\n    }\n\n    return () => {\n      clearTimeout(timer);\n    };\n  }, [lazy, isLoading]);\n\n  const focused = currentPage === index;\n\n  return (\n    <View\n      accessibilityElementsHidden={!focused}\n      importantForAccessibility={focused ? 'auto' : 'no-hide-descendants'}\n      style={{\n        flex: 1,\n        overflow: 'hidden',\n      }}\n    >\n      {children({ loading: isLoading })}\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/react-native-tabs/src/ScrollBar.tsx",
    "content": "import React, { PropsWithChildren, useEffect, useRef } from 'react';\nimport { LayoutChangeEvent, LayoutRectangle, ScrollView, StyleSheet } from 'react-native';\n\nimport { useSafeState } from '@td-design/rn-hooks';\n\ninterface ScrollBarProps {\n  height: number;\n  page: number;\n}\n\nexport default function ScrollBar({ height, page, children }: PropsWithChildren<ScrollBarProps>) {\n  const [tabLayouts, setTabLayouts] = useSafeState<LayoutRectangle[]>([]);\n\n  // 保存每个Tab的布局\n  const handleTabLayout = (layouts: LayoutRectangle[]) => {\n    setTabLayouts(layouts);\n  };\n\n  // 保存ScrollView的宽度\n  const [contentWidth, setContentWidth] = useSafeState(0);\n  const handleContentChange = (width: number) => {\n    setContentWidth(width);\n  };\n\n  // 保存滚动条的宽度\n  const [scrollBarWidth, setScrollBarWidth] = useSafeState(0);\n  const handleScrollBarLayout = (e: LayoutChangeEvent) => {\n    setScrollBarWidth(e.nativeEvent.layout.width);\n  };\n\n  const scrollViewRef = useRef<ScrollView>(null);\n\n  useEffect(() => {\n    if (tabLayouts.length - 1 < page || contentWidth === 0 || scrollBarWidth === 0) return;\n\n    // 当前选中的Tab的布局\n    const tabLayout = tabLayouts[page];\n\n    // 当前选中的Tab的中心点\n    const tabCenter = tabLayout.x + tabLayout.width / 2 - scrollBarWidth / 2;\n\n    // 计算ScrollView的最大可滚动距离[0, maxScrollX]\n    const maxScrollX = contentWidth - scrollBarWidth;\n\n    // 计算ScrollView应该滚动的x坐标位置，它必须在[0, maxScrollX]之间\n    const scrollX = Math.min(Math.max(0, tabCenter), maxScrollX);\n\n    // 滚动ScrollView\n    scrollViewRef.current?.scrollTo({ x: scrollX, animated: true });\n  }, [page, tabLayouts, contentWidth, scrollBarWidth]);\n\n  return (\n    <ScrollView\n      ref={scrollViewRef}\n      horizontal\n      bounces={false}\n      showsHorizontalScrollIndicator={false}\n      style={[styles.scrollbar, { height }]}\n      onContentSizeChange={handleContentChange}\n      onLayout={handleScrollBarLayout}\n      contentContainerStyle={{ flexGrow: 1 }}\n    >\n      {React.cloneElement(children as React.ReactElement, { onTabsLayout: handleTabLayout })}\n    </ScrollView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  scrollbar: {\n    flexGrow: 0,\n  },\n});\n"
  },
  {
    "path": "packages/react-native-tabs/src/TabBar.tsx",
    "content": "import React, { useEffect, useMemo, useRef } from 'react';\nimport {\n  Animated,\n  LayoutChangeEvent,\n  LayoutRectangle,\n  Platform,\n  StyleProp,\n  StyleSheet,\n  TextStyle,\n  ViewStyle,\n} from 'react-native';\n\nimport { Flex, helpers } from '@td-design/react-native';\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nimport TabBarIndicator from './TabBarIndicator';\nimport TabBarItem from './TabBarItem';\n\nconst { ONE_PIXEL, deviceWidth } = helpers;\n\nexport interface TabBarProps {\n  tabs: string[];\n  height?: number;\n  onTabPress: (index: number) => void;\n  onTabsLayout?: (layouts: LayoutRectangle[]) => void;\n  page: number;\n  position: Animated.Value;\n  offset: Animated.Value;\n  isIdle: boolean;\n  showIndicator?: boolean;\n  scrollState: 'idle' | 'dragging' | 'settling';\n  tabStyle?: StyleProp<ViewStyle>;\n  tabItemStyle?: StyleProp<ViewStyle>;\n  labelStyle?: StyleProp<TextStyle>;\n  indicatorStyle?: StyleProp<ViewStyle>;\n}\n\nexport default function TabBar({\n  tabs,\n  onTabPress,\n  onTabsLayout,\n  height,\n  position,\n  offset,\n  page,\n  isIdle,\n  scrollState,\n  showIndicator = true,\n  tabStyle,\n  tabItemStyle,\n  labelStyle,\n  indicatorStyle,\n}: TabBarProps) {\n  const layouts = useRef<LayoutRectangle[]>([]);\n  const indicatorWidth = getIndicatorWidth(indicatorStyle);\n\n  const inputRange = useMemo(() => tabs.map((_, i) => i), [tabs]);\n  const [outputRange, setOutputRange] = useSafeState(inputRange.map(() => 0));\n\n  const offsetPosition = Animated.add(position, offset);\n\n  const scrollX = offsetPosition.interpolate({\n    inputRange,\n    outputRange,\n    extrapolate: 'clamp',\n  });\n\n  const lastPage = useLastPage(page, isIdle);\n  const interactive = useInteractive(scrollState);\n\n  const handleTabPress = useMemoizedFn((index: number) => {\n    if (isIdle) {\n      onTabPress(index);\n    }\n  });\n\n  const handleTabLayout = useMemoizedFn((e: LayoutChangeEvent, index: number) => {\n    layouts.current[index] = e.nativeEvent.layout;\n\n    const length = layouts.current.filter(layout => layout.width > 0).length;\n    if (length !== tabs.length) return;\n\n    const range: number[] = [];\n    for (let index = 0; index < length; index++) {\n      const layout = layouts.current[index];\n\n      // 指示器要和当前Tab垂直居中对齐\n      const tabCenterX = layout.x + layout.width / 2;\n      const indicatorX = tabCenterX - indicatorWidth / 2;\n      range.push(indicatorX);\n    }\n\n    setOutputRange(range);\n    onTabsLayout?.(layouts.current);\n  });\n\n  return (\n    <Flex\n      minWidth={deviceWidth}\n      height={height}\n      justifyContent={'space-evenly'}\n      alignItems={'center'}\n      backgroundColor={'white'}\n      borderBottomColor={'border'}\n      borderBottomWidth={ONE_PIXEL}\n      style={tabStyle}\n    >\n      {tabs.map((tab, index) => {\n        const enhanced = interactive || index === page || index === lastPage;\n\n        let scale = offsetPosition.interpolate({\n          inputRange: [index - 1, index, index + 1],\n          outputRange: [1, enhanced ? 1.2 : 1, 1],\n          extrapolate: 'clamp',\n        });\n\n        let opacity = offsetPosition.interpolate({\n          inputRange: [index - 1, index, index + 1],\n          outputRange: [0.8, enhanced ? 1 : 0.8, 0.8],\n          extrapolate: 'clamp',\n        });\n\n        if (Platform.OS === 'ios' && Math.abs(page - lastPage) > 1 && index === lastPage) {\n          scale = offsetPosition.interpolate({\n            inputRange: [page - 1, page, page + 1],\n            outputRange: [1.2, 1, 1.2],\n            extrapolate: 'clamp',\n          });\n\n          opacity = offsetPosition.interpolate({\n            inputRange: [page - 1, page, page + 1],\n            outputRange: [1, 0.8, 1],\n            extrapolate: 'clamp',\n          });\n        }\n\n        return (\n          <TabBarItem\n            key={tab}\n            title={tab}\n            onPress={() => handleTabPress(index)}\n            onLayout={e => handleTabLayout(e, index)}\n            style={tabItemStyle}\n            labelStyle={[labelStyle, { opacity, transform: [{ scale }] }]}\n          />\n        );\n      })}\n      {showIndicator && <TabBarIndicator style={[{ width: indicatorWidth }, indicatorStyle]} scrollX={scrollX} />}\n    </Flex>\n  );\n}\n\nconst useLastPage = (page: number, isIdle: boolean) => {\n  const lastPage = useRef(0);\n\n  useEffect(() => {\n    if (isIdle) {\n      lastPage.current = page;\n    }\n  }, [page, isIdle]);\n\n  return lastPage.current;\n};\n\nconst useInteractive = (scrollState: 'idle' | 'dragging' | 'settling') => {\n  const interactive = useRef(false);\n  const scrollStateRef = useRef(scrollState);\n\n  useEffect(() => {\n    scrollStateRef.current = scrollState;\n  }, [scrollState]);\n\n  if (scrollState === 'dragging') {\n    interactive.current = true;\n  } else if (scrollState === 'idle' && (Platform.OS === 'android' || scrollStateRef.current === 'settling')) {\n    interactive.current = false;\n  }\n\n  return interactive.current;\n};\n\nfunction getIndicatorWidth(style?: StyleProp<ViewStyle>) {\n  const flattenedStyle = StyleSheet.flatten([{ width: 24 }, style]);\n  if (typeof flattenedStyle.width === 'number') {\n    return flattenedStyle.width;\n  }\n  return 24;\n}\n"
  },
  {
    "path": "packages/react-native-tabs/src/TabBarIndicator.tsx",
    "content": "import React, { memo } from 'react';\nimport { Animated, StyleProp, StyleSheet, ViewStyle } from 'react-native';\n\nimport { Theme, useTheme } from '@td-design/react-native';\n\nfunction TabBarIndicator({\n  style,\n  scrollX,\n}: {\n  style: StyleProp<ViewStyle>;\n  scrollX: Animated.AnimatedInterpolation<number>;\n}) {\n  const theme = useTheme<Theme>();\n\n  return (\n    <Animated.View\n      key=\"indicator\"\n      style={[\n        { backgroundColor: theme.colors.primary200 },\n        styles.indicator,\n        style,\n        { transform: [{ translateX: scrollX }] },\n      ]}\n    />\n  );\n}\n\nexport default memo(TabBarIndicator);\n\nconst styles = StyleSheet.create({\n  indicator: {\n    position: 'absolute',\n    left: 0,\n    bottom: 0,\n    height: 4,\n    borderRadius: 2,\n  },\n});\n"
  },
  {
    "path": "packages/react-native-tabs/src/TabBarItem.tsx",
    "content": "import React, { memo } from 'react';\nimport { Animated, Pressable, StyleProp, TextStyle, ViewProps, ViewStyle } from 'react-native';\n\nimport { helpers, Theme, useTheme } from '@td-design/react-native';\n\ninterface TabBarItemProps {\n  title: string;\n  onPress?: () => void;\n  onLayout: ViewProps['onLayout'];\n  style?: StyleProp<ViewStyle>;\n  labelStyle?: Animated.WithAnimatedObject<TextStyle> | Animated.WithAnimatedArray<StyleProp<TextStyle>>;\n}\n\nconst TabBarItem = ({ style, labelStyle, title, onLayout, onPress }: TabBarItemProps) => {\n  const theme = useTheme<Theme>();\n\n  return (\n    <Pressable\n      onLayout={onLayout}\n      onPress={onPress}\n      style={[\n        {\n          paddingHorizontal: theme.spacing.x2,\n          minWidth: 24,\n          height: '100%',\n          alignItems: 'center',\n          justifyContent: 'center',\n        },\n        style,\n      ]}\n    >\n      <Animated.Text style={[{ fontSize: helpers.px(16), color: theme.colors.black }, labelStyle]}>\n        {title}\n      </Animated.Text>\n    </Pressable>\n  );\n};\n\nexport default memo(TabBarItem);\n"
  },
  {
    "path": "packages/react-native-tabs/src/index.md",
    "content": "---\ntitle: Tabs - 选项卡组件\nnav:\n  title: RN组件\n  path: /react-native\ngroup:\n  title: 选项卡组件\n  path: /tabs\n---\n\n# Tabs 选项卡组件\n\n本组件依赖于`react-native-pager-view`，所以你还需要一并安装它们：\n\n```code\nyarn add react-native-pager-view @td-design/react-native-tabs\n```\n\n## 效果演示\n\n### 1. 默认效果\n\n```tsx | pure\nconst routes = [\n  { title: 'First', component: <LongList orderDate={orderDate} /> },\n  { title: 'Second', component: <LongList orderDate={orderDate} /> },\n  { title: 'Third', component: <LongList orderDate={orderDate} /> },\n];\n\nreturn (\n  <Container>\n    <Tabs scenes={routes} />\n  </Container>\n);\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1689759167501655832.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 2. 自定义选项卡样式\n\n```tsx | pure\nconst routes = [\n  { title: 'First', component: <LongList orderDate={orderDate} /> },\n  { title: 'Second', component: <LongList orderDate={orderDate} /> },\n  { title: 'Third', component: <LongList orderDate={orderDate} /> },\n];\n\nreturn (\n  <Container>\n    <Tabs scenes={routes} tabStyle={{backgroundColor: 'red'}} />\n  </Container>\n);\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1689759271487559294.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 3. 自定义选项卡文本样式\n\n```tsx | pure\nconst routes = [\n  { title: 'First', component: <LongList orderDate={orderDate} /> },\n  { title: 'Second', component: <LongList orderDate={orderDate} /> },\n  { title: 'Third', component: <LongList orderDate={orderDate} /> },\n];\n\nreturn (\n  <Container>\n    <Tabs scenes={routes} labelStyle={{color: 'red'}} />\n  </Container>\n);\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1689759277934027950.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 4. 自定义指示器样式\n\n```tsx | pure\nconst routes = [\n  { title: 'First', component: <LongList orderDate={orderDate} /> },\n  { title: 'Second', component: <LongList orderDate={orderDate} /> },\n  { title: 'Third', component: <LongList orderDate={orderDate} /> },\n];\n\nreturn (\n  <Container>\n    <Tabs scenes={routes} indicatorStyle={{color: 'red', height: 10, borderRadius: 5}} />\n  </Container>\n);\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1689759281929283399.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 5. 隐藏指示器\n\n```tsx | pure\nconst routes = [\n  { title: 'First', component: <LongList orderDate={orderDate} /> },\n  { title: 'Second', component: <LongList orderDate={orderDate} /> },\n  { title: 'Third', component: <LongList orderDate={orderDate} /> },\n];\n\nreturn (\n  <Container>\n    <Tabs scenes={routes} showIndicator={false} />\n  </Container>\n);\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1689759285404293900.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n### 6. 很多个选项卡\n\n```tsx | pure\nconst routes = [\n  { title: 'First', component: <LongList orderDate={orderDate} /> },\n  { title: 'Second', component: <LongList orderDate={orderDate} /> },\n  { title: 'Third', component: <LongList orderDate={orderDate} /> },\n  { title: 'Forth', component: <LongList orderDate={orderDate} /> },\n  { title: 'Fifth', component: <LongList orderDate={orderDate} /> },\n  { title: 'Sixth', component: <LongList orderDate={orderDate} /> },\n  { title: 'Seventh', component: <LongList orderDate={orderDate} /> },\n];\n\nreturn (\n  <Container>\n    <Tabs scenes={routes} />\n  </Container>\n);\n```\n\n### 7. 默认切换到第二个选项卡\n\n```tsx | pure\nconst routes = [\n  { title: 'First', component: <LongList orderDate={orderDate} /> },\n  { title: 'Second', component: <LongList orderDate={orderDate} /> },\n  { title: 'Third', component: <LongList orderDate={orderDate} /> },\n];\n\nreturn (\n  <Container>\n    <Tabs scenes={routes} initialPage={1} />\n  </Container>\n);\n```\n\n<center>\n  <img\n    alt=\"\"\n    src=\"https://td-dev-public.oss-cn-hangzhou.aliyuncs.com/maoyes-app/1689841071351022756.gif\"\n    style=\"width: 375px; margin-right: 10px; border: 1px solid #ddd;\"\n  />\n</center>\n\n## API\n\n| 属性                | 必填    | 说明                                       | 类型                | 默认值    |\n| ------------------- | ------- | ------------------------------------------ | ------------------- | --------- |\n| scenes              | `true`  | 选项卡面板配置                             | `TabScene[]`        |           |\n| initialPage         | `false` | 默认切换到第几个选项卡                     | `number`            | `0`       |\n| height              | `false` | 选项卡高度                                 | `boolean`           | `48`      |\n| scrollEnabled       | `false` | 启用手势控制左右滑动                       | `boolean`           | `true`    |\n| overdrag            | `false` | 到第一页或者最后一页之后还是否允许继续拖动 | `boolean`           | `true`    |\n| keyboardDismissMode | `false` | 关闭键盘模式                               | `none` \\| `on-drag` | `on-drag` |\n| showIndicator       | `false` | 是否显示指示器                             | `boolean`           | `true`    |\n| tabStyle            | `false` | 选项卡样式                                 | `ViewStyle`         |           |\n| tabItemStyle        | `false` | 选项卡标签样式                             | `ViewStyle`         |           |\n| labelStyle          | `false` | 标签文字样式                               | `TextStyle`         |           |\n| indicatorStyle      | `false` | 指示器样式                                 | `ViewStyle`         |           |\n| lazy                | `false` | 是否启用懒加载模式                         | `boolean`           |           |\n| lazyPlaceholder     | `false` | 懒加载时的placeholder组件                  | `() => ReactNode`   |           |\n\n```ts\ninterface TabScene {\n  title: ReactNode;\n  component: JSX.Element;\n}\n```\n"
  },
  {
    "path": "packages/react-native-tabs/src/index.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport { Animated, StyleProp, TextStyle, ViewStyle } from 'react-native';\nimport PagerView from 'react-native-pager-view';\n\nimport { Box, helpers } from '@td-design/react-native';\n\nimport SceneView from './SceneView';\nimport ScrollBar from './ScrollBar';\nimport TabBar from './TabBar';\nimport usePagerView from './usePagerView';\n\nconst { px } = helpers;\nconst AnimatedPagerView = Animated.createAnimatedComponent<typeof PagerView>(PagerView);\n\ntype Tab = {\n  title: string;\n  component: ReactNode;\n};\n\nexport interface TabsProps {\n  scenes: Tab[];\n  lazy?: boolean;\n  renderLazyPlaceholder?: () => JSX.Element;\n  /** 默认当前是第几个tab */\n  initialPage?: number;\n  /** 当前是第几个tab */\n  page?: number;\n  /** 切换tab事件 */\n  onChange?: (page: number) => void;\n  /** 标签栏的高度。 默认为48 */\n  height?: number;\n  /** 是否支持手势滚动。 */\n  scrollEnabled?: boolean;\n  /** 是否显示指示器。 默认为true */\n  showIndicator?: boolean;\n  /** 到第一页或者最后一页之后还是否允许继续拖动。 默认为true */\n  overdrag?: boolean;\n  /** 键盘关闭模式。 默认为滚动时关闭 */\n  keyboardDismissMode?: 'none' | 'on-drag';\n  tabStyle?: StyleProp<ViewStyle>;\n  tabItemStyle?: StyleProp<ViewStyle>;\n  labelStyle?: StyleProp<TextStyle>;\n  indicatorStyle?: StyleProp<ViewStyle>;\n}\n\nexport default function Tabs({\n  initialPage = 0,\n  lazy = false,\n  renderLazyPlaceholder,\n  page,\n  onChange,\n  scenes = [],\n  height = px(48),\n  showIndicator = true,\n  scrollEnabled = true,\n  overdrag = true,\n  keyboardDismissMode = 'on-drag',\n  tabStyle,\n  tabItemStyle,\n  labelStyle,\n  indicatorStyle,\n}: TabsProps) {\n  const {\n    pagerViewRef,\n    setPage,\n    currentPage,\n    position,\n    offset,\n    isIdle,\n    scrollState,\n    onPageScroll,\n    onPageSelected,\n    onPageScrollStateChanged,\n  } = usePagerView(initialPage, page, onChange);\n\n  const titles = scenes.map(tab => tab.title);\n\n  return (\n    <Box flex={1}>\n      {/* 可以滚动的TabBar */}\n      <ScrollBar page={currentPage} height={height}>\n        <TabBar\n          tabs={titles}\n          onTabPress={setPage}\n          page={currentPage}\n          position={position}\n          offset={offset}\n          isIdle={isIdle}\n          scrollState={scrollState}\n          showIndicator={showIndicator}\n          tabStyle={tabStyle}\n          tabItemStyle={tabItemStyle}\n          labelStyle={labelStyle}\n          indicatorStyle={indicatorStyle}\n        />\n      </ScrollBar>\n\n      {/* PagerView的内容 */}\n      <AnimatedPagerView\n        ref={pagerViewRef}\n        style={{ flex: 1 }}\n        overdrag={overdrag}\n        initialPage={currentPage}\n        keyboardDismissMode={keyboardDismissMode}\n        scrollEnabled={scrollEnabled}\n        overScrollMode=\"always\"\n        onPageScroll={onPageScroll}\n        onPageSelected={onPageSelected}\n        onPageScrollStateChanged={onPageScrollStateChanged}\n      >\n        {scenes.map(({ component }, i) => (\n          <SceneView key={i} index={i} lazy={lazy} currentPage={currentPage}>\n            {({ loading }) => {\n              if (loading) return renderLazyPlaceholder?.();\n\n              return component;\n            }}\n          </SceneView>\n        ))}\n      </AnimatedPagerView>\n    </Box>\n  );\n}\n"
  },
  {
    "path": "packages/react-native-tabs/src/types.tsx",
    "content": "export type Route = {\n  key: string;\n  icon?: string;\n  title?: string;\n};\n\nexport type Scene<T extends Route> = {\n  route: T;\n};\n\nexport type NavigationState<T extends Route> = {\n  index: number;\n  routes: T[];\n};\n"
  },
  {
    "path": "packages/react-native-tabs/src/usePagerView.ts",
    "content": "import { useEffect, useMemo, useRef } from 'react';\nimport { Animated } from 'react-native';\nimport PagerView, {\n  PagerViewOnPageScrollEventData,\n  PagerViewOnPageSelectedEvent,\n  PageScrollStateChangedNativeEvent,\n} from 'react-native-pager-view';\n\nimport { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';\n\nexport default function usePagerView(initialPage: number, page?: number, onChange?: (page: number) => void) {\n  const pagerViewRef = useRef<PagerView>(null);\n\n  const [activePage, setActivePage] = useSafeState(initialPage);\n  const [isIdle, setIdle] = useSafeState(true);\n\n  const setPage = useMemoizedFn((page: number, animated = true) => {\n    if (animated) {\n      pagerViewRef.current?.setPage(page);\n    } else {\n      pagerViewRef.current?.setPageWithoutAnimation(page);\n    }\n\n    setActivePage(page);\n    if (activePage !== page) {\n      setIdle(false);\n    } else {\n      setIdle(true);\n    }\n    onChange?.(page);\n  });\n\n  useEffect(() => {\n    if (page !== undefined && page !== activePage) {\n      setPage(page);\n    }\n  }, [page, activePage]);\n\n  const offset = useRef(new Animated.Value(initialPage)).current;\n  const position = useRef(new Animated.Value(0)).current;\n\n  const onPageScroll = useMemo(\n    () =>\n      Animated.event<PagerViewOnPageScrollEventData>(\n        [\n          {\n            nativeEvent: {\n              offset,\n              position,\n            },\n          },\n        ],\n        {\n          listener: ({ nativeEvent: { position, offset } }) => {\n            if (__DEV__) {\n              console.log('onPageScroll', 'position', position, 'offset', offset);\n            }\n          },\n          useNativeDriver: true,\n        }\n      ),\n    [offset, position]\n  );\n\n  const onPageSelected = useMemoizedFn((e: PagerViewOnPageSelectedEvent) => {\n    setActivePage(e.nativeEvent.position);\n    onChange?.(e.nativeEvent.position);\n    setIdle(true);\n  });\n\n  const [scrollState, setScrollState] = useSafeState<'idle' | 'dragging' | 'settling'>('idle');\n\n  const onPageScrollStateChanged = useMemoizedFn((e: PageScrollStateChangedNativeEvent) => {\n    setScrollState(e.nativeEvent.pageScrollState);\n    setIdle(e.nativeEvent.pageScrollState === 'idle');\n  });\n\n  return {\n    pagerViewRef,\n    currentPage: activePage,\n    isIdle,\n    scrollState,\n    position,\n    offset,\n    setPage,\n    onPageScroll,\n    onPageSelected,\n    onPageScrollStateChanged,\n  };\n}\n"
  },
  {
    "path": "packages/react-native-tabs/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationMap\": false, // 如果设为true，会为.d.ts文件生成sourcemap\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"jsx\": \"react\",\n    \"incremental\": false,\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"allowJs\": true,\n    \"lib\": [\"esnext\"],\n    \"experimentalDecorators\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"strictNullChecks\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"sourceMap\": false\n  },\n  \"exclude\": [\"**/*.(spec|test).ts?(x)\", \"build\", \"dist\", \"lib\", \"__tests__\", \"jest\", \"example\"]\n}\n"
  },
  {
    "path": "packages/react-native-tabs/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build\",\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "packages/svgicon-cli/CHANGELOG.md",
    "content": "# @td-design/svgicon-cli\n\n## 1.7.2\n\n### Patch Changes\n\n- [#773](https://github.com/thundersdata-frontend/td-design/pull/773) [`be1c4f77f`](https://github.com/thundersdata-frontend/td-design/commit/be1c4f77fac19ffcd7dfc0b666bfb323e4fc5d22) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复mkdirp API 使用错误\n\n## 1.7.1\n\n### Patch Changes\n\n- [#771](https://github.com/thundersdata-frontend/td-design/pull/771) [`f77a440cd`](https://github.com/thundersdata-frontend/td-design/commit/f77a440cdf605bc51dff719fb841eed1c65dde9e) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复另一处 glob 使用的报错\n\n## 1.7.0\n\n### Minor Changes\n\n- [#769](https://github.com/thundersdata-frontend/td-design/pull/769) [`81a24e238`](https://github.com/thundersdata-frontend/td-design/commit/81a24e2382207e2b61b68978b41ae2272e5b9e5b) Thanks [@chj-damon](https://github.com/chj-damon)! - 修复执行命令报错的问题\n\n## 1.6.0\n\n### Minor Changes\n\n- [#743](https://github.com/thundersdata-frontend/td-design/pull/743) [`acdd74c13`](https://github.com/thundersdata-frontend/td-design/commit/acdd74c1324be45816f4e1dff0d5e854124172ad) Thanks [@chj-damon](https://github.com/chj-damon)! - perf: 优化多个组件\n"
  },
  {
    "path": "packages/svgicon-cli/README.md",
    "content": "## @td-design/svgicon-cli\n\n本工具是基于[react-native-iconfont-cli](https://github.com/iconfont-cli/react-native-iconfont-cli)的基础上修改而来。因为 UI 设计师使用`Figma`产出设计稿，所以项目中用到的图标不会使用 iconfont 或者图片，而是直接导出 svg 格式。借助这个工具，就可以很方便地把本地 svg 转成图标组件在项目中使用。为此，精简了原项目中很多不需要的功能（比如拉取 iconfont 图标库、支持导出 js 文件等），以满足我们自己的需求。\n\n## 特性\n\n1、纯组件，不依赖字体，体积小 <br /> 2、支持渲染多色彩图标，支持自定义颜色 <br /> 3、支持热更新 <br /> 4、自动化生成图标组件，默认支持 typescript\n\n## Step 1\n\n安装插件\n\n```bash\n# Yarn\nyarn add react-native-svg\nyarn add @td-design/svgicon-cli --dev\n\n# Npm\nnpm install react-native-svg\nnpm install @td-design/svgicon-cli --save-dev\n```\n\n# Step 2\n\n生成配置文件\n\n```bash\nnpx svgicon-init\n```\n\n此时项目根目录会生成一个`svgicon.json`的文件，内容如下：\n\n```json\n{\n  \"save_dir\": \"\", // 生成图标文件的保存位置，推荐 ./src/components/iconfont\n  \"trim_icon_prefix\": \"icon\", // 图标文件的统一前缀\n  \"default_icon_size\": 20, // 图标文件的默认大小\n  \"icon_svg\": \"./icon-svg\", // 图标文件的存放位置\n  \"for_library\": false // 是否为组件库生成图标，默认是false，表示是为项目生成图标\n}\n```\n\n# Step 3\n\n开始生成 React-Native 标准组件\n\n```bash\nnpx svgicon-create\n```\n\n# 使用\n\n```typescript jsx\nimport { SvgIcon } from 'components';\n\nexport const App = () => {\n  return (\n    <View>\n      <SvgIcon name=\"alipay\" size={20} />\n      <SvgIcon name=\"wechat\" />\n    </View>\n  );\n};\n```\n\n### 图标尺寸\n\n根据配置`default_icon_size`，每个图标都会有一个默认的尺寸，你可以随时覆盖。\n\n```typescript jsx\n<SvgIcon name=\"alipay\" size={20} />\n```\n\n### 图标单色\n\n单色图标，如果不指定颜色值，图标将渲染原本的颜色。如果你想设置为其他的颜色，那么设置一个你想要的颜色即可。\n\n**注意：如果你在 props 传入的 color 是字符串而不是数组，那么即使原本是多色彩的图标，也会变成单色图标。**\n\n```typescript jsx\n<SvgIcon name=\"alipay\" color=\"green\" />\n```\n\n![](./images/one-color-icon.png)\n\n### 图标多色彩\n\n多色彩的图标，如果不指定颜色值，图标将渲染原本的多色彩。如果你想设置为其他的颜色，那么设置一组你想要的颜色即可\n\n```typescript jsx\n<IconFont name=\"alipay\" color={['green', 'orange']} />\n```\n\n颜色组的数量以及排序，需要根据当前图标的信息来确定。您需要进入图标组件中查看并得出结论。\n\n![](./images/multi-color-icon.png)\n\n# 更新图标\n\n当`icon_svg`文件夹下的 svg 文件发生变化时，只需要重新执行下面的命令即可生成最新的图标组件\n\n```bash\nnpx svgicon-rn\n```\n"
  },
  {
    "path": "packages/svgicon-cli/gulpfile.js",
    "content": "const gulp = require('gulp');\nconst del = require('del');\nconst replace = require('gulp-replace');\nconst ts = require('gulp-typescript');\n\n/**\n * 清理构建目录\n */\nfunction clean() {\n  /** 删除构建目录 */\n  return del('lib');\n}\n\n/**\n * 构建cjs模块\n * @returns\n */\nfunction buildCJS() {\n  const tsProject = ts.createProject('tsconfig.build.json', {\n    module: 'CommonJS',\n  });\n\n  return tsProject.src().pipe(tsProject()).pipe(gulp.dest('lib/'));\n}\n\n/**\n * 复制模板\n */\nfunction copyTemplate() {\n  return gulp.src('./src/templates/**/*').pipe(gulp.dest('lib/templates'));\n}\n\nfunction copyJson() {\n  return gulp.src('./svgicon.json').pipe(gulp.dest('lib/libs'));\n}\n\nexports.default = gulp.series(clean, buildCJS, copyTemplate, copyJson);\n"
  },
  {
    "path": "packages/svgicon-cli/package.json",
    "content": "{\n  \"name\": \"@td-design/svgicon-cli\",\n  \"version\": \"1.7.2\",\n  \"main\": \"index.js\",\n  \"keywords\": [\n    \"thundersdata-frontend\",\n    \"react-native\",\n    \"react-native-svg\",\n    \"icon\",\n    \"svg\"\n  ],\n  \"author\": \"thundersdata-frontend\",\n  \"license\": \"Apache-2.0\",\n  \"bin\": {\n    \"svgicon-init\": \"./lib/commands/createJson.js\",\n    \"svgicon-create\": \"./lib/commands/createIcon.js\"\n  },\n  \"files\": [\n    \"lib\"\n  ],\n  \"scripts\": {\n    \"build\": \"gulp\"\n  },\n  \"dependencies\": {\n    \"colors\": \"^1.4.0\",\n    \"glob\": \"^10.3.3\",\n    \"lodash\": \"^4.17.21\",\n    \"mkdirp\": \"^3.0.1\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"registry\": \"https://registry.npmjs.org/\"\n  },\n  \"devDependencies\": {\n    \"@types/glob\": \"^8.1.0\",\n    \"@types/lodash\": \"^4.14.195\",\n    \"@types/mkdirp\": \"1.0.2\",\n    \"@types/node\": \"20.4.4\",\n    \"del\": \"6.0.0\",\n    \"gulp\": \"^4.0.2\",\n    \"gulp-replace\": \"^1.1.4\",\n    \"gulp-typescript\": \"^6.0.0-alpha.1\",\n    \"typescript\": \"^5.1.6\"\n  }\n}"
  },
  {
    "path": "packages/svgicon-cli/src/commands/createIcon.ts",
    "content": "#!/usr/bin/env node\nimport { generateComponent } from '../libs/generateComponent';\nimport { getConfig } from '../libs/getConfig';\nimport parseLocalSvg from '../libs/parseLocalSvg';\n\nexport interface XmlData {\n  svg: {\n    symbol: Array<{\n      $: {\n        viewBox: string;\n        id: string;\n      };\n      path: Array<{\n        $: {\n          d: string;\n          fill?: string;\n        };\n      }>;\n    }>;\n  };\n}\n\nconst config = getConfig();\nconst localSvg = parseLocalSvg(config);\ngenerateComponent(localSvg, config);\n"
  },
  {
    "path": "packages/svgicon-cli/src/commands/createJson.ts",
    "content": "#!/usr/bin/env node\nimport colors from 'colors';\nimport fs from 'fs';\nimport path from 'path';\n\nconst targetFile = path.resolve('svgicon.json');\n\nif (fs.existsSync(targetFile)) {\n  console.error(colors.red('svgicon.json 文件已经存在'));\n} else {\n  fs.copyFileSync(path.join(__dirname, '../libs/svgicon.json'), targetFile);\n  console.log(colors.green('svgicon.json 文件生成成功，建议你加入到版本控制中'));\n}\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/copyTemplate.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\n\nexport const copyTemplate = (fromFile: string, toFile: string) => {\n  return fs.copyFileSync(path.join(__dirname, `../templates/${fromFile}.template`), toFile);\n};\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/generateComponent.ts",
    "content": "import colors from 'colors';\nimport fs from 'fs';\nimport { globSync } from 'glob';\nimport { camelCase, upperFirst } from 'lodash';\nimport { mkdirpSync } from 'mkdirp';\nimport path from 'path';\n\nimport { ILocalSvg } from '../libs/parseLocalSvg';\nimport { copyTemplate } from './copyTemplate';\nimport { Config } from './getConfig';\nimport { getTemplate } from './getTemplate';\nimport {\n  replaceCases,\n  replaceComponentName,\n  replaceComponentXml,\n  replaceFillAttr,\n  replaceFillStyle,\n  replaceHelper,\n  replaceImports,\n  replaceNames,\n  replacePx,\n  replaceSingleIconContent,\n  replaceSize,\n  replaceSvgComponents,\n} from './replace';\nimport { whitespace } from './whitespace';\n\nexport const generateComponent = (localSvg: ILocalSvg[], config: Config) => {\n  const svgComponents: Set<string> = new Set();\n  const names: string[] = [];\n  const imports: string[] = [];\n  const saveDir = path.resolve(config.save_dir);\n  const jsxExtension = '.tsx';\n  const jsExtension = '.ts';\n  let cases = '';\n\n  mkdirpSync(saveDir);\n  globSync(path.join(saveDir, '*')).forEach(file => fs.unlinkSync(file));\n  svgComponents.add('GProps');\n\n  copyTemplate(`helper${jsExtension}`, path.join(saveDir, `helper${jsExtension}`));\n\n  /**\n   * 本地文件添加\n   */\n  localSvg.forEach(({ name, svgStr, styleType, hasFill }) => {\n    let singleFile: string;\n\n    const componentName = upperFirst(config.trim_icon_prefix) + upperFirst(camelCase(name));\n    const currentSvgComponents = new Set<string>();\n    currentSvgComponents.add('GProps');\n    currentSvgComponents.add(styleType ? 'SvgCss' : 'SvgXml');\n\n    names.push(name);\n\n    cases += `${whitespace(4)}case '${name}':\\n`;\n\n    imports.push(componentName);\n\n    cases += `${whitespace(6)}return <${componentName} {...rest} />;\\n`;\n\n    singleFile = getTemplate('LocalSingleIcon' + jsxExtension);\n    singleFile = replacePx(singleFile, config.for_library);\n    singleFile = replaceSize(singleFile, config.default_icon_size);\n    singleFile = replaceSvgComponents(singleFile, currentSvgComponents);\n    singleFile = replaceComponentName(singleFile, componentName);\n\n    let xmlStr = replaceFillAttr(svgStr);\n    if (styleType) {\n      xmlStr = replaceFillStyle(xmlStr);\n    }\n    singleFile = replaceComponentXml(singleFile, `const xml = \\`\\n${xmlStr}\\n\\``);\n    singleFile = replaceSingleIconContent(\n      singleFile,\n      `\\n${whitespace(4)}<${styleType ? 'SvgCss' : 'SvgXml'} xml={xml}  width={width} height={height} {...rest} />\\n`\n    );\n    singleFile = replaceHelper(singleFile, hasFill);\n\n    fs.writeFileSync(path.join(saveDir, componentName + jsxExtension), singleFile);\n    console.log(`${colors.green('√')} Generated local icon \"${colors.yellow(name)}\"`);\n  });\n\n  /**\n   * 生成SvgIcon入口文件\n   */\n  let iconFile = getTemplate('Icon' + jsxExtension);\n  iconFile = replaceSize(iconFile, config.default_icon_size);\n  iconFile = replaceCases(iconFile, cases);\n  iconFile = replaceSvgComponents(iconFile, svgComponents);\n  iconFile = replaceImports(iconFile, imports);\n  iconFile = replaceNames(iconFile, names);\n\n  fs.writeFileSync(path.join(saveDir, 'index' + jsxExtension), iconFile);\n\n  console.log(`\\n${colors.green('√')} All icons have putted into dir: ${colors.green(config.save_dir)}\\n`);\n};\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/getConfig.ts",
    "content": "import colors from 'colors';\nimport fs from 'fs';\nimport path from 'path';\n\nimport defaultConfig from './svgicon.json';\n\nexport interface Config {\n  save_dir: string;\n  trim_icon_prefix: string;\n  default_icon_size: number;\n  icon_svg: string;\n  for_library: boolean;\n}\n\nlet cacheConfig: Config;\n\nexport const getConfig = () => {\n  if (cacheConfig) {\n    return cacheConfig;\n  }\n\n  const targetFile = path.resolve('svgicon.json');\n\n  if (!fs.existsSync(targetFile)) {\n    console.warn(colors.red('svgicon.json 文件不存在，你是不是忘了创建它？'));\n    process.exit(1);\n  }\n\n  const config = require(targetFile) as Config;\n\n  config.save_dir = config.save_dir || defaultConfig.save_dir;\n  config.default_icon_size = config.default_icon_size || defaultConfig.default_icon_size;\n  config.for_library = config.for_library || defaultConfig.for_library;\n\n  cacheConfig = config;\n\n  return config;\n};\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/getTemplate.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\n\nexport const getTemplate = (fileName: string) => {\n  return fs.readFileSync(path.join(__dirname, `../templates/${fileName}.template`)).toString();\n};\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/parseLocalSvg.ts",
    "content": "import * as fs from 'fs';\nimport { globSync } from 'glob';\nimport path from 'path';\n\nimport { Config } from '../libs/getConfig';\n\nexport interface ILocalSvg {\n  svgStr: string;\n  name: string;\n  styleType: boolean;\n  hasFill: boolean;\n}\n\nconst parseLocalSvg = ({ icon_svg }: Config) => {\n  if (!icon_svg) {\n    return [];\n  }\n\n  const localDir = path.resolve(icon_svg);\n\n  const localSvg = globSync(path.join(localDir, '**/*.svg'));\n\n  return localSvg.reduce<ILocalSvg[]>((previousValue, currentValue) => {\n    let svgStr = fs.readFileSync(currentValue, 'utf-8');\n\n    /**\n     * 去除注释,title,desc等不需要的标签\n     */\n    svgStr = svgStr\n      .substring(svgStr.indexOf('<svg '), svgStr.indexOf('</svg>') + 6)\n      .replace(/<!-(.*?)->/g, '')\n      .replace(/<title>(.*?)<\\/title>/g, '')\n      .replace(/<desc>(.*?)<\\/desc>/g, '')\n      .replace(/fill\\=\\\"none\\\"/g, '');\n\n    const styleType = !!~svgStr.indexOf('</style>') || !!~svgStr.indexOf('style=');\n\n    // 判断svg里面有没有fill，如果没有，则后面不会引入getIconColor的helper\n    const hasFill = svgStr.includes('fill=');\n\n    previousValue.push({\n      svgStr,\n      name: path.basename(currentValue, '.svg'),\n      styleType,\n      hasFill,\n    });\n\n    return previousValue;\n  }, []);\n};\n\nexport default parseLocalSvg;\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/replace.ts",
    "content": "export const replaceSize = (content: string, size: number) => {\n  return content.replace(/#size#/g, String(size));\n};\n\nexport const replacePx = (content: string, for_library: boolean) => {\n  if (for_library) {\n    return content.replace(/#px#/g, `import { px } from '../helpers/normalize';`);\n  }\n  return content.replace(\n    /#px#/g,\n    `\nimport { helpers } from '@td-design/react-native';\n\nconst { px } = helpers;\n    `\n  );\n};\n\nexport const replaceCases = (content: string, cases: string) => {\n  return content.replace(/#cases#/g, cases);\n};\n\nexport const replaceSvgComponents = (content: string, components: Set<string>) => {\n  const used = Array.from(components);\n\n  return content.replace(\n    /#svgComponents#/g,\n    used.length ? `import { ${used.join(', ')} } from 'react-native-svg';` : ''\n  );\n};\n\nexport const replaceNames = (content: string, names: string[]) => {\n  return content.replace(/#names#/g, names.join(`' | '`));\n};\n\nexport const replaceNamesArray = (content: string, names: string[]) => {\n  return content.replace(/#namesArray#/g, JSON.stringify(names).replace(/\"/g, \"'\").replace(/','/g, \"', '\"));\n};\n\nexport const replaceComponentName = (content: string, name: string) => {\n  return content.replace(/#componentName#/g, name);\n};\n\nexport const replaceSingleIconContent = (content: string, render: string) => {\n  return content.replace(/#iconContent#/g, render);\n};\n\nexport const replaceImports = (content: string, imports: string[]) => {\n  return content.replace(/#imports#/g, imports.map(item => `import ${item} from './${item}';`).join('\\n'));\n};\n\nexport const replaceHelper = (content: string, hasFill = false) => {\n  return content.replace(/#helper#/g, hasFill ? \"import { getIconColor } from './helper';\" : '');\n};\n\nexport const replaceNoColor = (content: string) => {\n  return content.replace(/#colorFunc#/g, '');\n};\n\nexport const replaceSummaryIcon = (content: string, iconName: string) => {\n  return content.replace(/#SummaryIcon#/g, iconName);\n};\n\nexport const replaceComponentXml = (content: string, svgStr: string) => {\n  return content.replace(/#xml#/g, svgStr);\n};\n\n/**\n * 用helper中的getIconColor方法替换svg xml字符串的属性中的fill，实现颜色可配置的功能\n * @param xmlString\n */\nexport const replaceFillAttr = (xmlString: string) => {\n  const replaceRegex = /fill\\=\\\"([\\d\\w\\#]*)\\\"/;\n  const matchRegex = /fill\\=\\\"([\\d\\w\\#]*)\\\"/g;\n\n  let xml = xmlString;\n\n  const matches = xmlString.match(matchRegex)?.length ?? 0;\n  new Array(matches).fill('').forEach((_, index) => {\n    xml = xml.replace(replaceRegex, `fill=\"\\${getIconColor(color, ${index}, '#999999')}\"`);\n  });\n  return xml;\n};\n\n/**\n * 用helper中的getIconColor方法替换svg xml字符串的样式中的fill，实现颜色可配置的功能\n * @param xmlString\n */\nexport const replaceFillStyle = (xmlString: string) => {\n  const replaceRegex = /fill:([\\d\\w\\_\\-\\#\\s\\S]*)/;\n  const matchRegex = /fill:([\\d\\w\\_\\-\\#\\s\\S]*)/g;\n\n  let xml = xmlString;\n\n  const matches = xmlString.match(matchRegex)?.length ?? 0;\n  new Array(matches).fill('').forEach((_, index) => {\n    xml = xml.replace(replaceRegex, `fill: \"\\${getIconColor(color, ${index}, '#999999')}\"`);\n  });\n  return xml;\n};\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/svgicon.json",
    "content": "{\n  \"save_dir\": \"./src/components/svgicon\",\n  \"trim_icon_prefix\": \"icon\",\n  \"default_icon_size\": 20,\n  \"icon_svg\": \"./icon-svg\",\n  \"for_library\": false\n}\n"
  },
  {
    "path": "packages/svgicon-cli/src/libs/whitespace.ts",
    "content": "export const whitespace = (repeat: number) => {\n  return ' '.repeat(repeat);\n};\n"
  },
  {
    "path": "packages/svgicon-cli/src/templates/Icon.tsx.template",
    "content": "/* eslint-disable */\n\nimport React from 'react';\nimport { ViewProps } from 'react-native';\n#svgComponents#\n#imports#\n\nexport type IconNames = '#names#';\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  name: IconNames;\n  size?: number;\n  width?: number | string;\n  height?: number | string;\n  color?: string | string[];\n}\n\nlet SvgIcon: React.FC<SvgIconProps> = ({ name, ...rest }) => {\n  switch (name) {\n#cases#\n    default:\n      return null;\n  }\n};\n\nexport default React.memo(SvgIcon);\n"
  },
  {
    "path": "packages/svgicon-cli/src/templates/LocalSingleIcon.tsx.template",
    "content": "/* eslint-disable */\n\nimport React from 'react';\nimport { ViewProps } from 'react-native';\n#svgComponents#\n#helper#\n#px#\n\nexport interface SvgIconProps extends GProps, ViewProps {\n  size?: number;\n  width?: number | string;\n  height?: number | string;\n  color?: string | string[];\n}\n\nlet #componentName#: React.FC<SvgIconProps> = ({ size, width = size, height = size, color, ...rest }) => {\n  #xml#\n\n  return (#iconContent#  );\n};\n\n#componentName#.defaultProps = {\n  size: px(#size#),\n};\n\nexport default React.memo(#componentName#);\n"
  },
  {
    "path": "packages/svgicon-cli/src/templates/helper.ts.template",
    "content": "/* eslint-disable */\n\nexport const getIconColor = (color: string | string[] | undefined, index: number, defaultColor: string) => {\n  return color\n    ? (\n      typeof color === 'string'\n        ? color\n        : color[index] || defaultColor\n    )\n    : defaultColor;\n};\n"
  },
  {
    "path": "packages/svgicon-cli/svgicon.json",
    "content": "{\n  \"save_dir\": \"./src/components/svgicon\",\n  \"trim_icon_prefix\": \"icon\",\n  \"default_icon_size\": 20,\n  \"icon_svg\": \"./icon-svg\",\n  \"for_library\": false\n}\n"
  },
  {
    "path": "packages/svgicon-cli/tsconfig.build.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"lib\": [\"ESNext\"],\n    \"moduleResolution\": \"node\",\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"downlevelIteration\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": false,\n    \"strictNullChecks\": true,\n    \"baseUrl\": \".\",\n    \"resolveJsonModule\": true\n  },\n  \"exclude\": [\"node_modules\", \"lib\", \"es\", \"dist\", \"**/index.test.ts\", \"**/demo\", \"coverage\", \"**/*.js\"]\n}\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/*'\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"moduleResolution\": \"node\",\n    \"jsx\": \"react\",\n    \"esModuleInterop\": true,\n    \"downlevelIteration\": true,\n    \"sourceMap\": true,\n    \"baseUrl\": \".\",\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": false,\n    \"strictNullChecks\": true,\n    \"paths\": {\n      \"@/*\": [\"src/*\"],\n      \"@@/*\": [\"src/.umi/*\"]\n    }\n  },\n  \"exclude\": [\"node_modules\", \"lib\", \"es\", \"dist\", \"typings\", \"**/__test__\", \"test\", \"docs\", \"tests\"]\n}\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n  \"$schema\": \"https://turborepo.org/schema.json\",\n  \"pipeline\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist/**\"]\n    }\n  }\n}\n"
  },
  {
    "path": "typings.d.ts",
    "content": "declare module '*.css';\ndeclare module '*.less';\n"
  }
]